shardingsphere-operator/pkg/kubernetes/container/container.go (150 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package container import ( v1 "k8s.io/api/core/v1" ) // ContainerBuilder is a common builder for Container type ContainerBuilder interface { SetName(name string) ContainerBuilder SetImage(image string) ContainerBuilder SetPorts(ports []v1.ContainerPort) ContainerBuilder SetResources(res v1.ResourceRequirements) ContainerBuilder SetLivenessProbe(probe *v1.Probe) ContainerBuilder SetReadinessProbe(probe *v1.Probe) ContainerBuilder SetStartupProbe(probe *v1.Probe) ContainerBuilder SetEnv(envs []v1.EnvVar) ContainerBuilder AppendEnv(envs []v1.EnvVar) ContainerBuilder SetCommand(cmds []string) ContainerBuilder SetArgs(args []string) ContainerBuilder UpdateVolumeMountByName(mount *v1.VolumeMount) ContainerBuilder SetVolumeMounts(mounts []v1.VolumeMount) ContainerBuilder AppendVolumeMounts(mounts []v1.VolumeMount) ContainerBuilder BuildContainer() *v1.Container } // NewContainerBuilder return a builder for Container func NewContainerBuilder() ContainerBuilder { return &containerBuilder{ container: DefaultContainer(), } } // NewContainerBuilderFromContainer creates a new ContainerBuilder func NewContainerBuilderFromContainer(c *v1.Container) ContainerBuilder { return &containerBuilder{ container: c, } } type containerBuilder struct { container *v1.Container } // SetName sets the name of the container func (c *containerBuilder) SetName(name string) ContainerBuilder { c.container.Name = name return c } // SetImage sets the name of the container func (c *containerBuilder) SetImage(image string) ContainerBuilder { c.container.Image = image return c } // SetPorts set the container port of the container func (c *containerBuilder) SetPorts(ports []v1.ContainerPort) ContainerBuilder { if ports == nil { c.container.Ports = []v1.ContainerPort{} } if ports != nil { c.container.Ports = ports } return c } // SetResources set the resources of the container func (c *containerBuilder) SetResources(res v1.ResourceRequirements) ContainerBuilder { c.container.Resources = res return c } // SetLivenessProbe set the livenessProbe of the container func (c *containerBuilder) SetLivenessProbe(probe *v1.Probe) ContainerBuilder { if probe != nil { if c.container.LivenessProbe == nil { c.container.LivenessProbe = &v1.Probe{} } c.container.LivenessProbe = probe } return c } // SetReadinessProbe set the readinessProbe of the container func (c *containerBuilder) SetReadinessProbe(probe *v1.Probe) ContainerBuilder { if probe != nil { if c.container.ReadinessProbe == nil { c.container.ReadinessProbe = &v1.Probe{} } c.container.ReadinessProbe = probe } return c } // SetStartupProbe set the startupProbe of the container func (c *containerBuilder) SetStartupProbe(probe *v1.Probe) ContainerBuilder { if probe != nil { if c.container.StartupProbe == nil { c.container.StartupProbe = &v1.Probe{} } c.container.StartupProbe = probe } return c } // SetEnv set the env of the container func (c *containerBuilder) SetEnv(envs []v1.EnvVar) ContainerBuilder { if c.container.Env == nil { c.container.Env = []v1.EnvVar{} } if envs != nil { c.container.Env = envs } return c } // AppendEnv append the env of the container func (c *containerBuilder) AppendEnv(envs []v1.EnvVar) ContainerBuilder { if c.container.Env == nil { c.container.Env = []v1.EnvVar{} } if envs != nil { c.container.Env = append(c.container.Env, envs...) } return c } // SetCommand set the command of the container func (c *containerBuilder) SetCommand(cmds []string) ContainerBuilder { if cmds != nil { c.container.Command = cmds } return c } // SetArgs set the args of the container func (c *containerBuilder) SetArgs(args []string) ContainerBuilder { if args != nil { c.container.Args = args } return c } // SetVolumeMount set the mount point of the container func (c *containerBuilder) UpdateVolumeMountByName(mount *v1.VolumeMount) ContainerBuilder { if c.container.VolumeMounts == nil { c.container.VolumeMounts = []v1.VolumeMount{*mount} } else { for idx := range c.container.VolumeMounts { if c.container.VolumeMounts[idx].Name == mount.Name { c.container.VolumeMounts[idx] = *mount return c } } c.container.VolumeMounts = append(c.container.VolumeMounts, *mount) } return c } // SetVolumeMount set the mount point of the container func (c *containerBuilder) SetVolumeMounts(mounts []v1.VolumeMount) ContainerBuilder { if c.container.VolumeMounts == nil { c.container.VolumeMounts = []v1.VolumeMount{} } c.container.VolumeMounts = mounts return c } // AppendVolumeMount mount a volume to the container func (c *containerBuilder) AppendVolumeMounts(mounts []v1.VolumeMount) ContainerBuilder { if c.container.VolumeMounts == nil { c.container.VolumeMounts = []v1.VolumeMount{} } c.container.VolumeMounts = append(c.container.VolumeMounts, mounts...) return c } // Build returns a Container func (c *containerBuilder) BuildContainer() *v1.Container { return c.container } // DefaultContainer returns a container with busybox func DefaultContainer() *v1.Container { con := &v1.Container{ Name: "default", Image: "busybox:1.35.0", } return con }