Skip to content

Commit 2bc15b6

Browse files
Merge pull request #64 from alexander-demichev/gcpe2e
Bug 2100822: Add E2E for GCP
2 parents 1a88f55 + fe1457a commit 2bc15b6

File tree

210 files changed

+6051
-1514
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

210 files changed

+6051
-1514
lines changed

cmd/cluster-capi-operator/main.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -234,15 +234,15 @@ func setupInfraClusterReconciler(mgr manager.Manager, platform configv1.Platform
234234
klog.Error(err, "unable to create controller", "controller", "AWSCluster")
235235
os.Exit(1)
236236
}
237-
case configv1.GCPPlatformType:
237+
case configv1.AzurePlatformType:
238238
if err := (&cluster.GenericInfraClusterReconciler{
239239
ClusterOperatorStatusClient: getClusterOperatorStatusClient(mgr, "cluster-capi-operator-infra-cluster-resource-controller"),
240240
InfraCluster: &azurev1.AzureCluster{},
241241
}).SetupWithManager(mgr); err != nil {
242242
klog.Error(err, "unable to create controller", "controller", "AzureCluster")
243243
os.Exit(1)
244244
}
245-
case configv1.AzurePlatformType:
245+
case configv1.GCPPlatformType:
246246
if err := (&cluster.GenericInfraClusterReconciler{
247247
ClusterOperatorStatusClient: getClusterOperatorStatusClient(mgr, "cluster-capi-operator-infra-cluster-resource-controller"),
248248
InfraCluster: &gcpv1.GCPCluster{},

e2e/aws_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ var _ = Describe("Cluster API AWS MachineSet", Ordered, func() {
4444
machineSet = framework.CreateMachineSet(cl, framework.NewMachineSetParams(
4545
"aws-machineset",
4646
clusterName,
47+
"",
4748
1,
4849
corev1.ObjectReference{
4950
Kind: "AWSMachineTemplate",

e2e/e2e_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1010
"k8s.io/client-go/kubernetes/scheme"
1111
awsv1 "sigs.k8s.io/cluster-api-provider-aws/api/v1beta1"
12+
gcpv1 "sigs.k8s.io/cluster-api-provider-gcp/api/v1beta1"
1213
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
1314
runtimeclient "sigs.k8s.io/controller-runtime/pkg/client"
1415
"sigs.k8s.io/controller-runtime/pkg/client/config"
@@ -32,6 +33,7 @@ var (
3233
func init() {
3334
utilruntime.Must(configv1.Install(scheme.Scheme))
3435
utilruntime.Must(awsv1.AddToScheme(scheme.Scheme))
36+
utilruntime.Must(gcpv1.AddToScheme(scheme.Scheme))
3537
utilruntime.Must(clusterv1.AddToScheme(scheme.Scheme))
3638
utilruntime.Must(mapiv1.AddToScheme(scheme.Scheme))
3739
}

e2e/framework/machineset.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ import (
1616
type machineSetParams struct {
1717
msName string
1818
clusterName string
19+
failureDomain string
1920
replicas int32
2021
infrastructureRef corev1.ObjectReference
2122
}
2223

2324
// NewMachineSetParams returns a new machineSetParams object.
24-
func NewMachineSetParams(msName, clusterName string, replicas int32, infrastructureRef corev1.ObjectReference) machineSetParams {
25+
func NewMachineSetParams(msName, clusterName, failureDomain string, replicas int32, infrastructureRef corev1.ObjectReference) machineSetParams {
2526
Expect(msName).ToNot(BeEmpty())
2627
Expect(clusterName).ToNot(BeEmpty())
2728
Expect(infrastructureRef.APIVersion).ToNot(BeEmpty())
@@ -33,6 +34,7 @@ func NewMachineSetParams(msName, clusterName string, replicas int32, infrastruct
3334
clusterName: clusterName,
3435
replicas: replicas,
3536
infrastructureRef: infrastructureRef,
37+
failureDomain: failureDomain,
3638
}
3739
}
3840

@@ -75,6 +77,10 @@ func CreateMachineSet(cl client.Client, params machineSetParams) *clusterv1.Mach
7577
},
7678
}
7779

80+
if params.failureDomain != "" {
81+
ms.Spec.Template.Spec.FailureDomain = &params.failureDomain
82+
}
83+
7884
Expect(cl.Create(ctx, ms)).To(Succeed())
7985
return ms
8086
}

e2e/gcp_test.go

+181
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
package e2e
2+
3+
import (
4+
"fmt"
5+
6+
. "github.com/onsi/ginkgo/v2"
7+
. "github.com/onsi/gomega"
8+
corev1 "k8s.io/api/core/v1"
9+
apierrors "k8s.io/apimachinery/pkg/api/errors"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
gcpv1 "sigs.k8s.io/cluster-api-provider-gcp/api/v1beta1"
12+
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
13+
"sigs.k8s.io/controller-runtime/pkg/client"
14+
yaml "sigs.k8s.io/yaml"
15+
16+
configv1 "github.com/openshift/api/config/v1"
17+
mapiv1 "github.com/openshift/api/machine/v1beta1"
18+
"github.com/openshift/cluster-capi-operator/e2e/framework"
19+
)
20+
21+
const (
22+
gcpMachineTemplateName = "gcp-machine-template"
23+
)
24+
25+
var _ = Describe("Cluster API GCP MachineSet", Ordered, func() {
26+
var gcpMachineTemplate *gcpv1.GCPMachineTemplate
27+
var machineSet *clusterv1.MachineSet
28+
var mapiMachineSpec *mapiv1.GCPMachineProviderSpec
29+
30+
BeforeAll(func() {
31+
if platform != configv1.GCPPlatformType {
32+
Skip("Skipping GCP E2E tests")
33+
}
34+
framework.CreateCoreCluster(cl, clusterName, "GCPCluster")
35+
mapiMachineSpec = getGCPMAPIProviderSpec(cl)
36+
createGCPCluster(cl, mapiMachineSpec)
37+
})
38+
39+
AfterEach(func() {
40+
framework.DeleteMachineSets(cl, machineSet)
41+
framework.WaitForMachineSetsDeleted(cl, machineSet)
42+
framework.DeleteObjects(cl, gcpMachineTemplate)
43+
})
44+
45+
It("should be able to run a machine", func() {
46+
gcpMachineTemplate = createGCPMachineTemplate(cl, mapiMachineSpec)
47+
48+
machineSet = framework.CreateMachineSet(cl, framework.NewMachineSetParams(
49+
"gcp-machineset",
50+
clusterName,
51+
mapiMachineSpec.Zone,
52+
1,
53+
corev1.ObjectReference{
54+
Kind: "GCPMachineTemplate",
55+
APIVersion: infraAPIVersion,
56+
Name: gcpMachineTemplateName,
57+
},
58+
))
59+
60+
framework.WaitForMachineSet(cl, machineSet.Name)
61+
})
62+
})
63+
64+
func getGCPMAPIProviderSpec(cl client.Client) *mapiv1.GCPMachineProviderSpec {
65+
machineSetList := &mapiv1.MachineSetList{}
66+
Expect(cl.List(ctx, machineSetList, client.InNamespace(framework.MAPINamespace))).To(Succeed())
67+
68+
Expect(machineSetList.Items).ToNot(HaveLen(0))
69+
machineSet := machineSetList.Items[0]
70+
Expect(machineSet.Spec.Template.Spec.ProviderSpec.Value).ToNot(BeNil())
71+
72+
providerSpec := &mapiv1.GCPMachineProviderSpec{}
73+
Expect(yaml.Unmarshal(machineSet.Spec.Template.Spec.ProviderSpec.Value.Raw, providerSpec)).To(Succeed())
74+
75+
return providerSpec
76+
}
77+
78+
func createGCPCluster(cl client.Client, mapiProviderSpec *mapiv1.GCPMachineProviderSpec) *gcpv1.GCPCluster {
79+
By("Creating GCP cluster")
80+
81+
gcpCluster := &gcpv1.GCPCluster{
82+
ObjectMeta: metav1.ObjectMeta{
83+
Name: clusterName,
84+
Namespace: framework.CAPINamespace,
85+
},
86+
Spec: gcpv1.GCPClusterSpec{
87+
Network: gcpv1.NetworkSpec{
88+
Name: &mapiProviderSpec.NetworkInterfaces[0].Network,
89+
},
90+
Region: mapiProviderSpec.Region,
91+
Project: mapiProviderSpec.ProjectID,
92+
},
93+
}
94+
95+
if err := cl.Create(ctx, gcpCluster); err != nil && !apierrors.IsAlreadyExists(err) {
96+
Expect(err).ToNot(HaveOccurred())
97+
}
98+
99+
Eventually(func() (bool, error) {
100+
patchedGCPCluster := &gcpv1.GCPCluster{}
101+
err := cl.Get(ctx, client.ObjectKeyFromObject(gcpCluster), patchedGCPCluster)
102+
if err != nil {
103+
return false, err
104+
}
105+
106+
if patchedGCPCluster.Annotations == nil {
107+
return false, nil
108+
}
109+
110+
if _, ok := patchedGCPCluster.Annotations[clusterv1.ManagedByAnnotation]; !ok {
111+
return false, nil
112+
}
113+
114+
return patchedGCPCluster.Status.Ready, nil
115+
}, framework.WaitShort).Should(BeTrue())
116+
117+
return gcpCluster
118+
}
119+
120+
func createGCPMachineTemplate(cl client.Client, mapiProviderSpec *mapiv1.GCPMachineProviderSpec) *gcpv1.GCPMachineTemplate {
121+
By("Creating GCP machine template")
122+
123+
Expect(mapiProviderSpec).ToNot(BeNil())
124+
Expect(mapiProviderSpec.Disks).ToNot(BeNil())
125+
Expect(len(mapiProviderSpec.Disks)).To(BeNumerically(">", 0))
126+
Expect(mapiProviderSpec.Disks[0].Type).ToNot(BeEmpty())
127+
Expect(mapiProviderSpec.MachineType).ToNot(BeEmpty())
128+
Expect(mapiProviderSpec.NetworkInterfaces).ToNot(BeNil())
129+
Expect(len(mapiProviderSpec.NetworkInterfaces)).To(BeNumerically(">", 0))
130+
Expect(mapiProviderSpec.NetworkInterfaces[0].Subnetwork).ToNot(BeEmpty())
131+
Expect(mapiProviderSpec.ServiceAccounts).ToNot(BeNil())
132+
Expect(mapiProviderSpec.ServiceAccounts[0].Email).ToNot(BeEmpty())
133+
Expect(mapiProviderSpec.ServiceAccounts[0].Scopes).ToNot(BeNil())
134+
Expect(len(mapiProviderSpec.ServiceAccounts)).To(BeNumerically(">", 0))
135+
Expect(mapiProviderSpec.Tags).ToNot(BeNil())
136+
Expect(len(mapiProviderSpec.Tags)).To(BeNumerically(">", 0))
137+
138+
var rootDeviceType gcpv1.DiskType
139+
switch mapiProviderSpec.Disks[0].Type {
140+
case "pd-standard":
141+
rootDeviceType = gcpv1.PdStandardDiskType
142+
case "pd-ssd":
143+
rootDeviceType = gcpv1.PdSsdDiskType
144+
case "local-ssd":
145+
rootDeviceType = gcpv1.LocalSsdDiskType
146+
}
147+
148+
ipForwardingDisabled := gcpv1.IPForwardingDisabled
149+
gcpMachineSpec := gcpv1.GCPMachineSpec{
150+
RootDeviceType: &rootDeviceType,
151+
RootDeviceSize: mapiProviderSpec.Disks[0].SizeGB,
152+
InstanceType: mapiProviderSpec.MachineType,
153+
Image: &mapiProviderSpec.Disks[0].Image,
154+
Subnet: &mapiProviderSpec.NetworkInterfaces[0].Subnetwork,
155+
ServiceAccount: &gcpv1.ServiceAccount{
156+
Email: mapiProviderSpec.ServiceAccounts[0].Email,
157+
Scopes: mapiProviderSpec.ServiceAccounts[0].Scopes,
158+
},
159+
AdditionalNetworkTags: mapiProviderSpec.Tags,
160+
AdditionalLabels: gcpv1.Labels{fmt.Sprintf("kubernetes-io-cluster-%s", clusterName): "owned"},
161+
IPForwarding: &ipForwardingDisabled,
162+
}
163+
164+
gcpMachineTemplate := &gcpv1.GCPMachineTemplate{
165+
ObjectMeta: metav1.ObjectMeta{
166+
Name: gcpMachineTemplateName,
167+
Namespace: framework.CAPINamespace,
168+
},
169+
Spec: gcpv1.GCPMachineTemplateSpec{
170+
Template: gcpv1.GCPMachineTemplateResource{
171+
Spec: gcpMachineSpec,
172+
},
173+
},
174+
}
175+
176+
if err := cl.Create(ctx, gcpMachineTemplate); err != nil && !apierrors.IsAlreadyExists(err) {
177+
Expect(err).ToNot(HaveOccurred())
178+
}
179+
180+
return gcpMachineTemplate
181+
}

go.mod

+9-9
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.18
55
require (
66
github.com/gobuffalo/flect v0.2.4
77
github.com/onsi/ginkgo/v2 v2.1.3
8-
github.com/onsi/gomega v1.18.1
8+
github.com/onsi/gomega v1.19.0
99
github.com/openshift/api v0.0.0-20220222102030-354aa98a475c
1010
github.com/openshift/library-go v0.0.0-20220221165938-535fc9bdb13b
1111
github.com/pkg/errors v0.9.1
@@ -18,12 +18,12 @@ require (
1818
k8s.io/component-base v0.24.0
1919
k8s.io/klog/v2 v2.60.1
2020
k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9
21-
sigs.k8s.io/cluster-api v1.1.1
21+
sigs.k8s.io/cluster-api v1.1.4
2222
sigs.k8s.io/cluster-api-operator v0.0.0-20220221190000-3f8fd689a585
2323
sigs.k8s.io/cluster-api-provider-aws v1.3.0
2424
sigs.k8s.io/cluster-api-provider-azure v1.2.1
25-
sigs.k8s.io/cluster-api-provider-gcp v1.0.2
26-
sigs.k8s.io/controller-runtime v0.11.1
25+
sigs.k8s.io/cluster-api-provider-gcp v1.1.0
26+
sigs.k8s.io/controller-runtime v0.11.2
2727
sigs.k8s.io/yaml v1.3.0
2828
)
2929

@@ -56,7 +56,7 @@ require (
5656
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
5757
github.com/golang/protobuf v1.5.2 // indirect
5858
github.com/google/gnostic v0.5.7-v3refs // indirect
59-
github.com/google/go-cmp v0.5.7 // indirect
59+
github.com/google/go-cmp v0.5.8 // indirect
6060
github.com/google/gofuzz v1.2.0 // indirect
6161
github.com/google/uuid v1.3.0 // indirect
6262
github.com/imdario/mergo v0.3.12 // indirect
@@ -72,15 +72,15 @@ require (
7272
github.com/prometheus/common v0.32.1 // indirect
7373
github.com/prometheus/procfs v0.7.3 // indirect
7474
golang.org/x/crypto v0.0.0-20220214200702-86341886e292 // indirect
75-
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
76-
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
77-
golang.org/x/sys v0.0.0-20220209214540-3681064d5158 // indirect
75+
golang.org/x/net v0.0.0-20220607020251-c690dde0001d // indirect
76+
golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb // indirect
77+
golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d // indirect
7878
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
7979
golang.org/x/text v0.3.7 // indirect
8080
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
8181
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
8282
google.golang.org/appengine v1.6.7 // indirect
83-
google.golang.org/protobuf v1.27.1 // indirect
83+
google.golang.org/protobuf v1.28.0 // indirect
8484
gopkg.in/inf.v0 v0.9.1 // indirect
8585
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
8686
k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect

0 commit comments

Comments
 (0)