diff --git a/Makefile b/Makefile index 46718f8f09..d8378694e9 100644 --- a/Makefile +++ b/Makefile @@ -48,7 +48,7 @@ UPLOAD_CMD=$(KOPS_ROOT)/hack/upload ${UPLOAD_ARGS} # Unexport environment variables that can affect tests and are not used in builds unexport AWS_ACCESS_KEY_ID AWS_REGION AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN CNI_VERSION_URL DNS_IGNORE_NS_CHECK DNSCONTROLLER_IMAGE DO_ACCESS_TOKEN GOOGLE_APPLICATION_CREDENTIALS unexport KOPS_BASE_URL KOPS_CLUSTER_NAME KOPS_RUN_OBSOLETE_VERSION KOPS_STATE_STORE KOPS_STATE_S3_ACL KUBE_API_VERSIONS NODEUP_URL OPENSTACK_CREDENTIAL_FILE SKIP_PACKAGE_UPDATE -unexport SKIP_REGION_CHECK S3_ACCESS_KEY_ID S3_ENDPOINT S3_REGION S3_SECRET_ACCESS_KEY HCLOUD_TOKEN +unexport SKIP_REGION_CHECK S3_ACCESS_KEY_ID S3_ENDPOINT S3_REGION S3_SECRET_ACCESS_KEY HCLOUD_TOKEN SCW_ACCESS_KEY SCW_SECRET_KEY SCW_DEFAULT_PROJECT_ID SCW_DEFAULT_REGION SCW_DEFAULT_ZONE VERSION=$(shell tools/get_version.sh | grep VERSION | awk '{print $$2}') diff --git a/nodeup/pkg/bootstrap/install.go b/nodeup/pkg/bootstrap/install.go index 0505987744..2a7644b8bc 100644 --- a/nodeup/pkg/bootstrap/install.go +++ b/nodeup/pkg/bootstrap/install.go @@ -153,6 +153,14 @@ func (i *Installation) buildEnvFile() *nodetasks.File { envVars["AZURE_STORAGE_ACCOUNT"] = os.Getenv("AZURE_STORAGE_ACCOUNT") } + if os.Getenv("SCW_ACCESS_KEY") != "" { + envVars["SCW_ACCESS_KEY"] = os.Getenv("SCW_ACCESS_KEY") + envVars["SCW_SECRET_KEY"] = os.Getenv("SCW_SECRET_KEY") + envVars["SCW_DEFAULT_PROJECT_ID"] = os.Getenv("SCW_DEFAULT_PROJECT_ID") + envVars["SCW_DEFAULT_REGION"] = os.Getenv("SCW_DEFAULT_REGION") + envVars["SCW_DEFAULT_ZONE"] = os.Getenv("SCW_DEFAULT_ZONE") + } + sysconfig := "" for key, value := range envVars { sysconfig += key + "=" + value + "\n" diff --git a/nodeup/pkg/model/protokube.go b/nodeup/pkg/model/protokube.go index eff38f707d..cdf869c053 100644 --- a/nodeup/pkg/model/protokube.go +++ b/nodeup/pkg/model/protokube.go @@ -310,6 +310,14 @@ func (t *ProtokubeBuilder) buildEnvFile() (*nodetasks.File, error) { envVars["AZURE_STORAGE_ACCOUNT"] = os.Getenv("AZURE_STORAGE_ACCOUNT") } + if t.CloudProvider == kops.CloudProviderScaleway { + envVars["SCW_ACCESS_KEY"] = os.Getenv("SCW_ACCESS_KEY") + envVars["SCW_SECRET_KEY"] = os.Getenv("SCW_SECRET_KEY") + envVars["SCW_DEFAULT_PROJECT_ID"] = os.Getenv("SCW_DEFAULT_PROJECT_ID") + envVars["SCW_DEFAULT_REGION"] = os.Getenv("SCW_DEFAULT_REGION") + envVars["SCW_DEFAULT_ZONE"] = os.Getenv("SCW_DEFAULT_ZONE") + } + for _, envVar := range proxy.GetProxyEnvVars(t.Cluster.Spec.EgressProxy) { envVars[envVar.Name] = envVar.Value } diff --git a/pkg/apis/kops/channel.go b/pkg/apis/kops/channel.go index a4f7b5ab76..181396f898 100644 --- a/pkg/apis/kops/channel.go +++ b/pkg/apis/kops/channel.go @@ -292,6 +292,7 @@ const ( CloudProviderHetzner CloudProviderID = "hetzner" CloudProviderOpenstack CloudProviderID = "openstack" CloudProviderAzure CloudProviderID = "azure" + CloudProviderScaleway CloudProviderID = "scaleway" ) // FindImage returns the image for the cloudprovider, or nil if none found diff --git a/pkg/clouds/supported.go b/pkg/clouds/supported.go index 29b1c15692..cb956d6367 100644 --- a/pkg/clouds/supported.go +++ b/pkg/clouds/supported.go @@ -32,6 +32,9 @@ func SupportedClouds() []kops.CloudProviderID { if featureflag.Azure.Enabled() { clouds = append(clouds, kops.CloudProviderAzure) } + if featureflag.Scaleway.Enabled() { + clouds = append(clouds, kops.CloudProviderScaleway) + } return clouds } diff --git a/pkg/featureflag/featureflag.go b/pkg/featureflag/featureflag.go index 6405af1365..2147655e7e 100644 --- a/pkg/featureflag/featureflag.go +++ b/pkg/featureflag/featureflag.go @@ -90,6 +90,8 @@ var ( Karpenter = new("Karpenter", Bool(false)) // ImageDigest remaps all manifests with image digests ImageDigest = new("ImageDigest", Bool(true)) + // Scaleway toggles the Scaleway Cloud support. + Scaleway = new("Scaleway", Bool(false)) ) // FeatureFlag defines a feature flag diff --git a/pkg/model/bootstrapscript.go b/pkg/model/bootstrapscript.go index 2f806fee25..4fb4660029 100644 --- a/pkg/model/bootstrapscript.go +++ b/pkg/model/bootstrapscript.go @@ -31,6 +31,7 @@ import ( "k8s.io/kops/upup/pkg/fi/utils" "sigs.k8s.io/yaml" + "github.com/scaleway/scaleway-sdk-go/scw" "k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/apis/nodeup" "k8s.io/kops/pkg/model/resources" @@ -213,6 +214,34 @@ func (b *BootstrapScript) buildEnvironmentVariables(cluster *kops.Cluster) (map[ } } + if cluster.Spec.GetCloudProvider() == kops.CloudProviderScaleway { + region, err := scw.ParseRegion(os.Getenv("SCW_DEFAULT_REGION")) + if err != nil { + return nil, fmt.Errorf("error parsing SCW_DEFAULT_REGION: %w", err) + } + env["SCW_DEFAULT_REGION"] = string(region) + zone, err := scw.ParseZone(os.Getenv("SCW_DEFAULT_ZONE")) + if err != nil { + return nil, fmt.Errorf("error parsing SCW_DEFAULT_ZONE: %w", err) + } + env["SCW_DEFAULT_ZONE"] = string(zone) + scwAccessKey := os.Getenv("SCW_ACCESS_KEY") + if scwAccessKey == "" { + return nil, fmt.Errorf("SCW_ACCESS_KEY has to be set as an environment variable") + } + env["SCW_ACCESS_KEY"] = scwAccessKey + scwSecretKey := os.Getenv("SCW_SECRET_KEY") + if scwSecretKey != "" { + return nil, fmt.Errorf("SCW_SECRET_KEY has to be set as an environment variable") + } + env["SCW_SECRET_KEY"] = scwSecretKey + scwProjectID := os.Getenv("SCW_DEFAULT_PROJECT_ID") + if scwProjectID != "" { + return nil, fmt.Errorf("SCW_DEFAULT_PROJECT_ID has to be set as an environment variable") + } + env["SCW_DEFAULT_PROJECT_ID"] = scwProjectID + } + return env, nil } diff --git a/util/pkg/env/standard.go b/util/pkg/env/standard.go index e21bbde8bb..842def2e5b 100644 --- a/util/pkg/env/standard.go +++ b/util/pkg/env/standard.go @@ -72,6 +72,13 @@ func BuildSystemComponentEnvVars(spec *kops.ClusterSpec) EnvVars { // Azure related values. vars.addEnvVariableIfExist("AZURE_STORAGE_ACCOUNT") + // Scaleway related values. + vars.addEnvVariableIfExist("SCW_ACCESS_KEY") + vars.addEnvVariableIfExist("SCW_SECRET_KEY") + vars.addEnvVariableIfExist("SCW_DEFAULT_PROJECT_ID") + vars.addEnvVariableIfExist("SCW_DEFAULT_REGION") + vars.addEnvVariableIfExist("SCW_DEFAULT_ZONE") + return vars }