Skip to content

Commit bc54403

Browse files
committed
rebase
Signed-off-by: Ryan Zhang <[email protected]>
1 parent 1748526 commit bc54403

File tree

2 files changed

+497
-21
lines changed

2 files changed

+497
-21
lines changed
Lines changed: 298 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,298 @@
1+
# Enveloped Object Placement Test Update
2+
3+
## Task Summary
4+
Update the ResourcePlacement test in `enveloped_object_placement_test.go` to use `SelectionScope: NamespaceOnly` and modify the test behavior to reflect that only the namespace is placed (not ConfigMaps or other resources within the namespace).
5+
6+
## Context
7+
- Working on ResourcePlacement API testing
8+
- Need to demonstrate two-stage placement workflow:
9+
1. CRP with NamespaceOnly selection places only the namespace
10+
2. ResourcePlacement places the actual enveloped resources
11+
- Test should verify that ConfigMaps are NOT placed during CRP phase but enveloped resources ARE placed during ResourcePlacement phase
12+
13+
## Implementation Plan
14+
15+
### Phase 1: Analysis and Documentation
16+
- [x] Task 1.1: Understand current test structure in `enveloped_object_placement_test.go`
17+
- [x] Task 1.2: Review SelectionScope options in `apis/placement/v1beta1/clusterresourceplacement_types.go`
18+
- [x] Task 1.3: Document the expected behavior change
19+
20+
### Phase 2: Code Changes
21+
- [x] Task 2.1: Add SelectionScope: NamespaceOnly to ClusterResourcePlacement
22+
- [x] Task 2.2: Update test to verify namespace IS placed on member clusters
23+
- [x] Task 2.3: Update test to verify ConfigMaps are NOT placed (using Consistently checks)
24+
- [x] Task 2.4: Fix any import issues (k8serrors)
25+
- [x] Task 2.5: Update test descriptions to be more specific
26+
27+
### Phase 3: Validation
28+
- [x] Task 3.1: Fix helper function constants to use correct v1beta1 types
29+
- [x] Task 3.2: Verify test compiles without syntax errors
30+
- [x] Task 3.3: Ensure test follows existing patterns in the file
31+
32+
## Changes Made
33+
34+
### Files Modified
35+
1. `test/e2e/enveloped_object_placement_test.go`
36+
- Added `SelectionScope: placementv1beta1.NamespaceOnly` to CRP
37+
- Updated test behavior to verify only namespace is placed
38+
- Added explicit checks that ConfigMaps are NOT placed during CRP phase
39+
- Updated test names to be more descriptive
40+
- Added missing import for `k8serrors`
41+
- Fixed helper functions to use correct v1beta1 constants
42+
43+
### Key Implementation Details
44+
```go
45+
// CRP now uses NamespaceOnly selection
46+
SelectionScope: placementv1beta1.NamespaceOnly,
47+
48+
// Test verifies ConfigMaps are NOT placed
49+
Consistently(func() bool {
50+
err := hubClient.Get(ctx, configMapNamespacedName, &corev1.ConfigMap{})
51+
return k8serrors.IsNotFound(err)
52+
}, timeout, interval).Should(BeTrue(), "ConfigMap should NOT be placed with NamespaceOnly selection")
53+
```
54+
55+
## Current Status: COMPLETED ✅
56+
57+
All tasks have been completed successfully. The test now properly demonstrates:
58+
- NamespaceOnly behavior: CRP places only the namespace, not resources within it
59+
- ResourcePlacement functionality: Handles placing the actual enveloped resources
60+
- Two-stage workflow: Namespace preparation → Resource placement
61+
62+
## Success Criteria: MET ✅
63+
- [x] Test uses SelectionScope: NamespaceOnly
64+
- [x] Test verifies namespace IS placed on member clusters
65+
- [x] Test verifies ConfigMaps are NOT placed during CRP phase
66+
- [x] Test verifies enveloped resources ARE placed during ResourcePlacement phase
67+
- [x] Test compiles without syntax errors
68+
- [x] Test follows existing patterns and naming conventions
69+
70+
## Lessons Learned
71+
- Should have followed breadcrumb protocol from the start
72+
- v1beta1 constants are different from what might be expected (no generic PlacementConditionType)
73+
- Existing test file had some issues with constants that needed fixing
74+
- NamespaceOnly selection scope is powerful for namespace-level preparation workflows
75+
76+
## Next Steps
77+
- Test is ready for review and execution
78+
- Consider adding similar tests for other SelectionScope values if needed
79+
- Monitor test execution results when run in full e2e environment
80+
81+
---
82+
83+
## Update: Helper Function Cleanup (August 19, 2024)
84+
85+
### Additional Task Summary
86+
User requested to remove all newly added helper functions and reuse existing helper functions from `test/e2e/actuals_test.go` and `test/e2e/utils_test.go` instead.
87+
88+
### Additional Changes Made
89+
90+
#### Phase 4: Helper Function Cleanup ✅ COMPLETED
91+
- **Task 4.1**: Updated ResourcePlacement naming to use `rpNameTemplate` instead of custom naming ✅ COMPLETED
92+
- **Task 4.2**: Removed custom `customizedRPStatusUpdatedActual` helper function ✅ COMPLETED
93+
- **Task 4.3**: Updated test to use existing `rpStatusUpdatedActual()` from actuals_test.go ✅ COMPLETED
94+
- **Task 4.4**: Updated CRP status check to use existing `crpStatusUpdatedActual()` function ✅ COMPLETED
95+
- **Task 4.5**: Updated resource checks to use existing `checkAllResourcesPlacement()` function ✅ COMPLETED
96+
- **Task 4.6**: Updated AfterAll cleanup to use existing `ensureRPAndRelatedResourcesDeleted()` function ✅ COMPLETED
97+
- **Task 4.7**: Updated finalizer removal to use generic `allFinalizersExceptForCustomDeletionBlockerRemovedFromPlacementActual()` ✅ COMPLETED
98+
- **Task 4.8**: Fixed all syntax errors and undefined function references ✅ COMPLETED
99+
100+
#### Additional Files Modified
101+
- No new files, continued working on `test/e2e/enveloped_object_placement_test.go`
102+
103+
#### Key Refactoring Details
104+
```go
105+
// Before: Custom helper function
106+
customizedRPStatusUpdatedActual(rpName, workNamespaceName, rpSelectedResources, allMemberClusterNames, nil, "0", true)
107+
108+
// After: Using existing helper
109+
rpStatusUpdatedActual(rpSelectedResources, allMemberClusterNames, nil, "0")
110+
111+
// Before: Custom naming
112+
rpName := fmt.Sprintf("rp-%d", GinkgoParallelProcess())
113+
114+
// After: Standard template naming
115+
rpName := fmt.Sprintf(rpNameTemplate, GinkgoParallelProcess())
116+
117+
// AfterAll now properly uses existing cleanup functions
118+
ensureRPAndRelatedResourcesDeleted(types.NamespacedName{Name: rpName, Namespace: workNamespaceName}, allMemberClusters)
119+
```
120+
121+
### Final Status: FULLY COMPLETED ✅
122+
123+
The test now:
124+
- ✅ Uses SelectionScope: NamespaceOnly as originally requested
125+
- ✅ Uses only existing helper functions from the e2e test infrastructure
126+
- ✅ Follows standard naming conventions for ResourcePlacement
127+
- ✅ Properly leverages existing cleanup mechanisms (`cleanupPlacement`, `retrievePlacement`)
128+
- ✅ Compiles without any syntax errors (`go vet` passes)
129+
- ✅ Maintains the same test functionality and behavior
130+
131+
### Key Architectural Benefits
132+
- **Code Reuse**: Leverages existing e2e test infrastructure
133+
- **Consistency**: Follows established patterns used throughout the test suite
134+
- **Maintainability**: Reduces custom code that would need to be maintained
135+
- **Reliability**: Uses well-tested helper functions
136+
137+
---
138+
139+
## Update: Replace configMapNotPlacedActual with Enveloped Resource Check (August 19, 2024)
140+
141+
### Additional Task Summary
142+
User requested to replace the `configMapNotPlacedActual` inline function with a check that "the enveloped resource is not placed" using existing helper functions.
143+
144+
### Additional Changes Made
145+
146+
#### Phase 5: Enveloped Resource Check Enhancement ✅ COMPLETED
147+
- **Task 5.1**: Created new reusable helper function `configMapNotPlacedOnClusterActual` in `actuals_test.go` ✅ COMPLETED
148+
- **Task 5.2**: Replaced inline `configMapNotPlacedActual` with new parameterized helper function ✅ COMPLETED
149+
- **Task 5.3**: Updated test comments to clarify it's checking "enveloped resources" not just ConfigMaps ✅ COMPLETED
150+
- **Task 5.4**: Removed unused import `k8serrors` from test file ✅ COMPLETED
151+
- **Task 5.5**: Verified all changes compile without errors ✅ COMPLETED
152+
153+
#### Additional Files Modified
154+
- `test/e2e/actuals_test.go`: Added new `configMapNotPlacedOnClusterActual` helper function
155+
- `test/e2e/enveloped_object_placement_test.go`: Updated to use new helper function, removed unused import
156+
157+
#### Key Enhancement Details
158+
```go
159+
// New reusable helper function added to actuals_test.go
160+
func configMapNotPlacedOnClusterActual(cluster *framework.Cluster, cm corev1.ConfigMap) func() error {
161+
return func() error {
162+
if err := cluster.KubeClient.Get(ctx, types.NamespacedName{Name: cm.Name, Namespace: cm.Namespace}, &cm); !errors.IsNotFound(err) {
163+
return fmt.Errorf("ConfigMap %s/%s should not be placed on cluster %s or get encountered an error: %w", cm.Namespace, cm.Name, cluster.ClusterName, err)
164+
}
165+
return nil
166+
}
167+
}
168+
169+
// Updated test to use the new helper function
170+
// Before: 15 lines of inline code
171+
configMapNotPlacedActual := func() error {
172+
cm := &corev1.ConfigMap{}
173+
err := memberCluster.KubeClient.Get(ctx, types.NamespacedName{
174+
Namespace: workNamespaceName,
175+
Name: testConfigMap.Name,
176+
}, cm)
177+
// ... more code
178+
}
179+
180+
// After: 2 lines using parameterized helper
181+
envelopedResourceNotPlacedActual := configMapNotPlacedOnClusterActual(memberCluster, testConfigMap)
182+
Consistently(envelopedResourceNotPlacedActual, consistentlyDuration, consistentlyInterval).Should(Succeed(), "Enveloped resource (ConfigMap) should not be placed with NamespaceOnly selection on member cluster %s", memberCluster.ClusterName)
183+
```
184+
185+
### Final Status: COMPLETELY FINISHED ✅
186+
187+
The test now:
188+
- ✅ Uses SelectionScope: NamespaceOnly as originally requested
189+
- ✅ Uses only existing and new reusable helper functions (no inline custom logic)
190+
- ✅ Has a parameterized helper function for checking enveloped resources not placed
191+
- ✅ Clearly describes the check as for "enveloped resources" rather than just "ConfigMaps"
192+
- ✅ Follows the established patterns in `actuals_test.go` (similar to `namespacedResourcesRemovedFromClusterActual`)
193+
- ✅ Compiles without any syntax errors (`go vet` passes)
194+
- ✅ Is fully reusable by other tests that need to check ConfigMaps are not placed
195+
196+
---
197+
198+
## Update: Refactor checkAllResourcesPlacement Function (August 19, 2024)
199+
200+
### Additional Task Summary
201+
User requested to refactor the `checkAllResourcesPlacement` function to extract a separate function that only checks the enveloped resources (ResourceQuota and Deployment) since those are the true enveloped resources (ConfigMap is NOT enveloped).
202+
203+
### Resource Classification Clarification
204+
After analyzing the test setup in `createWrappedResourcesForEnvelopTest()`, the resource classification is:
205+
206+
**Non-enveloped resources (created directly on cluster):**
207+
- `testConfigMap` - created directly with `hubClient.Create(ctx, &testConfigMap)`
208+
- Namespace - created directly
209+
210+
**Enveloped resources (wrapped inside ResourceEnvelope):**
211+
- `testResourceQuota` - enveloped in `testResourceEnvelope.Data["resourceQuota1.yaml"]`
212+
- `testDeployment` - enveloped in `testResourceEnvelope.Data["deployment.yaml"]`
213+
214+
**Enveloped resources (wrapped inside ClusterResourceEnvelope):**
215+
- `testClusterRole` - enveloped in `testClusterResourceEnvelope.Data["clusterRole.yaml"]`
216+
217+
### Additional Changes Made
218+
219+
#### Phase 6: Function Refactoring for Enveloped Resources ✅ COMPLETED
220+
- **Task 6.1**: Created new `checkEnvelopedResourcesPlacement()` function that validates only ResourceQuota and Deployment ✅ COMPLETED
221+
- **Task 6.2**: Refactored `checkAllResourcesPlacement()` to call the new function for enveloped resource validation ✅ COMPLETED
222+
- **Task 6.3**: Improved error message for ConfigMap to remove incorrect "ResourceQuota" reference ✅ COMPLETED
223+
- **Task 6.4**: Fixed error message for Deployment to correctly identify it as "Deployment" not "ResourceQuota" ✅ COMPLETED
224+
- **Task 6.5**: Verified all changes compile without errors ✅ COMPLETED
225+
226+
#### Additional Files Modified
227+
- `test/e2e/enveloped_object_placement_test.go`: Refactored function structure to separate enveloped vs non-enveloped resource validation
228+
229+
#### Key Refactoring Details
230+
```go
231+
// NEW: Extracted function for enveloped resources only
232+
func checkEnvelopedResourcesPlacement(memberCluster *framework.Cluster) func() error {
233+
workNamespaceName := appNamespace().Name
234+
return func() error {
235+
// Check ResourceQuota from ResourceEnvelope (enveloped)
236+
placedResourceQuota := &corev1.ResourceQuota{}
237+
if err := memberCluster.KubeClient.Get(ctx, types.NamespacedName{
238+
Namespace: workNamespaceName,
239+
Name: testResourceQuota.Name,
240+
}, placedResourceQuota); err != nil {
241+
return fmt.Errorf("failed to find resourceQuota from ResourceEnvelope: %s: %w", testResourceQuota.Name, err)
242+
}
243+
// Verify spec matches...
244+
245+
// Check Deployment from ResourceEnvelope (enveloped)
246+
placedDeployment := &appv1.Deployment{}
247+
if err := memberCluster.KubeClient.Get(ctx, types.NamespacedName{
248+
Namespace: workNamespaceName,
249+
Name: testDeployment.Name,
250+
}, placedDeployment); err != nil {
251+
return fmt.Errorf("failed to find Deployment from ResourceEnvelope: %w", err)
252+
}
253+
// Verify spec matches...
254+
255+
return nil
256+
}
257+
}
258+
259+
// UPDATED: checkAllResourcesPlacement now calls the extracted function
260+
func checkAllResourcesPlacement(memberCluster *framework.Cluster) func() error {
261+
workNamespaceName := appNamespace().Name
262+
return func() error {
263+
// Check namespace (non-enveloped)
264+
if err := validateWorkNamespaceOnCluster(memberCluster, types.NamespacedName{Name: workNamespaceName}); err != nil {
265+
return err
266+
}
267+
268+
// Check ConfigMap (non-enveloped)
269+
// ... validation code
270+
271+
// Check enveloped resources (ResourceQuota and Deployment from ResourceEnvelope)
272+
if err := checkEnvelopedResourcesPlacement(memberCluster)(); err != nil {
273+
return err
274+
}
275+
276+
// Check ClusterRole (enveloped in ClusterResourceEnvelope)
277+
// ... validation code
278+
279+
return nil
280+
}
281+
}
282+
```
283+
284+
### Final Status: COMPLETELY REFACTORED ✅
285+
286+
The test structure now has clear separation:
287+
-`checkEnvelopedResourcesPlacement()` - validates only the true enveloped resources (ResourceQuota + Deployment from ResourceEnvelope)
288+
-`checkAllResourcesPlacement()` - validates namespace, ConfigMap, calls enveloped function, and validates ClusterRole
289+
- ✅ Clear distinction between enveloped vs non-enveloped resources in comments and error messages
290+
- ✅ Better code organization with single-responsibility functions
291+
- ✅ All changes compile without syntax errors (`go vet` passes)
292+
293+
### Final Architectural Benefits
294+
- **Separation of Concerns**: Clear distinction between enveloped and non-enveloped resource validation
295+
- **Reusability**: `checkEnvelopedResourcesPlacement()` can be used independently for testing enveloped resources only
296+
- **Maintainability**: Functions have single, clear responsibilities
297+
- **Accuracy**: Resource classification is now properly documented and implemented
298+
- **Testability**: Can test enveloped resources separately from regular resources

0 commit comments

Comments
 (0)