in src/app/backend/resource/deployment/deploy.go [162:262]
func DeployApp(spec *AppDeploymentSpec, client client.Interface) error {
log.Printf("Deploying %s application into %s namespace", spec.Name, spec.Namespace)
annotations := map[string]string{}
if spec.Description != nil {
annotations[DescriptionAnnotationKey] = *spec.Description
}
labels := getLabelsMap(spec.Labels)
objectMeta := metaV1.ObjectMeta{
Annotations: annotations,
Name: spec.Name,
Labels: labels,
}
containerSpec := api.Container{
Name: spec.Name,
Image: spec.ContainerImage,
SecurityContext: &api.SecurityContext{
Privileged: &spec.RunAsPrivileged,
},
Resources: api.ResourceRequirements{
Requests: make(map[api.ResourceName]resource.Quantity),
},
Env: convertEnvVarsSpec(spec.Variables),
}
if spec.ContainerCommand != nil {
containerSpec.Command = []string{*spec.ContainerCommand}
}
if spec.ContainerCommandArgs != nil {
containerSpec.Args = strings.Fields(*spec.ContainerCommandArgs)
}
if spec.CpuRequirement != nil {
containerSpec.Resources.Requests[api.ResourceCPU] = *spec.CpuRequirement
}
if spec.MemoryRequirement != nil {
containerSpec.Resources.Requests[api.ResourceMemory] = *spec.MemoryRequirement
}
podSpec := api.PodSpec{
Containers: []api.Container{containerSpec},
}
if spec.ImagePullSecret != nil {
podSpec.ImagePullSecrets = []api.LocalObjectReference{{Name: *spec.ImagePullSecret}}
}
podTemplate := api.PodTemplateSpec{
ObjectMeta: objectMeta,
Spec: podSpec,
}
deployment := &apps.Deployment{
ObjectMeta: objectMeta,
Spec: apps.DeploymentSpec{
Replicas: &spec.Replicas,
Template: podTemplate,
Selector: &metaV1.LabelSelector{
MatchLabels: labels,
},
},
}
_, err := client.AppsV1().Deployments(spec.Namespace).Create(context.TODO(), deployment, metaV1.CreateOptions{})
if err != nil {
return err
}
if len(spec.PortMappings) > 0 {
service := &api.Service{
ObjectMeta: objectMeta,
Spec: api.ServiceSpec{
Selector: labels,
},
}
if spec.IsExternal {
service.Spec.Type = api.ServiceTypeLoadBalancer
} else {
service.Spec.Type = api.ServiceTypeClusterIP
}
for _, portMapping := range spec.PortMappings {
servicePort :=
api.ServicePort{
Protocol: portMapping.Protocol,
Port: portMapping.Port,
Name: generatePortMappingName(portMapping),
TargetPort: intstr.IntOrString{
Type: intstr.Int,
IntVal: portMapping.TargetPort,
},
}
service.Spec.Ports = append(service.Spec.Ports, servicePort)
}
_, err = client.CoreV1().Services(spec.Namespace).Create(context.TODO(), service, metaV1.CreateOptions{})
return err
}
return nil
}