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  }