penguin/monok8s

k8s image for Mono Gateway Dev Kit

clitools/pkg/node/crio.go

raw ยท 3187 bytes

package node

import (
	"context"
	"fmt"
	"os"
	"strings"
	"time"

	system "example.com/monok8s/pkg/system"
	"k8s.io/klog/v2"
)

const (
	storageConfPath = "/etc/containers/storage.conf"
)

func ConfigureDefaultCNI(ctx context.Context, n *NodeContext) error {
	_ = ctx

	const (
		cniDir       = "/etc/cni/net.d"
		enabledPath  = cniDir + "/10-crio-bridge.conflist"
		disabledPath = cniDir + "/10-crio-bridge.conflist.disabled"
	)

	plugin := strings.TrimSpace(n.Config.Spec.CNIPlugin)

	switch plugin {
	case "none":
		// Fail hard if we cannot ensure the default bridge CNI is disabled.
		if _, err := os.Stat(enabledPath); err == nil {
			if err := os.Rename(enabledPath, disabledPath); err != nil {
				return fmt.Errorf("disable default CRI-O bridge CNI: %w", err)
			}
		} else if !os.IsNotExist(err) {
			return fmt.Errorf("stat %s: %w", enabledPath, err)
		}

		klog.Infof("Default CRI-O bridge CNI disabled")
		return nil

	case "bridge":
		fallthrough
	case "default":
		// Fail soft. User can still install or provide their own CNI.
		if _, err := os.Stat(disabledPath); err == nil {
			if err := os.Rename(disabledPath, enabledPath); err != nil {
				klog.Warningf("failed enabling default CRI-O bridge CNI: %v", err)
				return nil
			}
		} else if !os.IsNotExist(err) {
			klog.Warningf("failed stating %s while enabling default CRI-O bridge CNI: %v", disabledPath, err)
			return nil
		}

		klog.Infof("Default CRI-O bridge CNI enabled")
		return nil

	}
	klog.Infof("unsupported CNIPlugin: %q", plugin)
	return nil
}

func StartCRIO(ctx context.Context, n *NodeContext) error {
	return system.EnsureServiceRunning(ctx, n.SystemRunner, "crio")
}

func RestartCRIO(ctx context.Context, nctx *NodeContext) error {
	_, err := nctx.SystemRunner.RunWithOptions(
		ctx,
		"rc-service",
		[]string{"crio", "restart"},
		system.RunOptions{
			Timeout:      60 * time.Second,
			OnStdoutLine: func(line string) { klog.Infof("[crio] %s", line) },
			OnStderrLine: func(line string) { klog.Infof("[crio] %s", line) },
		},
	)
	return err
}

func writeCRIOStorageConfig(ctx context.Context, nctx *NodeContext, altSource string) error {

	additionalStores := []string{
		"/usr/lib/monok8s/imagestore",
	}

	if altSource != "" {
		additionalStores = append(additionalStores, altSource)
	}

	var b strings.Builder
	b.WriteString("# Generated File. DO NOT MODIFY.\n")
	b.WriteString("[storage]\n")
	b.WriteString("driver = \"overlay\"\n")
	b.WriteString("runroot = \"/run/containers/storage\"\n")
	b.WriteString("graphroot = \"/var/lib/containers/storage\"\n\n")
	b.WriteString("[storage.options]\n")
	b.WriteString("additionalimagestores = [\n")
	for _, s := range additionalStores {
		b.WriteString(fmt.Sprintf("  %q,\n", s))
	}
	b.WriteString("]\n")

	content := b.String()

	path := storageConfPath
	tmp := path + ".tmp"
	if err := os.WriteFile(tmp, []byte(content), 0o644); err != nil {
		return fmt.Errorf("write temp storage.conf: %w", err)
	}
	if err := os.Rename(tmp, path); err != nil {
		_ = os.Remove(tmp)
		return fmt.Errorf("replace storage.conf: %w", err)
	}

	klog.InfoS("wrote CRI-O storage config", "path", path, "additionalImageStores", additionalStores)
	return nil
}