penguin/monok8s

k8s image for Mono Gateway Dev Kit

clitools/pkg/templates/templates.go

raw ยท 3006 bytes

package templates

import (
	"strings"

	monov1alpha1 "example.com/monok8s/pkg/apis/monok8s/v1alpha1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

const DefaultNamespace = "kube-system"

func DefaultMonoKSConfig(v TemplateValues) monov1alpha1.MonoKSConfig {
	return monov1alpha1.MonoKSConfig{
		TypeMeta: metav1.TypeMeta{
			APIVersion: monov1alpha1.APIVersion,
			Kind:       "MonoKSConfig",
		},
		ObjectMeta: metav1.ObjectMeta{
			Name:      "example",
			Namespace: DefaultNamespace,
		},
		Spec: monov1alpha1.MonoKSConfigSpec{
			KubernetesVersion: v.KubernetesVersion,
			NodeName:          firstNonEmpty(v.NodeName, v.Hostname),

			ClusterRole:        v.ClusterRole,
			InitControlPlane:   v.InitControlPlane,
			EnableControlAgent: v.EnableControlAgent,

			ClusterName:   v.ClusterName,
			ClusterDomain: v.ClusterDomain,

			PodSubnet:     v.PodSubnet,
			ServiceSubnet: v.ServiceSubnet,

			APIServerAdvertiseAddress: v.APIServerAdvertiseAddress,
			APIServerEndpoint:         v.APIServerEndpoint,

			BootstrapToken:           v.BootstrapToken,
			DiscoveryTokenCACertHash: v.DiscoveryTokenCACertHash,

			ContainerRuntimeEndpoint: v.ContainerRuntimeEndpoint,
			CNIPlugin:                v.CNIPlugin,

			AllowSchedulingOnControlPlane: v.AllowSchedulingOnControlPlane,
			SkipImageCheck:                v.SkipImageCheck,

			KubeProxyNodePortAddresses: []string{
				"primary",
			},

			SubjectAltNames: copyStringSlice(v.SubjectAltNames),
			NodeLabels:      copyStringMap(v.NodeLabels),
			NodeAnnotations: copyStringMap(v.NodeAnnotations),

			Network: monov1alpha1.NetworkSpec{
				Hostname:         firstNonEmpty(v.Hostname, v.NodeName),
				ManagementIface:  v.MgmtIface,
				ManagementCIDR:   v.MgmtAddress,
				ManagementGW:     v.MgmtGateway,
				DNSNameservers:   copyStringSlice(v.DNSNameservers),
				DNSSearchDomains: copyStringSlice(v.DNSSearchDomains),
			},
		},
	}
}

func DefaultOSUpgrade(v TemplateValues) monov1alpha1.OSUpgrade {
	return monov1alpha1.OSUpgrade{
		TypeMeta: metav1.TypeMeta{
			APIVersion: monov1alpha1.APIVersion,
			Kind:       "OSUpgrade",
		},
		ObjectMeta: metav1.ObjectMeta{
			Name:      "example",
			Namespace: DefaultNamespace,
		},
		Spec: monov1alpha1.OSUpgradeSpec{
			DesiredVersion: v.KubernetesVersion,
			ImageURL:       "https://example.invalid/images/monok8s-v0.0.1.img.zst",
			NodeSelector: &metav1.LabelSelector{
				MatchLabels: map[string]string{
					"kubernetes.io/hostname": firstNonEmpty(v.NodeName, v.Hostname),
				},
			},
		},
	}
}

func firstNonEmpty(xs ...string) string {
	for _, x := range xs {
		if strings.TrimSpace(x) != "" {
			return strings.TrimSpace(x)
		}
	}
	return ""
}

func copyStringSlice(in []string) []string {
	if len(in) == 0 {
		return nil
	}
	out := make([]string, len(in))
	copy(out, in)
	return out
}

func copyStringMap(in map[string]string) map[string]string {
	if len(in) == 0 {
		return nil
	}
	out := make(map[string]string, len(in))
	for k, v := range in {
		out[k] = v
	}
	return out
}