Просмотр исходного кода

update linked applications when updating env group (#3779)

Co-authored-by: David Townley <davidtownley@Davids-MacBook-Air.local>
d-g-town 2 лет назад
Родитель
Сommit
3f47bb6e85

+ 82 - 0
api/server/handlers/environment_groups/update_linked_apps.go

@@ -0,0 +1,82 @@
+package environment_groups
+
+import (
+	"net/http"
+
+	"connectrpc.com/connect"
+
+	porterv1 "github.com/porter-dev/api-contracts/generated/go/porter/v1"
+	"github.com/porter-dev/porter/api/server/authz"
+	"github.com/porter-dev/porter/api/server/handlers"
+	"github.com/porter-dev/porter/api/server/shared"
+	"github.com/porter-dev/porter/api/server/shared/apierrors"
+	"github.com/porter-dev/porter/api/server/shared/config"
+	"github.com/porter-dev/porter/api/types"
+	"github.com/porter-dev/porter/internal/models"
+	"github.com/porter-dev/porter/internal/telemetry"
+)
+
+// UpdateLinkedAppsHandler is the handle for the /environment-group/update-linked-apps endpoint
+type UpdateLinkedAppsHandler struct {
+	handlers.PorterHandlerReadWriter
+	authz.KubernetesAgentGetter
+}
+
+// NewUpdateLinkedAppsHandler creates an instance of UpdateLinkedAppsHandler
+func NewUpdateLinkedAppsHandler(
+	config *config.Config,
+	decoderValidator shared.RequestDecoderValidator,
+	writer shared.ResultWriter,
+) *UpdateLinkedAppsHandler {
+	return &UpdateLinkedAppsHandler{
+		PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
+		KubernetesAgentGetter:   authz.NewOutOfClusterAgentGetter(config),
+	}
+}
+
+// UpdateLinkedAppsRequest is the request object for the /environment-group/update-linked-apps endpoint
+type UpdateLinkedAppsRequest struct {
+	Name string `json:"name"`
+}
+
+// UpdateLinkedAppsResponse is the response object for the /environment-group/update-linked-apps endpoint
+type UpdateLinkedAppsResponse struct{}
+
+// ServeHTTP updates all apps linked to an environment group
+func (c *UpdateLinkedAppsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	ctx, span := telemetry.NewSpan(r.Context(), "serve-update-apps-linked-to-env-group")
+	defer span.End()
+
+	project, _ := ctx.Value(types.ProjectScope).(*models.Project)
+	cluster, _ := ctx.Value(types.ClusterScope).(*models.Cluster)
+
+	if !project.GetFeatureFlag(models.ValidateApplyV2, c.Config().LaunchDarklyClient) {
+		err := telemetry.Error(ctx, span, nil, "project does not have validate apply v2 enabled")
+		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusForbidden))
+		return
+	}
+
+	request := &UpdateLinkedAppsRequest{}
+	if ok := c.DecodeAndValidate(w, r, request); !ok {
+		err := telemetry.Error(ctx, span, nil, "error decoding request")
+		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusBadRequest))
+		return
+	}
+	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "env-group-name", Value: request.Name})
+
+	updateLinkedAppsReq := connect.NewRequest(&porterv1.UpdateAppsLinkedToEnvGroupRequest{
+		ProjectId:    int64(project.ID),
+		ClusterId:    int64(cluster.ID),
+		EnvGroupName: request.Name,
+	})
+	_, err := c.Config().ClusterControlPlaneClient.UpdateAppsLinkedToEnvGroup(ctx, updateLinkedAppsReq)
+	if err != nil {
+		err := telemetry.Error(ctx, span, err, "error calling ccp update apps linked to env group")
+		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
+		return
+	}
+
+	res := &UpdateLinkedAppsResponse{}
+
+	c.WriteResult(w, r, res)
+}

+ 29 - 0
api/server/router/cluster.go

@@ -1692,5 +1692,34 @@ func getClusterRoutes(
 		Router:   r,
 	})
 
+	// GET /api/projects/{project_id}/clusters/{cluster_id}/environment-groups/update-linked-apps
+	updateLinkedAppsEndpoint := factory.NewAPIEndpoint(
+		&types.APIRequestMetadata{
+			Verb:   types.APIVerbUpdate,
+			Method: types.HTTPVerbPost,
+			Path: &types.Path{
+				Parent:       basePath,
+				RelativePath: relPath + "/environment-groups/update-linked-apps",
+			},
+			Scopes: []types.PermissionScope{
+				types.UserScope,
+				types.ProjectScope,
+				types.ClusterScope,
+			},
+		},
+	)
+
+	updateLinkedAppsHandler := environment_groups.NewUpdateLinkedAppsHandler(
+		config,
+		factory.GetDecoderValidator(),
+		factory.GetResultWriter(),
+	)
+
+	routes = append(routes, &router.Route{
+		Endpoint: updateLinkedAppsEndpoint,
+		Handler:  updateLinkedAppsHandler,
+		Router:   r,
+	})
+
 	return routes, newPath
 }

Разница между файлами не показана из-за своего большого размера
+ 353 - 332
dashboard/src/main/home/cluster-dashboard/env-groups/ExpandedEnvGroup.tsx


+ 13 - 0
dashboard/src/shared/api.tsx

@@ -1917,6 +1917,18 @@ const getAllEnvGroups = baseApi<
   return `/api/projects/${pathParams.id}/clusters/${pathParams.cluster_id}/environment-groups`;
 });
 
+const updateAppsLinkedToEnvironmentGroup = baseApi<
+    {
+        name: string;
+    },
+    {
+        id: number;
+        cluster_id: number;
+    }
+>("POST", (pathParams) => {
+    return `/api/projects/${pathParams.id}/clusters/${pathParams.cluster_id}/environment-groups/update-linked-apps`;
+});
+
 const updateEnvironmentGroupV2 = baseApi<
   {
     deployment_target_id: string;
@@ -3260,6 +3272,7 @@ export default {
   listEnvGroups,
   getAllEnvGroups,
   updateEnvironmentGroupV2,
+  updateAppsLinkedToEnvironmentGroup,
   getEnvGroup,
   deleteEnvGroup,
   deleteNewEnvGroup,

+ 1 - 1
go.mod

@@ -82,7 +82,7 @@ require (
 	github.com/matryer/is v1.4.0
 	github.com/nats-io/nats.go v1.24.0
 	github.com/open-policy-agent/opa v0.44.0
-	github.com/porter-dev/api-contracts v0.2.11
+	github.com/porter-dev/api-contracts v0.2.13
 	github.com/riandyrn/otelchi v0.5.1
 	github.com/santhosh-tekuri/jsonschema/v5 v5.0.1
 	github.com/stefanmcshane/helm v0.0.0-20221213002717-88a4a2c6e77d

+ 2 - 2
go.sum

@@ -1516,8 +1516,8 @@ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/polyfloyd/go-errorlint v0.0.0-20210722154253-910bb7978349/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw=
-github.com/porter-dev/api-contracts v0.2.11 h1:hwE0Pzn3P7LCaMOFXCMzSwIFaY+sABC96m2fOSl1E10=
-github.com/porter-dev/api-contracts v0.2.11/go.mod h1:fX6JmP5QuzxDLvqP3evFOTXjI4dHxsG0+VKNTjImZU8=
+github.com/porter-dev/api-contracts v0.2.13 h1:z878AzwirK28dybdLlOan2U02ZNljw3rFJ79jnc1rFM=
+github.com/porter-dev/api-contracts v0.2.13/go.mod h1:fX6JmP5QuzxDLvqP3evFOTXjI4dHxsG0+VKNTjImZU8=
 github.com/porter-dev/switchboard v0.0.3 h1:dBuYkiVLa5Ce7059d6qTe9a1C2XEORFEanhbtV92R+M=
 github.com/porter-dev/switchboard v0.0.3/go.mod h1:xSPzqSFMQ6OSbp42fhCi4AbGbQbsm6nRvOkrblFeXU4=
 github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=

+ 1 - 0
go.work.sum

@@ -825,6 +825,7 @@ github.com/porter-dev/api-contracts v0.1.7 h1:Mxua9qTur0HIhIS4gmK0a9sLcHrgJfFwSQ
 github.com/porter-dev/api-contracts v0.1.7/go.mod h1:fX6JmP5QuzxDLvqP3evFOTXjI4dHxsG0+VKNTjImZU8=
 github.com/porter-dev/api-contracts v0.2.3 h1:JDdi2QT6RkI37XiYRaKM3L5wvFSp070pWmnlexDsd4c=
 github.com/porter-dev/api-contracts v0.2.3/go.mod h1:fX6JmP5QuzxDLvqP3evFOTXjI4dHxsG0+VKNTjImZU8=
+github.com/porter-dev/api-contracts v0.2.11/go.mod h1:fX6JmP5QuzxDLvqP3evFOTXjI4dHxsG0+VKNTjImZU8=
 github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo=
 github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc=
 github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI=

+ 2 - 0
internal/kubernetes/environment_groups/create.go

@@ -130,6 +130,7 @@ func createVersionedEnvironmentGroupInNamespace(ctx context.Context, a *kubernet
 			Labels: map[string]string{
 				LabelKey_EnvironmentGroupName:    environmentGroup.Name,
 				LabelKey_EnvironmentGroupVersion: strconv.Itoa(environmentGroup.Version),
+				LabelKey_PorterManaged:           "true",
 			},
 		},
 		Data: environmentGroup.Variables,
@@ -155,6 +156,7 @@ func createVersionedEnvironmentGroupInNamespace(ctx context.Context, a *kubernet
 			Labels: map[string]string{
 				LabelKey_EnvironmentGroupName:    environmentGroup.Name,
 				LabelKey_EnvironmentGroupVersion: strconv.Itoa(environmentGroup.Version),
+				LabelKey_PorterManaged:           "true",
 			},
 		},
 		Data: secretData,

+ 1 - 1
internal/kubernetes/environment_groups/get.go

@@ -68,7 +68,7 @@ func latestBaseEnvironmentGroup(ctx context.Context, a *kubernetes.Agent, enviro
 }
 
 // EnvironmentGroupInTargetNamespaceInput contains all information required to check if an environment group exists in a target namespace.
-// If you are looking for envrionment groups in the base namespace, consider using LatestBaseEnvironmentGroup or ListBaseEnvironmentGroups instead
+// If you are looking for environment groups in the base namespace, consider using LatestBaseEnvironmentGroup or ListBaseEnvironmentGroups instead
 type EnvironmentGroupInTargetNamespaceInput struct {
 	// Name is the environment group name which can be found on the configmap label
 	Name                              string

+ 12 - 10
internal/kubernetes/environment_groups/list.go

@@ -18,6 +18,8 @@ const (
 	LabelKey_LinkedEnvironmentGroup  = "porter.run/linked-environment-group"
 	LabelKey_EnvironmentGroupVersion = "porter.run/environment-group-version"
 	LabelKey_EnvironmentGroupName    = "porter.run/environment-group-name"
+	// LabelKey_PorterManaged is the label key signifying the resource is managed by porter
+	LabelKey_PorterManaged = "porter.run/managed"
 
 	LabelKey_DefaultAppEnvironment = "porter.run/default-app-environment"
 
@@ -151,11 +153,11 @@ func listEnvironmentGroups(ctx context.Context, a *kubernetes.Agent, listOpts ..
 			envGroupSet[cm.Name] = EnvironmentGroup{}
 		}
 		envGroupSet[cm.Name] = EnvironmentGroup{
-			Name:            name,
-			Version:         version,
-			Variables:       cm.Data,
-			SecretVariables: envGroupSet[cm.Name].SecretVariables,
-			CreatedAtUTC:    cm.CreationTimestamp.Time.UTC(),
+			Name:                  name,
+			Version:               version,
+			Variables:             cm.Data,
+			SecretVariables:       envGroupSet[cm.Name].SecretVariables,
+			CreatedAtUTC:          cm.CreationTimestamp.Time.UTC(),
 			DefaultAppEnvironment: cm.Labels[LabelKey_DefaultAppEnvironment] == "true",
 		}
 	}
@@ -190,11 +192,11 @@ func listEnvironmentGroups(ctx context.Context, a *kubernetes.Agent, listOpts ..
 			envGroupSet[secret.Name] = EnvironmentGroup{}
 		}
 		envGroupSet[secret.Name] = EnvironmentGroup{
-			Name:            name,
-			Version:         version,
-			SecretVariables: stringSecret,
-			Variables:       envGroupSet[secret.Name].Variables,
-			CreatedAtUTC:    secret.CreationTimestamp.Time.UTC(),
+			Name:                  name,
+			Version:               version,
+			SecretVariables:       stringSecret,
+			Variables:             envGroupSet[secret.Name].Variables,
+			CreatedAtUTC:          secret.CreationTimestamp.Time.UTC(),
 			DefaultAppEnvironment: secret.Labels[LabelKey_DefaultAppEnvironment] == "true",
 		}
 	}

Некоторые файлы не были показаны из-за большого количества измененных файлов