package staticpodscheduler import ( "context" "path/filepath" "github.com/spf13/afero" "edge-infra.dev/pkg/k8s/runtime/controller/reconcile" v1ien "edge-infra.dev/pkg/sds/ien/k8s/apis/v1" "edge-infra.dev/pkg/sds/ien/k8s/controllers/nodeagent/config" "edge-infra.dev/pkg/sds/ien/k8s/controllers/nodeagent/plugins/staticpodscheduler/pkg/render" ) // parameterMutations are the functions that populate the parameters that are // required for the Static Pod Scheduler static pods. var parameterMutations = []render.ParameterMutations{ render.SetKubeControlPlaneImages, render.SetLANOutageSchedulerImage, render.SetCPGuardianImage, render.SetAdmissionWebhookName, render.SetNodeName, render.SetNodeRole, render.SetAdmissionInitContainerImage, render.SetControlPlanePromoterImage, render.SetMacAddress, render.SetThickPOS, render.SetNodeIP, render.SetDeviceAgentImage, render.SetDeviceSystemLogLevel, } type Plugin struct{} // Reconcile compiles all of the templates and writes (or removes) them from the // filesystem. func (p Plugin) Reconcile(ctx context.Context, ienode *v1ien.IENode, cfg config.Config) (reconcile.Result, error) { params := &render.Parameters{ IENode: ienode, } if err := params.Populate(ctx, params, cfg, parameterMutations...); err != nil { return reconcile.ResultRequeue, err } if err := render.WriteTargets(cfg, params); err != nil { return reconcile.ResultRequeue, err } if err := writeHelperScript(cfg.Fs()); err != nil { return reconcile.ResultRequeue, err } return reconcile.ResultSuccess, nil } // Delivers Etcd Manager script for backwards compatibility with // IEN v1.9.x. This function can be removed in a future release. func writeHelperScript(fs afero.Fs) (err error) { scriptDir := "/zynstra/config/scripts/" scriptPath := filepath.Join(scriptDir, "ien-force-recover-etcd") wrapperScriptContent := []byte(`#!/bin/bash set -e # Wrapper script around etcd manager recovery client # Execs into etcd-manager static pod and calls binary # check invoked as root if [[ "$EUID" -ne 0 ]]; then echo "[ERROR] This script must be run as root" exit 1 fi CONTAINER_ID=$(crictl ps --name ^etcd-manager$ --quiet | head -n 1) if [ -z "$CONTAINER_ID" ]; then echo "[ERROR] etcd-manager container not found" exit 1 fi crictl exec $CONTAINER_ID /usr/local/bin/ien-force-recover-etcd if [[ "$1" == "-f" ]] || [[ "$1" == "--follow" ]]; then echo -e "\nEtcd Manager Logs:\n" crictl logs --follow --tail=5 --timestamps $CONTAINER_ID fi `) if err := fs.MkdirAll(scriptDir, 0755); err != nil { return err } return afero.WriteFile(fs, scriptPath, wrapperScriptContent, 0755) }