From 53a7468ba62e9d87341e882fbb277ed46cc9c9d8 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 ++++++++ owned-manifests/clusterapi-controller.yaml | 5 +++ pkg/operator/operator.go | 1 + pkg/operator/sync.go | 4 ++ pkg/render/config.go | 37 +++++++++++++------ pkg/render/render.go | 5 ++- pkg/render/render_test.go | 32 ++++++++++++++++ 10 files changed, 92 insertions(+), 17 deletions(-) create mode 100644 machines/openstack/cluster.yaml diff --git a/README.md b/README.md index bd9881740..fb1afd291 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 46badfbfc..71197ce96 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 a5bb4005f..b66af2798 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: registry.svc.ci.openshift.org/openshift/origin-v4.0:openstack-machine-controllers - 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 000000000..37124549e --- /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/owned-manifests/clusterapi-controller.yaml b/owned-manifests/clusterapi-controller.yaml index 9f79c1cc8..9838843f4 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 3fb1b0b53..1c594b91d 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 4e9729b03..178f46f50 100644 --- a/pkg/operator/sync.go +++ b/pkg/operator/sync.go @@ -118,6 +118,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 21d42eec5..525d21178 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,16 @@ type LibvirtConfig struct { Replicas string `json:"replicas"` } +// 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 +55,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 a9f44d928..19aecdace 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 e0a693dfe..21cdc6369 100644 --- a/pkg/render/render_test.go +++ b/pkg/render/render_test.go @@ -152,6 +152,38 @@ 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 TestMachineSetLibvirtManifest(t *testing.T) { config := OperatorConfig{ TargetNamespace: "go-test",