penguin/monok8s

k8s image for Mono Gateway Dev Kit

clitools/pkg/cmd/apply/apply.go

raw ยท 1720 bytes

package apply

import (
	"context"
	"fmt"

	"example.com/monok8s/pkg/crds"
	"example.com/monok8s/pkg/kube"
	"github.com/spf13/cobra"
	apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
	apierrors "k8s.io/apimachinery/pkg/api/errors"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/cli-runtime/pkg/genericclioptions"
	"k8s.io/klog/v2"
)

func NewCmdApply(flags *genericclioptions.ConfigFlags) *cobra.Command {
	cmd := &cobra.Command{Use: "apply", Short: "Apply MonoK8s resources"}
	cmd.AddCommand(newCmdApplyCRDs(flags))
	return cmd
}

func newCmdApplyCRDs(flags *genericclioptions.ConfigFlags) *cobra.Command {
	return &cobra.Command{
		Use:   "crds",
		Short: "Register the MonoKSConfig and OSUpgrade CRDs",
		RunE: func(cmd *cobra.Command, _ []string) error {
			clients, err := kube.NewClients(flags)
			if err != nil {
				return err
			}
			ctx := context.Background()
			for _, wanted := range crds.Definitions() {
				_, err := clients.APIExtensions.ApiextensionsV1().CustomResourceDefinitions().Create(ctx, wanted, metav1.CreateOptions{})
				if apierrors.IsAlreadyExists(err) {
					current, getErr := clients.APIExtensions.ApiextensionsV1().CustomResourceDefinitions().Get(ctx, wanted.Name, metav1.GetOptions{})
					if getErr != nil {
						return getErr
					}
					wanted.ResourceVersion = current.ResourceVersion
					_, err = clients.APIExtensions.ApiextensionsV1().CustomResourceDefinitions().Update(ctx, wanted, metav1.UpdateOptions{})
				}
				if err != nil {
					return err
				}
				klog.InfoS("crd applied", "name", wanted.Name)
			}
			_, _ = fmt.Fprintln(cmd.OutOrStdout(), "CRDs applied")
			return nil
		},
	}
}

var _ *apiextensionsv1.CustomResourceDefinition