diff --git a/hack/e2e.sh b/hack/e2e.sh index 3b5b7c29..97e7d9ca 100755 --- a/hack/e2e.sh +++ b/hack/e2e.sh @@ -44,6 +44,9 @@ trap cleanup EXIT export E2E_KUTTL_OSCLOUDS="${creds_dir}/clouds.yaml" export E2E_KUTTL_CACERT_OPT +# default flavor name to use for tests +export E2E_KUTTL_FLAVOR=${E2E_KUTTL_FLAVOR:-m1.tiny} + # Name of the openstack credentials to use from the E2E_OSCLOUDS file E2E_OPENSTACK_CLOUD_NAME=${E2E_OPENSTACK_CLOUD_NAME:-devstack} # Name of the openstack admin credentials to use from the E2E_OSCLOUDS file diff --git a/internal/controllers/server/actuator.go b/internal/controllers/server/actuator.go index 7f61a1ca..579590be 100644 --- a/internal/controllers/server/actuator.go +++ b/internal/controllers/server/actuator.go @@ -73,14 +73,14 @@ func (actuator serverActuator) ListOSResourcesForAdoption(ctx context.Context, o } listOpts := servers.ListOpts{ - Name: string(getResourceName(obj)), + Name: fmt.Sprintf("^%s$", string(getResourceName(obj))), } return actuator.osClient.ListServers(ctx, listOpts), true } func (actuator serverActuator) ListOSResourcesForImport(ctx context.Context, filter filterT) serverIterator { listOpts := servers.ListOpts{ - Name: string(ptr.Deref(filter.Name, "")), + Name: fmt.Sprintf("^%s$", string(ptr.Deref(filter.Name, ""))), } return actuator.osClient.ListServers(ctx, listOpts) } diff --git a/internal/controllers/server/tests/create-adoption-server/00-assert.yaml b/internal/controllers/server/tests/create-adoption-server/00-assert.yaml new file mode 100644 index 00000000..46ab4d31 --- /dev/null +++ b/internal/controllers/server/tests/create-adoption-server/00-assert.yaml @@ -0,0 +1,8 @@ +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Server +metadata: + name: create-adoption +status: + resource: + name: create-adoption \ No newline at end of file diff --git a/internal/controllers/server/tests/create-adoption-server/00-flavor.yaml b/internal/controllers/server/tests/create-adoption-server/00-flavor.yaml new file mode 100644 index 00000000..0f074243 --- /dev/null +++ b/internal/controllers/server/tests/create-adoption-server/00-flavor.yaml @@ -0,0 +1,7 @@ +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - command: kubectl create secret generic openstack-clouds --from-file=clouds.yaml=${E2E_KUTTL_OSCLOUDS} ${E2E_KUTTL_CACERT_OPT} + namespaced: true + - script: cat ../templates/create-flavor.tmpl |envsubst | kubectl -n ${NAMESPACE} apply -f - \ No newline at end of file diff --git a/internal/controllers/server/tests/create-adoption-server/00-server.yaml b/internal/controllers/server/tests/create-adoption-server/00-server.yaml new file mode 100644 index 00000000..7f1000f2 --- /dev/null +++ b/internal/controllers/server/tests/create-adoption-server/00-server.yaml @@ -0,0 +1,71 @@ +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Image +metadata: + name: create-adoption +spec: + cloudCredentialsRef: + cloudName: openstack-admin + secretName: openstack-clouds + managementPolicy: managed + resource: + content: + diskFormat: qcow2 + download: + url: https://download.cirros-cloud.net/0.6.3/cirros-0.6.3-x86_64-disk.img + visibility: public +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Network +metadata: + name: create-adoption +spec: + cloudCredentialsRef: + cloudName: openstack + secretName: openstack-clouds + managementPolicy: managed + resource: + name: create-adoption +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Subnet +metadata: + name: create-adoption +spec: + cloudCredentialsRef: + cloudName: openstack + secretName: openstack-clouds + managementPolicy: managed + networkRef: create-adoption + resource: + ipVersion: 4 + cidr: 192.168.200.0/24 +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Port +metadata: + name: create-adoption +spec: + cloudCredentialsRef: + cloudName: openstack + secretName: openstack-clouds + managementPolicy: managed + networkRef: create-adoption + resource: + addresses: + - subnetRef: create-adoption +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Server +metadata: + name: create-adoption +spec: + cloudCredentialsRef: + cloudName: openstack + secretName: openstack-clouds + managementPolicy: managed + resource: + imageRef: create-adoption + flavorRef: server-flavor + ports: + - portRef: create-adoption \ No newline at end of file diff --git a/internal/controllers/server/tests/create-adoption-server/01-adoption-server.yaml b/internal/controllers/server/tests/create-adoption-server/01-adoption-server.yaml new file mode 100644 index 00000000..47a4844f --- /dev/null +++ b/internal/controllers/server/tests/create-adoption-server/01-adoption-server.yaml @@ -0,0 +1,28 @@ +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Port +metadata: + name: adoption +spec: + cloudCredentialsRef: + cloudName: openstack + secretName: openstack-clouds + managementPolicy: managed + networkRef: create-adoption + resource: + addresses: + - subnetRef: create-adoption +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Server +metadata: + name: adoption +spec: + cloudCredentialsRef: + cloudName: openstack + secretName: openstack-clouds + managementPolicy: managed + resource: + imageRef: create-adoption + flavorRef: server-flavor + ports: + - portRef: adoption \ No newline at end of file diff --git a/internal/controllers/server/tests/create-adoption-server/01-assert.yaml b/internal/controllers/server/tests/create-adoption-server/01-assert.yaml new file mode 100644 index 00000000..da892afb --- /dev/null +++ b/internal/controllers/server/tests/create-adoption-server/01-assert.yaml @@ -0,0 +1,8 @@ +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Server +metadata: + name: adoption +status: + resource: + name: adoption \ No newline at end of file diff --git a/internal/controllers/server/tests/create-adoption-server/02-assert.yaml b/internal/controllers/server/tests/create-adoption-server/02-assert.yaml new file mode 100644 index 00000000..50d0fbb0 --- /dev/null +++ b/internal/controllers/server/tests/create-adoption-server/02-assert.yaml @@ -0,0 +1,20 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +commands: +- script: "! kubectl get server create-adoption --namespace $NAMESPACE" + skipLogOutput: true +- script: "! kubectl get port create-adoption --namespace $NAMESPACE" + skipLogOutput: true +- script: "! kubectl get server adoption --namespace $NAMESPACE" + skipLogOutput: true +- script: "! kubectl get port adoption --namespace $NAMESPACE" + skipLogOutput: true +- script: "! kubectl get subnet create-adoption --namespace $NAMESPACE" + skipLogOutput: true +- script: "! kubectl get network create-adoption --namespace $NAMESPACE" + skipLogOutput: true +- script: "! kubectl get flavor server-flavor --namespace $NAMESPACE" + skipLogOutput: true +- script: "! kubectl get image create-adoption --namespace $NAMESPACE" + skipLogOutput: true + \ No newline at end of file diff --git a/internal/controllers/server/tests/create-adoption-server/02-cleanup.yaml b/internal/controllers/server/tests/create-adoption-server/02-cleanup.yaml new file mode 100644 index 00000000..3a201aad --- /dev/null +++ b/internal/controllers/server/tests/create-adoption-server/02-cleanup.yaml @@ -0,0 +1,27 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +delete: +- apiVersion: openstack.k-orc.cloud/v1alpha1 + kind: Server + name: create-adoption +- apiVersion: openstack.k-orc.cloud/v1alpha1 + kind: Port + name: create-adoption +- apiVersion: openstack.k-orc.cloud/v1alpha1 + kind: Server + name: adoption +- apiVersion: openstack.k-orc.cloud/v1alpha1 + kind: Port + name: adoption +- apiVersion: openstack.k-orc.cloud/v1alpha1 + kind: Subnet + name: create-adoption +- apiVersion: openstack.k-orc.cloud/v1alpha1 + kind: Network + name: create-adoption +- apiVersion: openstack.k-orc.cloud/v1alpha1 + kind: Flavor + name: server-flavor +- apiVersion: openstack.k-orc.cloud/v1alpha1 + kind: Image + name: create-adoption \ No newline at end of file diff --git a/internal/controllers/server/tests/create-adoption-server/README.md b/internal/controllers/server/tests/create-adoption-server/README.md new file mode 100644 index 00000000..9fe572aa --- /dev/null +++ b/internal/controllers/server/tests/create-adoption-server/README.md @@ -0,0 +1,13 @@ +# Create two servers to test adoption + +## Step 00 + +Import a flavor, create an image,network,subnet and a port and then create a server with name 'create-adoption'. + +## Step 01 +Create another server with the name 'adoption'. The second server should have a resource name of 'adoption' + +## Step 02 + +Validate we're able to delete resources. +Cleaning up resources also avoids a race where kuttl could delete the secret before the other resources. diff --git a/internal/controllers/server/tests/import-server/00-assert.yaml b/internal/controllers/server/tests/import-server/00-assert.yaml new file mode 100644 index 00000000..bfde4d20 --- /dev/null +++ b/internal/controllers/server/tests/import-server/00-assert.yaml @@ -0,0 +1,30 @@ +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Server +metadata: + name: import +status: + conditions: + - type: Available + message: Waiting for OpenStack resource to be created externally + status: "False" + reason: Progressing + - type: Progressing + message: Waiting for OpenStack resource to be created externally + status: "True" + reason: Progressing +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Server +metadata: + name: import-error +status: + conditions: + - type: Available + message: Waiting for OpenStack resource to be created externally + status: "False" + reason: Progressing + - type: Progressing + message: Waiting for OpenStack resource to be created externally + status: "True" + reason: Progressing \ No newline at end of file diff --git a/internal/controllers/server/tests/import-server/00-flavor.yaml b/internal/controllers/server/tests/import-server/00-flavor.yaml new file mode 100644 index 00000000..0f074243 --- /dev/null +++ b/internal/controllers/server/tests/import-server/00-flavor.yaml @@ -0,0 +1,7 @@ +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - command: kubectl create secret generic openstack-clouds --from-file=clouds.yaml=${E2E_KUTTL_OSCLOUDS} ${E2E_KUTTL_CACERT_OPT} + namespaced: true + - script: cat ../templates/create-flavor.tmpl |envsubst | kubectl -n ${NAMESPACE} apply -f - \ No newline at end of file diff --git a/internal/controllers/server/tests/import-server/00-import-server-error.yaml b/internal/controllers/server/tests/import-server/00-import-server-error.yaml new file mode 100644 index 00000000..1e160679 --- /dev/null +++ b/internal/controllers/server/tests/import-server/00-import-server-error.yaml @@ -0,0 +1,13 @@ +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Server +metadata: + name: import-error +spec: + cloudCredentialsRef: + cloudName: openstack + secretName: openstack-clouds + managementPolicy: unmanaged + import: + filter: + name: external \ No newline at end of file diff --git a/internal/controllers/server/tests/import-server/00-import-server.yaml b/internal/controllers/server/tests/import-server/00-import-server.yaml new file mode 100644 index 00000000..dc35e243 --- /dev/null +++ b/internal/controllers/server/tests/import-server/00-import-server.yaml @@ -0,0 +1,13 @@ +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Server +metadata: + name: import +spec: + cloudCredentialsRef: + cloudName: openstack + secretName: openstack-clouds + managementPolicy: unmanaged + import: + filter: + name: import-external \ No newline at end of file diff --git a/internal/controllers/server/tests/import-server/01-assert.yaml b/internal/controllers/server/tests/import-server/01-assert.yaml new file mode 100644 index 00000000..44d91d53 --- /dev/null +++ b/internal/controllers/server/tests/import-server/01-assert.yaml @@ -0,0 +1,32 @@ +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Server +metadata: + name: import +status: + conditions: + - type: Available + message: OpenStack resource is available + status: "True" + reason: Success + - type: Progressing + message: OpenStack resource is up to date + status: "False" + reason: Success + resource: + name: import-external +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Server +metadata: + name: import-error +status: + conditions: + - type: Available + message: Waiting for OpenStack resource to be created externally + status: "False" + reason: Progressing + - type: Progressing + message: Waiting for OpenStack resource to be created externally + status: "True" + reason: Progressing \ No newline at end of file diff --git a/internal/controllers/server/tests/import-server/01-create-server.yaml b/internal/controllers/server/tests/import-server/01-create-server.yaml new file mode 100644 index 00000000..7717d51b --- /dev/null +++ b/internal/controllers/server/tests/import-server/01-create-server.yaml @@ -0,0 +1,71 @@ +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Image +metadata: + name: import-external-image-server +spec: + cloudCredentialsRef: + cloudName: openstack-admin + secretName: openstack-clouds + managementPolicy: managed + resource: + content: + diskFormat: qcow2 + download: + url: https://download.cirros-cloud.net/0.6.3/cirros-0.6.3-x86_64-disk.img + visibility: public +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Network +metadata: + name: import-external-network-server +spec: + cloudCredentialsRef: + cloudName: openstack + secretName: openstack-clouds + managementPolicy: managed + resource: + name: import-external-network-server +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Subnet +metadata: + name: import-external-subnet-server +spec: + cloudCredentialsRef: + cloudName: openstack + secretName: openstack-clouds + managementPolicy: managed + networkRef: import-external-network-server + resource: + ipVersion: 4 + cidr: 192.168.200.0/24 +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Port +metadata: + name: import-external-port-server +spec: + cloudCredentialsRef: + cloudName: openstack + secretName: openstack-clouds + managementPolicy: managed + networkRef: import-external-network-server + resource: + addresses: + - subnetRef: import-external-subnet-server +--- +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Server +metadata: + name: import-external +spec: + cloudCredentialsRef: + cloudName: openstack + secretName: openstack-clouds + managementPolicy: managed + resource: + imageRef: import-external-image-server + flavorRef: server-flavor + ports: + - portRef: import-external-port-server \ No newline at end of file diff --git a/internal/controllers/server/tests/import-server/02-assert.yaml b/internal/controllers/server/tests/import-server/02-assert.yaml new file mode 100644 index 00000000..0e9d9e3b --- /dev/null +++ b/internal/controllers/server/tests/import-server/02-assert.yaml @@ -0,0 +1,12 @@ +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +commands: +- script: "! kubectl get server import --namespace $NAMESPACE" + skipLogOutput: true +- script: "! kubectl get server import-external--namespace $NAMESPACE" + skipLogOutput: true +- script: "! kubectl get server import-error --namespace $NAMESPACE" + skipLogOutput: true +- script: "! kubectl get flavor server-flavor --namespace $NAMESPACE" + skipLogOutput: true \ No newline at end of file diff --git a/internal/controllers/server/tests/import-server/02-cleanup.yaml b/internal/controllers/server/tests/import-server/02-cleanup.yaml new file mode 100644 index 00000000..baa3e3b4 --- /dev/null +++ b/internal/controllers/server/tests/import-server/02-cleanup.yaml @@ -0,0 +1,15 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +delete: +- apiVersion: openstack.k-orc.cloud/v1alpha1 + kind: Server + name: import +- apiVersion: openstack.k-orc.cloud/v1alpha1 + kind: Server + name: import-external +- apiVersion: openstack.k-orc.cloud/v1alpha1 + kind: Server + name: import-error +- apiVersion: openstack.k-orc.cloud/v1alpha1 + kind: Flavor + name: server-flavor \ No newline at end of file diff --git a/internal/controllers/server/tests/import-server/README.md b/internal/controllers/server/tests/import-server/README.md new file mode 100644 index 00000000..77e38fc9 --- /dev/null +++ b/internal/controllers/server/tests/import-server/README.md @@ -0,0 +1,16 @@ +# Test import making sure only a server with the exact name matches + +## Step 00 + +Create a secert and import a flavor. Create a server with import resource 'external'. +Create another server with import resource 'import-external' + +## Step 01 + +Create an image,network,subnet and a port and then create a server with name 'import-external'. +Make sure only the server with filter of 'import-external is available' + +## Step 02 + +Validate we're able to delete resources. +Cleaning up resources also avoids a race where kuttl could delete the secret before the other resources. diff --git a/internal/controllers/server/tests/templates/create-flavor.tmpl b/internal/controllers/server/tests/templates/create-flavor.tmpl new file mode 100755 index 00000000..44337d6a --- /dev/null +++ b/internal/controllers/server/tests/templates/create-flavor.tmpl @@ -0,0 +1,12 @@ +apiVersion: openstack.k-orc.cloud/v1alpha1 +kind: Flavor +metadata: + name: server-flavor +spec: + cloudCredentialsRef: + cloudName: openstack-admin + secretName: openstack-clouds + managementPolicy: unmanaged + import: + filter: + name: ${E2E_KUTTL_FLAVOR} diff --git a/kuttl-test.yaml b/kuttl-test.yaml index 42f24098..9a3828d6 100644 --- a/kuttl-test.yaml +++ b/kuttl-test.yaml @@ -3,5 +3,6 @@ kind: TestSuite testDirs: - ./internal/controllers/flavor/tests/ - ./internal/controllers/network/tests/ +- ./internal/controllers/server/tests/ - ./internal/controllers/subnet/tests/ timeout: 120