github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/operator/orbiter/kinds/providers/static/machine.go (about)

     1  package static
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/caos/orbos/internal/operator/orbiter/kinds/clusters/core/infra"
     8  	"github.com/caos/orbos/internal/operator/orbiter/kinds/loadbalancers"
     9  	"github.com/caos/orbos/internal/operator/orbiter/kinds/providers/core"
    10  	"github.com/caos/orbos/internal/operator/orbiter/kinds/providers/ssh"
    11  	"github.com/caos/orbos/mntr"
    12  	"github.com/caos/orbos/pkg/tree"
    13  )
    14  
    15  var _ infra.Machine = (*machine)(nil)
    16  
    17  type machine struct {
    18  	poolFile             string
    19  	rebootRequired       bool
    20  	requireReboot        func()
    21  	unrequireReboot      func()
    22  	replacementRequired  bool
    23  	requireReplacement   func()
    24  	unrequireReplacement func()
    25  	*ssh.Machine
    26  	X_ID     *string `header:"id"`
    27  	X_IP     string  `header:"ip"`
    28  	X_active bool    `header:"active"`
    29  }
    30  
    31  func newMachine(
    32  	monitor mntr.Monitor,
    33  	poolFile string,
    34  	remoteUser string,
    35  	id *string,
    36  	ip string,
    37  	rebootRequired bool,
    38  	requireReboot func(),
    39  	unrequireReboot func(),
    40  	replacementRequired bool,
    41  	requireReplacement func(),
    42  	unrequireReplacement func(),
    43  ) *machine {
    44  	return &machine{
    45  		X_active:             false,
    46  		poolFile:             poolFile,
    47  		X_ID:                 id,
    48  		X_IP:                 ip,
    49  		Machine:              ssh.NewMachine(monitor, remoteUser, ip),
    50  		rebootRequired:       rebootRequired,
    51  		requireReboot:        requireReboot,
    52  		unrequireReboot:      unrequireReboot,
    53  		replacementRequired:  replacementRequired,
    54  		requireReplacement:   requireReplacement,
    55  		unrequireReplacement: unrequireReplacement,
    56  	}
    57  }
    58  
    59  func (c *machine) ID() string {
    60  	return *c.X_ID
    61  }
    62  
    63  func (c *machine) IP() string {
    64  	return c.X_IP
    65  }
    66  
    67  func (c *machine) Destroy() (func() error, error) {
    68  	c.Execute(nil, "sudo systemctl stop node-agentd keepalived nginx")
    69  	c.Execute(nil, "sudo systemctl disable node-agentd keepalived nginx")
    70  	c.X_active = false
    71  	return func() error {
    72  		c.Execute(nil, "sudo kubeadm reset -f")
    73  		c.Execute(nil, "sudo rm -rf /var/lib/etcd")
    74  		return nil
    75  	}, c.Machine.WriteFile(c.poolFile, strings.NewReader(""), 600)
    76  }
    77  
    78  func (c *machine) RebootRequired() (bool, func(), func()) {
    79  	return c.rebootRequired, c.requireReboot, c.unrequireReboot
    80  }
    81  
    82  func (c *machine) ReplacementRequired() (bool, func(), func()) {
    83  	return c.replacementRequired, c.requireReplacement, c.unrequireReplacement
    84  }
    85  
    86  func ListMachines(monitor mntr.Monitor, desiredTree *tree.Tree, providerID string) (map[string]infra.Machine, error) {
    87  	desired, err := parseDesiredV0(desiredTree)
    88  	if err != nil {
    89  		return nil, fmt.Errorf("parsing desired state failed: %w", err)
    90  	}
    91  	desiredTree.Parsed = desired
    92  
    93  	_, _, _, _, _, err = loadbalancers.GetQueryAndDestroyFunc(monitor, nil, desired.Loadbalancing, &tree.Tree{}, nil)
    94  	if err != nil {
    95  		return nil, err
    96  	}
    97  
    98  	machinesSvc := NewMachinesService(monitor,
    99  		desired,
   100  		providerID)
   101  
   102  	if err := machinesSvc.updateKeys(); err != nil {
   103  		return nil, err
   104  	}
   105  
   106  	return core.ListMachines(machinesSvc)
   107  }