diff --git a/cmd/common/controller_context.go b/cmd/common/controller_context.go index b567781ab6..56dd54d883 100644 --- a/cmd/common/controller_context.go +++ b/cmd/common/controller_context.go @@ -6,14 +6,12 @@ import ( apiextinformers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/informers" - clusterapiinformers "sigs.k8s.io/cluster-api/pkg/client/informers_generated/externalversions" ) // ControllerContext stores all the informers for a variety of kubernetes objects. type ControllerContext struct { ClientBuilder *ClientBuilder - CAPINamespacedInformerFactory clusterapiinformers.SharedInformerFactory KubeInformerFactory informers.SharedInformerFactory KubeNamespacedInformerFactory informers.SharedInformerFactory APIExtInformerFactory apiextinformers.SharedInformerFactory @@ -31,19 +29,15 @@ type ControllerContext struct { // CreateControllerContext creates the ControllerContext with the ClientBuilder. func CreateControllerContext(cb *ClientBuilder, stop <-chan struct{}, targetNamespace string) *ControllerContext { - clusterAPIClient := cb.ClusterAPIClientOrDie("cluster-api-shared-informer") kubeClient := cb.KubeClientOrDie("kube-shared-informer") apiExtClient := cb.APIExtClientOrDie("apiext-shared-informer") - sharedNamespacedInformers := clusterapiinformers.NewFilteredSharedInformerFactory(clusterAPIClient, resyncPeriod()(), targetNamespace, nil) - kubeSharedInformer := informers.NewSharedInformerFactory(kubeClient, resyncPeriod()()) kubeNamespacedSharedInformer := informers.NewFilteredSharedInformerFactory(kubeClient, resyncPeriod()(), targetNamespace, nil) apiExtSharedInformer := apiextinformers.NewSharedInformerFactory(apiExtClient, resyncPeriod()()) return &ControllerContext{ ClientBuilder: cb, - CAPINamespacedInformerFactory: sharedNamespacedInformers, KubeInformerFactory: kubeSharedInformer, KubeNamespacedInformerFactory: kubeNamespacedSharedInformer, APIExtInformerFactory: apiExtSharedInformer, diff --git a/cmd/machine-api-operator/start.go b/cmd/machine-api-operator/start.go index b070892951..61e96e97aa 100644 --- a/cmd/machine-api-operator/start.go +++ b/cmd/machine-api-operator/start.go @@ -54,7 +54,6 @@ func runStartCmd(cmd *cobra.Command, args []string) { glog.Fatalf("error starting controllers: %v", err) } - ctx.CAPINamespacedInformerFactory.Start(ctx.Stop) ctx.KubeInformerFactory.Start(ctx.Stop) ctx.KubeNamespacedInformerFactory.Start(ctx.Stop) ctx.APIExtInformerFactory.Start(ctx.Stop) @@ -84,7 +83,6 @@ func startControllers(ctx *common.ControllerContext) error { startOpts.imagesFile, config, - ctx.CAPINamespacedInformerFactory.Cluster().V1alpha1().MachineSets(), ctx.KubeInformerFactory.Core().V1().ConfigMaps(), ctx.KubeNamespacedInformerFactory.Core().V1().ServiceAccounts(), ctx.APIExtInformerFactory.Apiextensions().V1beta1().CustomResourceDefinitions(), diff --git a/lib/resourceapply/clusterapi.go b/lib/resourceapply/clusterapi.go deleted file mode 100644 index 99c7935802..0000000000 --- a/lib/resourceapply/clusterapi.go +++ /dev/null @@ -1,54 +0,0 @@ -package resourceapply - -import ( - "github.com/openshift/machine-api-operator/lib/resourcemerge" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - clusterv1alpha "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" - "sigs.k8s.io/cluster-api/pkg/client/clientset_generated/clientset" -) - -// ApplyMachineSet applies the required machineset to the cluster. -func ApplyMachineSet(client clientset.Interface, required *clusterv1alpha.MachineSet) (*clusterv1alpha.MachineSet, bool, error) { - v1alphaClient := client.ClusterV1alpha1() - existing, err := v1alphaClient.MachineSets(required.GetNamespace()).Get(required.GetName(), metav1.GetOptions{}) - if apierrors.IsNotFound(err) { - actual, err := v1alphaClient.MachineSets(required.GetNamespace()).Create(required) - return actual, true, err - } - if err != nil { - return nil, false, err - } - - modified := resourcemerge.BoolPtr(false) - resourcemerge.EnsureMachineSet(modified, existing, required) - if !*modified { - return existing, false, nil - } - - actual, err := v1alphaClient.MachineSets(required.GetNamespace()).Update(existing) - return actual, true, err -} - -// ApplyCluster applies the required cluster object to the cluster. -func ApplyCluster(client clientset.Interface, required *clusterv1alpha.Cluster) (*clusterv1alpha.Cluster, bool, error) { - v1alphaClient := client.ClusterV1alpha1() - existing, err := v1alphaClient.Clusters(required.GetNamespace()).Get(required.GetName(), metav1.GetOptions{}) - if apierrors.IsNotFound(err) { - actual, err := v1alphaClient.Clusters(required.GetNamespace()).Create(required) - return actual, true, err - } - if err != nil { - return nil, false, err - } - - modified := resourcemerge.BoolPtr(false) - resourcemerge.EnsureCluster(modified, existing, required) - if !*modified { - return existing, false, nil - } - - actual, err := v1alphaClient.Clusters(required.GetNamespace()).Update(existing) - return actual, true, err -} diff --git a/lib/resourcemerge/clusterapi.go b/lib/resourcemerge/clusterapi.go deleted file mode 100644 index cee1c318de..0000000000 --- a/lib/resourcemerge/clusterapi.go +++ /dev/null @@ -1,37 +0,0 @@ -package resourcemerge - -import ( - "k8s.io/apimachinery/pkg/api/equality" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" -) - -// EnsureMachineSet ensures that the existing matches the required. -// modified is set to true when existing had to be updated with required. -func EnsureMachineSet(modified *bool, existing *clusterv1.MachineSet, required *clusterv1.MachineSet) { - EnsureObjectMeta(modified, &existing.ObjectMeta, required.ObjectMeta) - ensureMachineSetSpec(modified, &existing.Spec, required.Spec) -} - -// ensureMachineSetSpec ensures that the existing matches the required. -// modified is set to true when existing had to be updated with required. -func ensureMachineSetSpec(modified *bool, existing *clusterv1.MachineSetSpec, required clusterv1.MachineSetSpec) { - setInt32IfSet(modified, existing.Replicas, *required.Replicas) - if !equality.Semantic.DeepEqual(existing.Selector, required.Selector) { - *modified = true - existing.Selector = required.Selector - } - EnsureObjectMeta(modified, &existing.Template.Spec.ObjectMeta, required.Template.Spec.ObjectMeta) - if !equality.Semantic.DeepEqual(existing.Template.Spec.Taints, required.Template.Spec.Taints) { - *modified = true - existing.Template.Spec.Taints = required.Template.Spec.Taints - } - // TODO(vikasc): verify if other fields also needs to be synced -} - -// EnsureCluster ensures that the existing matches the required. -// We don't wanna implement this for now as we only deploy the cluster object -// because it's currenlty required by the actuator interface. -// see https://github.com/kubernetes-sigs/cluster-api/issues/490 -func EnsureCluster(modified *bool, existing *clusterv1.Cluster, required *clusterv1.Cluster) { - return -} diff --git a/lib/resourceread/clusterapi.go b/lib/resourceread/clusterapi.go deleted file mode 100644 index fa0d8aa321..0000000000 --- a/lib/resourceread/clusterapi.go +++ /dev/null @@ -1,36 +0,0 @@ -package resourceread - -import ( - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/serializer" - clusterv1alpha "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" -) - -var ( - clusterAPIScheme = runtime.NewScheme() - clusterAPICodecs = serializer.NewCodecFactory(clusterAPIScheme) -) - -func init() { - if err := clusterv1alpha.AddToScheme(clusterAPIScheme); err != nil { - panic(err) - } -} - -// ReadMachineSetV1alphaOrDie reads MachineSet object from bytes. Panics on error. -func ReadMachineSetV1alphaOrDie(objBytes []byte) *clusterv1alpha.MachineSet { - requiredObj, err := runtime.Decode(clusterAPICodecs.UniversalDecoder(clusterv1alpha.SchemeGroupVersion), objBytes) - if err != nil { - panic(err) - } - return requiredObj.(*clusterv1alpha.MachineSet) -} - -// ReadClusterV1alphaOrDie reads Cluster object from bytes. Panics on error. -func ReadClusterV1alphaOrDie(objBytes []byte) *clusterv1alpha.Cluster { - requiredObj, err := runtime.Decode(clusterAPICodecs.UniversalDecoder(clusterv1alpha.SchemeGroupVersion), objBytes) - if err != nil { - panic(err) - } - return requiredObj.(*clusterv1alpha.Cluster) -} diff --git a/machines/aws/cluster.yaml b/machines/aws/cluster.yaml deleted file mode 100644 index eaaef11c10..0000000000 --- a/machines/aws/cluster.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- -apiVersion: "cluster.k8s.io/v1alpha1" -kind: Cluster -metadata: - name: {{.AWS.ClusterName}} - namespace: {{ .TargetNamespace }} -spec: - clusterNetwork: - services: - cidrBlocks: - - "10.0.0.1/24" - pods: - cidrBlocks: - - "10.0.0.2/24" - serviceDomain: unused diff --git a/machines/aws/worker.machineset.yaml b/machines/aws/worker.machineset.yaml deleted file mode 100644 index 7d9b4014b3..0000000000 --- a/machines/aws/worker.machineset.yaml +++ /dev/null @@ -1,71 +0,0 @@ ---- -apiVersion: cluster.k8s.io/v1alpha1 -kind: MachineSet -metadata: - name: worker - namespace: {{ .TargetNamespace }} - labels: - sigs.k8s.io/cluster-api-cluster: {{.AWS.ClusterName}} - sigs.k8s.io/cluster-api-machine-role: worker - sigs.k8s.io/cluster-api-machine-type: worker -spec: - replicas: {{.AWS.Replicas}} - selector: - matchLabels: - sigs.k8s.io/cluster-api-machineset: worker - sigs.k8s.io/cluster-api-cluster: {{.AWS.ClusterName}} - template: - metadata: - labels: - sigs.k8s.io/cluster-api-machineset: worker - sigs.k8s.io/cluster-api-cluster: {{.AWS.ClusterName}} - sigs.k8s.io/cluster-api-machine-role: worker - sigs.k8s.io/cluster-api-machine-type: worker - spec: - providerConfig: - value: - apiVersion: aws.cluster.k8s.io/v1alpha1 - kind: AWSMachineProviderConfig - {{- if .AWS.WithCreds }} - credentialsSecret: - name: aws-credentials-secret - {{- end}} - ami: - id: {{.AWS.Image}} - filters: - - name: "name" - values: - - CoreOS-{{.AWS.ReleaseChannel}}-{{.AWS.ContainerLinuxVersion}}-* - - name: "architecture" - values: - - "x86_64" - - name: "virtualization-type" - values: - - "hvm" - - name: "owner-id" - values: - - "595879546273" - instanceType: m4.large - placement: - region: {{.AWS.Region}} - availabilityZone: {{.AWS.AvailabilityZone}} - subnet: - filters: - - name: "tag:Name" - values: - - "{{.AWS.ClusterName}}-worker-*" - iamInstanceProfile: - id: "{{.AWS.ClusterName}}-worker-profile" - tags: - - name: tectonicClusterID - value: {{.AWS.ClusterID}} - securityGroups: - - filters: - - name: "tag:Name" - values: - - "{{.AWS.ClusterName}}_worker_sg" - userDataSecret: - name: ignition-worker - versions: - kubelet: "" - controlPlane: "" diff --git a/machines/libvirt/cluster.yaml b/machines/libvirt/cluster.yaml deleted file mode 100644 index 3685420654..0000000000 --- a/machines/libvirt/cluster.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- -apiVersion: "cluster.k8s.io/v1alpha1" -kind: Cluster -metadata: - name: {{ .Libvirt.ClusterName }} - namespace: {{ .TargetNamespace }} -spec: - clusterNetwork: - services: - cidrBlocks: - - "10.0.0.1/24" - pods: - cidrBlocks: - - "10.0.0.2/24" - serviceDomain: unused diff --git a/machines/libvirt/worker.machineset.yaml b/machines/libvirt/worker.machineset.yaml deleted file mode 100644 index 5b5ef3e5b7..0000000000 --- a/machines/libvirt/worker.machineset.yaml +++ /dev/null @@ -1,43 +0,0 @@ ---- -apiVersion: cluster.k8s.io/v1alpha1 -kind: MachineSet -metadata: - name: worker - namespace: {{ .TargetNamespace }} - labels: - sigs.k8s.io/cluster-api-cluster: {{.Libvirt.ClusterName}} - sigs.k8s.io/cluster-api-machine-role: worker - sigs.k8s.io/cluster-api-machine-type: worker -spec: - replicas: {{.Libvirt.Replicas}} - selector: - matchLabels: - sigs.k8s.io/cluster-api-machineset: worker - sigs.k8s.io/cluster-api-cluster: {{.Libvirt.ClusterName}} - sigs.k8s.io/cluster-api-machine-role: worker - sigs.k8s.io/cluster-api-machine-type: worker - template: - metadata: - labels: - sigs.k8s.io/cluster-api-machineset: worker - sigs.k8s.io/cluster-api-cluster: {{.Libvirt.ClusterName}} - sigs.k8s.io/cluster-api-machine-role: worker - sigs.k8s.io/cluster-api-machine-type: worker - spec: - providerConfig: - value: - apiVersion: libvirtproviderconfig/v1alpha1 - kind: LibvirtMachineProviderConfig - domainMemory: 2048 - domainVcpu: 2 - ignKey: /var/lib/libvirt/images/worker.ign - volume: - poolName: default - baseVolumeID: /var/lib/libvirt/images/coreos_base - networkInterfaceName: {{.Libvirt.NetworkName}} - networkInterfaceAddress: {{.Libvirt.IPRange}} - autostart: false - uri: {{.Libvirt.URI}} - versions: - kubelet: "" - controlPlane: "" \ No newline at end of file diff --git a/machines/openstack/cluster.yaml b/machines/openstack/cluster.yaml deleted file mode 100644 index 915457d80e..0000000000 --- a/machines/openstack/cluster.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- -apiVersion: "cluster.k8s.io/v1alpha1" -kind: Cluster -metadata: - namespace: {{ .TargetNamespace }} -spec: - clusterNetwork: - services: - cidrBlocks: - - "10.0.0.1/24" - pods: - cidrBlocks: - - "10.0.0.2/24" - serviceDomain: unused diff --git a/owned-manifests/clusterapi-manager-controllers.yaml b/owned-manifests/clusterapi-manager-controllers.yaml index 42b3c6d7a1..53d25f77bb 100644 --- a/owned-manifests/clusterapi-manager-controllers.yaml +++ b/owned-manifests/clusterapi-manager-controllers.yaml @@ -37,11 +37,13 @@ spec: operator: Exists containers: - name: controller-manager - {{- if .AWS }} + {{- if eq .Provider "aws" }} image: {{ .Images.ClusterAPIControllerManagerAWS }} - {{- else if .OpenStack}} + {{end}} + {{- if eq .Provider "openstack" }} image: {{ .Images.ClusterAPIControllerManagerOpenStack }} - {{- else if .Libvirt}} + {{end}} + {{- if eq .Provider "libvirt" }} image: {{ .Images.ClusterAPIControllerManagerLibvirt }} {{- end}} command: @@ -53,13 +55,15 @@ spec: limits: cpu: 100m memory: 30Mi - {{- if .AWS }} + {{- if eq .Provider "aws" }} - name: aws-machine-controller image: {{ .Images.ClusterAPIControllerAWS }} - {{- else if .OpenStack }} + {{end}} + {{- if eq .Provider "openstack" }} - name: openstack-machine-controller image: {{ .Images.ClusterAPIControllerOpenStack }} - {{- else if .Libvirt}} + {{end}} + {{- if eq .Provider "libvirt" }} - name: libvirt-machine-controller image: {{ .Images.ClusterAPIControllerLibvirt }} {{- end}} diff --git a/pkg/operator/operator.go b/pkg/operator/operator.go index 88fd09fb29..f015735869 100644 --- a/pkg/operator/operator.go +++ b/pkg/operator/operator.go @@ -32,7 +32,6 @@ import ( apiregistrationclientset "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset" "sigs.k8s.io/cluster-api/pkg/client/clientset_generated/clientset" "sigs.k8s.io/cluster-api/pkg/client/clientset_generated/clientset/scheme" - clusterapiinformersv1alpha1 "sigs.k8s.io/cluster-api/pkg/client/informers_generated/externalversions/cluster/v1alpha1" clusterapilisterv1alpha1 "sigs.k8s.io/cluster-api/pkg/client/listers_generated/cluster/v1alpha1" ) @@ -85,7 +84,6 @@ func New( config string, - machineSetInformer clusterapiinformersv1alpha1.MachineSetInformer, configMapInformer coreinformersv1.ConfigMapInformer, serviceAccountInfomer coreinformersv1.ServiceAccountInformer, crdInformer apiextinformersv1beta1.CustomResourceDefinitionInformer, @@ -116,7 +114,6 @@ func New( queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "machineapioperator"), } - machineSetInformer.Informer().AddEventHandler(optr.eventHandler()) configMapInformer.Informer().AddEventHandler(optr.eventHandler()) serviceAccountInfomer.Informer().AddEventHandler(optr.eventHandler()) crdInformer.Informer().AddEventHandler(optr.eventHandler()) @@ -129,8 +126,6 @@ func New( optr.crdLister = crdInformer.Lister() optr.crdListerSynced = crdInformer.Informer().HasSynced - optr.machineSetLister = machineSetInformer.Lister() - optr.machineSetSynced = machineSetInformer.Informer().HasSynced optr.deployLister = deployInformer.Lister() optr.deployListerSynced = deployInformer.Informer().HasSynced @@ -146,43 +141,12 @@ func (optr *Operator) Run(workers int, stopCh <-chan struct{}) { defer glog.Info("Shutting down MachineAPIOperator") if !cache.WaitForCacheSync(stopCh, - optr.deployListerSynced) { + optr.deployListerSynced, + optr.crdListerSynced) { glog.Error("failed to sync caches") return } glog.Info("Synched up caches") - go func() { - err := wait.Poll(machineRolloutPollInterval, machineRolloutTimeout, func() (bool, error) { - //TODO(vikasc) move operatorconfig rendering logic to main() to fail fast - operatorConfig, err := optr.getOperatorConfig() - if err != nil { - return false, fmt.Errorf("error decoding operator config: %v", err) - } - err = optr.updateImageDetails(operatorConfig) - if err != nil { - return false, fmt.Errorf("error getting image details: %v", err) - } - glog.Infof("images %+v", operatorConfig.Images) - - glog.Info("Trying to deploy Cluster object") - if err := optr.syncCluster(*operatorConfig); err != nil { - glog.Infof("Cannot create cluster, retrying: %v", err) - return false, nil - } - glog.Info("Created Cluster object") - glog.Info("Trying to deploy MachineSet object") - if err := optr.syncMachineSets(*operatorConfig); err != nil { - glog.Infof("Cannot create MachineSet, retrying: %v", err) - return false, nil - } - glog.Info("Created MachineSet object Successfully") - return true, nil - }) - if err != nil { - glog.Fatalf("Error out while trying to deploy machines: %v", err) - } - }() - for i := 0; i < workers; i++ { go wait.Until(optr.worker, time.Second, stopCh) } @@ -267,7 +231,6 @@ func (optr *Operator) sync(key string) error { glog.V(4).Infof("Finished syncing operator %q (%v)", key, time.Since(startTime)) }() - // TODO(alberto) operatorConfig as CRD? glog.Infof("Getting operator config using kubeclient") operatorConfig, err := optr.getOperatorConfig() if err != nil { diff --git a/pkg/operator/operator_test.go b/pkg/operator/operator_test.go new file mode 100644 index 0000000000..d117aee69c --- /dev/null +++ b/pkg/operator/operator_test.go @@ -0,0 +1,38 @@ +package operator + +import ( + "testing" + + "k8s.io/api/core/v1" +) + +func TestMinIncomingConfig(t *testing.T) { + data := make(map[string]string) + data["mao-config"] = ` +apiVersion: v1 +kind: machineAPIOperatorConfig +provider: aws +targetNamespace: openshift-cluster-api +` + cfg := v1.ConfigMap{ + Data: data, + } + + optr := &Operator{} + res, err := optr.mcFromClusterConfig(&cfg) + if err != nil { + t.Errorf("failed to get config: %v", err) + } + if res.APIVersion != "v1" { + t.Errorf("failed to get config: %v", err) + } + if res.Kind != "machineAPIOperatorConfig" { + t.Errorf("failed to get config: %v", err) + } + if res.Provider != "aws" { + t.Errorf("failed to get config: %v", err) + } + if res.TargetNamespace != "openshift-cluster-api" { + t.Errorf("failed to get config: %v", err) + } +} diff --git a/pkg/operator/sync.go b/pkg/operator/sync.go index ed44200e45..f5e019db20 100644 --- a/pkg/operator/sync.go +++ b/pkg/operator/sync.go @@ -10,7 +10,6 @@ import ( apiextv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/wait" "github.com/openshift/machine-api-operator/lib/resourceapply" @@ -21,11 +20,6 @@ import ( type syncFunc func(config render.OperatorConfig) error func (optr *Operator) syncAll(rconfig render.OperatorConfig) error { - // syncFuncs is the list of sync functions that are executed in order. - // any error marks sync as failure but continues to next syncFunc - syncFuncs := []syncFunc{ - optr.syncCluster, - } glog.Infof("Syncing operatorstatus") if err := optr.syncStatus(v1.OperatorStatusCondition{ @@ -36,18 +30,6 @@ func (optr *Operator) syncAll(rconfig render.OperatorConfig) error { return fmt.Errorf("error syncing status: %v", err) } - var errs []error - for _, f := range syncFuncs { - errs = append(errs, f(rconfig)) - } - - agg := utilerrors.NewAggregate(errs) - if agg != nil { - errs = append(errs, optr.syncDegradedStatus(agg)) - agg = utilerrors.NewAggregate(errs) - return fmt.Errorf("error syncing: %v", agg.Error()) - } - return optr.syncStatus(v1.OperatorStatusCondition{ Type: v1.OperatorStatusConditionTypeDone, Message: "Done running sync functions", @@ -81,64 +63,6 @@ func (optr *Operator) syncCustomResourceDefinitions(config render.OperatorConfig return nil } -func (optr *Operator) syncMachineSets(config render.OperatorConfig) error { - var machineSets []string - switch provider := config.Provider; provider { - case providerAWS: - machineSets = []string{ - "machines/aws/worker.machineset.yaml", - } - case providerLibvirt: - machineSets = []string{ - "machines/libvirt/worker.machineset.yaml", - } - } - for _, machineSet := range machineSets { - machineSetBytes, err := render.PopulateTemplate(&config, machineSet) - if err != nil { - return err - } - p := resourceread.ReadMachineSetV1alphaOrDie(machineSetBytes) - _, _, err = resourceapply.ApplyMachineSet(optr.clusterAPIClient, p) - if err != nil { - return err - } - } - - return nil -} - -func (optr *Operator) syncCluster(config render.OperatorConfig) error { - var clusters []string - switch provider := config.Provider; provider { - case providerAWS: - clusters = []string{ - "machines/aws/cluster.yaml", - } - case providerOpenStack: - clusters = []string{ - "machines/openstack/cluster.yaml", - } - case providerLibvirt: - clusters = []string{ - "machines/libvirt/cluster.yaml", - } - } - for _, cluster := range clusters { - clusterBytes, err := render.PopulateTemplate(&config, cluster) - if err != nil { - return err - } - p := resourceread.ReadClusterV1alphaOrDie(clusterBytes) - _, _, err = resourceapply.ApplyCluster(optr.clusterAPIClient, p) - if err != nil { - return err - } - } - - return nil -} - func (optr *Operator) syncClusterAPIController(config render.OperatorConfig) error { crBytes, err := render.PopulateTemplate(&config, fmt.Sprintf("%s/clusterapi-manager-cluster-role.yaml", ownedManifestsDir)) if err != nil { @@ -174,9 +98,6 @@ func (optr *Operator) syncClusterAPIController(config render.OperatorConfig) err } const ( - machineRolloutPollInterval = 5 * time.Second - machineRolloutTimeout = 10 * time.Minute - deploymentRolloutPollInterval = time.Second deploymentRolloutTimeout = 5 * time.Minute diff --git a/pkg/render/render_test.go b/pkg/render/render_test.go index 13fccf796a..36a11af900 100644 --- a/pkg/render/render_test.go +++ b/pkg/render/render_test.go @@ -33,208 +33,6 @@ func testRenderManifest(t *testing.T, filename string, config *OperatorConfig, e } } -func TestClusterAWSManifest(t *testing.T) { - config := OperatorConfig{ - TargetNamespace: "go-test", - Provider: "AWS", - AWS: &AWSConfig{ - ClusterName: "TestClusterManifest-ClusterName", - ClusterID: "TestClusterManifest-ClusterID", - Region: "TestClusterManifest-Region", - AvailabilityZone: "TestClusterManifest-AvailabilityZone", - Image: "TestClusterManifest-Image", - Replicas: "TestClusterManifest-Replicas", - }, - } - - testRenderManifest(t, "../../machines/aws/cluster.yaml", &config, ` ---- -apiVersion: "cluster.k8s.io/v1alpha1" -kind: Cluster -metadata: - name: TestClusterManifest-ClusterName - namespace: go-test -spec: - clusterNetwork: - services: - cidrBlocks: - - "10.0.0.1/24" - pods: - cidrBlocks: - - "10.0.0.2/24" - serviceDomain: unused -`) -} - -func TestMachineSetAWSManifest(t *testing.T) { - config := OperatorConfig{ - TargetNamespace: "go-test", - Provider: "aws", - AWS: &AWSConfig{ - ClusterName: "TestClusterManifest-ClusterName", - ClusterID: "TestClusterManifest-ClusterID", - ReleaseChannel: "TestChannel", - ContainerLinuxVersion: "TestCLVersion", - Region: "TestClusterManifest-Region", - AvailabilityZone: "TestClusterManifest-AvailabilityZone", - Image: "TestClusterManifest-Image", - Replicas: "TestClusterManifest-Replicas", - }, - } - - testRenderManifest(t, "../../machines/aws/worker.machineset.yaml", &config, ` ---- -apiVersion: cluster.k8s.io/v1alpha1 -kind: MachineSet -metadata: - name: worker - namespace: go-test - labels: - sigs.k8s.io/cluster-api-cluster: TestClusterManifest-ClusterName - sigs.k8s.io/cluster-api-machine-role: worker - sigs.k8s.io/cluster-api-machine-type: worker -spec: - replicas: TestClusterManifest-Replicas - selector: - matchLabels: - sigs.k8s.io/cluster-api-machineset: worker - sigs.k8s.io/cluster-api-cluster: TestClusterManifest-ClusterName - template: - metadata: - labels: - sigs.k8s.io/cluster-api-machineset: worker - sigs.k8s.io/cluster-api-cluster: TestClusterManifest-ClusterName - sigs.k8s.io/cluster-api-machine-role: worker - sigs.k8s.io/cluster-api-machine-type: worker - spec: - providerConfig: - value: - apiVersion: aws.cluster.k8s.io/v1alpha1 - kind: AWSMachineProviderConfig - ami: - id: TestClusterManifest-Image - filters: - - name: "name" - values: - - CoreOS-TestChannel-TestCLVersion-* - - name: "architecture" - values: - - "x86_64" - - name: "virtualization-type" - values: - - "hvm" - - name: "owner-id" - values: - - "595879546273" - instanceType: m4.large - placement: - region: TestClusterManifest-Region - availabilityZone: TestClusterManifest-AvailabilityZone - subnet: - filters: - - name: "tag:Name" - values: - - "TestClusterManifest-ClusterName-worker-*" - iamInstanceProfile: - id: "TestClusterManifest-ClusterName-worker-profile" - tags: - - name: tectonicClusterID - value: TestClusterManifest-ClusterID - securityGroups: - - filters: - - name: "tag:Name" - values: - - "TestClusterManifest-ClusterName_worker_sg" - userDataSecret: - name: ignition-worker - versions: - kubelet: "" - controlPlane: ""`) -} - -func TestClusterOpenStackManifest(t *testing.T) { - config := OperatorConfig{ - TargetNamespace: "go-test", - Provider: "OpenStack", - } - - testRenderManifest(t, "../../machines/openstack/cluster.yaml", &config, ` ---- -apiVersion: "cluster.k8s.io/v1alpha1" -kind: Cluster -metadata: - namespace: go-test -spec: - clusterNetwork: - services: - cidrBlocks: - - "10.0.0.1/24" - pods: - cidrBlocks: - - "10.0.0.2/24" - serviceDomain: unused -`) -} - -func TestMachineSetLibvirtManifest(t *testing.T) { - config := OperatorConfig{ - TargetNamespace: "go-test", - Provider: "libvirt", - Libvirt: &LibvirtConfig{ - URI: "qemu+tcp://host_private_ip/system", - NetworkName: "testNet", - IPRange: "192.168.124.0/24", - Replicas: "2", - ClusterName: "test", - }, - } - - testRenderManifest(t, "../../machines/libvirt/worker.machineset.yaml", &config, ` ---- -apiVersion: cluster.k8s.io/v1alpha1 -kind: MachineSet -metadata: - name: worker - namespace: go-test - labels: - sigs.k8s.io/cluster-api-cluster: test - sigs.k8s.io/cluster-api-machine-role: worker - sigs.k8s.io/cluster-api-machine-type: worker -spec: - replicas: 2 - selector: - matchLabels: - sigs.k8s.io/cluster-api-machineset: worker - sigs.k8s.io/cluster-api-cluster: test - sigs.k8s.io/cluster-api-machine-role: worker - sigs.k8s.io/cluster-api-machine-type: worker - template: - metadata: - labels: - sigs.k8s.io/cluster-api-machineset: worker - sigs.k8s.io/cluster-api-cluster: test - sigs.k8s.io/cluster-api-machine-role: worker - sigs.k8s.io/cluster-api-machine-type: worker - spec: - providerConfig: - value: - apiVersion: libvirtproviderconfig/v1alpha1 - kind: LibvirtMachineProviderConfig - domainMemory: 2048 - domainVcpu: 2 - ignKey: /var/lib/libvirt/images/worker.ign - volume: - poolName: default - baseVolumeID: /var/lib/libvirt/images/coreos_base - networkInterfaceName: testNet - networkInterfaceAddress: 192.168.124.0/24 - autostart: false - uri: qemu+tcp://host_private_ip/system - versions: - kubelet: "" - controlPlane: ""`) -} - func TestClusterapiControllerManifest(t *testing.T) { config := OperatorConfig{ TargetNamespace: "go-test", diff --git a/tests/e2e/main.go b/tests/e2e/main.go index c961b5b5e9..f79cbfc1b9 100644 --- a/tests/e2e/main.go +++ b/tests/e2e/main.go @@ -25,7 +25,9 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" + capiv1alpha1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" "sigs.k8s.io/cluster-api/pkg/client/clientset_generated/clientset" + capiv1alpha1scheme "sigs.k8s.io/cluster-api/pkg/client/clientset_generated/clientset/scheme" ) const ( @@ -219,6 +221,7 @@ var rootCmd = &cobra.Command{ return err } + capiv1alpha1scheme.AddToScheme(scheme.Scheme) apiextensionsscheme.AddToScheme(scheme.Scheme) decode := scheme.Codecs.UniversalDeserializer().Decode // create rbac @@ -370,6 +373,40 @@ var rootCmd = &cobra.Command{ return err } + // create cluster and machineSet objects + type clusterConfig struct { + ClusterID string + } + ccgf := clusterConfig{ + ClusterID: clusterID, + } + clusterData, err := RenderTemplateFromFile(ccgf, filepath.Join(assetsPath, "manifests/cluster.yaml")) + if err != nil { + glog.Fatalf("Error reading %#v", err) + } else { + clusterObj, _, err := decode([]byte(clusterData), nil, nil) + if err != nil { + glog.Fatalf("Error decoding %#v", err) + } + cluster := clusterObj.(*capiv1alpha1.Cluster) + if _, err := testConfig.CAPIClient.ClusterV1alpha1().Clusters(targetNamespace).Create(cluster); err != nil { + return err + } + } + machineSetData, err := RenderTemplateFromFile(ccgf, filepath.Join(assetsPath, "manifests/machineset.yaml")) + if err != nil { + glog.Fatalf("Error reading %#v", err) + } else { + machineSetObj, _, err := decode([]byte(machineSetData), nil, nil) + if err != nil { + glog.Fatalf("Error decoding %#v", err) + } + machineSet := machineSetObj.(*capiv1alpha1.MachineSet) + if _, err := testConfig.CAPIClient.ClusterV1alpha1().MachineSets(targetNamespace).Create(machineSet); err != nil { + return err + } + } + // Verify cluster, machineSet and machines have been deployed var cluster, machineSet, workers bool err = wait.Poll(pollInterval, timeoutPoolMachineSetRunningInterval, func() (bool, error) { @@ -384,7 +421,7 @@ var rootCmd = &cobra.Command{ } if workersList, err := testConfig.CAPIClient.ClusterV1alpha1().Machines(targetNamespace).List(metav1.ListOptions{}); err == nil { - if len(workersList.Items) == 2 { + if len(workersList.Items) == machineSetReplicas { workers = true log.Info("Machine objects has been created") } diff --git a/tests/e2e/manifests/cluster.yaml b/tests/e2e/manifests/cluster.yaml new file mode 100644 index 0000000000..c66fbb7677 --- /dev/null +++ b/tests/e2e/manifests/cluster.yaml @@ -0,0 +1,14 @@ +apiVersion: cluster.k8s.io/v1alpha1 +kind: Cluster +metadata: + name: {{ .ClusterID }} + namespace: openshift-cluster-api +spec: + clusterNetwork: + pods: + cidrBlocks: + - 10.0.0.2/24 + serviceDomain: unused + services: + cidrBlocks: + - 10.0.0.1/24 \ No newline at end of file diff --git a/tests/e2e/manifests/machineset.yaml b/tests/e2e/manifests/machineset.yaml new file mode 100644 index 0000000000..5e4301ecb6 --- /dev/null +++ b/tests/e2e/manifests/machineset.yaml @@ -0,0 +1,53 @@ +apiVersion: cluster.k8s.io/v1alpha1 +kind: MachineSet +metadata: + labels: + sigs.k8s.io/cluster-api-cluster: {{ .ClusterID }} + sigs.k8s.io/cluster-api-machine-role: worker + sigs.k8s.io/cluster-api-machine-type: worker + name: worker + namespace: openshift-cluster-api +spec: + replicas: 2 + selector: + matchLabels: + sigs.k8s.io/cluster-api-cluster: {{ .ClusterID }} + sigs.k8s.io/cluster-api-machineset: worker + template: + metadata: + labels: + sigs.k8s.io/cluster-api-cluster: {{ .ClusterID }} + sigs.k8s.io/cluster-api-machine-role: worker + sigs.k8s.io/cluster-api-machine-type: worker + sigs.k8s.io/cluster-api-machineset: worker + spec: + providerConfig: + value: + credentialsSecret: + name: aws-credentials-secret + ami: + id: ami-05c79276d240b93bc + apiVersion: aws.cluster.k8s.io/v1alpha1 + iamInstanceProfile: + id: {{ .ClusterID }}-worker-profile + instanceType: t2.medium + kind: AWSMachineProviderConfig + placement: + region: us-east-1 + securityGroups: + - filters: + - name: tag:Name + values: + - {{ .ClusterID }}_worker_sg + subnet: + filters: + - name: tag:Name + values: + - {{ .ClusterID }}-worker-* + tags: + - name: tectonicClusterID + value: {{ .ClusterID }} + userDataSecret: + name: ignition-worker + versions: + kubelet: "" \ No newline at end of file diff --git a/tests/e2e/manifests/mao-config.yaml b/tests/e2e/manifests/mao-config.yaml index 306a1ff27d..b4aa5cef62 100644 --- a/tests/e2e/manifests/mao-config.yaml +++ b/tests/e2e/manifests/mao-config.yaml @@ -1,35 +1,4 @@ apiVersion: v1 -aws: - availabilityZone: "" - clusterID: {{.AWS.ClusterID}} - clusterName: {{.AWS.ClusterName}} - containerLinuxVersion: 1800.7.0 - image: "" - region: {{.AWS.Region}} - releaseChannel: stable - replicas: 2 - WithCreds: true kind: machineAPIOperatorConfig provider: aws targetNamespace: openshift-cluster-api -apiServiceCA: | - -----BEGIN CERTIFICATE----- - MIIDUDCCAjgCCQDhU1FW+oorKTANBgkqhkiG9w0BAQsFADBqMQswCQYDVQQGEwJ1 - bjELMAkGA1UECAwCc3QxCjAIBgNVBAcMAWwxCjAIBgNVBAoMAW8xCzAJBgNVBAsM - Am91MSkwJwYDVQQDDCBjbHVzdGVyYXBpLWNlcnRpZmljYXRlLWF1dGhvcml0eTAe - Fw0xODEwMDMxNDIwMzhaFw0xOTEwMDMxNDIwMzhaMGoxCzAJBgNVBAYTAnVuMQsw - CQYDVQQIDAJzdDEKMAgGA1UEBwwBbDEKMAgGA1UECgwBbzELMAkGA1UECwwCb3Ux - KTAnBgNVBAMMIGNsdXN0ZXJhcGktY2VydGlmaWNhdGUtYXV0aG9yaXR5MIIBIjAN - BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3A3qoOHiLxMtaKlRkkepMFlwzeit - OZV+1HfOK2IrLIp96oRup0JuTAFSIdnGiuhTwYdbIxotp00ucbkfofWGKp+d9ipu - dfbqUdvmpySIrEMd6bX9fbyvUTDs8sAUBqa+rmKItlQrJlp6yEZ2uoiFENn81zoi - pi3BS5G+P7cpDdlTa6agnZDB/rwZC9fMZnpJt4upBFC7kkX0XXVbFQV8364+GaWK - QAzsG7MuX918mu77K72zW4u0KOV0JbkmYIwzUQe6rk0hA02tgNm1MZ5ErDDRkRmv - cUd2xQvarmynVSW5uNMm0W1Wti/a9fUTEdi0VITbHWe6UW4YLsAo3DmEdwIDAQAB - MA0GCSqGSIb3DQEBCwUAA4IBAQBzKlJC2xha3RQQzsE2YZ9SUxqEjvpvp5tsrxCG - SJcysHqSigU/c0+n8gEACXUEaAx+qsMlwepnQrDXkATeLnJec8pkMuV3Dsjf4hMl - xGhBYbltCJE99jbBRC5jpXqudl3EaZOIhK8okdA6nFbLp61UxmmMehUgmLEQ7oh/ - nQD8xXi+Hm1eOO9DmlqateFH+YqdqVl3Q6Wc1xiSQXwZoVEzTkoK1EBUtGESarzc - SjFhQwJRFcadljxrJn45ThEC2a68H3XMxoSAezcEToFHn7DcNY8MDXUTWXXQVWBv - ALhGsUi59bp6kbKgutU91EOynikbDJ8bckbWcZBPtRm948b+ - -----END CERTIFICATE-----