...

Source file src/edge-infra.dev/pkg/sds/ien/k8s/controllers/nodeagent/plugins/staticpodscheduler/staticpodscheduler.go

Documentation: edge-infra.dev/pkg/sds/ien/k8s/controllers/nodeagent/plugins/staticpodscheduler

     1  package staticpodscheduler
     2  
     3  import (
     4  	"context"
     5  	"path/filepath"
     6  
     7  	"github.com/spf13/afero"
     8  
     9  	"edge-infra.dev/pkg/k8s/runtime/controller/reconcile"
    10  	v1ien "edge-infra.dev/pkg/sds/ien/k8s/apis/v1"
    11  	"edge-infra.dev/pkg/sds/ien/k8s/controllers/nodeagent/config"
    12  	"edge-infra.dev/pkg/sds/ien/k8s/controllers/nodeagent/plugins/staticpodscheduler/pkg/render"
    13  )
    14  
    15  // parameterMutations are the functions that populate the parameters that are
    16  // required for the Static Pod Scheduler static pods.
    17  var parameterMutations = []render.ParameterMutations{
    18  	render.SetKubeControlPlaneImages,
    19  	render.SetLANOutageSchedulerImage,
    20  	render.SetCPGuardianImage,
    21  	render.SetAdmissionWebhookName,
    22  	render.SetNodeName,
    23  	render.SetNodeRole,
    24  	render.SetAdmissionInitContainerImage,
    25  	render.SetControlPlanePromoterImage,
    26  	render.SetMacAddress,
    27  	render.SetThickPOS,
    28  	render.SetNodeIP,
    29  	render.SetDeviceAgentImage,
    30  	render.SetDeviceSystemLogLevel,
    31  }
    32  
    33  type Plugin struct{}
    34  
    35  // Reconcile compiles all of the templates and writes (or removes) them from the
    36  // filesystem.
    37  func (p Plugin) Reconcile(ctx context.Context, ienode *v1ien.IENode, cfg config.Config) (reconcile.Result, error) {
    38  	params := &render.Parameters{
    39  		IENode: ienode,
    40  	}
    41  	if err := params.Populate(ctx, params, cfg, parameterMutations...); err != nil {
    42  		return reconcile.ResultRequeue, err
    43  	}
    44  	if err := render.WriteTargets(cfg, params); err != nil {
    45  		return reconcile.ResultRequeue, err
    46  	}
    47  
    48  	if err := writeHelperScript(cfg.Fs()); err != nil {
    49  		return reconcile.ResultRequeue, err
    50  	}
    51  	return reconcile.ResultSuccess, nil
    52  }
    53  
    54  // Delivers Etcd Manager script for backwards compatibility with
    55  // IEN v1.9.x. This function can be removed in a future release.
    56  func writeHelperScript(fs afero.Fs) (err error) {
    57  	scriptDir := "/zynstra/config/scripts/"
    58  	scriptPath := filepath.Join(scriptDir, "ien-force-recover-etcd")
    59  	wrapperScriptContent := []byte(`#!/bin/bash
    60  set -e
    61  # Wrapper script around etcd manager recovery client
    62  # Execs into etcd-manager static pod and calls binary
    63  
    64  # check invoked as root
    65  if [[ "$EUID" -ne 0 ]]; then
    66  	echo "[ERROR] This script must be run as root"
    67  	exit 1
    68  fi
    69  
    70  CONTAINER_ID=$(crictl ps --name ^etcd-manager$ --quiet | head -n 1)
    71  
    72  if [ -z "$CONTAINER_ID" ]; then
    73  	echo "[ERROR] etcd-manager container not found"
    74  	exit 1
    75  fi
    76  
    77  crictl exec $CONTAINER_ID /usr/local/bin/ien-force-recover-etcd
    78  
    79  if [[ "$1" == "-f" ]] || [[ "$1" == "--follow" ]]; then
    80  	echo -e "\nEtcd Manager Logs:\n"
    81  	crictl logs --follow --tail=5 --timestamps $CONTAINER_ID
    82  fi
    83  `)
    84  
    85  	if err := fs.MkdirAll(scriptDir, 0755); err != nil {
    86  		return err
    87  	}
    88  	return afero.WriteFile(fs, scriptPath, wrapperScriptContent, 0755)
    89  }
    90  

View as plain text