Skip to content

Commit

Permalink
Support for edge provider in KKP API (#6525)
Browse files Browse the repository at this point in the history
* support edge provider in the api

Signed-off-by: Moath Qasim <[email protected]>

* Fixes

Signed-off-by: Waleed Malik <[email protected]>

* Refactored code

Signed-off-by: Waleed Malik <[email protected]>

---------

Signed-off-by: Moath Qasim <[email protected]>
Signed-off-by: Waleed Malik <[email protected]>
Co-authored-by: Waleed Malik <[email protected]>
  • Loading branch information
moadqassem and ahmedwaleedmalik authored Feb 19, 2024
1 parent c944d92 commit 5f521be
Show file tree
Hide file tree
Showing 11 changed files with 715 additions and 1 deletion.
60 changes: 60 additions & 0 deletions modules/api/cmd/kubermatic-api/swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -10652,6 +10652,61 @@
}
}
},
"/api/v2/projects/{project_id}/clusters/{cluster_id}/machinedeployments/{machinedeployment_id}/joiningscript": {
"get": {
"produces": [
"application/json"
],
"tags": [
"project"
],
"summary": "Gets a machine deployment joining script for the edge provider.",
"operationId": "getMachineDeploymentJoinScript",
"parameters": [
{
"type": "string",
"x-go-name": "ProjectID",
"name": "project_id",
"in": "path",
"required": true
},
{
"type": "string",
"x-go-name": "ClusterID",
"name": "cluster_id",
"in": "path",
"required": true
},
{
"type": "string",
"x-go-name": "MachineDeploymentID",
"name": "machinedeployment_id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "JoiningScript",
"schema": {
"$ref": "#/definitions/JoiningScript"
}
},
"401": {
"$ref": "#/responses/empty"
},
"403": {
"$ref": "#/responses/empty"
},
"default": {
"description": "errorResponse",
"schema": {
"$ref": "#/definitions/errorResponse"
}
}
}
}
},
"/api/v2/projects/{project_id}/clusters/{cluster_id}/machinedeployments/{machinedeployment_id}/nodes": {
"get": {
"produces": [
Expand Down Expand Up @@ -33083,6 +33138,11 @@
"title": "JSONSchemaURL represents a schema url.",
"x-go-package": "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
},
"JoiningScript": {
"description": "JoiningScript represent an encoded joining script for machines",
"type": "string",
"x-go-package": "k8c.io/dashboard/v2/pkg/api/v1"
},
"Kind": {
"type": "object",
"title": "Kind specifies the resource Kind and APIGroup.",
Expand Down
4 changes: 4 additions & 0 deletions modules/api/pkg/api/v1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -2962,3 +2962,7 @@ type MeteringReportConfiguration struct {
// ReportURL represent an S3 pre signed URL to download a report
// swagger:model MeteringReportURL
type ReportURL string

// JoiningScript represent an encoded joining script for machines
// swagger:model JoiningScript
type JoiningScript string
37 changes: 37 additions & 0 deletions modules/api/pkg/handler/common/machine.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ package common

import (
"context"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"strconv"
"strings"
Expand All @@ -28,6 +30,7 @@ import (
jsonpatch "github.com/evanphx/json-patch"

clusterv1alpha1 "github.com/kubermatic/machine-controller/pkg/apis/cluster/v1alpha1"
"github.com/kubermatic/machine-controller/pkg/bootstrap"
apiv1 "k8c.io/dashboard/v2/pkg/api/v1"
"k8c.io/dashboard/v2/pkg/handler/middleware"
"k8c.io/dashboard/v2/pkg/handler/v1/common"
Expand Down Expand Up @@ -266,6 +269,40 @@ func GetMachineDeployment(ctx context.Context, userInfoGetter provider.UserInfoG
return OutputMachineDeployment(machineDeployment)
}

func GetMachineDeploymentJoiningScript(ctx context.Context, userInfoGetter provider.UserInfoGetter, projectProvider provider.ProjectProvider, privilegedProjectProvider provider.PrivilegedProjectProvider, projectID, clusterID, machineDeploymentID string) (interface{}, error) {
clusterProvider := ctx.Value(middleware.ClusterProviderContextKey).(provider.ClusterProvider)
cluster, err := GetCluster(ctx, projectProvider, privilegedProjectProvider, userInfoGetter, projectID, clusterID, nil)
if err != nil {
return nil, err
}

client, err := common.GetClusterClient(ctx, userInfoGetter, clusterProvider, cluster, projectID)
if err != nil {
return nil, common.KubernetesErrorToHTTPError(err)
}

machineDeployment := &clusterv1alpha1.MachineDeployment{}
if err := client.Get(ctx, types.NamespacedName{Namespace: metav1.NamespaceSystem, Name: machineDeploymentID}, machineDeployment); err != nil {
return nil, common.KubernetesErrorToHTTPError(err)
}

scriptSecretName := fmt.Sprintf("edge-provider-script-%s-%s", machineDeployment.Name, bootstrap.CloudInitSettingsNamespace)
joiningScriptSecret := &corev1.Secret{}
if err := client.Get(ctx, types.NamespacedName{Name: scriptSecretName, Namespace: bootstrap.CloudInitSettingsNamespace}, joiningScriptSecret); err != nil {
return nil, common.KubernetesErrorToHTTPError(err)
}

joiningScript := joiningScriptSecret.Data["fetch-bootstrap-script"]
if len(joiningScript) == 0 {
return nil, errors.New("machine joining script is not found")
}

encodedJoiningScript := []byte{}
base64.StdEncoding.Encode(encodedJoiningScript, joiningScript)

return string(encodedJoiningScript), nil
}

func ListMachineDeploymentNodes(ctx context.Context, userInfoGetter provider.UserInfoGetter, projectProvider provider.ProjectProvider, privilegedProjectProvider provider.PrivilegedProjectProvider, projectID, clusterID, machineDeploymentID string, hideInitialConditions bool) (interface{}, error) {
clusterProvider := ctx.Value(middleware.ClusterProviderContextKey).(provider.ClusterProvider)

Expand Down
9 changes: 8 additions & 1 deletion modules/api/pkg/handler/v2/machine/machine.go
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,13 @@ func GetMachineDeployment(projectProvider provider.ProjectProvider, privilegedPr
}
}

func GetMachineDeploymentJoiningScript(projectProvider provider.ProjectProvider, privilegedProjectProvider provider.PrivilegedProjectProvider, userInfoGetter provider.UserInfoGetter) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (interface{}, error) {
req := request.(machineDeploymentReq)
return handlercommon.GetMachineDeploymentJoiningScript(ctx, userInfoGetter, projectProvider, privilegedProjectProvider, req.ProjectID, req.ClusterID, req.MachineDeploymentID)
}
}

// GetSeedCluster returns the SeedCluster object.
func (req machineDeploymentReq) GetSeedCluster() apiv1.SeedCluster {
return apiv1.SeedCluster{
Expand All @@ -195,7 +202,7 @@ func (req machineDeploymentReq) GetSeedCluster() apiv1.SeedCluster {
}

// machineDeploymentReq defines HTTP request for getMachineDeployment
// swagger:parameters getMachineDeployment restartMachineDeployment
// swagger:parameters getMachineDeployment restartMachineDeployment getMachineDeploymentJoinScript
type machineDeploymentReq struct {
common.ProjectReq
// in: path
Expand Down
30 changes: 30 additions & 0 deletions modules/api/pkg/handler/v2/routes_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,10 @@ func (r Routing) RegisterV2(mux *mux.Router, oidcKubeConfEndpoint bool) {
Path("/projects/{project_id}/clusters/{cluster_id}/machinedeployments/{machinedeployment_id}").
Handler(r.getMachineDeployment())

mux.Methods(http.MethodGet).
Path("/projects/{project_id}/clusters/{cluster_id}/machinedeployments/{machinedeployment_id}/joiningscript").
Handler(r.getMachineDeploymentJoinScript())

mux.Methods(http.MethodGet).
Path("/projects/{project_id}/clusters/{cluster_id}/machinedeployments/{machinedeployment_id}/nodes").
Handler(r.listMachineDeploymentNodes())
Expand Down Expand Up @@ -3295,6 +3299,32 @@ func (r Routing) getMachineDeployment() http.Handler {
)
}

// swagger:route GET /api/v2/projects/{project_id}/clusters/{cluster_id}/machinedeployments/{machinedeployment_id}/joiningscript project getMachineDeploymentJoinScript
//
// Gets a machine deployment joining script for the edge provider.
//
// Produces:
// - application/json
//
// Responses:
// default: errorResponse
// 200: JoiningScript
// 401: empty
// 403: empty
func (r Routing) getMachineDeploymentJoinScript() http.Handler {
return httptransport.NewServer(
endpoint.Chain(
middleware.TokenVerifier(r.tokenVerifiers, r.userProvider),
middleware.UserSaver(r.userProvider),
middleware.SetClusterProvider(r.clusterProviderGetter, r.seedsGetter),
middleware.SetPrivilegedClusterProvider(r.clusterProviderGetter, r.seedsGetter),
)(machine.GetMachineDeploymentJoiningScript(r.projectProvider, r.privilegedProjectProvider, r.userInfoGetter)),
machine.DecodeGetMachineDeployment,
handler.EncodeJSON,
r.defaultServerOptions()...,
)
}

// swagger:route GET /api/v2/projects/{project_id}/clusters/{cluster_id}/machinedeployments/{machinedeployment_id}/nodes project listMachineDeploymentNodes
//
// Lists nodes that belong to the given machine deployment.
Expand Down
30 changes: 30 additions & 0 deletions modules/api/pkg/provider/cloud/edge/provider.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
Copyright 2024 The Kubermatic Kubernetes Platform contributors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package edge

import (
"k8c.io/dashboard/v2/pkg/provider"
)

type edge struct{}

// NewCloudProvider creates a new edge provider.
func NewCloudProvider() provider.CloudProvider {
return &edge{}
}

var _ provider.CloudProvider = &edge{}
4 changes: 4 additions & 0 deletions modules/api/pkg/provider/cloud/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
"k8c.io/dashboard/v2/pkg/provider/cloud/azure"
"k8c.io/dashboard/v2/pkg/provider/cloud/bringyourown"
"k8c.io/dashboard/v2/pkg/provider/cloud/digitalocean"
"k8c.io/dashboard/v2/pkg/provider/cloud/edge"
"k8c.io/dashboard/v2/pkg/provider/cloud/fake"
"k8c.io/dashboard/v2/pkg/provider/cloud/gcp"
"k8c.io/dashboard/v2/pkg/provider/cloud/hetzner"
Expand All @@ -50,6 +51,9 @@ func Provider(
if datacenter.Spec.BringYourOwn != nil {
return bringyourown.NewCloudProvider(), nil
}
if datacenter.Spec.Edge != nil {
return edge.NewCloudProvider(), nil
}
if datacenter.Spec.AWS != nil {
return aws.NewCloudProvider(datacenter, secretKeyGetter)
}
Expand Down
Loading

0 comments on commit 5f521be

Please sign in to comment.