kuma

Форк
0
/
config.go 
280 строк · 10.7 Кб
1
package framework
2

3
import (
4
	"fmt"
5
	"os"
6
	"path"
7
	"runtime"
8
	"time"
9

10
	"github.com/pkg/errors"
11

12
	"github.com/kumahq/kuma/pkg/config"
13
	kuma_version "github.com/kumahq/kuma/pkg/version"
14
)
15

16
var _ config.Config = E2eConfig{}
17

18
type E2eConfig struct {
19
	config.BaseConfig
20

21
	KumaImageRegistry                 string            `json:"imageRegistry,omitempty" envconfig:"KUMA_GLOBAL_IMAGE_REGISTRY"`
22
	KumaImageTag                      string            `json:"imageTag,omitempty" envconfig:"KUMA_GLOBAL_IMAGE_TAG"`
23
	KumaNamespace                     string            `json:"namespace,omitempty"`
24
	KumaServiceName                   string            `json:"serviceName,omitempty"`
25
	HelmChartPath                     string            `json:"helmChartPath,omitempty"`
26
	HelmSubChartPrefix                string            `json:"helmSubChartPrefix,omitempty"`
27
	HelmChartName                     string            `json:"helmChartName,omitempty"`
28
	HelmRepoUrl                       string            `json:"helmRepoUrl,omitempty"`
29
	HelmGlobalExtraYaml               string            `json:"HelmGlobalExtraYaml,omitempty"`
30
	CNIApp                            string            `json:"CNIApp,omitempty"`
31
	CNINamespace                      string            `json:"CNINamespace,omitempty"`
32
	CNIConf                           CniConf           `json:"CNIConf,omitempty"`
33
	KumaGlobalZoneSyncServiceName     string            `json:"globalZoneSyncServiceName,omitempty"`
34
	KumaUniversalEnvVars              map[string]string `json:"universalEnvVars,omitempty"`
35
	KumaZoneUniversalEnvVars          map[string]string `json:"universalZoneEnvVars,omitempty"`
36
	KumaK8sCtlFlags                   map[string]string `json:"k8sCtlFlags,omitempty"`
37
	KumaZoneK8sCtlFlags               map[string]string `json:"k8sZoneCtlFlags,omitempty"`
38
	DefaultObservabilityNamespace     string            `json:"observabilityNamespace,omitempty"`
39
	DefaultGatewayNamespace           string            `json:"gatewayNamespace,omitempty"`
40
	KumactlImageRepo                  string            `json:"ctlImageRepo,omitempty" envconfig:"KUMACTL_IMAGE_REPOSITORY"`
41
	KumaCPImageRepo                   string            `json:"cpImageRepo,omitempty" envconfig:"KUMA_CP_IMAGE_REPOSITORY"`
42
	KumaDPImageRepo                   string            `json:"dpImageRepo,omitempty" envconfig:"KUMA_DP_IMAGE_REPOSITORY"`
43
	KumaInitImageRepo                 string            `json:"initImageRepo,omitempty" envconfig:"KUMA_INIT_IMAGE_REPOSITORY"`
44
	KumaCNIImageRepo                  string            `json:"cniImageRepo,omitempty" envconfig:"KUMA_CNI_IMAGE_REPOSITORY"`
45
	KumaUniversalImageRepo            string            `json:"universalImageRepo,omitempty"`
46
	XDSApiVersion                     string            `json:"xdsVersion,omitempty" envconfig:"API_VERSION"`
47
	K8sType                           K8sType           `json:"k8sType,omitempty" envconfig:"KUMA_K8S_TYPE"`
48
	IPV6                              bool              `json:"ipv6,omitempty" envconfig:"IPV6"`
49
	UseHostnameInsteadOfIP            bool              `json:"useHostnameInsteadOfIP,omitempty" envconfig:"KUMA_USE_HOSTNAME_INSTEAD_OF_ID"`
50
	UseLoadBalancer                   bool              `json:"useLoadBalancer,omitempty" envconfig:"KUMA_USE_LOAD_BALANCER"`
51
	CIDR                              string            `json:"kumaCidr,omitempty"`
52
	DefaultClusterStartupRetries      int               `json:"defaultClusterStartupRetries,omitempty" envconfig:"KUMA_DEFAULT_RETRIES"`
53
	DefaultClusterStartupTimeout      time.Duration     `json:"defaultClusterStartupTimeout,omitempty" envconfig:"KUMA_DEFAULT_TIMEOUT"`
54
	KumactlBin                        string            `json:"kumactlBin,omitempty" envconfig:"KUMACTLBIN"`
55
	ZoneEgressApp                     string            `json:"zoneEgressApp,omitempty" envconfig:"KUMA_ZONE_EGRESS_APP"`
56
	ZoneIngressApp                    string            `json:"zoneIngressApp,omitempty" envconfig:"KUMA_ZONE_INGRESS_APP"`
57
	Arch                              string            `json:"arch,omitempty" envconfig:"ARCH"`
58
	OS                                string            `json:"os,omitempty" envconfig:"OS"`
59
	KumaCpConfig                      KumaCpConfig      `json:"kumaCpConfig,omitempty" envconfig:"KUMA_CP_CONFIG"`
60
	UniversalE2ELogsPath              string            `json:"universalE2ELogsPath,omitempty" envconfig:"UNIVERSAL_E2E_LOGS_PATH"`
61
	CleanupLogsOnSuccess              bool              `json:"cleanupLogsOnSuccess,omitempty" envconfig:"CLEANUP_LOGS_ON_SUCCESS"`
62
	VersionsYamlPath                  string            `json:"versionsYamlPath,omitempty" envconfig:"VERSIONS_YAML_PATH"`
63
	KumaExperimentalSidecarContainers bool              `json:"kumaSidecarContainers,omitempty" envconfig:"KUMA_EXPERIMENTAL_SIDECAR_CONTAINERS"`
64

65
	SuiteConfig SuiteConfig `json:"suites,omitempty"`
66
}
67

68
type SuiteConfig struct {
69
	Compatibility CompatibilitySuiteConfig `json:"compatibility,omitempty"`
70
}
71

72
type CompatibilitySuiteConfig struct {
73
	HelmVersion string `json:"helmVersion,omitempty"`
74
}
75

76
type KumaCpConfig struct {
77
	Standalone StandaloneConfig `json:"standalone,omitempty"`
78
	Multizone  MultizoneConfig  `json:"multizone,omitempty"`
79
}
80

81
type StandaloneConfig struct {
82
	Kubernetes ControlPlaneConfig `json:"kubernetes,omitempty"`
83
	Universal  ControlPlaneConfig `json:"universal,omitempty"`
84
}
85

86
type MultizoneConfig struct {
87
	Global    ControlPlaneConfig `json:"global,omitempty"`
88
	KubeZone1 ControlPlaneConfig `json:"kubeZone1,omitempty"`
89
	KubeZone2 ControlPlaneConfig `json:"kubeZone2,omitempty"`
90
	UniZone1  ControlPlaneConfig `json:"uniZone1,omitempty"`
91
	UniZone2  ControlPlaneConfig `json:"uniZone2,omitempty"`
92
}
93

94
type ControlPlaneConfig struct {
95
	Envs                 map[string]string `json:"envs,omitempty"`
96
	AdditionalYamlConfig string            `json:"additionalYamlConfig,omitempty"`
97
}
98

99
func (c E2eConfig) Validate() error {
100
	if Config.KumactlBin != "" {
101
		_, err := os.Stat(Config.KumactlBin)
102
		if os.IsNotExist(err) {
103
			return errors.Wrapf(err, "unable to find kumactl at:%s", Config.KumactlBin)
104
		}
105
	}
106
	return nil
107
}
108

109
func (c E2eConfig) AutoConfigure() error {
110
	if Config.CNIConf.ConfName == "" {
111
		switch Config.K8sType {
112
		case KindK8sType:
113
			Config.CNIConf = CniConf{
114
				ConfName: "10-kindnet.conflist",
115
				NetDir:   "/etc/cni/net.d",
116
				BinDir:   "/opt/cni/bin",
117
			}
118
		case K3dK8sType:
119
			Config.CNIConf = CniConf{
120
				ConfName: "10-flannel.conflist",
121
				NetDir:   "/var/lib/rancher/k3s/agent/etc/cni/net.d",
122
				BinDir:   "/bin",
123
			}
124
		case K3dCalicoK8sType:
125
			Config.CNIConf = CniConf{
126
				ConfName: "10-calico.conflist",
127
				NetDir:   "/etc/cni/net.d/",
128
				BinDir:   "/opt/cni/bin",
129
			}
130
		case AzureK8sType:
131
			Config.CNIConf = CniConf{
132
				ConfName: "10-azure.conflist",
133
				NetDir:   "/etc/cni/net.d",
134
				BinDir:   "/opt/cni/bin",
135
			}
136
		case AwsK8sType:
137
			Config.CNIConf = CniConf{
138
				ConfName: "10-aws.conflist",
139
				NetDir:   "/etc/cni/net.d",
140
				BinDir:   "/opt/cni/bin",
141
			}
142
		default:
143
			return fmt.Errorf("you must set a supported KUMA_K8S_TYPE got:%s", Config.K8sType)
144
		}
145
	}
146

147
	if Config.IPV6 && Config.CIDR == "" {
148
		Config.CIDR = "fd00:fd00::/64"
149
	}
150

151
	Config.Arch = runtime.GOARCH
152
	Config.OS = runtime.GOOS
153

154
	return nil
155
}
156

157
type K8sType string
158

159
const (
160
	KindK8sType      K8sType = "kind"
161
	K3dK8sType       K8sType = "k3d"
162
	K3dCalicoK8sType K8sType = "k3d-calico"
163
	AzureK8sType     K8sType = "azure"
164
	AwsK8sType       K8sType = "aws"
165
)
166

167
type CniConf struct {
168
	BinDir   string
169
	NetDir   string
170
	ConfName string
171
}
172

173
var Config E2eConfig
174

175
func (c E2eConfig) GetUniversalImage() string {
176
	if c.KumaImageTag != "" {
177
		return fmt.Sprintf("%s/%s:%s", c.KumaImageRegistry, c.KumaUniversalImageRepo, c.KumaImageTag)
178
	} else {
179
		return fmt.Sprintf("%s/%s", c.KumaImageRegistry, c.KumaUniversalImageRepo)
180
	}
181
}
182

183
var defaultConf = E2eConfig{
184
	HelmChartName:                 "kuma/kuma",
185
	HelmChartPath:                 "../../../deployments/charts/kuma",
186
	VersionsYamlPath:              "../../../versions.yml",
187
	HelmRepoUrl:                   "https://kumahq.github.io/charts",
188
	HelmSubChartPrefix:            "",
189
	KumaNamespace:                 "kuma-system",
190
	KumaServiceName:               "kuma-control-plane",
191
	KumaGlobalZoneSyncServiceName: "kuma-global-zone-sync",
192
	DefaultObservabilityNamespace: "mesh-observability",
193
	DefaultGatewayNamespace:       "kuma-gateway",
194
	CNIApp:                        "kuma-cni",
195
	CNINamespace:                  "kube-system",
196

197
	KumaImageRegistry:      "kumahq",
198
	KumaImageTag:           kuma_version.Build.Version,
199
	KumaUniversalImageRepo: "kuma-universal",
200
	KumaCPImageRepo:        "kuma-cp",
201
	KumaDPImageRepo:        "kuma-dp",
202
	KumaInitImageRepo:      "kuma-init",
203
	KumactlImageRepo:       "kumactl",
204
	KumaCNIImageRepo:       "kuma-cni",
205

206
	KumaUniversalEnvVars: map[string]string{},
207
	KumaK8sCtlFlags:      map[string]string{},
208
	KumaZoneK8sCtlFlags:  map[string]string{},
209
	SuiteConfig: SuiteConfig{
210
		Compatibility: CompatibilitySuiteConfig{
211
			HelmVersion: "2.3.3",
212
		},
213
	},
214
	K8sType:                      KindK8sType,
215
	DefaultClusterStartupRetries: 30,
216
	DefaultClusterStartupTimeout: time.Second * 3,
217
	KumaCpConfig: KumaCpConfig{
218
		Standalone: StandaloneConfig{
219
			Kubernetes: ControlPlaneConfig{
220
				Envs: map[string]string{
221
					"KUMA_RUNTIME_KUBERNETES_INJECTOR_IGNORED_SERVICE_SELECTOR_LABELS": "changesvc-test-label",
222
				},
223
				AdditionalYamlConfig: "",
224
			},
225
			Universal: ControlPlaneConfig{
226
				Envs:                 map[string]string{},
227
				AdditionalYamlConfig: "",
228
			},
229
		},
230
		Multizone: MultizoneConfig{
231
			Global: ControlPlaneConfig{
232
				Envs:                 map[string]string{},
233
				AdditionalYamlConfig: "",
234
			},
235
			KubeZone1: ControlPlaneConfig{
236
				Envs:                 map[string]string{},
237
				AdditionalYamlConfig: "",
238
			},
239
			KubeZone2: ControlPlaneConfig{
240
				Envs:                 map[string]string{},
241
				AdditionalYamlConfig: "",
242
			},
243
			UniZone1: ControlPlaneConfig{
244
				Envs:                 map[string]string{},
245
				AdditionalYamlConfig: "",
246
			},
247
			UniZone2: ControlPlaneConfig{
248
				Envs:                 map[string]string{},
249
				AdditionalYamlConfig: "",
250
			},
251
		},
252
	},
253
	ZoneEgressApp:                     "kuma-egress",
254
	ZoneIngressApp:                    "kuma-ingress",
255
	UniversalE2ELogsPath:              path.Join(os.TempDir(), "e2e"),
256
	CleanupLogsOnSuccess:              false,
257
	KumaExperimentalSidecarContainers: false,
258
}
259

260
func init() {
261
	Config = defaultConf
262
	if err := config.Load(os.Getenv("E2E_CONFIG_FILE"), &Config); err != nil {
263
		panic(err)
264
	}
265

266
	if err := Config.AutoConfigure(); err != nil {
267
		panic(err)
268
	}
269
}
270

271
func KumaDeploymentOptionsFromConfig(config ControlPlaneConfig) []KumaDeploymentOption {
272
	kumaOptions := []KumaDeploymentOption{}
273
	for key, value := range config.Envs {
274
		kumaOptions = append(kumaOptions, WithEnv(key, value))
275
	}
276
	if config.AdditionalYamlConfig != "" {
277
		kumaOptions = append(kumaOptions, WithYamlConfig(config.AdditionalYamlConfig))
278
	}
279
	return kumaOptions
280
}
281

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

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

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

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