Jelajahi Sumber

refactor deployment target requests (#3985)

ianedwards 2 tahun lalu
induk
melakukan
a08394f761

+ 8 - 22
api/server/handlers/porter_app/app_metrics.go

@@ -3,11 +3,9 @@ package porter_app
 import (
 	"net/http"
 
+	"github.com/porter-dev/porter/internal/deployment_target"
 	"github.com/porter-dev/porter/internal/kubernetes/prometheus"
 
-	"connectrpc.com/connect"
-
-	porterv1 "github.com/porter-dev/api-contracts/generated/go/porter/v1"
 	"github.com/porter-dev/porter/internal/telemetry"
 
 	"github.com/porter-dev/porter/api/server/authz"
@@ -80,31 +78,19 @@ func (c *AppMetricsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	}
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "deployment-target-id", Value: request.DeploymentTargetID})
 
-	deploymentTargetDetailsReq := connect.NewRequest(&porterv1.DeploymentTargetDetailsRequest{
-		ProjectId:          int64(project.ID),
-		DeploymentTargetId: request.DeploymentTargetID,
+	deploymentTarget, err := deployment_target.DeploymentTargetDetails(ctx, deployment_target.DeploymentTargetDetailsInput{
+		ProjectID:          int64(project.ID),
+		ClusterID:          int64(cluster.ID),
+		DeploymentTargetID: request.DeploymentTargetID,
+		CCPClient:          c.Config().ClusterControlPlaneClient,
 	})
-
-	deploymentTargetDetailsResp, err := c.Config().ClusterControlPlaneClient.DeploymentTargetDetails(ctx, deploymentTargetDetailsReq)
 	if err != nil {
-		err := telemetry.Error(ctx, span, err, "error getting deployment target details from cluster control plane client")
-		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusBadRequest))
-		return
-	}
-
-	if deploymentTargetDetailsResp == nil || deploymentTargetDetailsResp.Msg == nil {
-		err := telemetry.Error(ctx, span, err, "deployment target details resp is nil")
-		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
-		return
-	}
-
-	if deploymentTargetDetailsResp.Msg.ClusterId != int64(cluster.ID) {
-		err := telemetry.Error(ctx, span, err, "deployment target details resp cluster id does not match cluster id")
+		err := telemetry.Error(ctx, span, err, "error getting deployment target details")
 		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 	}
 
-	namespace := deploymentTargetDetailsResp.Msg.Namespace
+	namespace := deploymentTarget.Namespace
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})
 
 	agent, err := c.GetAgent(r, cluster, "")

+ 15 - 10
api/server/handlers/porter_app/default_deployment_target.go

@@ -3,8 +3,9 @@ package porter_app
 import (
 	"net/http"
 
-	"github.com/google/uuid"
+	"connectrpc.com/connect"
 
+	porterv1 "github.com/porter-dev/api-contracts/generated/go/porter/v1"
 	"github.com/porter-dev/porter/internal/telemetry"
 
 	"github.com/porter-dev/porter/api/server/handlers"
@@ -59,23 +60,27 @@ func (c *DefaultDeploymentTargetHandler) ServeHTTP(w http.ResponseWriter, r *htt
 		telemetry.AttributeKV{Key: "cluster-id", Value: cluster.ID},
 	)
 
-	defaultDeploymentTarget, err := c.Repo().DeploymentTarget().DeploymentTargetBySelectorAndSelectorType(project.ID, cluster.ID, DeploymentTargetSelector_Default, DeploymentTargetSelectorType_Default)
+	defaultDeploymentTargetReq := connect.NewRequest(&porterv1.DefaultDeploymentTargetRequest{
+		ProjectId: int64(project.ID),
+		ClusterId: int64(cluster.ID),
+	})
+
+	defaultDeploymentTargetResp, err := c.Config().ClusterControlPlaneClient.DefaultDeploymentTarget(ctx, defaultDeploymentTargetReq)
 	if err != nil {
-		err := telemetry.Error(ctx, span, err, "error getting default deployment target from repo")
-		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusBadRequest))
+		err := telemetry.Error(ctx, span, err, "error getting default deployment target")
+		c.WriteResult(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 	}
 
-	if defaultDeploymentTarget.ID == uuid.Nil {
-		err := telemetry.Error(ctx, span, err, "default deployment target not found")
-		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
+	if defaultDeploymentTargetResp == nil || defaultDeploymentTargetResp.Msg == nil {
+		err := telemetry.Error(ctx, span, nil, "default deployment target response is nil")
+		c.WriteResult(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 	}
 
-	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "deployment-target-id", Value: defaultDeploymentTarget.ID.String()})
-
+	defaultDeploymentTarget := defaultDeploymentTargetResp.Msg.DeploymentTarget
 	response := &DefaultDeploymentTargetResponse{
-		DeploymentTargetID: defaultDeploymentTarget.ID.String(),
+		DeploymentTargetID: defaultDeploymentTarget.Id,
 	}
 
 	c.WriteResult(w, r, response)

+ 8 - 21
api/server/handlers/porter_app/job_status.go

@@ -3,8 +3,6 @@ package porter_app
 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"
@@ -12,6 +10,7 @@ import (
 	"github.com/porter-dev/porter/api/server/shared/config"
 	"github.com/porter-dev/porter/api/server/shared/requestutils"
 	"github.com/porter-dev/porter/api/types"
+	"github.com/porter-dev/porter/internal/deployment_target"
 	"github.com/porter-dev/porter/internal/kubernetes"
 	"github.com/porter-dev/porter/internal/models"
 	"github.com/porter-dev/porter/internal/telemetry"
@@ -71,31 +70,19 @@ func (c *JobStatusHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	}
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "deployment-target-id", Value: request.DeploymentTargetID})
 
-	deploymentTargetDetailsReq := connect.NewRequest(&porterv1.DeploymentTargetDetailsRequest{
-		ProjectId:          int64(project.ID),
-		DeploymentTargetId: request.DeploymentTargetID,
+	deploymentTarget, err := deployment_target.DeploymentTargetDetails(ctx, deployment_target.DeploymentTargetDetailsInput{
+		ProjectID:          int64(project.ID),
+		ClusterID:          int64(cluster.ID),
+		DeploymentTargetID: request.DeploymentTargetID,
+		CCPClient:          c.Config().ClusterControlPlaneClient,
 	})
-
-	deploymentTargetDetailsResp, err := c.Config().ClusterControlPlaneClient.DeploymentTargetDetails(ctx, deploymentTargetDetailsReq)
 	if err != nil {
-		err := telemetry.Error(ctx, span, err, "error getting deployment target details from cluster control plane client")
-		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusBadRequest))
-		return
-	}
-
-	if deploymentTargetDetailsResp == nil || deploymentTargetDetailsResp.Msg == nil {
-		err := telemetry.Error(ctx, span, err, "deployment target details resp is nil")
-		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
-		return
-	}
-
-	if deploymentTargetDetailsResp.Msg.ClusterId != int64(cluster.ID) {
-		err := telemetry.Error(ctx, span, err, "deployment target details resp cluster id does not match cluster id")
+		err := telemetry.Error(ctx, span, err, "error getting deployment target details")
 		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 	}
 
-	namespace := deploymentTargetDetailsResp.Msg.Namespace
+	namespace := deploymentTarget.Namespace
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})
 
 	agent, err := c.GetAgent(r, cluster, "")

+ 8 - 23
api/server/handlers/porter_app/logs_apply_v2.go

@@ -5,10 +5,6 @@ import (
 	"net/http"
 	"time"
 
-	"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"
@@ -16,6 +12,7 @@ import (
 	"github.com/porter-dev/porter/api/server/shared/config"
 	"github.com/porter-dev/porter/api/server/shared/requestutils"
 	"github.com/porter-dev/porter/api/types"
+	"github.com/porter-dev/porter/internal/deployment_target"
 	porter_agent "github.com/porter-dev/porter/internal/kubernetes/porter_agent/v2"
 	"github.com/porter-dev/porter/internal/models"
 	"github.com/porter-dev/porter/internal/telemetry"
@@ -104,31 +101,19 @@ func (c *AppLogsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	}
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "deployment-target-id", Value: request.DeploymentTargetID})
 
-	deploymentTargetDetailsReq := connect.NewRequest(&porterv1.DeploymentTargetDetailsRequest{
-		ProjectId:          int64(project.ID),
-		DeploymentTargetId: request.DeploymentTargetID,
+	deploymentTarget, err := deployment_target.DeploymentTargetDetails(ctx, deployment_target.DeploymentTargetDetailsInput{
+		ProjectID:          int64(project.ID),
+		ClusterID:          int64(cluster.ID),
+		DeploymentTargetID: request.DeploymentTargetID,
+		CCPClient:          c.Config().ClusterControlPlaneClient,
 	})
-
-	deploymentTargetDetailsResp, err := c.Config().ClusterControlPlaneClient.DeploymentTargetDetails(ctx, deploymentTargetDetailsReq)
 	if err != nil {
-		err := telemetry.Error(ctx, span, err, "error getting deployment target details from cluster control plane client")
-		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusBadRequest))
-		return
-	}
-
-	if deploymentTargetDetailsResp == nil || deploymentTargetDetailsResp.Msg == nil {
-		err := telemetry.Error(ctx, span, err, "deployment target details resp is nil")
-		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
-		return
-	}
-
-	if deploymentTargetDetailsResp.Msg.ClusterId != int64(cluster.ID) {
-		err := telemetry.Error(ctx, span, err, "deployment target details resp cluster id does not match cluster id")
+		err := telemetry.Error(ctx, span, err, "error getting deployment target details")
 		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 	}
 
-	namespace := deploymentTargetDetailsResp.Msg.Namespace
+	namespace := deploymentTarget.Namespace
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})
 
 	if request.StartRange.IsZero() || request.EndRange.IsZero() {

+ 8 - 21
api/server/handlers/porter_app/pod_status.go

@@ -4,8 +4,6 @@ import (
 	"fmt"
 	"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"
@@ -13,6 +11,7 @@ import (
 	"github.com/porter-dev/porter/api/server/shared/config"
 	"github.com/porter-dev/porter/api/server/shared/requestutils"
 	"github.com/porter-dev/porter/api/types"
+	"github.com/porter-dev/porter/internal/deployment_target"
 	"github.com/porter-dev/porter/internal/models"
 	"github.com/porter-dev/porter/internal/telemetry"
 	v1 "k8s.io/api/core/v1"
@@ -72,31 +71,19 @@ func (c *PodStatusHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	}
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "deployment-target-id", Value: request.DeploymentTargetID})
 
-	deploymentTargetDetailsReq := connect.NewRequest(&porterv1.DeploymentTargetDetailsRequest{
-		ProjectId:          int64(project.ID),
-		DeploymentTargetId: request.DeploymentTargetID,
+	deploymentTarget, err := deployment_target.DeploymentTargetDetails(ctx, deployment_target.DeploymentTargetDetailsInput{
+		ProjectID:          int64(project.ID),
+		ClusterID:          int64(cluster.ID),
+		DeploymentTargetID: request.DeploymentTargetID,
+		CCPClient:          c.Config().ClusterControlPlaneClient,
 	})
-
-	deploymentTargetDetailsResp, err := c.Config().ClusterControlPlaneClient.DeploymentTargetDetails(ctx, deploymentTargetDetailsReq)
 	if err != nil {
-		err := telemetry.Error(ctx, span, err, "error getting deployment target details from cluster control plane client")
-		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusBadRequest))
-		return
-	}
-
-	if deploymentTargetDetailsResp == nil || deploymentTargetDetailsResp.Msg == nil {
-		err := telemetry.Error(ctx, span, err, "deployment target details resp is nil")
-		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
-		return
-	}
-
-	if deploymentTargetDetailsResp.Msg.ClusterId != int64(cluster.ID) {
-		err := telemetry.Error(ctx, span, err, "deployment target details resp cluster id does not match cluster id")
+		err := telemetry.Error(ctx, span, err, "error getting deployment target details")
 		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 	}
 
-	namespace := deploymentTargetDetailsResp.Msg.Namespace
+	namespace := deploymentTarget.Namespace
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})
 
 	agent, err := c.GetAgent(r, cluster, "")

+ 2 - 2
api/server/handlers/porter_app/report_status.go

@@ -140,13 +140,13 @@ func (c *ReportRevisionStatusHandler) ServeHTTP(w http.ResponseWriter, r *http.R
 		telemetry.AttributeKV{Key: "deployment-target-id", Value: deploymentTarget.ID},
 		telemetry.AttributeKV{Key: "pr-number", Value: request.PRNumber},
 		telemetry.AttributeKV{Key: "commit-sha", Value: request.CommitSHA},
-		telemetry.AttributeKV{Key: "preview", Value: deploymentTarget.Preview},
+		telemetry.AttributeKV{Key: "is-preview", Value: deploymentTarget.IsPreview},
 		telemetry.AttributeKV{Key: "revision-number", Value: revision.RevisionNumber},
 	)
 
 	resp := &ReportRevisionStatusResponse{}
 
-	if !deploymentTarget.Preview || request.PRNumber == 0 || revision.RevisionNumber > 1 {
+	if !deploymentTarget.IsPreview || request.PRNumber == 0 || revision.RevisionNumber > 1 {
 		c.WriteResult(w, r, resp)
 		return
 	}

+ 8 - 22
api/server/handlers/porter_app/stream_logs.go

@@ -6,9 +6,7 @@ import (
 	"strings"
 	"time"
 
-	"connectrpc.com/connect"
-
-	porterv1 "github.com/porter-dev/api-contracts/generated/go/porter/v1"
+	"github.com/porter-dev/porter/internal/deployment_target"
 	"github.com/porter-dev/porter/internal/telemetry"
 
 	"github.com/porter-dev/porter/api/server/authz"
@@ -77,31 +75,19 @@ func (c *StreamLogsLokiHandler) ServeHTTP(w http.ResponseWriter, r *http.Request
 	}
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "deployment-target-id", Value: request.DeploymentTargetID})
 
-	deploymentTargetDetailsReq := connect.NewRequest(&porterv1.DeploymentTargetDetailsRequest{
-		ProjectId:          int64(project.ID),
-		DeploymentTargetId: request.DeploymentTargetID,
+	deploymentTarget, err := deployment_target.DeploymentTargetDetails(ctx, deployment_target.DeploymentTargetDetailsInput{
+		ProjectID:          int64(project.ID),
+		ClusterID:          int64(cluster.ID),
+		DeploymentTargetID: request.DeploymentTargetID,
+		CCPClient:          c.Config().ClusterControlPlaneClient,
 	})
-
-	deploymentTargetDetailsResp, err := c.Config().ClusterControlPlaneClient.DeploymentTargetDetails(ctx, deploymentTargetDetailsReq)
 	if err != nil {
-		err := telemetry.Error(ctx, span, err, "error getting deployment target details from cluster control plane client")
-		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusBadRequest))
-		return
-	}
-
-	if deploymentTargetDetailsResp == nil || deploymentTargetDetailsResp.Msg == nil {
-		err := telemetry.Error(ctx, span, err, "deployment target details resp is nil")
-		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
-		return
-	}
-
-	if deploymentTargetDetailsResp.Msg.ClusterId != int64(cluster.ID) {
-		err := telemetry.Error(ctx, span, err, "deployment target details resp cluster id does not match cluster id")
+		err := telemetry.Error(ctx, span, err, "error getting deployment target details")
 		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 	}
 
-	namespace := deploymentTargetDetailsResp.Msg.Namespace
+	namespace := deploymentTarget.Namespace
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})
 
 	if request.StartRange.IsZero() {

+ 9 - 22
api/server/handlers/porter_app/update_app_environment_group.go

@@ -8,14 +8,13 @@ import (
 	"strings"
 	"time"
 
+	"github.com/porter-dev/porter/internal/deployment_target"
 	"github.com/porter-dev/porter/internal/kubernetes"
 	"github.com/porter-dev/porter/internal/porter_app"
 
 	"github.com/porter-dev/porter/api/server/shared/requestutils"
 	"github.com/porter-dev/porter/internal/kubernetes/environment_groups"
 
-	"connectrpc.com/connect"
-
 	"github.com/porter-dev/api-contracts/generated/go/helpers"
 	porterv1 "github.com/porter-dev/api-contracts/generated/go/porter/v1"
 
@@ -147,32 +146,20 @@ func (c *UpdateAppEnvironmentHandler) ServeHTTP(w http.ResponseWriter, r *http.R
 		return
 	}
 
-	deploymentTargetDetailsReq := connect.NewRequest(&porterv1.DeploymentTargetDetailsRequest{
-		ProjectId:          int64(project.ID),
-		DeploymentTargetId: request.DeploymentTargetID,
+	deploymentTarget, err := deployment_target.DeploymentTargetDetails(ctx, deployment_target.DeploymentTargetDetailsInput{
+		ProjectID:          int64(project.ID),
+		ClusterID:          int64(cluster.ID),
+		DeploymentTargetID: request.DeploymentTargetID,
+		CCPClient:          c.Config().ClusterControlPlaneClient,
 	})
-
-	deploymentTargetDetailsResp, err := c.Config().ClusterControlPlaneClient.DeploymentTargetDetails(ctx, deploymentTargetDetailsReq)
 	if err != nil {
-		err := telemetry.Error(ctx, span, err, "error getting deployment target details from cluster control plane client")
-		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusBadRequest))
-		return
-	}
-
-	if deploymentTargetDetailsResp == nil || deploymentTargetDetailsResp.Msg == nil {
-		err := telemetry.Error(ctx, span, err, "deployment target details resp is nil")
-		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
-		return
-	}
-
-	if deploymentTargetDetailsResp.Msg.ClusterId != int64(cluster.ID) {
-		err := telemetry.Error(ctx, span, err, "deployment target details resp cluster id does not match cluster id")
+		err := telemetry.Error(ctx, span, err, "error getting deployment target details")
 		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 	}
 
-	namespace := deploymentTargetDetailsResp.Msg.Namespace
-	isPreview := deploymentTargetDetailsResp.Msg.IsPreview
+	namespace := deploymentTarget.Namespace
+	isPreview := deploymentTarget.IsPreview
 
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "is-preview", Value: isPreview})
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})

+ 4 - 4
dashboard/src/main/home/app-dashboard/app-view/AppDataContainer.tsx

@@ -316,7 +316,7 @@ const AppDataContainer: React.FC<AppDataContainerProps> = ({ tabParam }) => {
       ]);
       setPreviewRevision(null);
 
-      if (deploymentTarget.preview) {
+      if (deploymentTarget.isPreview) {
         history.push(
           `/preview-environments/apps/${porterAppRecord.name}/${DEFAULT_TAB}?target=${deploymentTarget.id}`
         );
@@ -494,7 +494,7 @@ const AppDataContainer: React.FC<AppDataContainerProps> = ({ tabParam }) => {
       { label: "Environment", value: "environment" },
     ];
 
-    if (deploymentTarget.preview) {
+    if (deploymentTarget.isPreview) {
       return base;
     }
 
@@ -519,7 +519,7 @@ const AppDataContainer: React.FC<AppDataContainerProps> = ({ tabParam }) => {
 
     base.push({ label: "Settings", value: "settings" });
     return base;
-  }, [deploymentTarget.preview, latestProto.build, latestNotifications.length]);
+  }, [deploymentTarget.isPreview, latestProto.build, latestNotifications.length]);
 
   useEffect(() => {
     const newProto = previewRevision
@@ -602,7 +602,7 @@ const AppDataContainer: React.FC<AppDataContainerProps> = ({ tabParam }) => {
           options={tabs}
           currentTab={currentTab}
           setCurrentTab={(tab) => {
-            if (deploymentTarget.preview) {
+            if (deploymentTarget.isPreview) {
               history.push(
                 `/preview-environments/apps/${porterAppRecord.name}/${tab}?target=${deploymentTarget.id}`
               );

+ 5 - 5
dashboard/src/main/home/app-dashboard/app-view/AppHeader.tsx

@@ -174,18 +174,18 @@ const AppHeader: React.FC = () => {
               </A>
             </Container>
             <Spacer inline x={1} />
-            <TagWrapper preview={deploymentTarget.preview}>
-              {deploymentTarget.preview ? "Preview" : "Branch"}
-              <BranchTag preview={deploymentTarget.preview}>
+            <TagWrapper preview={deploymentTarget.isPreview}>
+              {deploymentTarget.isPreview ? "Preview" : "Branch"}
+              <BranchTag preview={deploymentTarget.isPreview}>
                 <PullRequestIcon
                   styles={{
                     height: "14px",
                     opacity: "0.65",
                     marginRight: "5px",
-                    fill: deploymentTarget.preview ? "" : "#fff",
+                    fill: deploymentTarget.isPreview ? "" : "#fff",
                   }}
                 />
-                {deploymentTarget.preview
+                {deploymentTarget.isPreview
                   ? deploymentTarget.namespace
                   : gitData.branch}
               </BranchTag>

+ 1 - 1
dashboard/src/main/home/app-dashboard/app-view/LatestRevisionContext.tsx

@@ -200,7 +200,7 @@ export const LatestRevisionProvider: React.FC<LatestRevisionProviderProps> = ({
           deployment_target: z.object({
             cluster_id: z.number(),
             namespace: z.string(),
-            preview: z.boolean(),
+            is_preview: z.boolean(),
           }),
         })
         .parseAsync(res.data);

+ 1 - 1
dashboard/src/main/home/app-dashboard/apps/AppGrid.tsx

@@ -157,7 +157,7 @@ const AppGrid: React.FC<AppGridProps> = ({ apps, searchValue, view, sort }) => {
             return (
               <Link
                 to={
-                  currentDeploymentTarget?.preview
+                  currentDeploymentTarget?.isPreview
                     ? `/preview-environments/apps/${proto.name}/activity?target=${currentDeploymentTarget.id}`
                     : `/apps/${proto.name}`
                 }

+ 8 - 8
dashboard/src/main/home/app-dashboard/apps/Apps.tsx

@@ -113,23 +113,23 @@ const Apps: React.FC<Props> = ({ }) => {
         }
       );
 
-      const { deployment_target } = await z
+      const { deployment_target: deploymentTarget } = await z
         .object({
           deployment_target: z.object({
             cluster_id: z.number(),
             namespace: z.string(),
-            preview: z.boolean(),
+            is_preview: z.boolean(),
           }),
         })
         .parseAsync(res.data);
 
-      return deployment_target;
+      return deploymentTarget;
     },
     {
       enabled:
         !!currentCluster &&
         !!currentProject &&
-        currentDeploymentTarget?.preview,
+        currentDeploymentTarget?.isPreview,
     }
   );
 
@@ -172,7 +172,7 @@ const Apps: React.FC<Props> = ({ }) => {
 
     if (
       status === "loading" ||
-      (currentDeploymentTarget?.preview && deploymentTargetStatus === "loading")
+      (currentDeploymentTarget?.isPreview && deploymentTargetStatus === "loading")
     ) {
       return <Loading offset="-150px" />;
     }
@@ -199,7 +199,7 @@ const Apps: React.FC<Props> = ({ }) => {
 
     return (
       <>
-        {currentDeploymentTarget?.preview && (
+        {currentDeploymentTarget?.isPreview && (
           <DashboardHeader
             image={pull_request}
             title={
@@ -263,7 +263,7 @@ const Apps: React.FC<Props> = ({ }) => {
             activeColor={"transparent"}
           />
           <Spacer inline x={2} />
-          {currentDeploymentTarget?.preview ? (
+          {currentDeploymentTarget?.isPreview ? (
             <Button
               onClick={async () => {
                 setShowDeleteEnvModal(true);
@@ -300,7 +300,7 @@ const Apps: React.FC<Props> = ({ }) => {
 
   return (
     <StyledAppDashboard>
-      {!currentDeploymentTarget?.preview && (
+      {!currentDeploymentTarget?.isPreview && (
         <DashboardHeader
           image={web}
           title="Applications"

+ 6 - 12
dashboard/src/shared/DeploymentTargetContext.tsx

@@ -1,17 +1,11 @@
-import { useDefaultDeploymentTarget } from "lib/hooks/useDeploymentTarget";
-import React, {
-  Dispatch,
-  SetStateAction,
-  createContext,
-  useContext,
-  useMemo,
-  useState,
-} from "react";
+import React, { createContext, useContext, useMemo } from "react";
 import { useLocation } from "react-router";
 
+import { useDefaultDeploymentTarget } from "lib/hooks/useDeploymentTarget";
+
 export type DeploymentTarget = {
   id: string;
-  preview: boolean;
+  isPreview: boolean;
 };
 
 export const DeploymentTargetContext = createContext<{
@@ -43,14 +37,14 @@ const DeploymentTargetProvider = ({ children }: { children: JSX.Element }) => {
     if (idParam) {
       return {
         id: idParam,
-        preview: true,
+        isPreview: true,
       };
     }
 
     if (defaultDeploymentTarget) {
       return {
         id: defaultDeploymentTarget.deployment_target_id,
-        preview: false,
+        isPreview: false,
       };
     }
 

+ 1 - 1
go.mod

@@ -83,7 +83,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.44
+	github.com/porter-dev/api-contracts v0.2.51
 	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

@@ -1520,8 +1520,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.44 h1:dDi2Tb41KxMz6pC8XwI3FkMqtc2ubBYVscA4s0ZlcK8=
-github.com/porter-dev/api-contracts v0.2.44/go.mod h1:fX6JmP5QuzxDLvqP3evFOTXjI4dHxsG0+VKNTjImZU8=
+github.com/porter-dev/api-contracts v0.2.51 h1:xGl2i+djCwGoenK/AIwVNtBgGZhnnxklNJry0jwror0=
+github.com/porter-dev/api-contracts v0.2.51/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=

+ 10 - 5
internal/deployment_target/get.go

@@ -20,9 +20,11 @@ type DeploymentTargetDetailsInput struct {
 // DeploymentTarget is a struct representing the unique cluster, namespace pair for a deployment target
 type DeploymentTarget struct {
 	ID        string `json:"id"`
+	Name      string `json:"name"`
 	ClusterID int64  `json:"cluster_id"`
 	Namespace string `json:"namespace"`
-	Preview   bool   `json:"preview"`
+	IsPreview bool   `json:"is_preview"`
+	IsDefault bool   `json:"is_default"`
 }
 
 // DeploymentTargetDetails gets the deployment target details from CCP
@@ -59,15 +61,18 @@ func DeploymentTargetDetails(ctx context.Context, inp DeploymentTargetDetailsInp
 		return deploymentTarget, telemetry.Error(ctx, span, err, "deployment target details resp is nil")
 	}
 
-	if deploymentTargetDetailsResp.Msg.ClusterId != inp.ClusterID {
+	target := deploymentTargetDetailsResp.Msg.DeploymentTarget
+	if target.ClusterId != inp.ClusterID {
 		return deploymentTarget, telemetry.Error(ctx, span, err, "deployment target details resp cluster id does not match cluster id")
 	}
 
 	deploymentTarget = DeploymentTarget{
 		ID:        inp.DeploymentTargetID,
-		Namespace: deploymentTargetDetailsResp.Msg.Namespace,
-		ClusterID: deploymentTargetDetailsResp.Msg.ClusterId,
-		Preview:   deploymentTargetDetailsResp.Msg.IsPreview,
+		Name:      target.Name,
+		Namespace: target.Namespace,
+		ClusterID: target.ClusterId,
+		IsPreview: target.IsPreview,
+		IsDefault: target.IsDefault,
 	}
 
 	return deploymentTarget, nil