Skip to content

Commit c2ac0b3

Browse files
authored
feat: enable skipping clusters in CRD management (#125)
1 parent bea1a9f commit c2ac0b3

File tree

3 files changed

+52
-7
lines changed

3 files changed

+52
-7
lines changed

pkg/crds/crds.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ func (m *CRDManager) AddCRDLabelToClusterMapping(labelValue string, cluster *clu
3939
m.crdLabelsToClusterMappings[labelValue] = cluster
4040
}
4141

42+
func (m *CRDManager) SkipCRDsWithClusterLabel(labelValue string) {
43+
m.crdLabelsToClusterMappings[labelValue] = nil
44+
}
45+
4246
func (m *CRDManager) CreateOrUpdateCRDs(ctx context.Context, log *logging.Logger) error {
4347
crds, err := m.crdList()
4448
if err != nil {
@@ -48,14 +52,20 @@ func (m *CRDManager) CreateOrUpdateCRDs(ctx context.Context, log *logging.Logger
4852
var errs error
4953

5054
for _, crd := range crds {
51-
c, err := m.getClusterForCRD(crd)
55+
c, cLabel, err := m.getClusterForCRD(crd)
5256
if err != nil {
5357
errs = errors.Join(errs, err)
5458
continue
5559
}
5660

61+
if c == nil {
62+
if log != nil {
63+
log.Info("Skipping CRD because the assigned cluster is nil", "name", crd.Name, "clusterLabel", cLabel)
64+
}
65+
continue
66+
}
5767
if log != nil {
58-
log.Info("creating/updating CRD", "name", crd.Name, "cluster", c.ID())
68+
log.Info("Creating/updating CRD", "name", crd.Name, "cluster", c.ID())
5969
}
6070
m := resources.NewCRDMutator(crd)
6171
m.MetadataMutator().WithLabels(crd.Labels).WithAnnotations(crd.Annotations)
@@ -69,18 +79,18 @@ func (m *CRDManager) CreateOrUpdateCRDs(ctx context.Context, log *logging.Logger
6979
return nil
7080
}
7181

72-
func (m *CRDManager) getClusterForCRD(crd *apiextv1.CustomResourceDefinition) (*clusters.Cluster, error) {
82+
func (m *CRDManager) getClusterForCRD(crd *apiextv1.CustomResourceDefinition) (*clusters.Cluster, string, error) {
7383
labelValue, ok := controller.GetLabel(crd, m.mappingLabelName)
7484
if !ok {
75-
return nil, fmt.Errorf("missing label '%s' for CRD '%s'", m.mappingLabelName, crd.Name)
85+
return nil, "", fmt.Errorf("missing label '%s' for CRD '%s'", m.mappingLabelName, crd.Name)
7686
}
7787

7888
cluster, ok := m.crdLabelsToClusterMappings[labelValue]
7989
if !ok {
80-
return nil, fmt.Errorf("no cluster mapping found for label value '%s' in CRD '%s'", labelValue, crd.Name)
90+
return nil, labelValue, fmt.Errorf("no cluster mapping found for label value '%s' in CRD '%s'", labelValue, crd.Name)
8191
}
8292

83-
return cluster, nil
93+
return cluster, labelValue, nil
8494
}
8595

8696
// CRDsFromFileSystem reads CRDs from the specified filesystem path.

pkg/crds/crds_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ var _ = Describe("CRDsFromFileSystem", func() {
3131
crdPath := "testdata"
3232
crdsList, err := crds.CRDsFromFileSystem(testFS, crdPath)
3333
Expect(err).NotTo(HaveOccurred())
34-
Expect(crdsList).To(HaveLen(2))
34+
Expect(crdsList).To(HaveLen(3))
3535

3636
// Validate the first CRD
3737
Expect(crdsList[0].Name).To(Equal("testresources.example.com"))
@@ -69,6 +69,11 @@ var _ = Describe("CRDManager", func() {
6969

7070
ctx := context.Background()
7171

72+
// CRD creation should fail due to unknown cluster label
73+
Expect(crdManager.CreateOrUpdateCRDs(ctx, nil)).To(HaveOccurred())
74+
75+
crdManager.SkipCRDsWithClusterLabel("cluster_c")
76+
7277
err = crdManager.CreateOrUpdateCRDs(ctx, nil)
7378
Expect(err).NotTo(HaveOccurred())
7479

pkg/crds/testdata/crd_c.yaml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
apiVersion: apiextensions.k8s.io/v1
2+
kind: CustomResourceDefinition
3+
metadata:
4+
name: unused.example.com
5+
labels:
6+
openmcp.cloud/cluster: "cluster_c"
7+
spec:
8+
group: example.com
9+
names:
10+
kind: TestResource
11+
listKind: TestResourceList
12+
plural: testresources
13+
singular: testresource
14+
scope: Namespaced
15+
versions:
16+
- name: v1
17+
served: true
18+
storage: true
19+
schema:
20+
openAPIV3Schema:
21+
type: object
22+
properties:
23+
spec:
24+
type: object
25+
properties:
26+
name:
27+
type: string
28+
replicas:
29+
type: integer
30+
minimum: 1

0 commit comments

Comments
 (0)