Skip to content

Commit 0939ef3

Browse files
authored
Merge pull request #7 from kcp-dev/fix-state-namespace
⚠️ move object states Secrets to the namespace where the agent is running
2 parents 5ca4390 + 7b539c2 commit 0939ef3

File tree

7 files changed

+30
-12
lines changed

7 files changed

+30
-12
lines changed

cmd/api-syncagent/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ func run(ctx context.Context, log *zap.SugaredLogger, opts *Options) error {
138138
return fmt.Errorf("failed to add apiexport controller: %w", err)
139139
}
140140

141-
if err := syncmanager.Add(ctx, mgr, kcpCluster, kcpRestConfig, log, apiExport, opts.PublishedResourceSelector); err != nil {
141+
if err := syncmanager.Add(ctx, mgr, kcpCluster, kcpRestConfig, log, apiExport, opts.PublishedResourceSelector, opts.Namespace); err != nil {
142142
return fmt.Errorf("failed to add syncmanager controller: %w", err)
143143
}
144144

internal/controller/sync/controller.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ func Create(
6363
pubRes *syncagentv1alpha1.PublishedResource,
6464
discoveryClient *discovery.Client,
6565
apiExportName string,
66+
stateNamespace string,
6667
log *zap.SugaredLogger,
6768
numWorkers int,
6869
) (controller.Controller, error) {
@@ -86,7 +87,7 @@ func Create(
8687

8788
// create the syncer that holds the meat&potatoes of the synchronization logic
8889
mutator := mutation.NewMutator(nil) // pubRes.Spec.Mutation
89-
syncer, err := sync.NewResourceSyncer(log, localManager.GetClient(), virtualWorkspaceCluster.GetClient(), pubRes, localCRD, apiExportName, mutator)
90+
syncer, err := sync.NewResourceSyncer(log, localManager.GetClient(), virtualWorkspaceCluster.GetClient(), pubRes, localCRD, apiExportName, mutator, stateNamespace)
9091
if err != nil {
9192
return nil, fmt.Errorf("failed to create syncer: %w", err)
9293
}

internal/controller/syncmanager/controller.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ type Reconciler struct {
6969
recorder record.EventRecorder
7070
discoveryClient *discovery.Client
7171
prFilter labels.Selector
72+
stateNamespace string
7273

7374
apiExport *kcpdevv1alpha1.APIExport
7475

@@ -93,6 +94,7 @@ func Add(
9394
log *zap.SugaredLogger,
9495
apiExport *kcpdevv1alpha1.APIExport,
9596
prFilter labels.Selector,
97+
stateNamespace string,
9698
) error {
9799
reconciler := &Reconciler{
98100
ctx: ctx,
@@ -105,6 +107,7 @@ func Add(
105107
syncWorkers: map[string]lifecycle.Controller{},
106108
discoveryClient: discovery.NewClient(localManager.GetClient()),
107109
prFilter: prFilter,
110+
stateNamespace: stateNamespace,
108111
}
109112

110113
_, err := builder.ControllerManagedBy(localManager).
@@ -276,6 +279,7 @@ func (r *Reconciler) ensureSyncControllers(ctx context.Context, log *zap.Sugared
276279
&pubRes,
277280
r.discoveryClient,
278281
r.apiExport.Name,
282+
r.stateNamespace,
279283
r.log,
280284
numSyncWorkers,
281285
)

internal/sync/state_store.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,15 @@ type objectStateStore struct {
4343
backend backend
4444
}
4545

46-
func newObjectStateStore(primaryObject, stateCluster syncSide) ObjectStateStore {
47-
kubernetes := newKubernetesBackend(primaryObject, stateCluster)
48-
46+
func newObjectStateStore(backend backend) ObjectStateStore {
4947
return &objectStateStore{
50-
backend: kubernetes,
48+
backend: backend,
49+
}
50+
}
51+
52+
func newKubernetesStateStoreCreator(namespace string) newObjectStateStoreFunc {
53+
return func(primaryObject, stateCluster syncSide) ObjectStateStore {
54+
return newObjectStateStore(newKubernetesBackend(namespace, primaryObject, stateCluster))
5155
}
5256
}
5357

@@ -124,7 +128,7 @@ func hashObject(obj *unstructured.Unstructured) string {
124128
return hex.EncodeToString(hash.Sum(nil))
125129
}
126130

127-
func newKubernetesBackend(primaryObject, stateCluster syncSide) *kubernetesBackend {
131+
func newKubernetesBackend(namespace string, primaryObject, stateCluster syncSide) *kubernetesBackend {
128132
keyHash := hashObject(primaryObject.object)
129133

130134
secretLabels := newObjectKey(primaryObject.object, primaryObject.clusterName).Labels()
@@ -134,7 +138,7 @@ func newKubernetesBackend(primaryObject, stateCluster syncSide) *kubernetesBacke
134138
secretName: types.NamespacedName{
135139
// trim hash down; 20 was chosen at random
136140
Name: fmt.Sprintf("obj-state-%s-%s", primaryObject.clusterName, keyHash[:20]),
137-
Namespace: "kcp-system",
141+
Namespace: namespace,
138142
},
139143
labels: secretLabels,
140144
stateCluster: stateCluster,

internal/sync/state_store_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ func TestStateStoreBasics(t *testing.T) {
3838

3939
serviceClusterClient := buildFakeClient()
4040
ctx := context.Background()
41+
stateNamespace := "kcp-system"
4142

4243
primaryObjectSide := syncSide{
4344
object: primaryObject,
@@ -48,7 +49,8 @@ func TestStateStoreBasics(t *testing.T) {
4849
client: serviceClusterClient,
4950
}
5051

51-
store := newObjectStateStore(primaryObjectSide, stateSide)
52+
storeCreator := newKubernetesStateStoreCreator(stateNamespace)
53+
store := storeCreator(primaryObjectSide, stateSide)
5254

5355
///////////////////////////////////////
5456
// get nil from empty store

internal/sync/syncer.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ func NewResourceSyncer(
5959
localCRD *apiextensionsv1.CustomResourceDefinition,
6060
remoteAPIGroup string,
6161
mutator mutation.Mutator,
62+
stateNamespace string,
6263
) (*ResourceSyncer, error) {
6364
// create a dummy that represents the type used on the local service cluster
6465
localGVK := projection.PublishedResourceSourceGVK(pubRes)
@@ -100,7 +101,7 @@ func NewResourceSyncer(
100101
subresources: subresources,
101102
destDummy: localDummy,
102103
mutator: mutator,
103-
newObjectStateStore: newObjectStateStore,
104+
newObjectStateStore: newKubernetesStateStoreCreator(stateNamespace),
104105
}, nil
105106
}
106107

internal/sync/syncer_test.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -792,6 +792,8 @@ func TestSyncerProcessingSingleResourceWithoutStatus(t *testing.T) {
792792
},
793793
}
794794

795+
const stateNamespace = "kcp-system"
796+
795797
for _, testcase := range testcases {
796798
t.Run(testcase.name, func(t *testing.T) {
797799
localClient := buildFakeClient(testcase.localObject)
@@ -806,6 +808,7 @@ func TestSyncerProcessingSingleResourceWithoutStatus(t *testing.T) {
806808
testcase.localCRD,
807809
testcase.remoteAPIGroup,
808810
nil,
811+
stateNamespace,
809812
)
810813
if err != nil {
811814
t.Fatalf("Failed to create syncer: %v", err)
@@ -820,7 +823,7 @@ func TestSyncerProcessingSingleResourceWithoutStatus(t *testing.T) {
820823
syncer.newObjectStateStore = func(primaryObject, stateCluster syncSide) ObjectStateStore {
821824
// .Process() is called multiple times, but we want the state to persist between reconciles.
822825
if backend == nil {
823-
backend = newKubernetesBackend(primaryObject, stateCluster)
826+
backend = newKubernetesBackend(stateNamespace, primaryObject, stateCluster)
824827
if testcase.existingState != "" {
825828
if err := backend.Put(testcase.remoteObject, clusterName.String(), []byte(testcase.existingState)); err != nil {
826829
t.Fatalf("Failed to prime state store: %v", err)
@@ -1086,6 +1089,8 @@ func TestSyncerProcessingSingleResourceWithStatus(t *testing.T) {
10861089
},
10871090
}
10881091

1092+
const stateNamespace = "kcp-system"
1093+
10891094
for _, testcase := range testcases {
10901095
t.Run(testcase.name, func(t *testing.T) {
10911096
localClient := buildFakeClientWithStatus(testcase.localObject)
@@ -1100,6 +1105,7 @@ func TestSyncerProcessingSingleResourceWithStatus(t *testing.T) {
11001105
testcase.localCRD,
11011106
testcase.remoteAPIGroup,
11021107
nil,
1108+
stateNamespace,
11031109
)
11041110
if err != nil {
11051111
t.Fatalf("Failed to create syncer: %v", err)
@@ -1114,7 +1120,7 @@ func TestSyncerProcessingSingleResourceWithStatus(t *testing.T) {
11141120
syncer.newObjectStateStore = func(primaryObject, stateCluster syncSide) ObjectStateStore {
11151121
// .Process() is called multiple times, but we want the state to persist between reconciles.
11161122
if backend == nil {
1117-
backend = newKubernetesBackend(primaryObject, stateCluster)
1123+
backend = newKubernetesBackend(stateNamespace, primaryObject, stateCluster)
11181124
if testcase.existingState != "" {
11191125
if err := backend.Put(testcase.remoteObject, clusterName.String(), []byte(testcase.existingState)); err != nil {
11201126
t.Fatalf("Failed to prime state store: %v", err)

0 commit comments

Comments
 (0)