1
// This Source Code Form is subject to the terms of the Mozilla Public
2
// License, v. 2.0. If a copy of the MPL was not distributed with this
3
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
13
"github.com/containernetworking/cni/libcni"
14
yaml "gopkg.in/yaml.v3"
16
"github.com/siderolabs/talos/pkg/provision"
19
// State common state representation for vm provisioners.
21
ProvisionerName string
24
ClusterInfo provision.ClusterInfo
26
VMCNIConfig *libcni.NetworkConfigList
31
// NewState create new vm provisioner state.
32
func NewState(statePath, provisionerName, clusterName string) (*State, error) {
34
ProvisionerName: provisionerName,
38
_, err := os.Stat(s.statePath)
41
return nil, fmt.Errorf(
42
"state directory %q already exists, is the cluster %q already running? remove cluster state with talosctl cluster destroy",
48
if !os.IsNotExist(err) {
49
return nil, fmt.Errorf("error checking state directory: %w", err)
52
if err = os.MkdirAll(s.statePath, os.ModePerm); err != nil {
53
return nil, fmt.Errorf("error creating state directory: %w", err)
59
// Provisioner get provisioner name.
60
func (s *State) Provisioner() string {
61
return s.ProvisionerName
64
// Info get cluster info.
65
func (s *State) Info() provision.ClusterInfo {
69
// StatePath get state config file path.
70
func (s *State) StatePath() (string, error) {
71
if s.statePath == "" {
72
return "", errors.New("state path is not set")
75
return s.statePath, nil
78
// Save save state to config file.
79
func (s *State) Save() error {
81
stateFile, err := os.Create(filepath.Join(s.statePath, stateFileName))
86
defer stateFile.Close() //nolint:errcheck
88
if err = yaml.NewEncoder(stateFile).Encode(&s); err != nil {
89
return fmt.Errorf("error marshaling state: %w", err)
92
return stateFile.Close()
95
// GetRelativePath get file path relative to config folder.
96
func (s *State) GetRelativePath(path string) string {
97
return filepath.Join(s.statePath, path)