Skip to content

Commit

Permalink
Merge pull request #46 from lobziik/azure-images
Browse files Browse the repository at this point in the history
Add azure images
  • Loading branch information
openshift-merge-robot committed Jun 4, 2021
2 parents 81ed17e + 98d2a83 commit be2215a
Show file tree
Hide file tree
Showing 6 changed files with 213 additions and 6 deletions.
Expand Up @@ -10,5 +10,7 @@ data:
images.json: >
{
"cloudControllerManagerAWS": "registry.ci.openshift.org/openshift:aws-cloud-controller-manager",
"cloudControllerManagerAzure": "registry.ci.openshift.org/openshift:azure-cloud-controller-manager",
"cloudNodeManagerAzure": "registry.ci.openshift.org/openshift:azure-cloud-node-manager",
"cloudControllerManagerOpenStack": "registry.ci.openshift.org/openshift:openstack-cloud-controller-manager"
}
8 changes: 8 additions & 0 deletions manifests/image-references
Expand Up @@ -10,6 +10,14 @@ spec:
from:
kind: DockerImage
name: registry.ci.openshift.org/openshift:aws-cloud-controller-manager
- name: azure-cloud-controller-manager
from:
kind: DockerImage
name: registry.ci.openshift.org/openshift:azure-cloud-controller-manager
- name: azure-cloud-node-manager
from:
kind: DockerImage
name: registry.ci.openshift.org/openshift:azure-cloud-node-manager
- name: openstack-cloud-controller-manager
from:
kind: DockerImage
Expand Down
15 changes: 15 additions & 0 deletions pkg/config/config.go
Expand Up @@ -13,13 +13,16 @@ import (
// imagesReference allows build systems to inject imagesReference for CCCMO components
type imagesReference struct {
CloudControllerManagerAWS string `json:"cloudControllerManagerAWS"`
CloudControllerManagerAzure string `json:"cloudControllerManagerAzure"`
CloudNodeManagerAzure string `json:"cloudNodeManagerAzure"`
CloudControllerManagerOpenStack string `json:"cloudControllerManagerOpenStack"`
}

// OperatorConfig contains configuration values for templating resources
type OperatorConfig struct {
ManagedNamespace string
ControllerImage string
CloudNodeImage string
Platform configv1.PlatformType
}

Expand Down Expand Up @@ -53,6 +56,17 @@ func getCloudControllerManagerFromImages(platform configv1.PlatformType, images
return images.CloudControllerManagerAWS
case configv1.OpenStackPlatformType:
return images.CloudControllerManagerOpenStack
case configv1.AzurePlatformType:
return images.CloudControllerManagerAzure
default:
return ""
}
}

func getCloudNodeManagerFromImages(platform configv1.PlatformType, images imagesReference) string {
switch platform {
case configv1.AzurePlatformType:
return images.CloudNodeManagerAzure
default:
return ""
}
Expand All @@ -71,6 +85,7 @@ func ComposeConfig(platform configv1.PlatformType, imagesFile, managedNamespace
}

config.ControllerImage = getCloudControllerManagerFromImages(platform, images)
config.CloudNodeImage = getCloudNodeManagerFromImages(platform, images)

return config, nil
}
38 changes: 38 additions & 0 deletions pkg/config/config_test.go
Expand Up @@ -176,6 +176,44 @@ func TestGetProviderControllerFromImages(t *testing.T) {
}
}

func TestGetNodeControllerFromImages(t *testing.T) {
images := imagesReference{
CloudControllerManagerAWS: "registry.ci.openshift.org/openshift:aws-cloud-controller-manager",
CloudControllerManagerAzure: "registry.ci.openshift.org/openshift:azure-cloud-controller-manager",
CloudNodeManagerAzure: "registry.ci.openshift.org/openshift:azure-cloud-node-manager",
CloudControllerManagerOpenStack: "registry.ci.openshift.org/openshift:openstack-cloud-controller-manager",
}

tc := []struct {
name string
platformType configv1.PlatformType
expectedImage string
}{{
name: "AWS platorm",
platformType: configv1.AWSPlatformType,
expectedImage: "",
}, {
name: "Azure platorm",
platformType: configv1.AzurePlatformType,
expectedImage: "registry.ci.openshift.org/openshift:azure-cloud-node-manager",
}, {
name: "OpenStack platorm",
platformType: configv1.OpenStackPlatformType,
expectedImage: "",
}, {
name: "Unknown platorm",
platformType: "unknown",
expectedImage: "",
}}

for _, tc := range tc {
t.Run(tc.name, func(t *testing.T) {
image := getCloudNodeManagerFromImages(tc.platformType, images)
assert.Equal(t, tc.expectedImage, image)
})
}
}

func TestComposeConfig(t *testing.T) {
defaultManagementNamespace := "test-namespace"

Expand Down
24 changes: 18 additions & 6 deletions pkg/substitution/substitution.go
Expand Up @@ -11,6 +11,7 @@ const (
// Names in this list are unique and will be substituted with an image from config
// cloudControllerManagerName is a name for default CCM controller container any provider may have
cloudControllerManagerName = "cloud-controller-manager"
cloudNodeManagerName = "cloud-node-manager"
)

// setDeploymentImages substitutes controller containers in Deployment with correct image
Expand All @@ -20,11 +21,22 @@ func setDeploymentImages(config config.OperatorConfig, d *v1.Deployment) {
continue
}

klog.Infof("Substituting %q: %s", container.Name, config.ControllerImage)
klog.Infof("Substituting %q in %q with %s", container.Name, d.Kind, config.ControllerImage)
d.Spec.Template.Spec.Containers[i].Image = config.ControllerImage
}
}

func setDaemonSetImage(config config.OperatorConfig, d *v1.DaemonSet) {
for i, container := range d.Spec.Template.Spec.Containers {
if container.Name != cloudNodeManagerName {
continue
}

klog.Infof("Substituting %q in %q with %s", container.Name, d.Kind, config.ControllerImage)
d.Spec.Template.Spec.Containers[i].Image = config.CloudNodeImage
}
}

func FillConfigValues(config config.OperatorConfig, templates []client.Object) []client.Object {
objects := make([]client.Object, len(templates))
for i, objectTemplate := range templates {
Expand All @@ -33,12 +45,12 @@ func FillConfigValues(config config.OperatorConfig, templates []client.Object) [
// Set namespaces for all object. Namespace on cluster-wide objects is stripped by API server and is not applied
templateCopy.SetNamespace(config.ManagedNamespace)

dep, ok := templateCopy.(*v1.Deployment)
if ok {
setDeploymentImages(config, dep)
// TODO: add cloud-config calculated hash to annotations to account for redeployment on content change
switch obj := templateCopy.(type) {
case *v1.Deployment:
setDeploymentImages(config, obj)
case *v1.DaemonSet:
setDaemonSetImage(config, obj)
}

objects[i] = templateCopy
}
return objects
Expand Down
132 changes: 132 additions & 0 deletions pkg/substitution/substitution_test.go
Expand Up @@ -84,6 +84,78 @@ func TestSetDeploymentImages(t *testing.T) {

}

func TestSetDaemonsetImages(t *testing.T) {
tc := []struct {
name string
containers []corev1.Container
config config.OperatorConfig
expectedContainers []corev1.Container
}{{
name: "Unknown container name",
containers: []corev1.Container{{
Name: "different_name",
Image: "no_change",
}},
expectedContainers: []corev1.Container{{
Name: "different_name",
Image: "no_change",
}},
config: config.OperatorConfig{
CloudNodeImage: "correct_image:tag",
},
}, {
name: "Substitute cloud-node-manager container image",
containers: []corev1.Container{{
Name: cloudNodeManagerName,
Image: "expect_change",
}},
expectedContainers: []corev1.Container{{
Name: cloudNodeManagerName,
Image: "correct_image:tag",
}},
config: config.OperatorConfig{
CloudNodeImage: "correct_image:tag",
},
}, {
name: "Combination of container image names",
containers: []corev1.Container{{
Name: cloudNodeManagerName,
Image: "expect_change",
}, {
Name: "some-stuff-there",
Image: "no_change",
}},
expectedContainers: []corev1.Container{{
Name: cloudNodeManagerName,
Image: "correct_image:tag",
}, {
Name: "some-stuff-there",
Image: "no_change",
}},
config: config.OperatorConfig{
CloudNodeImage: "correct_image:tag",
},
}}

for _, tc := range tc {
t.Run(tc.name, func(t *testing.T) {
ds := &v1.DaemonSet{
Spec: v1.DaemonSetSpec{
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
Containers: tc.containers,
},
},
},
}

setDaemonSetImage(tc.config, ds)

assert.EqualValues(t, ds.Spec.Template.Spec.Containers, tc.expectedContainers)
})
}
}

func TestFillConfigValues(t *testing.T) {
testManagementNamespace := "test-namespace"

Expand Down Expand Up @@ -174,6 +246,66 @@ func TestFillConfigValues(t *testing.T) {
ControllerImage: "correct_image:tag",
ManagedNamespace: testManagementNamespace,
},
}, {
name: "Substitute image and namespace for more deployment and daemonset",
objects: []client.Object{&v1.DaemonSet{
Spec: v1.DaemonSetSpec{
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
Containers: []corev1.Container{{
Name: cloudNodeManagerName,
Image: "expect_change",
}},
},
},
},
}, &v1.Deployment{
Spec: v1.DeploymentSpec{
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
Containers: []corev1.Container{{
Name: cloudControllerManagerName,
Image: "expect_change",
}},
},
},
},
}},
expectedObjects: []client.Object{
&v1.DaemonSet{
ObjectMeta: metav1.ObjectMeta{
Namespace: testManagementNamespace,
},
Spec: v1.DaemonSetSpec{
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
Containers: []corev1.Container{{
Name: cloudNodeManagerName,
Image: "correct_cloud_node_image:tag",
}},
},
},
},
}, &v1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Namespace: testManagementNamespace,
},
Spec: v1.DeploymentSpec{
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
Containers: []corev1.Container{{
Name: cloudControllerManagerName,
Image: "correct_image:tag",
}},
},
},
},
}},
config: config.OperatorConfig{
ControllerImage: "correct_image:tag",
CloudNodeImage: "correct_cloud_node_image:tag",
ManagedNamespace: testManagementNamespace,
},
}}

for _, tc := range tc {
Expand Down

0 comments on commit be2215a

Please sign in to comment.