diff --git a/scripts/ci-e2e.sh b/scripts/ci-e2e.sh index ce298a265..c4271733a 100755 --- a/scripts/ci-e2e.sh +++ b/scripts/ci-e2e.sh @@ -102,6 +102,9 @@ EOF # initialize a router and cloud NAT init_networks() { +# gcloud compute shared-vpc enable "$GCP_PROJECT" +# gcloud compute shared-vpc associated-projects add "$GCP_SERVICE_PROJECT" --host-project + if [[ ${GCP_NETWORK_NAME} != "default" ]]; then gcloud compute networks create --project "$GCP_PROJECT" "${GCP_NETWORK_NAME}" --subnet-mode auto --quiet gcloud compute firewall-rules create "${GCP_NETWORK_NAME}"-allow-http --project "$GCP_PROJECT" \ @@ -110,7 +113,7 @@ init_networks() { --allow tcp:443 --network "${GCP_NETWORK_NAME}" --quiet gcloud compute firewall-rules create "${GCP_NETWORK_NAME}"-allow-icmp --project "$GCP_PROJECT" \ --allow icmp --network "${GCP_NETWORK_NAME}" --priority 65534 --quiet - gcloud compute firewall-rules create "${GCP_NETWORK_NAME}"-allow-internal --project "$GCP_PROJECT" \ + gcloud compute firewall-rules create "${NETWGCP_NETWORK_NAMEORK}"-allow-internal --project "$GCP_PROJECT" \ --allow "tcp:0-65535,udp:0-65535,icmp" --network "${GCP_NETWORK_NAME}" --priority 65534 --quiet fi @@ -125,7 +128,6 @@ init_networks() { --nat-all-subnet-ip-ranges --auto-allocate-nat-external-ips } - cleanup() { # Force a cleanup of cluster api created resources using gcloud commands (gcloud compute forwarding-rules list --project "$GCP_PROJECT" | grep capg-e2e \ @@ -143,12 +145,12 @@ cleanup() { (gcloud compute instances list --project "$GCP_PROJECT" | grep capg-e2e \ | awk '{print "gcloud compute instances delete --project '"$GCP_PROJECT"' --quiet " $1 " --zone " $2 "\n"}' \ | bash) || true - (gcloud compute instance-groups list --project "$GCP_PROJECT" | grep capg-e2e \ - | awk '{print "gcloud compute instance-groups unmanaged delete --project '"$GCP_PROJECT"' --quiet " $1 " --zone " $2 "\n"}' \ - | bash) || true (gcloud compute firewall-rules list --project "$GCP_PROJECT" | grep capg-e2e \ | awk '{print "gcloud compute firewall-rules delete --project '"$GCP_PROJECT"' --quiet " $1 "\n"}' \ | bash) || true + (gcloud compute instance-groups list --project "$GCP_PROJECT" | grep capg-e2e \ + | awk '{print "gcloud compute instance-groups unmanaged delete --project '"$GCP_PROJECT"' --quiet " $1 " --zone " $2 "\n"}' \ + | bash) || true # cleanup the networks gcloud compute routers nats delete "${TEST_NAME}-mynat" --project="${GCP_PROJECT}" \ diff --git a/test/e2e/config/gcp-ci.yaml b/test/e2e/config/gcp-ci.yaml index 39abbe42c..56852aaa1 100644 --- a/test/e2e/config/gcp-ci.yaml +++ b/test/e2e/config/gcp-ci.yaml @@ -73,6 +73,7 @@ providers: - sourcePath: "${PWD}/test/e2e/data/infrastructure-gcp/cluster-template-ci-gke-autopilot.yaml" - sourcePath: "${PWD}/test/e2e/data/infrastructure-gcp/cluster-template-ci-gke-custom-subnet.yaml" - sourcePath: "${PWD}/test/e2e/data/infrastructure-gcp/cluster-template-ci-with-internal-lb.yaml" + - sourcePath: "${PWD}/test/e2e/data/infrastructure-gcp/cluster-template-ci-with-shared-vpc.yaml" variables: KUBERNETES_VERSION: "${KUBERNETES_VERSION:-v1.29.0}" diff --git a/test/e2e/data/infrastructure-gcp/cluster-template-ci-with-shared-vpc.yaml b/test/e2e/data/infrastructure-gcp/cluster-template-ci-with-shared-vpc.yaml new file mode 100644 index 000000000..a4cdde6cb --- /dev/null +++ b/test/e2e/data/infrastructure-gcp/cluster-template-ci-with-shared-vpc.yaml @@ -0,0 +1,121 @@ +--- +apiVersion: cluster.x-k8s.io/v1beta1 +kind: Cluster +metadata: + name: "${CLUSTER_NAME}" + labels: + cni: "${CLUSTER_NAME}-shared-vpc" +spec: + clusterNetwork: + pods: + cidrBlocks: ["192.168.0.0/16"] + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: GCPCluster + name: "${CLUSTER_NAME}" + controlPlaneRef: + kind: KubeadmControlPlane + apiVersion: controlplane.cluster.x-k8s.io/v1beta1 + name: "${CLUSTER_NAME}-control-plane" +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: GCPCluster +metadata: + name: "${CLUSTER_NAME}" +spec: + project: "${GCP_SERVICE_PROJECT}" + region: "${GCP_REGION}" + network: + name: "${GCP_NETWORK_NAME}" + hostProject: "${GCP_PROJECT}" +--- +apiVersion: controlplane.cluster.x-k8s.io/v1beta1 +kind: KubeadmControlPlane +metadata: + name: "${CLUSTER_NAME}-control-plane" +spec: + replicas: ${CONTROL_PLANE_MACHINE_COUNT} + machineTemplate: + infrastructureRef: + kind: GCPMachineTemplate + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + name: "${CLUSTER_NAME}-control-plane" + kubeadmConfigSpec: + useExperimentalRetryJoin: true + initConfiguration: + nodeRegistration: + name: '{{ ds.meta_data.local_hostname.split(".")[0] }}' + kubeletExtraArgs: + cloud-provider: gce + clusterConfiguration: + apiServer: + timeoutForControlPlane: 20m + extraArgs: + cloud-provider: gce + controllerManager: + extraArgs: + cloud-provider: gce + allocate-node-cidrs: "false" + kubernetesVersion: "${KUBERNETES_VERSION}" + joinConfiguration: + nodeRegistration: + name: '{{ ds.meta_data.local_hostname.split(".")[0] }}' + kubeletExtraArgs: + cloud-provider: gce + version: "${KUBERNETES_VERSION}" +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: GCPMachineTemplate +metadata: + name: "${CLUSTER_NAME}-control-plane" +spec: + template: + spec: + instanceType: "${GCP_CONTROL_PLANE_MACHINE_TYPE}" + image: "${IMAGE_ID}" +--- +apiVersion: cluster.x-k8s.io/v1beta1 +kind: MachineDeployment +metadata: + name: "${CLUSTER_NAME}-md-0" +spec: + clusterName: "${CLUSTER_NAME}" + replicas: ${WORKER_MACHINE_COUNT} + selector: + matchLabels: + template: + spec: + clusterName: "${CLUSTER_NAME}" + version: "${KUBERNETES_VERSION}" + bootstrap: + configRef: + name: "${CLUSTER_NAME}-md-0" + apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 + kind: KubeadmConfigTemplate + infrastructureRef: + name: "${CLUSTER_NAME}-md-0" + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: GCPMachineTemplate +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: GCPMachineTemplate +metadata: + name: "${CLUSTER_NAME}-md-0" +spec: + template: + spec: + instanceType: "${GCP_NODE_MACHINE_TYPE}" + image: "${IMAGE_ID}" +--- +apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 +kind: KubeadmConfigTemplate +metadata: + name: "${CLUSTER_NAME}-md-0" +spec: + template: + spec: + joinConfiguration: + nodeRegistration: + name: '{{ ds.meta_data.local_hostname.split(".")[0] }}' + kubeletExtraArgs: + cloud-provider: gce diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index 906ae0698..f7dc6428c 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -206,4 +206,28 @@ var _ = Describe("Workload cluster creation", func() { }, result) }) }) + + Context("Creating a control-plane cluster with a shared vpc", func() { + It("Should create a cluster with 1 control-plane and 1 worker node where the network exists in a host project", func() { + By("Creating a cluster where the host project shares network resources with the service project") + clusterctl.ApplyClusterTemplateAndWait(ctx, clusterctl.ApplyClusterTemplateAndWaitInput{ + ClusterProxy: bootstrapClusterProxy, + ConfigCluster: clusterctl.ConfigClusterInput{ + LogFolder: clusterctlLogFolder, + ClusterctlConfigPath: clusterctlConfigPath, + KubeconfigPath: bootstrapClusterProxy.GetKubeconfigPath(), + InfrastructureProvider: clusterctl.DefaultInfrastructureProvider, + Flavor: "ci-with-shared-vpc", + Namespace: namespace.Name, + ClusterName: clusterName, + KubernetesVersion: e2eConfig.GetVariable(KubernetesVersion), + ControlPlaneMachineCount: ptr.To[int64](1), + WorkerMachineCount: ptr.To[int64](1), + }, + WaitForClusterIntervals: e2eConfig.GetIntervals(specName, "wait-cluster"), + WaitForControlPlaneIntervals: e2eConfig.GetIntervals(specName, "wait-control-plane"), + WaitForMachineDeployments: e2eConfig.GetIntervals(specName, "wait-worker-nodes"), + }, result) + }) + }) })