Skip to content

Commit d24b8a2

Browse files
Eneman DonatienEneman Donatien
authored andcommitted
add label selector
1 parent 314d637 commit d24b8a2

File tree

6 files changed

+92
-25
lines changed

6 files changed

+92
-25
lines changed

controllers/bucket_controller.go

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ import (
2121
"fmt"
2222
"time"
2323

24+
s3v1alpha1 "github.com/InseeFrLab/s3-operator/api/v1alpha1"
25+
"github.com/InseeFrLab/s3-operator/controllers/s3/factory"
26+
utils "github.com/InseeFrLab/s3-operator/controllers/utils"
2427
"k8s.io/apimachinery/pkg/api/errors"
2528
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2629
"k8s.io/apimachinery/pkg/runtime"
@@ -32,18 +35,15 @@ import (
3235
"sigs.k8s.io/controller-runtime/pkg/event"
3336
"sigs.k8s.io/controller-runtime/pkg/log"
3437
"sigs.k8s.io/controller-runtime/pkg/predicate"
35-
36-
s3v1alpha1 "github.com/InseeFrLab/s3-operator/api/v1alpha1"
37-
"github.com/InseeFrLab/s3-operator/controllers/s3/factory"
38-
"github.com/InseeFrLab/s3-operator/controllers/utils"
3938
)
4039

4140
// BucketReconciler reconciles a Bucket object
4241
type BucketReconciler struct {
4342
client.Client
44-
Scheme *runtime.Scheme
45-
S3Client factory.S3Client
46-
BucketDeletion bool
43+
Scheme *runtime.Scheme
44+
S3Client factory.S3Client
45+
BucketDeletion bool
46+
S3LabelSelectorValue string
4747
}
4848

4949
//+kubebuilder:rbac:groups=s3.onyxia.sh,resources=buckets,verbs=get;list;watch;create;update;patch;delete
@@ -72,6 +72,19 @@ func (r *BucketReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
7272
return ctrl.Result{}, err
7373
}
7474

75+
// check if this object must be manage by this instance
76+
if r.S3LabelSelectorValue != "" {
77+
labelSelectorValue, found := bucketResource.Labels[utils.S3OperatorBucketLabelSelectorKey]
78+
if !found {
79+
logger.Info("This bucket ressouce will not be manage by this instance because this instance require that Bucket get labelSelector and label selector not found", "req.Name", req.Name, "Bucket Labels", bucketResource.Labels, "S3OperatorBucketLabelSelectorKey", utils.S3OperatorBucketLabelSelectorKey)
80+
return ctrl.Result{}, nil
81+
}
82+
if labelSelectorValue != r.S3LabelSelectorValue {
83+
logger.Info("This bucket ressouce will not be manage by this instance because this instance require that Bucket get specific a specific labelSelector value", "req.Name", req.Name, "expected", r.S3LabelSelectorValue, "current", labelSelectorValue)
84+
return ctrl.Result{}, nil
85+
}
86+
}
87+
7588
// Managing bucket deletion with a finalizer
7689
// REF : https://sdk.operatorframework.io/docs/building-operators/golang/advanced-topics/#external-resources
7790
isMarkedForDeletion := bucketResource.GetDeletionTimestamp() != nil

controllers/path_controller.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,10 @@ import (
4141
// PathReconciler reconciles a Path object
4242
type PathReconciler struct {
4343
client.Client
44-
Scheme *runtime.Scheme
45-
S3Client factory.S3Client
46-
PathDeletion bool
44+
Scheme *runtime.Scheme
45+
S3Client factory.S3Client
46+
PathDeletion bool
47+
S3LabelSelectorValue string
4748
}
4849

4950
//+kubebuilder:rbac:groups=s3.onyxia.sh,resources=paths,verbs=get;list;watch;create;update;patch;delete
@@ -72,6 +73,19 @@ func (r *PathReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.
7273
return ctrl.Result{}, err
7374
}
7475

76+
// check if this object must be manage by this instance
77+
if r.S3LabelSelectorValue != "" {
78+
labelSelectorValue, found := pathResource.Labels[utils.S3OperatorPathLabelSelectorKey]
79+
if !found {
80+
logger.Info("This paht ressouce will not be manage by this instance because this instance require that path get labelSelector and label selector not found", "req.Name", req.Name, "Bucket Labels", pathResource.Labels, "S3OperatorBucketLabelSelectorKey", utils.S3OperatorBucketLabelSelectorKey)
81+
return ctrl.Result{}, nil
82+
}
83+
if labelSelectorValue != r.S3LabelSelectorValue {
84+
logger.Info("This path ressouce will not be manage by this instance because this instance require that path get specific a specific labelSelector value", "req.Name", req.Name, "expected", r.S3LabelSelectorValue, "current", labelSelectorValue)
85+
return ctrl.Result{}, nil
86+
}
87+
}
88+
7589
// Managing path deletion with a finalizer
7690
// REF : https://sdk.operatorframework.io/docs/building-operators/golang/advanced-topics/#external-resources
7791
isMarkedForDeletion := pathResource.GetDeletionTimestamp() != nil

controllers/policy_controller.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,10 @@ import (
4444
// PolicyReconciler reconciles a Policy object
4545
type PolicyReconciler struct {
4646
client.Client
47-
Scheme *runtime.Scheme
48-
S3Client factory.S3Client
49-
PolicyDeletion bool
47+
Scheme *runtime.Scheme
48+
S3Client factory.S3Client
49+
PolicyDeletion bool
50+
S3LabelSelectorValue string
5051
}
5152

5253
//+kubebuilder:rbac:groups=s3.onyxia.sh,resources=policies,verbs=get;list;watch;create;update;patch;delete
@@ -75,6 +76,19 @@ func (r *PolicyReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
7576
return ctrl.Result{}, err
7677
}
7778

79+
// check if this object must be manage by this instance
80+
if r.S3LabelSelectorValue != "" {
81+
labelSelectorValue, found := policyResource.Labels[utils.S3OperatorPolicyLabelSelectorKey]
82+
if !found {
83+
logger.Info("This policy ressouce will not be manage by this instance because this instance require that policy get labelSelector and label selector not found", "req.Name", req.Name, "Policy Labels", policyResource.Labels, "S3OperatorPolicyLabelSelectorKey", utils.S3OperatorPolicyLabelSelectorKey)
84+
return ctrl.Result{}, nil
85+
}
86+
if labelSelectorValue != r.S3LabelSelectorValue {
87+
logger.Info("This policy ressouce will not be manage by this instance because this instance require that policy get specific a specific labelSelector value", "req.Name", req.Name, "expected", r.S3LabelSelectorValue, "current", labelSelectorValue)
88+
return ctrl.Result{}, nil
89+
}
90+
}
91+
7892
// Managing policy deletion with a finalizer
7993
// REF : https://sdk.operatorframework.io/docs/building-operators/golang/advanced-topics/#external-resources
8094
isMarkedForDeletion := policyResource.GetDeletionTimestamp() != nil

controllers/user_controller.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ type S3UserReconciler struct {
5151
S3Client factory.S3Client
5252
S3UserDeletion bool
5353
OverrideExistingSecret bool
54+
S3LabelSelectorValue string
5455
}
5556

5657
const (
@@ -81,6 +82,19 @@ func (r *S3UserReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
8182
return ctrl.Result{}, err
8283
}
8384

85+
// check if this object must be manage by this instance
86+
if r.S3LabelSelectorValue != "" {
87+
labelSelectorValue, found := userResource.Labels[utils.S3OperatorUserLabelSelectorKey]
88+
if !found {
89+
logger.Info("This user ressouce will not be manage by this instance because this instance require that Bucket get labelSelector and label selector not found", "req.Name", req.Name, "Bucket Labels", userResource.Labels, "S3OperatorBucketLabelSelectorKey", utils.S3OperatorBucketLabelSelectorKey)
90+
return ctrl.Result{}, nil
91+
}
92+
if labelSelectorValue != r.S3LabelSelectorValue {
93+
logger.Info("This user ressouce will not be manage by this instance because this instance require that Bucket get specific a specific labelSelector value", "req.Name", req.Name, "expected", r.S3LabelSelectorValue, "current", labelSelectorValue)
94+
return ctrl.Result{}, nil
95+
}
96+
}
97+
8498
// Check if the userResource instance is marked to be deleted, which is
8599
// indicated by the deletion timestamp being set. The object will be deleted.
86100
if userResource.GetDeletionTimestamp() != nil {

controllers/utils/const.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package utils
2+
3+
const S3OperatorBucketLabelSelectorKey = "s3operator.bucket.managed-by"
4+
const S3OperatorPathLabelSelectorKey = "s3operator.path.managed-by"
5+
const S3OperatorPolicyLabelSelectorKey = "s3operator.policy.managed-by"
6+
const S3OperatorUserLabelSelectorKey = "s3operator.user.managed-by"

main.go

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ func main() {
8282
var policyDeletion bool
8383
var pathDeletion bool
8484
var s3userDeletion bool
85+
var s3LabelSelector string
8586

8687
//K8S related variable
8788
var overrideExistingSecret bool
@@ -97,6 +98,7 @@ func main() {
9798
flag.StringVar(&s3EndpointUrl, "s3-endpoint-url", "localhost:9000", "Hostname (or hostname:port) of the S3 server")
9899
flag.StringVar(&accessKey, "s3-access-key", "ROOTNAME", "The accessKey of the acount")
99100
flag.StringVar(&secretKey, "s3-secret-key", "CHANGEME123", "The secretKey of the acount")
101+
flag.StringVar(&s3LabelSelector, "s3-label-selector", "", "label selector to filter object managed by this operator if empty all objects are managed")
100102
flag.Var(&caCertificatesBase64, "s3-ca-certificate-base64", "(Optional) Base64 encoded, PEM format certificate file for a certificate authority, for https requests to S3")
101103
flag.StringVar(&caCertificatesBundlePath, "s3-ca-certificate-bundle-path", "", "(Optional) Path to a CA certificate file, for https requests to S3")
102104
flag.StringVar(&region, "region", "us-east-1", "The region to configure for the S3 client")
@@ -173,28 +175,31 @@ func main() {
173175
}
174176

175177
if err = (&controllers.BucketReconciler{
176-
Client: mgr.GetClient(),
177-
Scheme: mgr.GetScheme(),
178-
S3Client: s3Client,
179-
BucketDeletion: bucketDeletion,
178+
Client: mgr.GetClient(),
179+
Scheme: mgr.GetScheme(),
180+
S3Client: s3Client,
181+
BucketDeletion: bucketDeletion,
182+
S3LabelSelectorValue: s3LabelSelector,
180183
}).SetupWithManager(mgr); err != nil {
181184
setupLog.Error(err, "unable to create controller", "controller", "Bucket")
182185
os.Exit(1)
183186
}
184187
if err = (&controllers.PathReconciler{
185-
Client: mgr.GetClient(),
186-
Scheme: mgr.GetScheme(),
187-
S3Client: s3Client,
188-
PathDeletion: pathDeletion,
188+
Client: mgr.GetClient(),
189+
Scheme: mgr.GetScheme(),
190+
S3Client: s3Client,
191+
PathDeletion: pathDeletion,
192+
S3LabelSelectorValue: s3LabelSelector,
189193
}).SetupWithManager(mgr); err != nil {
190194
setupLog.Error(err, "unable to create controller", "controller", "Path")
191195
os.Exit(1)
192196
}
193197
if err = (&controllers.PolicyReconciler{
194-
Client: mgr.GetClient(),
195-
Scheme: mgr.GetScheme(),
196-
S3Client: s3Client,
197-
PolicyDeletion: policyDeletion,
198+
Client: mgr.GetClient(),
199+
Scheme: mgr.GetScheme(),
200+
S3Client: s3Client,
201+
PolicyDeletion: policyDeletion,
202+
S3LabelSelectorValue: s3LabelSelector,
198203
}).SetupWithManager(mgr); err != nil {
199204
setupLog.Error(err, "unable to create controller", "controller", "Policy")
200205
os.Exit(1)
@@ -205,6 +210,7 @@ func main() {
205210
S3Client: s3Client,
206211
S3UserDeletion: s3userDeletion,
207212
OverrideExistingSecret: overrideExistingSecret,
213+
S3LabelSelectorValue: s3LabelSelector,
208214
}).SetupWithManager(mgr); err != nil {
209215
setupLog.Error(err, "unable to create controller", "controller", "S3User")
210216
os.Exit(1)

0 commit comments

Comments
 (0)