From e77b68c887e186e9298005a38b8d1c9347d05131 Mon Sep 17 00:00:00 2001 From: Nico Andres Date: Fri, 6 Mar 2026 13:21:04 +0100 Subject: [PATCH 1/6] Add batch 2 upgrade test resources --- docs/upgrade-testing.md | 56 +++++++++++++++++-- test/upgrade/testdata/baseCrs/import.yaml | 14 +++++ .../baseCrs/service_credential_binding.yaml | 14 +++++ .../testdata/baseCrs/service_instance.yaml | 17 ++++++ .../testdata/baseCrs/space_members.yaml | 17 ++++++ test/upgrade/testdata/baseCrs/space_role.yaml | 2 +- 6 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 test/upgrade/testdata/baseCrs/service_credential_binding.yaml create mode 100644 test/upgrade/testdata/baseCrs/service_instance.yaml create mode 100644 test/upgrade/testdata/baseCrs/space_members.yaml diff --git a/docs/upgrade-testing.md b/docs/upgrade-testing.md index 09c8af48..3e9bbc8f 100644 --- a/docs/upgrade-testing.md +++ b/docs/upgrade-testing.md @@ -60,9 +60,15 @@ You need valid CloudFoundry credentials with appropriate permissions: ## Quick Start -### ⚠️ IMPORTANT: Configure Your CF Organization First +### ⚠️ IMPORTANT: Necessary configuration steps before running any tests -Before running any tests, you **must** update the organization name to one you have access to: +Some configuration steps are necessary before you can successfully run any upgrade tests: +- Configure your CF organization +- Configure your CF space + +#### CF Organization + +Before running any tests, you **must** update the organization name to one you have access: 1. **List your available CF organizations:** ```bash @@ -85,6 +91,42 @@ spec: name: your-org-name-here # ← Change this to your CF org name ``` +#### CF Space + +Before running the base tests, you **must** update the space name to one in your organization. +That can either be an existing one you have atleast the SpaceDeveloper role in or you create a new one as describe below: + +1. **Optionally create and configure a new CF Space** + +Create a space and give your user the SpaceDeveloper role +```bash +cf create-space -o # Create a space in your org +cf set-space-role SpaceDeveloper # Assign your user the SpaceDeveloper role +``` + +2. **List your available CF spaces:** +```bash +cf spaces # List spaces +``` +3. **Update the spaces name** in test manifests: +- For base tests: `test/upgrade/testdata/baseCrs/import.yaml`: +- For custom tests: `test/upgrade/testdata/customCRs/*/import.yaml` (if applicable) +```yaml +apiVersion: cloudfoundry.crossplane.io/v1alpha1 +kind: Space +metadata: + name: upgrade-test-import-space +spec: + managementPolicies: + - Observe + forProvider: + name: upgrade-test-space-donotdelete # ← Change this to you CF space name + orgRef: + name: upgrade-test-org + providerConfigRef: + name: default +``` + ### 1. Set Environment Variables #### Option A: Use the provided template @@ -194,6 +236,9 @@ Base tests use YAML manifests from `test/upgrade/testdata/baseCrs/`. Currently t - **Domain** - **SpaceQuota** - **SpaceRole** +- **SpaceMembers** +- **ServiceInstance** +- **ServiceCredentialBinding** #### Test Base Resource Dependencies - **SpaceRole:** A space role can only be assigned to a user if the user is also a member of the space's organization.\ @@ -317,11 +362,14 @@ test/ ├── upgrade/ │ ├── testdata/ │ │ ├── baseCrs/ # Base upgrade test resources -│ │ │ ├── import.yaml # Organization (observe) +│ │ │ ├── import.yaml # Organization (observe) + Space (observe) │ │ │ ├── space.yaml # Space (create) | │ │ ├── domain.yaml | │ │ ├── space_quota.yaml -| │ │ └── space_role.yaml +| │ │ ├── space_role.yaml +| │ │ ├── service_credential_binding.yaml +| │ │ ├── service_instance.yaml +| │ │ └── space_members.yaml │ │ └── customCRs/ # Custom upgrade test resources │ │ └── externalNames/ # External-name validation test │ │ ├── space.yaml diff --git a/test/upgrade/testdata/baseCrs/import.yaml b/test/upgrade/testdata/baseCrs/import.yaml index 1833fa9f..19a7d613 100644 --- a/test/upgrade/testdata/baseCrs/import.yaml +++ b/test/upgrade/testdata/baseCrs/import.yaml @@ -9,5 +9,19 @@ spec: # IMPORTANT: Change this to an org you have access to # Run `cf orgs` to see available organizations name: cf-ci-e2e # ← TODO: Change this to an existing org name + providerConfigRef: + name: default +--- +apiVersion: cloudfoundry.crossplane.io/v1alpha1 +kind: Space +metadata: + name: upgrade-test-import-space +spec: + managementPolicies: + - Observe + forProvider: + name: upgrade-test-space-donotdelete + orgRef: + name: upgrade-test-org # ← References the imported org providerConfigRef: name: default \ No newline at end of file diff --git a/test/upgrade/testdata/baseCrs/service_credential_binding.yaml b/test/upgrade/testdata/baseCrs/service_credential_binding.yaml new file mode 100644 index 00000000..49b35237 --- /dev/null +++ b/test/upgrade/testdata/baseCrs/service_credential_binding.yaml @@ -0,0 +1,14 @@ +apiVersion: cloudfoundry.crossplane.io/v1alpha1 +kind: ServiceCredentialBinding +metadata: + name: upgrade-test-service-credential-binding +spec: + forProvider: + name: upgrade-test-service-credential-binding + type: key + serviceInstanceRef: + name: upgrade-test-service-instance + policy: + resolve: Always + providerConfigRef: + name: default \ No newline at end of file diff --git a/test/upgrade/testdata/baseCrs/service_instance.yaml b/test/upgrade/testdata/baseCrs/service_instance.yaml new file mode 100644 index 00000000..bd0bbdb9 --- /dev/null +++ b/test/upgrade/testdata/baseCrs/service_instance.yaml @@ -0,0 +1,17 @@ +apiVersion: cloudfoundry.crossplane.io/v1alpha1 +kind: ServiceInstance +metadata: + name: upgrade-test-service-instance +spec: + forProvider: + type: managed + name: upgrade-test-service-instance + spaceRef: + name: upgrade-test-import-space + policy: + resolve: Always + servicePlan: + offering: destination + plan: lite + providerConfigRef: + name: default \ No newline at end of file diff --git a/test/upgrade/testdata/baseCrs/space_members.yaml b/test/upgrade/testdata/baseCrs/space_members.yaml new file mode 100644 index 00000000..aa919412 --- /dev/null +++ b/test/upgrade/testdata/baseCrs/space_members.yaml @@ -0,0 +1,17 @@ +apiVersion: cloudfoundry.crossplane.io/v1alpha1 +kind: SpaceMembers +metadata: + name: upgrade-test-space-members +spec: + forProvider: + roleType: Developers + members: + - username: upgrade-test-space-member-1@example.com + - username: upgrade-test-space-member-2@example.com + spaceRef: + name: upgrade-test-import-space + policy: + resolve: Always + enforcementPolicy: Lax + providerConfigRef: + name: default \ No newline at end of file diff --git a/test/upgrade/testdata/baseCrs/space_role.yaml b/test/upgrade/testdata/baseCrs/space_role.yaml index 9961634d..67041b2e 100644 --- a/test/upgrade/testdata/baseCrs/space_role.yaml +++ b/test/upgrade/testdata/baseCrs/space_role.yaml @@ -5,7 +5,7 @@ metadata: spec: forProvider: type: Developer - username: upgrade-test-user@example.com + username: upgrade-test-space-role@example.com spaceRef: name: upgrade-test-space policy: From 097ee6e5d533852432a1add95d80bce6e98a09e5 Mon Sep 17 00:00:00 2001 From: Nico Andres Date: Fri, 6 Mar 2026 13:39:45 +0100 Subject: [PATCH 2/6] Add ServiceInstance dependency to readme --- docs/upgrade-testing.md | 3 +++ test/upgrade/testdata/baseCrs/service_instance.yaml | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/upgrade-testing.md b/docs/upgrade-testing.md index 3e9bbc8f..b58896a2 100644 --- a/docs/upgrade-testing.md +++ b/docs/upgrade-testing.md @@ -243,6 +243,9 @@ Base tests use YAML manifests from `test/upgrade/testdata/baseCrs/`. Currently t #### Test Base Resource Dependencies - **SpaceRole:** A space role can only be assigned to a user if the user is also a member of the space's organization.\ 🠊 Assign a user to the space's organization by either creating a SpaceMembers/SpaceRole resource or by using the BTP Cockpit +- **ServiceInstance:** A managed service instance requires a ServicePlan specifying an offering and a plan. +If the combination of offering and plan is not available in your space change it something different.\ +🠊 Run `cf marketplace` and update the values in test/upgrade/testdata/baseCrs/service_instance.yaml #### Adding New Base Test Resources diff --git a/test/upgrade/testdata/baseCrs/service_instance.yaml b/test/upgrade/testdata/baseCrs/service_instance.yaml index bd0bbdb9..7da55f8d 100644 --- a/test/upgrade/testdata/baseCrs/service_instance.yaml +++ b/test/upgrade/testdata/baseCrs/service_instance.yaml @@ -11,7 +11,7 @@ spec: policy: resolve: Always servicePlan: - offering: destination - plan: lite + offering: destination # Change the offering if not available + plan: lite # Change the plan if not available providerConfigRef: name: default \ No newline at end of file From 42b522ea7d5aae3eb0764adeb7d9a142be7c41db Mon Sep 17 00:00:00 2001 From: Nico Andres Date: Fri, 6 Mar 2026 13:51:23 +0100 Subject: [PATCH 3/6] Add ServiceCredentialBinding dependency --- docs/upgrade-testing.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/upgrade-testing.md b/docs/upgrade-testing.md index b58896a2..8dbd7abf 100644 --- a/docs/upgrade-testing.md +++ b/docs/upgrade-testing.md @@ -246,6 +246,7 @@ Base tests use YAML manifests from `test/upgrade/testdata/baseCrs/`. Currently t - **ServiceInstance:** A managed service instance requires a ServicePlan specifying an offering and a plan. If the combination of offering and plan is not available in your space change it something different.\ 🠊 Run `cf marketplace` and update the values in test/upgrade/testdata/baseCrs/service_instance.yaml +- **ServiceCredentialBinding:** The ServiceCredentialBinding directly depends on the ServiceInstance it is referencing #### Adding New Base Test Resources From 39da45cf565fdc0bfbb52dccbd0dac53c237c741 Mon Sep 17 00:00:00 2001 From: Nico Andres Date: Fri, 13 Mar 2026 12:04:47 +0100 Subject: [PATCH 4/6] Move baseCrs resources to subdirectories and add annotation --- test/upgrade/testdata/baseCrs/{ => domain}/domain.yaml | 2 ++ test/upgrade/testdata/baseCrs/{ => import}/import.yaml | 4 ++++ .../service_credential_binding.yaml | 2 ++ .../baseCrs/{ => serviceInstance}/service_instance.yaml | 2 ++ test/upgrade/testdata/baseCrs/{ => space}/space.yaml | 2 ++ .../testdata/baseCrs/{ => spaceMembers}/space_members.yaml | 2 ++ .../testdata/baseCrs/{ => spaceQuota}/space_quota.yaml | 2 ++ test/upgrade/testdata/baseCrs/{ => spaceRole}/space_role.yaml | 2 ++ 8 files changed, 18 insertions(+) rename test/upgrade/testdata/baseCrs/{ => domain}/domain.yaml (83%) rename test/upgrade/testdata/baseCrs/{ => import}/import.yaml (87%) rename test/upgrade/testdata/baseCrs/{ => serviceCredentialBinding}/service_credential_binding.yaml (88%) rename test/upgrade/testdata/baseCrs/{ => serviceInstance}/service_instance.yaml (90%) rename test/upgrade/testdata/baseCrs/{ => space}/space.yaml (84%) rename test/upgrade/testdata/baseCrs/{ => spaceMembers}/space_members.yaml (89%) rename test/upgrade/testdata/baseCrs/{ => spaceQuota}/space_quota.yaml (86%) rename test/upgrade/testdata/baseCrs/{ => spaceRole}/space_role.yaml (87%) diff --git a/test/upgrade/testdata/baseCrs/domain.yaml b/test/upgrade/testdata/baseCrs/domain/domain.yaml similarity index 83% rename from test/upgrade/testdata/baseCrs/domain.yaml rename to test/upgrade/testdata/baseCrs/domain/domain.yaml index 171f06d3..b9789bf6 100644 --- a/test/upgrade/testdata/baseCrs/domain.yaml +++ b/test/upgrade/testdata/baseCrs/domain/domain.yaml @@ -2,6 +2,8 @@ apiVersion: cloudfoundry.crossplane.io/v1alpha1 kind: Domain metadata: name: upgrade-test-domain + annotations: + crossplane.io/paused: "false" spec: forProvider: name: cfupgradetest.eu12.hana.ondemand.com diff --git a/test/upgrade/testdata/baseCrs/import.yaml b/test/upgrade/testdata/baseCrs/import/import.yaml similarity index 87% rename from test/upgrade/testdata/baseCrs/import.yaml rename to test/upgrade/testdata/baseCrs/import/import.yaml index 19a7d613..28045f83 100644 --- a/test/upgrade/testdata/baseCrs/import.yaml +++ b/test/upgrade/testdata/baseCrs/import/import.yaml @@ -2,6 +2,8 @@ apiVersion: cloudfoundry.crossplane.io/v1alpha1 kind: Organization metadata: name: upgrade-test-org + annotations: + crossplane.io/paused: "false" spec: managementPolicies: - Observe @@ -16,6 +18,8 @@ apiVersion: cloudfoundry.crossplane.io/v1alpha1 kind: Space metadata: name: upgrade-test-import-space + annotations: + crossplane.io/paused: "false" spec: managementPolicies: - Observe diff --git a/test/upgrade/testdata/baseCrs/service_credential_binding.yaml b/test/upgrade/testdata/baseCrs/serviceCredentialBinding/service_credential_binding.yaml similarity index 88% rename from test/upgrade/testdata/baseCrs/service_credential_binding.yaml rename to test/upgrade/testdata/baseCrs/serviceCredentialBinding/service_credential_binding.yaml index 49b35237..33a7379e 100644 --- a/test/upgrade/testdata/baseCrs/service_credential_binding.yaml +++ b/test/upgrade/testdata/baseCrs/serviceCredentialBinding/service_credential_binding.yaml @@ -2,6 +2,8 @@ apiVersion: cloudfoundry.crossplane.io/v1alpha1 kind: ServiceCredentialBinding metadata: name: upgrade-test-service-credential-binding + annotations: + crossplane.io/paused: "false" spec: forProvider: name: upgrade-test-service-credential-binding diff --git a/test/upgrade/testdata/baseCrs/service_instance.yaml b/test/upgrade/testdata/baseCrs/serviceInstance/service_instance.yaml similarity index 90% rename from test/upgrade/testdata/baseCrs/service_instance.yaml rename to test/upgrade/testdata/baseCrs/serviceInstance/service_instance.yaml index 7da55f8d..fa24cce3 100644 --- a/test/upgrade/testdata/baseCrs/service_instance.yaml +++ b/test/upgrade/testdata/baseCrs/serviceInstance/service_instance.yaml @@ -2,6 +2,8 @@ apiVersion: cloudfoundry.crossplane.io/v1alpha1 kind: ServiceInstance metadata: name: upgrade-test-service-instance + annotations: + crossplane.io/paused: "false" spec: forProvider: type: managed diff --git a/test/upgrade/testdata/baseCrs/space.yaml b/test/upgrade/testdata/baseCrs/space/space.yaml similarity index 84% rename from test/upgrade/testdata/baseCrs/space.yaml rename to test/upgrade/testdata/baseCrs/space/space.yaml index c8a94a6d..a750532b 100644 --- a/test/upgrade/testdata/baseCrs/space.yaml +++ b/test/upgrade/testdata/baseCrs/space/space.yaml @@ -2,6 +2,8 @@ apiVersion: cloudfoundry.crossplane.io/v1alpha1 kind: Space metadata: name: upgrade-test-space + annotations: + crossplane.io/paused: "false" spec: forProvider: name: upgrade-test-space diff --git a/test/upgrade/testdata/baseCrs/space_members.yaml b/test/upgrade/testdata/baseCrs/spaceMembers/space_members.yaml similarity index 89% rename from test/upgrade/testdata/baseCrs/space_members.yaml rename to test/upgrade/testdata/baseCrs/spaceMembers/space_members.yaml index aa919412..d71ccdd7 100644 --- a/test/upgrade/testdata/baseCrs/space_members.yaml +++ b/test/upgrade/testdata/baseCrs/spaceMembers/space_members.yaml @@ -2,6 +2,8 @@ apiVersion: cloudfoundry.crossplane.io/v1alpha1 kind: SpaceMembers metadata: name: upgrade-test-space-members + annotations: + crossplane.io/paused: "false" spec: forProvider: roleType: Developers diff --git a/test/upgrade/testdata/baseCrs/space_quota.yaml b/test/upgrade/testdata/baseCrs/spaceQuota/space_quota.yaml similarity index 86% rename from test/upgrade/testdata/baseCrs/space_quota.yaml rename to test/upgrade/testdata/baseCrs/spaceQuota/space_quota.yaml index 7a6b91ed..89994d19 100644 --- a/test/upgrade/testdata/baseCrs/space_quota.yaml +++ b/test/upgrade/testdata/baseCrs/spaceQuota/space_quota.yaml @@ -2,6 +2,8 @@ apiVersion: cloudfoundry.crossplane.io/v1alpha1 kind: SpaceQuota metadata: name: upgrade-test-space-quota + annotations: + crossplane.io/paused: "false" spec: forProvider: allowPaidServicePlans: false diff --git a/test/upgrade/testdata/baseCrs/space_role.yaml b/test/upgrade/testdata/baseCrs/spaceRole/space_role.yaml similarity index 87% rename from test/upgrade/testdata/baseCrs/space_role.yaml rename to test/upgrade/testdata/baseCrs/spaceRole/space_role.yaml index 67041b2e..895a3357 100644 --- a/test/upgrade/testdata/baseCrs/space_role.yaml +++ b/test/upgrade/testdata/baseCrs/spaceRole/space_role.yaml @@ -2,6 +2,8 @@ apiVersion: cloudfoundry.crossplane.io/v1alpha1 kind: SpaceRole metadata: name: upgrade-test-space-role + annotations: + crossplane.io/paused: "false" spec: forProvider: type: Developer From 28f2c122ce6fe1deab273803ae6ae375ad289151 Mon Sep 17 00:00:00 2001 From: Nico Andres Date: Fri, 13 Mar 2026 12:05:44 +0100 Subject: [PATCH 5/6] Add custom assessment for base_upgrade_test --- test/upgrade/base_upgrade_test.go | 76 ++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/test/upgrade/base_upgrade_test.go b/test/upgrade/base_upgrade_test.go index 296c1027..8ad28822 100644 --- a/test/upgrade/base_upgrade_test.go +++ b/test/upgrade/base_upgrade_test.go @@ -15,20 +15,92 @@ package upgrade import ( + "context" + "path/filepath" + "slices" + "strings" "testing" + "time" + + "github.com/crossplane-contrib/xp-testing/pkg/resources" + "k8s.io/klog/v2" + "sigs.k8s.io/e2e-framework/klient/wait" + "sigs.k8s.io/e2e-framework/pkg/envconf" ) func TestUpgradeProvider(t *testing.T) { fromTag, toTag := loadTags() + serviceInstanceDir := filepath.Join(resourceDirectoryRoot, "serviceInstance") + serviceCredentialBindingDir := filepath.Join(resourceDirectoryRoot, "serviceCredentialBinding") + dependentDirs := []string{serviceCredentialBindingDir} + + requiredDirs := removeFromDirs(resourceDirectories, dependentDirs) + upgradeTest := NewCustomUpgradeTest("baseline-upgrade-test"). FromVersion(fromTag). ToVersion(toTag). - WithResourceDirectories(resourceDirectories) - + WithResourceDirectories(resourceDirectories). + SkipDefaultResourceVerification(). + WithCustomPreUpgradeAssessment( + "Check all required resources are healthy before upgrade", + func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context { + return verifyResources(ctx, t, cfg, requiredDirs, verifyTimeout) + }, + ). + WithCustomPreUpgradeAssessment( + "Check service instance and dependent resources are healthy before upgrade", + func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context { + return verifyServiceInstanceWithDependents(ctx, t, cfg, serviceInstanceDir, dependentDirs, verifyTimeout) + }, + ). + WithCustomPostUpgradeAssessment( + "Check all required resources are healthy after upgrade", + func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context { + return verifyResources(ctx, t, cfg, requiredDirs, verifyTimeout) + }, + ). + WithCustomPostUpgradeAssessment( + "Check service instance and dependent resources are healthy after upgrade", + func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context { + return verifyServiceInstanceWithDependents(ctx, t, cfg, serviceInstanceDir, dependentDirs, verifyTimeout) + }, + ) testenv.Test(t, upgradeTest.Feature()) } +// verifyResources waits for resources in dirs to be ready +func verifyResources(ctx context.Context, t *testing.T, cfg *envconf.Config, dirs []string, timeout time.Duration) context.Context { + for _, dir := range dirs { + klog.V(4).Infof("verify resources of directory %s", dir) + if err := resources.WaitForResourcesToBeSynced(ctx, cfg, dir, nil, wait.WithTimeout(timeout)); err != nil { + t.Errorf("verify resources of directory %s failed: %v", dir, err) + } + } + + return ctx +} + +// verifyServiceInstanceWithDependents verifies the service instance directory first and +// if successful dependent directories +func verifyServiceInstanceWithDependents(ctx context.Context, t *testing.T, cfg *envconf.Config, serviceInstanceDir string, dependentDirs []string, timeout time.Duration) context.Context { + klog.V(4).Infof("verify service instance") + if err := resources.WaitForResourcesToBeSynced(ctx, cfg, serviceInstanceDir, nil, wait.WithTimeout(timeout)); err != nil { + t.Errorf("verify service instance failed: %v — skipping verification of: %s", err, strings.Join(dependentDirs, ", ")) + return ctx + } + return verifyResources(ctx, t, cfg, dependentDirs, timeout) +} + +// removeFromDirs is a helper function to remove directories from the list of directories to verify, +// allowing dependent resources to be verified separately +func removeFromDirs(dirs []string, remove []string) []string { + result := slices.Clone(dirs) + return slices.DeleteFunc(result, func(d string) bool { + return slices.Contains(remove, d) + }) +} + // loadTags is a helper function to load FROM and TO tags for tests // This allows custom tests to reuse the same version configuration func loadTags() (string, string) { From a1afe7103cd502e65462ae60d163cdc2a68c4344 Mon Sep 17 00:00:00 2001 From: Nico Andres Date: Fri, 13 Mar 2026 12:05:57 +0100 Subject: [PATCH 6/6] Update readme --- docs/upgrade-testing.md | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/docs/upgrade-testing.md b/docs/upgrade-testing.md index 8dbd7abf..68ba33a8 100644 --- a/docs/upgrade-testing.md +++ b/docs/upgrade-testing.md @@ -232,6 +232,7 @@ make test-upgrade-custom Base tests use YAML manifests from `test/upgrade/testdata/baseCrs/`. Currently tested resources: - **Organization** (import) - Uses `managementPolicies: [Observe]` to import existing org +- **Space** (import) - Uses `managementPolicies: [Observe]` to import existing space - **Space** - Lightweight resource for testing basic upgrade flow - **Domain** - **SpaceQuota** @@ -246,7 +247,8 @@ Base tests use YAML manifests from `test/upgrade/testdata/baseCrs/`. Currently t - **ServiceInstance:** A managed service instance requires a ServicePlan specifying an offering and a plan. If the combination of offering and plan is not available in your space change it something different.\ 🠊 Run `cf marketplace` and update the values in test/upgrade/testdata/baseCrs/service_instance.yaml -- **ServiceCredentialBinding:** The ServiceCredentialBinding directly depends on the ServiceInstance it is referencing +- **ServiceCredentialBinding:** The ServiceCredentialBinding directly depends on the ServiceInstance it is referencing \ +🠊 The `base_upgrade_test` includes dedicated pre- and post-upgrade assessment for the ServiceInstance resources and its dependents. These assessments verify the ServiceInstance first, and only then thedependent resources such as ServiceCredentialBinding. This ordering makes dependency failures easier to diagnose and test less flaky when the upstream ServiceInstance is not healthy. #### Adding New Base Test Resources @@ -366,18 +368,26 @@ test/ ├── upgrade/ │ ├── testdata/ │ │ ├── baseCrs/ # Base upgrade test resources -│ │ │ ├── import.yaml # Organization (observe) + Space (observe) -│ │ │ ├── space.yaml # Space (create) -| │ │ ├── domain.yaml -| │ │ ├── space_quota.yaml -| │ │ ├── space_role.yaml -| │ │ ├── service_credential_binding.yaml -| │ │ ├── service_instance.yaml -| │ │ └── space_members.yaml -│ │ └── customCRs/ # Custom upgrade test resources +│ │ │ ├── import/ +│ │ │ │ └── import_org.yaml # Organization (observe) +│ │ │ ├── space/ +│ │ │ │ └── space.yaml # Space (create) +│ │ │ ├── domain/ +│ │ │ │ └── domain.yaml +│ │ │ ├── spaceQuota/ +│ │ │ │ └── space_quota.yaml +│ │ │ ├── spaceRole/ +│ │ │ │ └── space_role.yaml +│ │ │ ├── serviceCredentialBinding/ +│ │ │ │ └── service_credential_binding.yaml +│ │ │ ├── serviceInstance/ +│ │ │ │ └── service_instance.yaml +│ │ │ └── spaceMembers/ +│ │ │ └── space_members.yaml +│ │ └── customCrs/ # Custom upgrade test resources │ │ └── externalNames/ # External-name validation test │ │ ├── space.yaml -| | └── import.yaml +│ │ └── import.yaml │ ├── main_test.go # Test environment setup │ ├── upgrade_test.go # Base upgrade test logic │ ├── base_upgrade_test.go # Custom upgrade test framework