Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions hack/ci/cloud-init/controller.yaml.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,8 @@
openstack flavor create --ram 4192 --disk 20 --ephemeral 5 --vcpus 2 --public --id 2 m1.small --property hw_rng:allowed='True'
openstack flavor delete m1.medium
openstack flavor create --ram 6144 --disk 20 --ephemeral 5 --vcpus 2 --public --id 3 m1.medium --property hw_rng:allowed='True'
# Create an additional flavor for the e2e tests that will be used by the e2e bastion tests
openstack flavor create --ram 512 --disk 1 --ephemeral 1 --vcpus 1 --public --id 10 m1.tiny.alt --property hw_rng:allowed='True'

# Adjust the CPU quota
openstack quota set --cores 32 demo
Expand Down
2 changes: 2 additions & 0 deletions test/e2e/data/e2e_conf.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ variables:
EXP_CLUSTER_RESOURCE_SET: "true"
OPENSTACK_BASTION_IMAGE_NAME: "cirros-0.6.1-x86_64-disk"
OPENSTACK_BASTION_MACHINE_FLAVOR: "m1.tiny"
OPENSTACK_BASTION_MACHINE_FLAVOR_ALT: "m1.tiny.alt"
OPENSTACK_CLOUD: "capo-e2e"
OPENSTACK_CLOUD_ADMIN: "capo-e2e-admin"
OPENSTACK_CLOUD_CACERT_B64: "Cg=="
Expand Down Expand Up @@ -220,6 +221,7 @@ intervals:
conformance/wait-control-plane: ["30m", "10s"]
conformance/wait-worker-nodes: ["30m", "10s"]
default/wait-controllers: ["3m", "10s"]
default/wait-bastion: ["5m", "10s"]
default/wait-cluster: ["20m", "10s"]
default/wait-control-plane: ["30m", "10s"]
default/wait-worker-nodes: ["30m", "10s"]
Expand Down
1 change: 1 addition & 0 deletions test/e2e/shared/defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ const (
KubernetesVersion = "KUBERNETES_VERSION"
CCMPath = "CCM"
CCMResources = "CCM_RESOURCES"
OpenStackBastionFlavorAlt = "OPENSTACK_BASTION_MACHINE_FLAVOR_ALT"
OpenStackCloudYAMLFile = "OPENSTACK_CLOUD_YAML_FILE"
OpenStackCloud = "OPENSTACK_CLOUD"
OpenStackCloudAdmin = "OPENSTACK_CLOUD_ADMIN"
Expand Down
18 changes: 18 additions & 0 deletions test/e2e/shared/openstack.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import (
"github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
"github.com/gophercloud/gophercloud/openstack/compute/v2/flavors"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/openstack/imageservice/v2/images"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers"
Expand All @@ -46,6 +47,7 @@ import (
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
"github.com/gophercloud/utils/openstack/clientconfig"
uflavors "github.com/gophercloud/utils/openstack/compute/v2/flavors"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"gopkg.in/ini.v1"
Expand Down Expand Up @@ -847,3 +849,19 @@ func GetOpenStackVolume(e2eCtx *E2EContext, name string) (*volumes.Volume, error

return volume, nil
}

func GetFlavorFromName(e2eCtx *E2EContext, name string) (*flavors.Flavor, error) {
providerClient, clientOpts, _, err := GetTenantProviderClient(e2eCtx)
if err != nil {
_, _ = fmt.Fprintf(GinkgoWriter, "error creating provider client: %s\n", err)
return nil, err
}

computeClient, err := openstack.NewComputeV2(providerClient, gophercloud.EndpointOpts{Region: clientOpts.RegionName})
Expect(err).NotTo(HaveOccurred())

flavorID, err := uflavors.IDFromName(computeClient, name)
Expect(err).NotTo(HaveOccurred())

return flavors.Get(computeClient, flavorID).Extract()
}
81 changes: 81 additions & 0 deletions test/e2e/suites/e2e/e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,87 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
// We expect 4 security group rules that allow Calico traffic on the control plane
// from both the control plane and worker machines and vice versa, that makes 8 rules.
Expect(calicoSGRules).To(Equal(8))

shared.Logf("Check the bastion")
openStackCluster, err = shared.ClusterForSpec(ctx, e2eCtx, namespace)
Expect(err).NotTo(HaveOccurred())
bastionSpec := openStackCluster.Spec.Bastion
Expect(openStackCluster.Status.Bastion).NotTo(BeNil(), "OpenStackCluster.Status.Bastion has not been populated")
bastionServerName := openStackCluster.Status.Bastion.Name
Comment thread
EmilienM marked this conversation as resolved.
bastionServer, err := shared.DumpOpenStackServers(e2eCtx, servers.ListOpts{Name: bastionServerName})
Expect(err).NotTo(HaveOccurred())
Expect(bastionServer).To(HaveLen(1), "Did not find the bastion in OpenStack")

shared.Logf("Disable the bastion")
openStackCluster, err = shared.ClusterForSpec(ctx, e2eCtx, namespace)
Expect(err).NotTo(HaveOccurred())
openStackClusterDisabledBastion := openStackCluster.DeepCopy()
openStackClusterDisabledBastion.Spec.Bastion.Enabled = false
Expect(e2eCtx.Environment.BootstrapClusterProxy.GetClient().Update(ctx, openStackClusterDisabledBastion)).To(Succeed())
Eventually(
func() (bool, error) {
bastionServer, err := shared.DumpOpenStackServers(e2eCtx, servers.ListOpts{Name: bastionServerName})
Expect(err).NotTo(HaveOccurred())
if len(bastionServer) == 0 {
return true, nil
}
return false, errors.New("Bastion was not deleted in OpenStack")
}, e2eCtx.E2EConfig.GetIntervals(specName, "wait-bastion")...,
).Should(BeTrue())
Comment thread
EmilienM marked this conversation as resolved.
Eventually(
func() (bool, error) {
openStackCluster, err = shared.ClusterForSpec(ctx, e2eCtx, namespace)
Expect(err).NotTo(HaveOccurred())
if openStackCluster.Status.Bastion == nil {
return true, nil
}
return false, errors.New("Bastion was not removed in OpenStackCluster.Status")
}, e2eCtx.E2EConfig.GetIntervals(specName, "wait-bastion")...,
).Should(BeTrue())
Comment thread
EmilienM marked this conversation as resolved.

shared.Logf("Delete the bastion")
openStackCluster, err = shared.ClusterForSpec(ctx, e2eCtx, namespace)
Expect(err).NotTo(HaveOccurred())
openStackClusterWithoutBastion := openStackCluster.DeepCopy()
openStackClusterWithoutBastion.Spec.Bastion = nil
Expect(e2eCtx.Environment.BootstrapClusterProxy.GetClient().Update(ctx, openStackClusterWithoutBastion)).To(Succeed())
openStackCluster, err = shared.ClusterForSpec(ctx, e2eCtx, namespace)
Expect(err).NotTo(HaveOccurred())
Eventually(
func() (bool, error) {
openStackCluster, err = shared.ClusterForSpec(ctx, e2eCtx, namespace)
Expect(err).NotTo(HaveOccurred())
if openStackCluster.Spec.Bastion == nil {
return true, nil
}
return false, errors.New("Bastion was not removed in OpenStackCluster.Spec")
}, e2eCtx.E2EConfig.GetIntervals(specName, "wait-bastion")...,
).Should(BeTrue())

shared.Logf("Create the bastion with a new flavor")
bastionNewFlavorName := e2eCtx.E2EConfig.GetVariable(shared.OpenStackBastionFlavorAlt)
bastionNewFlavor, err := shared.GetFlavorFromName(e2eCtx, bastionNewFlavorName)
Expect(err).NotTo(HaveOccurred())
openStackCluster, err = shared.ClusterForSpec(ctx, e2eCtx, namespace)
Expect(err).NotTo(HaveOccurred())
openStackClusterWithNewBastionFlavor := openStackCluster.DeepCopy()
openStackClusterWithNewBastionFlavor.Spec.Bastion = bastionSpec
openStackClusterWithNewBastionFlavor.Spec.Bastion.Instance.Flavor = bastionNewFlavorName
Expect(e2eCtx.Environment.BootstrapClusterProxy.GetClient().Update(ctx, openStackClusterWithNewBastionFlavor)).To(Succeed())
Eventually(
func() (bool, error) {
bastionServer, err := shared.DumpOpenStackServers(e2eCtx, servers.ListOpts{Name: bastionServerName, Flavor: bastionNewFlavor.ID})
Expect(err).NotTo(HaveOccurred())
if len(bastionServer) == 1 {
return true, nil
}
return false, errors.New("Bastion with new flavor was not created in OpenStack")
}, e2eCtx.E2EConfig.GetIntervals(specName, "wait-bastion")...,
).Should(BeTrue())
Comment thread
EmilienM marked this conversation as resolved.
openStackCluster, err = shared.ClusterForSpec(ctx, e2eCtx, namespace)
Expect(err).NotTo(HaveOccurred())
Expect(openStackCluster.Spec.Bastion).To(Equal(openStackClusterWithNewBastionFlavor.Spec.Bastion))
Expect(openStackCluster.Status.Bastion).NotTo(BeNil(), "OpenStackCluster.Status.Bastion with new flavor has not been populated")
})
})

Expand Down