github.com/interconnectedcloud/qdr-operator@v0.0.0-20210826174505-576d2b33dac7/pkg/resources/containers/container.go (about) 1 package containers 2 3 import ( 4 "os" 5 "strconv" 6 7 v1alpha1 "github.com/interconnectedcloud/qdr-operator/pkg/apis/interconnectedcloud/v1alpha1" 8 "github.com/interconnectedcloud/qdr-operator/pkg/utils/configs" 9 corev1 "k8s.io/api/core/v1" 10 "k8s.io/apimachinery/pkg/util/intstr" 11 logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" 12 ) 13 14 var ( 15 log = logf.Log.WithName("containers") 16 ) 17 18 func containerPortsForListeners(listeners []v1alpha1.Listener) []corev1.ContainerPort { 19 ports := []corev1.ContainerPort{} 20 for _, listener := range listeners { 21 ports = append(ports, corev1.ContainerPort{ 22 Name: nameForListener(&listener), 23 ContainerPort: listener.Port, 24 }) 25 } 26 return ports 27 } 28 29 func containerPortsForInterconnect(m *v1alpha1.Interconnect) []corev1.ContainerPort { 30 ports := containerPortsForListeners(m.Spec.Listeners) 31 ports = append(ports, containerPortsForListeners(m.Spec.InterRouterListeners)...) 32 return ports 33 } 34 35 func nameForListener(l *v1alpha1.Listener) string { 36 if l.Name == "" { 37 return "port-" + strconv.Itoa(int(l.Port)) 38 } else { 39 return l.Name 40 } 41 } 42 43 func containerEnvVarsForInterconnect(m *v1alpha1.Interconnect) []corev1.EnvVar { 44 envVars := []corev1.EnvVar{} 45 envVars = append(envVars, corev1.EnvVar{Name: "APPLICATION_NAME", Value: m.Name}) 46 envVars = append(envVars, corev1.EnvVar{Name: "QDROUTERD_CONF", Value: configs.ConfigForInterconnect(m)}) 47 if m.Spec.Users != "" { 48 envVars = append(envVars, corev1.EnvVar{Name: "QDROUTERD_AUTO_CREATE_SASLDB_SOURCE", Value: "/etc/qpid-dispatch/sasl-users/"}) 49 envVars = append(envVars, corev1.EnvVar{Name: "QDROUTERD_AUTO_CREATE_SASLDB_PATH", Value: "/tmp/qdrouterd.sasldb"}) 50 } 51 envVars = append(envVars, corev1.EnvVar{Name: "POD_COUNT", Value: strconv.Itoa(int(m.Spec.DeploymentPlan.Size))}) 52 envVars = append(envVars, corev1.EnvVar{Name: "POD_NAMESPACE", ValueFrom: &corev1.EnvVarSource{ 53 FieldRef: &corev1.ObjectFieldSelector{ 54 FieldPath: "metadata.namespace", 55 }, 56 }, 57 }) 58 envVars = append(envVars, corev1.EnvVar{Name: "POD_IP", ValueFrom: &corev1.EnvVarSource{ 59 FieldRef: &corev1.ObjectFieldSelector{ 60 FieldPath: "status.podIP", 61 }, 62 }, 63 }) 64 if m.Spec.DeploymentPlan.Role == v1alpha1.RouterRoleInterior { 65 envVars = append(envVars, corev1.EnvVar{Name: "QDROUTERD_AUTO_MESH_DISCOVERY", Value: "QUERY"}) 66 } 67 return envVars 68 } 69 70 func findEnvVar(env []corev1.EnvVar, name string) *corev1.EnvVar { 71 for _, v := range env { 72 if v.Name == name { 73 return &v 74 } 75 } 76 return nil 77 } 78 79 func checkInterconnectConfig(desired []corev1.EnvVar, actual []corev1.EnvVar) bool { 80 a := findEnvVar(desired, "QDROUTERD_CONF") 81 b := findEnvVar(actual, "QDROUTERD_CONF") 82 return (a == nil && b == nil) || a.Value == b.Value 83 } 84 85 func CheckInterconnectContainer(desired *corev1.Container, actual *corev1.Container) bool { 86 if desired.Image != actual.Image { 87 log.Info("Name changed", "desired", desired.Image, "actual", actual.Image) 88 return false 89 } 90 if !checkInterconnectConfig(desired.Env, actual.Env) { 91 log.Info("Config changed", "desired", desired.Env, "actual", actual.Env) 92 return false 93 } 94 return true 95 } 96 97 func ContainerForInterconnect(m *v1alpha1.Interconnect) corev1.Container { 98 var image string 99 if m.Spec.DeploymentPlan.Image != "" { 100 image = m.Spec.DeploymentPlan.Image 101 } else { 102 image = os.Getenv("QDROUTERD_IMAGE") 103 } 104 container := corev1.Container{ 105 Image: image, 106 Name: m.Name, 107 LivenessProbe: &corev1.Probe{ 108 InitialDelaySeconds: 60, 109 Handler: corev1.Handler{ 110 HTTPGet: &corev1.HTTPGetAction{ 111 Port: intstr.FromInt(int(m.Spec.DeploymentPlan.LivenessPort)), 112 Path: "/healthz", 113 }, 114 }, 115 }, 116 Env: containerEnvVarsForInterconnect(m), 117 Ports: containerPortsForInterconnect(m), 118 } 119 volumeMounts := []corev1.VolumeMount{} 120 if m.Spec.SslProfiles != nil && len(m.Spec.SslProfiles) > 0 { 121 for _, profile := range m.Spec.SslProfiles { 122 if len(profile.Credentials) > 0 { 123 volumeMounts = append(volumeMounts, corev1.VolumeMount{ 124 Name: profile.Credentials, 125 MountPath: "/etc/qpid-dispatch-certs/" + profile.Name + "/" + profile.Credentials, 126 }) 127 } 128 if len(profile.CaCert) > 0 && configs.IsCaSecretNeeded(&profile) { 129 volumeMounts = append(volumeMounts, corev1.VolumeMount{ 130 Name: profile.CaCert, 131 MountPath: "/etc/qpid-dispatch-certs/" + profile.Name + "/" + profile.CaCert, 132 }) 133 } 134 135 } 136 } 137 if len(m.Spec.Users) > 0 { 138 volumeMounts = append(volumeMounts, corev1.VolumeMount{ 139 Name: "sasl-users", 140 MountPath: "/etc/qpid-dispatch/sasl-users", 141 }) 142 volumeMounts = append(volumeMounts, corev1.VolumeMount{ 143 Name: "sasl-config", 144 MountPath: "/etc/sasl2", 145 }) 146 } 147 148 container.VolumeMounts = volumeMounts 149 container.Resources = m.Spec.DeploymentPlan.Resources 150 return container 151 }