10
"github.com/pkg/errors"
12
"github.com/kumahq/kuma/pkg/config"
13
kuma_version "github.com/kumahq/kuma/pkg/version"
16
var _ config.Config = E2eConfig{}
18
type E2eConfig struct {
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"`
65
SuiteConfig SuiteConfig `json:"suites,omitempty"`
68
type SuiteConfig struct {
69
Compatibility CompatibilitySuiteConfig `json:"compatibility,omitempty"`
72
type CompatibilitySuiteConfig struct {
73
HelmVersion string `json:"helmVersion,omitempty"`
76
type KumaCpConfig struct {
77
Standalone StandaloneConfig `json:"standalone,omitempty"`
78
Multizone MultizoneConfig `json:"multizone,omitempty"`
81
type StandaloneConfig struct {
82
Kubernetes ControlPlaneConfig `json:"kubernetes,omitempty"`
83
Universal ControlPlaneConfig `json:"universal,omitempty"`
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"`
94
type ControlPlaneConfig struct {
95
Envs map[string]string `json:"envs,omitempty"`
96
AdditionalYamlConfig string `json:"additionalYamlConfig,omitempty"`
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)
109
func (c E2eConfig) AutoConfigure() error {
110
if Config.CNIConf.ConfName == "" {
111
switch Config.K8sType {
113
Config.CNIConf = CniConf{
114
ConfName: "10-kindnet.conflist",
115
NetDir: "/etc/cni/net.d",
116
BinDir: "/opt/cni/bin",
119
Config.CNIConf = CniConf{
120
ConfName: "10-flannel.conflist",
121
NetDir: "/var/lib/rancher/k3s/agent/etc/cni/net.d",
124
case K3dCalicoK8sType:
125
Config.CNIConf = CniConf{
126
ConfName: "10-calico.conflist",
127
NetDir: "/etc/cni/net.d/",
128
BinDir: "/opt/cni/bin",
131
Config.CNIConf = CniConf{
132
ConfName: "10-azure.conflist",
133
NetDir: "/etc/cni/net.d",
134
BinDir: "/opt/cni/bin",
137
Config.CNIConf = CniConf{
138
ConfName: "10-aws.conflist",
139
NetDir: "/etc/cni/net.d",
140
BinDir: "/opt/cni/bin",
143
return fmt.Errorf("you must set a supported KUMA_K8S_TYPE got:%s", Config.K8sType)
147
if Config.IPV6 && Config.CIDR == "" {
148
Config.CIDR = "fd00:fd00::/64"
151
Config.Arch = runtime.GOARCH
152
Config.OS = runtime.GOOS
160
KindK8sType K8sType = "kind"
161
K3dK8sType K8sType = "k3d"
162
K3dCalicoK8sType K8sType = "k3d-calico"
163
AzureK8sType K8sType = "azure"
164
AwsK8sType K8sType = "aws"
175
func (c E2eConfig) GetUniversalImage() string {
176
if c.KumaImageTag != "" {
177
return fmt.Sprintf("%s/%s:%s", c.KumaImageRegistry, c.KumaUniversalImageRepo, c.KumaImageTag)
179
return fmt.Sprintf("%s/%s", c.KumaImageRegistry, c.KumaUniversalImageRepo)
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",
195
CNINamespace: "kube-system",
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",
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",
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",
223
AdditionalYamlConfig: "",
225
Universal: ControlPlaneConfig{
226
Envs: map[string]string{},
227
AdditionalYamlConfig: "",
230
Multizone: MultizoneConfig{
231
Global: ControlPlaneConfig{
232
Envs: map[string]string{},
233
AdditionalYamlConfig: "",
235
KubeZone1: ControlPlaneConfig{
236
Envs: map[string]string{},
237
AdditionalYamlConfig: "",
239
KubeZone2: ControlPlaneConfig{
240
Envs: map[string]string{},
241
AdditionalYamlConfig: "",
243
UniZone1: ControlPlaneConfig{
244
Envs: map[string]string{},
245
AdditionalYamlConfig: "",
247
UniZone2: ControlPlaneConfig{
248
Envs: map[string]string{},
249
AdditionalYamlConfig: "",
253
ZoneEgressApp: "kuma-egress",
254
ZoneIngressApp: "kuma-ingress",
255
UniversalE2ELogsPath: path.Join(os.TempDir(), "e2e"),
256
CleanupLogsOnSuccess: false,
257
KumaExperimentalSidecarContainers: false,
262
if err := config.Load(os.Getenv("E2E_CONFIG_FILE"), &Config); err != nil {
266
if err := Config.AutoConfigure(); err != nil {
271
func KumaDeploymentOptionsFromConfig(config ControlPlaneConfig) []KumaDeploymentOption {
272
kumaOptions := []KumaDeploymentOption{}
273
for key, value := range config.Envs {
274
kumaOptions = append(kumaOptions, WithEnv(key, value))
276
if config.AdditionalYamlConfig != "" {
277
kumaOptions = append(kumaOptions, WithYamlConfig(config.AdditionalYamlConfig))