penguin/monok8s

k8s image for Mono Gateway Dev Kit

clitools/pkg/system/helpers.go

raw ยท 1362 bytes

package system

import (
	"context"
	"fmt"
	"os"
	"strings"
)

const DefaultSecond = 1_000_000_000

func EnsureServiceRunning(ctx context.Context, r *Runner, svc string) error {
	if _, err := r.Run(ctx, " rc-service", svc, "status"); err == nil {
		return nil
	}

	_, err := r.RunRetry(ctx, RetryOptions{
		Attempts: 3,
		Delay:    2 * DefaultSecond,
	}, "rc-service", svc, "start")
	if err != nil {
		return fmt.Errorf("failed to start service %q: %w", svc, err)
	}

	_, err = r.Run(ctx, "rc-service", svc, "status")
	if err != nil {
		return fmt.Errorf("service %q still not healthy after start: %w", svc, err)
	}
	return nil
}

func EnsureSysctl(ctx context.Context, r *Runner, key, want string) error {
	_, err := r.Run(ctx, "sysctl", "-w", key+"="+want)
	if err != nil {
		return fmt.Errorf("failed setting sysctl %s=%s: %w", key, want, err)
	}

	// verify
	path := "/proc/sys/" + strings.ReplaceAll(key, ".", "/")
	raw, err := os.ReadFile(path)
	if err != nil {
		return fmt.Errorf("failed verifying sysctl %s: %w", key, err)
	}
	if strings.TrimSpace(string(raw)) != want {
		return fmt.Errorf("sysctl %s not applied, expected %s got %s",
			key, want, strings.TrimSpace(string(raw)))
	}

	return nil
}

func EnsureDir(ctx context.Context, r *Runner, path string, mode string) error {
	_, err := r.Run(ctx, "install", "-d", "-m", mode, path)
	return err
}