talos

Форк
0
98 строк · 2.2 Кб
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/.
4

5
package vm
6

7
import (
8
	"errors"
9
	"fmt"
10
	"os"
11
	"path/filepath"
12

13
	"github.com/containernetworking/cni/libcni"
14
	yaml "gopkg.in/yaml.v3"
15

16
	"github.com/siderolabs/talos/pkg/provision"
17
)
18

19
// State common state representation for vm provisioners.
20
type State struct {
21
	ProvisionerName string
22
	BridgeName      string
23

24
	ClusterInfo provision.ClusterInfo
25

26
	VMCNIConfig *libcni.NetworkConfigList
27

28
	statePath string
29
}
30

31
// NewState create new vm provisioner state.
32
func NewState(statePath, provisionerName, clusterName string) (*State, error) {
33
	s := &State{
34
		ProvisionerName: provisionerName,
35
		statePath:       statePath,
36
	}
37

38
	_, err := os.Stat(s.statePath)
39

40
	if err == nil {
41
		return nil, fmt.Errorf(
42
			"state directory %q already exists, is the cluster %q already running? remove cluster state with talosctl cluster destroy",
43
			s.statePath,
44
			clusterName,
45
		)
46
	}
47

48
	if !os.IsNotExist(err) {
49
		return nil, fmt.Errorf("error checking state directory: %w", err)
50
	}
51

52
	if err = os.MkdirAll(s.statePath, os.ModePerm); err != nil {
53
		return nil, fmt.Errorf("error creating state directory: %w", err)
54
	}
55

56
	return s, nil
57
}
58

59
// Provisioner get provisioner name.
60
func (s *State) Provisioner() string {
61
	return s.ProvisionerName
62
}
63

64
// Info get cluster info.
65
func (s *State) Info() provision.ClusterInfo {
66
	return s.ClusterInfo
67
}
68

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")
73
	}
74

75
	return s.statePath, nil
76
}
77

78
// Save save state to config file.
79
func (s *State) Save() error {
80
	// save state
81
	stateFile, err := os.Create(filepath.Join(s.statePath, stateFileName))
82
	if err != nil {
83
		return err
84
	}
85

86
	defer stateFile.Close() //nolint:errcheck
87

88
	if err = yaml.NewEncoder(stateFile).Encode(&s); err != nil {
89
		return fmt.Errorf("error marshaling state: %w", err)
90
	}
91

92
	return stateFile.Close()
93
}
94

95
// GetRelativePath get file path relative to config folder.
96
func (s *State) GetRelativePath(path string) string {
97
	return filepath.Join(s.statePath, path)
98
}
99

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.