Skip to content

Commit

Permalink
Add edge cloud provider (#349)
Browse files Browse the repository at this point in the history
* support edge cloud provider in OSM CRDs
Signed-off-by: Moath Qasim <moad.qassem@gmail.com>

Signed-off-by: Moath Qasim <moad.qassem@gmail.com>

* generate bootstrap script via edge provider script
Signed-off-by: Moath Qasim <moad.qassem@gmail.com>

Signed-off-by: Moath Qasim <moad.qassem@gmail.com>

* Revert "support edge cloud provider in OSM CRDs"

This reverts commit 6853b56.

Signed-off-by: Moath Qasim <moad.qassem@gmail.com>

* add the edge provider to the crd

This reverts commit 6853b56.

Signed-off-by: Moath Qasim <moad.qassem@gmail.com>

---------

Signed-off-by: Moath Qasim <moad.qassem@gmail.com>
  • Loading branch information
moadqassem authored Feb 6, 2024
1 parent 34aa7a2 commit 165eb90
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ spec:
- aws
- azure
- digitalocean
- edge
- gce
- hetzner
- kubevirt
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,7 @@ spec:
- aws
- azure
- digitalocean
- edge
- gce
- hetzner
- kubevirt
Expand Down
2 changes: 1 addition & 1 deletion pkg/cloudprovider/cloudprovider.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ func GetCloudConfig(pconfig providerconfigtypes.Config, kubeletVersion string) (
case osmv1alpha1.CloudProviderAlibaba, osmv1alpha1.CloudProviderAnexia, osmv1alpha1.CloudProviderDigitalocean,
osmv1alpha1.CloudProviderHetzner, osmv1alpha1.CloudProviderLinode, osmv1alpha1.CloudProviderEquinixMetal,
osmv1alpha1.CloudProviderScaleway, osmv1alpha1.CloudProviderNutanix, osmv1alpha1.CloudProviderVMwareCloudDirector,
osmv1alpha1.CloudProviderOpenNebula:
osmv1alpha1.CloudProviderOpenNebula, osmv1alpha1.CloudProviderEdge:
return "", nil
}

Expand Down
39 changes: 39 additions & 0 deletions pkg/controllers/osc/osc_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import (
osmv1alpha1 "k8c.io/operating-system-manager/pkg/crd/osm/v1alpha1"
"k8c.io/operating-system-manager/pkg/generator"
kuberneteshelper "k8c.io/operating-system-manager/pkg/kubernetes"
"k8s.io/client-go/tools/clientcmd/api"

corev1 "k8s.io/api/core/v1"
kerrors "k8s.io/apimachinery/pkg/api/errors"
Expand Down Expand Up @@ -267,6 +268,13 @@ func (r *Reconciler) reconcileOperatingSystemConfigs(ctx context.Context, md *cl
r.containerRuntimeConfig,
r.kubeletFeatureGates,
)

if osc.Spec.CloudProvider.Name == "edge" {
if err := r.generateEdgeScript(ctx, md, token, bootstrapKubeconfig); err != nil {
return fmt.Errorf("failed to generate edge provider bootstrap script: %w", err)
}
}

if err != nil {
return fmt.Errorf("failed to generate %s osc: %w", oscName, err)
}
Expand Down Expand Up @@ -458,6 +466,37 @@ func (r *Reconciler) checkOSP(ctx context.Context, md *clusterv1alpha1.MachineDe
return err
}

func (r *Reconciler) generateEdgeScript(ctx context.Context, md *clusterv1alpha1.MachineDeployment, token string, config *api.Config) error {
var clusterName string
for key := range config.Clusters {
clusterName = key
break
}

serverURL := config.Clusters[clusterName].Server
bootstrapSecretName := fmt.Sprintf("%s-%s-bootstrap-config", md.Name, md.Namespace)
script := fmt.Sprintf("curl -s -k -v --header 'Authorization: Bearer %s' %s/api/v1/namespaces/cloud-init-settings/secrets/%s | jq '.data[\"cloud-config\"]' -r| base64 -d > /etc/cloud/cloud.cfg.d/%s.cfg \ncloud-init --file /etc/cloud/cloud.cfg.d/%s.cfg init\n",
token, serverURL, bootstrapSecretName, bootstrapSecretName, bootstrapSecretName)

scriptSecretName := fmt.Sprintf("edge-provider-script-%s-%s", md.Name, md.Namespace)
secret := &corev1.Secret{}
if err := r.workerClient.Get(ctx, types.NamespacedName{Name: scriptSecretName, Namespace: bootstrap.CloudInitNamespace}, secret); err != nil {
if !kerrors.IsNotFound(err) {
return fmt.Errorf("failed to get %s secret in namespace %s: %w", scriptSecretName, bootstrap.CloudInitNamespace, err)
}
}

if secret.Data == nil {
secret.Data = map[string][]byte{}
}

secret.Name = scriptSecretName
secret.Namespace = bootstrap.CloudInitNamespace
secret.Data["fetch-bootstrap-script"] = []byte(script)

return r.workerClient.Create(ctx, secret)
}

// filterMachineDeploymentPredicate will filter machine deployments based on the presence of OSP annotation
func filterMachineDeploymentPredicate() predicate.Predicate {
return predicate.NewPredicateFuncs(func(o ctrlruntimeclient.Object) bool {
Expand Down
7 changes: 4 additions & 3 deletions pkg/crd/osm/v1alpha1/common_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ const (
)

// CloudProvider represents supported cloud provider.
// +kubebuilder:validation:Enum=aws;azure;digitalocean;gce;hetzner;kubevirt;linode;nutanix;openstack;equinixmetal;vsphere;fake;alibaba;anexia;scaleway;baremetal;external;vmware-cloud-director;opennebula
// +kubebuilder:validation:Enum=aws;azure;digitalocean;edge;gce;hetzner;kubevirt;linode;nutanix;openstack;equinixmetal;vsphere;fake;alibaba;anexia;scaleway;baremetal;external;vmware-cloud-director;opennebula
type CloudProvider string

const (
Expand All @@ -44,6 +44,7 @@ const (
CloudProviderAzure CloudProvider = "azure"
CloudProviderBaremetal CloudProvider = "baremetal"
CloudProviderDigitalocean CloudProvider = "digitalocean"
CloudProviderEdge CloudProvider = "edge"
CloudProviderEquinixMetal CloudProvider = "equinixmetal"
CloudProviderExternal CloudProvider = "external"
CloudProviderFake CloudProvider = "fake"
Expand All @@ -54,9 +55,9 @@ const (
CloudProviderNutanix CloudProvider = "nutanix"
CloudProviderOpenNebula CloudProvider = "opennebula"
CloudProviderOpenstack CloudProvider = "openstack"
CloudProviderVsphere CloudProvider = "vsphere"
CloudProviderVMwareCloudDirector CloudProvider = "vmware-cloud-director"
CloudProviderScaleway CloudProvider = "scaleway"
CloudProviderVMwareCloudDirector CloudProvider = "vmware-cloud-director"
CloudProviderVsphere CloudProvider = "vsphere"
)

// ContainerRuntime represents supported container runtime
Expand Down

0 comments on commit 165eb90

Please sign in to comment.