entangle/controllers/deployment.go
2022-11-14 23:52:21 +01:00

135 lines
3.5 KiB
Go

package controllers
import (
"context"
"fmt"
entanglev1alpha1 "github.com/kairos-io/entangle/api/v1alpha1"
appsv1 "k8s.io/api/apps/v1"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
)
func genOwner(ent entanglev1alpha1.Entanglement) []metav1.OwnerReference {
return []metav1.OwnerReference{
*metav1.NewControllerRef(&ent.ObjectMeta, schema.GroupVersionKind{
Group: entanglev1alpha1.GroupVersion.Group,
Version: entanglev1alpha1.GroupVersion.Version,
Kind: "Entanglement",
}),
}
}
func (r *EntanglementReconciler) genDeployment(ent entanglev1alpha1.Entanglement, logLevel string) (*appsv1.Deployment, error) {
objMeta := metav1.ObjectMeta{
Name: ent.Name,
Namespace: ent.Namespace,
OwnerReferences: genOwner(ent),
}
privileged := false
serviceAccount := false
svc := &v1.Service{}
if ent.Spec.ServiceRef != nil {
err := r.Client.Get(context.Background(), types.NamespacedName{Namespace: ent.Namespace, Name: *ent.Spec.ServiceRef}, svc)
if err != nil {
return nil, err
}
}
v := ent.Spec.Envs
v = append(v, v1.EnvVar{
Name: "EDGEVPNTOKEN",
ValueFrom: &v1.EnvVarSource{
SecretKeyRef: &v1.SecretKeySelector{
Key: "network_token",
LocalObjectReference: v1.LocalObjectReference{
Name: *ent.Spec.SecretRef,
},
},
},
})
expose := v1.Container{
ImagePullPolicy: v1.PullAlways,
SecurityContext: &v1.SecurityContext{Privileged: &privileged},
Name: "entanglement",
Image: r.EntangleServiceImage,
Env: v,
Command: []string{"/usr/bin/edgevpn"},
}
cmd := "service-add"
if ent.Spec.Inbound {
// p, err := strconv.Atoi(ent.Spec.Port)
// if err != nil {
// return nil, err
// }
cmd = "service-connect"
// expose.Ports = []v1.ContainerPort{
// {
// Name: "service",
// ContainerPort: int32(p),
// },
// }
// expose.ReadinessProbe = &v1.Probe{
// ProbeHandler: v1.ProbeHandler{
// Exec: &v1.ExecAction{
// Command: []string{"/bin/bash", "-xce", ""},
// },
// },
// InitialDelaySeconds: 60,
// PeriodSeconds: 30,
// SuccessThreshold: 3,
// FailureThreshold: 3,
// }
// expose.LivenessProbe = &v1.Probe{
// ProbeHandler: v1.ProbeHandler{},
// InitialDelaySeconds: 220,
// PeriodSeconds: 120,
// SuccessThreshold: 1,
// FailureThreshold: 3,
// }
}
if ent.Spec.ServiceRef != nil {
expose.Args = []string{cmd, "--log-level", logLevel, ent.Spec.ServiceUUID, fmt.Sprintf("%s:%s", fmt.Sprintf("%s.svc.cluster.local", svc.Name), ent.Spec.Port)}
} else {
expose.Args = []string{cmd, "--log-level", logLevel, ent.Spec.ServiceUUID, fmt.Sprintf("%s:%s", ent.Spec.Host, ent.Spec.Port)}
}
pod := v1.PodSpec{
Containers: []v1.Container{expose},
AutomountServiceAccountToken: &serviceAccount,
HostNetwork: ent.Spec.HostNetwork,
}
deploymentLabels := genDeploymentLabel(ent.Name)
replicas := int32(1)
return &appsv1.Deployment{
ObjectMeta: objMeta,
Spec: appsv1.DeploymentSpec{
Selector: &metav1.LabelSelector{MatchLabels: deploymentLabels},
Replicas: &replicas,
Template: v1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: deploymentLabels,
},
Spec: pod,
},
},
}, nil
}
func genDeploymentLabel(s string) map[string]string {
return map[string]string{
"entanglement.kairos.io": s,
}
}