From 9021207ef7be4c668e666234dbaed2648f8ef2ec Mon Sep 17 00:00:00 2001 From: Flavio Percoco Date: Fri, 5 Oct 2018 11:42:45 +0200 Subject: [PATCH] Add OpenStack as a supported platform --- README.md | 2 +- ...hine-api-operator_01_images.configmap.yaml | 2 +- install/image-references | 6 +- machines/openstack/cluster.yaml | 15 ++++ machines/openstack/worker.machineset.yaml | 45 ++++++++++ owned-manifests/clusterapi-controller.yaml | 5 ++ pkg/operator/operator.go | 1 + pkg/operator/sync.go | 8 ++ pkg/render/config.go | 49 ++++++++--- pkg/render/render.go | 5 +- pkg/render/render_test.go | 85 +++++++++++++++++++ 11 files changed, 206 insertions(+), 17 deletions(-) create mode 100644 machines/openstack/cluster.yaml create mode 100644 machines/openstack/worker.machineset.yaml diff --git a/README.md b/README.md index bd98817402..fb1afd2910 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An Operator for managing the cluster-api stack and the Openshift owned machineSets: - Aggregated API server - Controller manager -- Machine controller (AWS/Libvirt actuator) +- Machine controller (AWS/OpenStack/Libvirt actuator) # Manual deployment (for Kubernetes cluster) diff --git a/install/0000_50_machine-api-operator_01_images.configmap.yaml b/install/0000_50_machine-api-operator_01_images.configmap.yaml index 46badfbfca..71197ce968 100644 --- a/install/0000_50_machine-api-operator_01_images.configmap.yaml +++ b/install/0000_50_machine-api-operator_01_images.configmap.yaml @@ -4,4 +4,4 @@ metadata: name: machine-api-operator-images namespace: openshift-cluster-api data: - images.json: '{"clusterAPIControllerAWS": "openshift/origin-aws-machine-controllers:v4.0.0", "clusterAPIControllerManagerAWS": "openshift/origin-aws-machine-controllers:v4.0.0" , "clusterAPIControllerManagerLibvirt": "gcr.io/k8s-cluster-api/controller-manager:0.0.7", "clusterAPIControllerLibvirt": "quay.io/coreos/cluster-api-provider-libvirt:cd386e4", "clusterAPIServer": "gcr.io/k8s-cluster-api/cluster-apiserver:0.0.6", "Etcd": "quay.io/coreos/etcd:latest"}' + images.json: '{"clusterAPIControllerAWS": "openshift/origin-aws-machine-controllers:v4.0.0", "clusterAPIControllerManagerAWS": "openshift/origin-aws-machine-controllers:v4.0.0", "clusterAPIControllerOpenStack": "openshift/origin-openstack-machine-controllers:v4.0.0", "clusterAPIControllerManagerOpenStack": "openshift/origin-openstack-machine-controllers:v4.0.0", "clusterAPIControllerManagerLibvirt": "gcr.io/k8s-cluster-api/controller-manager:0.0.7", "clusterAPIControllerLibvirt": "quay.io/coreos/cluster-api-provider-libvirt:cd386e4", "clusterAPIServer": "gcr.io/k8s-cluster-api/cluster-apiserver:0.0.6", "Etcd": "quay.io/coreos/etcd:latest"}' diff --git a/install/image-references b/install/image-references index a5bb4005fb..3b3a0f134e 100644 --- a/install/image-references +++ b/install/image-references @@ -10,7 +10,11 @@ spec: from: kind: DockerImage name: docker.io/openshift/origin-aws-machine-controllers:v4.0.0 + - name: openstack-machine-controllers + from: + kind: DockerImage + name: docker.io/openshift/origin-openstack-machine-controllers:v4.0.0 - name: libvirt-machine-controllers from: kind: DockerImage - name: docker.io/openshift/origin-libvirt-machine-controllers:v4.0.0 \ No newline at end of file + name: docker.io/openshift/origin-libvirt-machine-controllers:v4.0.0 diff --git a/machines/openstack/cluster.yaml b/machines/openstack/cluster.yaml new file mode 100644 index 0000000000..37124549e9 --- /dev/null +++ b/machines/openstack/cluster.yaml @@ -0,0 +1,15 @@ +--- +apiVersion: "cluster.k8s.io/v1alpha1" +kind: Cluster +metadata: + name: {{.OpenStack.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/openstack/worker.machineset.yaml b/machines/openstack/worker.machineset.yaml new file mode 100644 index 0000000000..e8f853b56a --- /dev/null +++ b/machines/openstack/worker.machineset.yaml @@ -0,0 +1,45 @@ +--- +apiVersion: cluster.k8s.io/v1alpha1 +kind: MachineSet +metadata: + name: worker + namespace: {{ .TargetNamespace }} + labels: + sigs.k8s.io/cluster-api-cluster: {{.OpenStack.ClusterName}} + sigs.k8s.io/cluster-api-machine-role: worker + sigs.k8s.io/cluster-api-machine-type: worker + set: worker +spec: + replicas: {{.OpenStack.Replicas}} + selector: + matchLabels: + sigs.k8s.io/cluster-api-machineset: worker + sigs.k8s.io/cluster-api-cluster: {{.OpenStack.ClusterName}} + template: + metadata: + labels: + sigs.k8s.io/cluster-api-machineset: worker + sigs.k8s.io/cluster-api-cluster: {{.OpenStack.ClusterName}} + sigs.k8s.io/cluster-api-machine-role: worker + sigs.k8s.io/cluster-api-machine-type: worker + spec: + providerConfig: + value: + apiVersion: openstack.cluster.k8s.io/v1alpha1 + kind: OpenStackMachineProviderConfig + flavor: m4.large + image: {{.OpenStack.Image}} + availability_zone: {{.OpenStack.AvailabilityZone}} + {{- if .OpenStack.Networks}} + networks: + {{- range .OpenStack.Networks}} + - uuid: {{.UUID}} + {{- end}} + {{- end}} + floatingIP: {{.OpenStack.FloatingIP}} + {{- if .OpenStack.SecurityGroups}} + security_groups: {{.OpenStack.SecurityGroups}} + {{- end}} + versions: + kubelet: "" + controlPlane: "" diff --git a/owned-manifests/clusterapi-controller.yaml b/owned-manifests/clusterapi-controller.yaml index 9f79c1cc8c..9838843f42 100644 --- a/owned-manifests/clusterapi-controller.yaml +++ b/owned-manifests/clusterapi-controller.yaml @@ -39,6 +39,8 @@ spec: - name: controller-manager {{- if .AWS }} image: {{ .Images.ClusterAPIControllerManagerAWS }} + {{- else if .OpenStack}} + image: {{ .Images.ClusterAPIControllerManagerOpenStack }} {{- else if .Libvirt}} image: {{ .Images.ClusterAPIControllerManagerLibvirt }} {{- end}} @@ -54,6 +56,9 @@ spec: {{- if .AWS }} - name: aws-machine-controller image: {{ .Images.ClusterAPIControllerAWS }} + {{- else if .OpenStack }} + - name: openstack-machine-controller + image: {{ .Images.ClusterAPIControllerOpenStack }} {{- else if .Libvirt}} - name: libvirt-machine-controller image: {{ .Images.ClusterAPIControllerLibvirt }} diff --git a/pkg/operator/operator.go b/pkg/operator/operator.go index 3fb1b0b532..1c594b91d1 100644 --- a/pkg/operator/operator.go +++ b/pkg/operator/operator.go @@ -44,6 +44,7 @@ const ( // 5ms, 10ms, 20ms, 40ms, 80ms, 160ms, 320ms, 640ms, 1.3s, 2.6s, 5.1s, 10.2s, 20.4s, 41s, 82s maxRetries = 15 providerAWS = "aws" + providerOpenStack = "openstack" providerLibvirt = "libvirt" ownedManifestsDir = "owned-manifests" ) diff --git a/pkg/operator/sync.go b/pkg/operator/sync.go index 06a470b13d..028f88e69c 100644 --- a/pkg/operator/sync.go +++ b/pkg/operator/sync.go @@ -89,6 +89,10 @@ func (optr *Operator) syncMachineSets(config render.OperatorConfig) error { machineSets = []string{ "machines/aws/worker.machineset.yaml", } + case providerOpenStack: + machineSets = []string{ + "machines/openstack/worker.machineset.yaml", + } case providerLibvirt: machineSets = []string{ "machines/libvirt/worker.machineset.yaml", @@ -116,6 +120,10 @@ func (optr *Operator) syncCluster(config render.OperatorConfig) error { clusters = []string{ "machines/aws/cluster.yaml", } + case providerOpenStack: + clusters = []string{ + "machines/openstack/cluster.yaml", + } case providerLibvirt: clusters = []string{ "machines/libvirt/cluster.yaml", diff --git a/pkg/render/config.go b/pkg/render/config.go index 21d42eec56..8daab1e17a 100644 --- a/pkg/render/config.go +++ b/pkg/render/config.go @@ -12,12 +12,13 @@ const ( // OperatorConfig contains configuration for MAO type OperatorConfig struct { metav1.TypeMeta `json:",inline"` - TargetNamespace string `json:"targetNamespace"` - APIServiceCA string `json:"apiServiceCA"` - Provider string `json:"provider"` - AWS *AWSConfig `json:"aws"` - Libvirt *LibvirtConfig `json:"libvirt"` - Images *Images `json:"images"` + TargetNamespace string `json:"targetNamespace"` + APIServiceCA string `json:"apiServiceCA"` + Provider string `json:"provider"` + AWS *AWSConfig `json:"aws"` + OpenStack *OpenStackConfig `json:"openstack"` + Libvirt *LibvirtConfig `json:"libvirt"` + Images *Images `json:"images"` } // LibvirtConfig contains specific config for Libvirt @@ -29,6 +30,28 @@ type LibvirtConfig struct { Replicas string `json:"replicas"` } +// OpenStackConfig contains specific config for OpenStack +type OpenStackConfig struct { + ClusterName string `json:"clusterName"` + ClusterID string `json:"clusterID"` + AvailabilityZone string `json:"availabilityZone"` + Image string `json:"image"` + Replicas string `json:"replicas"` + FloatingIP string `json:"floatingIP,omitempty"` + Networks []OpenStackNetworkParam `json:"networks,omitempty"` + SecurityGroups []string `json:"securityGroups,omitempty"` +} + +// We should switch to predictable names/filters as soon as +// it is available in the OpenStack actuator. +type OpenStackNetworkParam struct { + // The UUID of the network. Required if you omit the port attribute. + UUID string `json:"uuid,omitempty"` + // A fixed IPv4 address for the NIC. + FixedIp string `json:"fixed_ip,omitempty"` +} + + // AWSConfig contains specific config for AWS type AWSConfig struct { ClusterName string `json:"clusterName"` @@ -44,10 +67,12 @@ type AWSConfig struct { // Images allows build systems to inject images for MAO components. type Images struct { - ClusterAPIControllerAWS string `json:"clusterAPIControllerAWS"` - ClusterAPIControllerLibvirt string `json:"clusterAPIControllerLibvirt"` - ClusterAPIControllerManagerAWS string `json:"clusterAPIControllerManagerAWS"` - ClusterAPIControllerManagerLibvirt string `json:"clusterAPIControllerManagerLibvirt"` - ClusterAPIServer string `json:"clusterAPIServer"` - Etcd string `json:"Etcd"` + ClusterAPIControllerAWS string `json:"clusterAPIControllerAWS"` + ClusterAPIControllerOpenStack string `json:"clusterAPIControllerOpenStack"` + ClusterAPIControllerLibvirt string `json:"clusterAPIControllerLibvirt"` + ClusterAPIControllerManagerAWS string `json:"clusterAPIControllerManagerAWS"` + ClusterAPIControllerManagerOpenStack string `json:"clusterAPIControllerManagerOpenStack"` + ClusterAPIControllerManagerLibvirt string `json:"clusterAPIControllerManagerLibvirt"` + ClusterAPIServer string `json:"clusterAPIServer"` + Etcd string `json:"Etcd"` } diff --git a/pkg/render/render.go b/pkg/render/render.go index a9f44d9284..19aecdacee 100644 --- a/pkg/render/render.go +++ b/pkg/render/render.go @@ -11,8 +11,9 @@ import ( ) const ( - providerAWS = "aws" - providerLibvirt = "libvirt" + providerAWS = "aws" + providerOpenStack = "openstack" + providerLibvirt = "libvirt" ) // Manifests takes the config object that contains the templated value, diff --git a/pkg/render/render_test.go b/pkg/render/render_test.go index e0a693dfe8..1f2e58074c 100644 --- a/pkg/render/render_test.go +++ b/pkg/render/render_test.go @@ -152,6 +152,91 @@ spec: controlPlane: ""`) } +func TestClusterOpenStackManifest(t *testing.T) { + config := OperatorConfig{ + TargetNamespace: "go-test", + Provider: "OpenStack", + OpenStack: &OpenStackConfig{ + ClusterName: "TestClusterManifest-ClusterName", + ClusterID: "TestClusterManifest-ClusterID", + AvailabilityZone: "TestClusterManifest-AvailabilityZone", + Image: "TestClusterManifest-Image", + Replicas: "TestClusterManifest-Replicas", + }, + } + + testRenderManifest(t, "../../machines/openstack/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 TestMachineSetOpenStackManifest(t *testing.T) { + config := OperatorConfig{ + TargetNamespace: "go-test", + Provider: "openstack", + OpenStack: &OpenStackConfig{ + ClusterName: "TestClusterManifest-ClusterName", + ClusterID: "TestClusterManifest-ClusterID", + AvailabilityZone: "TestClusterManifest-AvailabilityZone", + Image: "TestClusterManifest-Image", + Replicas: "TestClusterManifest-Replicas", + FloatingIP: "192.168.1.1", + }, + } + + testRenderManifest(t, "../../machines/openstack/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 + set: 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: openstack.cluster.k8s.io/v1alpha1 + kind: OpenStackMachineProviderConfig + flavor: m4.large + image: TestClusterManifest-Image + availability_zone: TestClusterManifest-AvailabilityZone + floatingIP: 192.168.1.1 + versions: + kubelet: "" + controlPlane: ""`) +} + func TestMachineSetLibvirtManifest(t *testing.T) { config := OperatorConfig{ TargetNamespace: "go-test",