Pārlūkot izejas kodu

refactor deployment target requests (#3985)

ianedwards 2 gadi atpakaļ
vecāks
revīzija
a08394f761

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

@@ -3,11 +3,9 @@ package porter_app
 import (
 import (
 	"net/http"
 	"net/http"
 
 
+	"github.com/porter-dev/porter/internal/deployment_target"
 	"github.com/porter-dev/porter/internal/kubernetes/prometheus"
 	"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/internal/telemetry"
 
 
 	"github.com/porter-dev/porter/api/server/authz"
 	"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})
 	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 {
 	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))
 		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 		return
 	}
 	}
 
 
-	namespace := deploymentTargetDetailsResp.Msg.Namespace
+	namespace := deploymentTarget.Namespace
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})
 
 
 	agent, err := c.GetAgent(r, cluster, "")
 	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 (
 import (
 	"net/http"
 	"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/internal/telemetry"
 
 
 	"github.com/porter-dev/porter/api/server/handlers"
 	"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},
 		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 {
 	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
 		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
 		return
 	}
 	}
 
 
-	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "deployment-target-id", Value: defaultDeploymentTarget.ID.String()})
-
+	defaultDeploymentTarget := defaultDeploymentTargetResp.Msg.DeploymentTarget
 	response := &DefaultDeploymentTargetResponse{
 	response := &DefaultDeploymentTargetResponse{
-		DeploymentTargetID: defaultDeploymentTarget.ID.String(),
+		DeploymentTargetID: defaultDeploymentTarget.Id,
 	}
 	}
 
 
 	c.WriteResult(w, r, response)
 	c.WriteResult(w, r, response)

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

@@ -3,8 +3,6 @@ package porter_app
 import (
 import (
 	"net/http"
 	"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/authz"
 	"github.com/porter-dev/porter/api/server/handlers"
 	"github.com/porter-dev/porter/api/server/handlers"
 	"github.com/porter-dev/porter/api/server/shared"
 	"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/config"
 	"github.com/porter-dev/porter/api/server/shared/requestutils"
 	"github.com/porter-dev/porter/api/server/shared/requestutils"
 	"github.com/porter-dev/porter/api/types"
 	"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/kubernetes"
 	"github.com/porter-dev/porter/internal/models"
 	"github.com/porter-dev/porter/internal/models"
 	"github.com/porter-dev/porter/internal/telemetry"
 	"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})
 	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 {
 	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))
 		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 		return
 	}
 	}
 
 
-	namespace := deploymentTargetDetailsResp.Msg.Namespace
+	namespace := deploymentTarget.Namespace
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})
 
 
 	agent, err := c.GetAgent(r, cluster, "")
 	agent, err := c.GetAgent(r, cluster, "")

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

@@ -5,10 +5,6 @@ import (
 	"net/http"
 	"net/http"
 	"time"
 	"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/authz"
 	"github.com/porter-dev/porter/api/server/handlers"
 	"github.com/porter-dev/porter/api/server/handlers"
 	"github.com/porter-dev/porter/api/server/shared"
 	"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/config"
 	"github.com/porter-dev/porter/api/server/shared/requestutils"
 	"github.com/porter-dev/porter/api/server/shared/requestutils"
 	"github.com/porter-dev/porter/api/types"
 	"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"
 	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/models"
 	"github.com/porter-dev/porter/internal/telemetry"
 	"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})
 	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 {
 	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))
 		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 		return
 	}
 	}
 
 
-	namespace := deploymentTargetDetailsResp.Msg.Namespace
+	namespace := deploymentTarget.Namespace
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})
 
 
 	if request.StartRange.IsZero() || request.EndRange.IsZero() {
 	if request.StartRange.IsZero() || request.EndRange.IsZero() {

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

@@ -4,8 +4,6 @@ import (
 	"fmt"
 	"fmt"
 	"net/http"
 	"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/authz"
 	"github.com/porter-dev/porter/api/server/handlers"
 	"github.com/porter-dev/porter/api/server/handlers"
 	"github.com/porter-dev/porter/api/server/shared"
 	"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/config"
 	"github.com/porter-dev/porter/api/server/shared/requestutils"
 	"github.com/porter-dev/porter/api/server/shared/requestutils"
 	"github.com/porter-dev/porter/api/types"
 	"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/models"
 	"github.com/porter-dev/porter/internal/telemetry"
 	"github.com/porter-dev/porter/internal/telemetry"
 	v1 "k8s.io/api/core/v1"
 	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})
 	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 {
 	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))
 		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 		return
 	}
 	}
 
 
-	namespace := deploymentTargetDetailsResp.Msg.Namespace
+	namespace := deploymentTarget.Namespace
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})
 
 
 	agent, err := c.GetAgent(r, cluster, "")
 	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: "deployment-target-id", Value: deploymentTarget.ID},
 		telemetry.AttributeKV{Key: "pr-number", Value: request.PRNumber},
 		telemetry.AttributeKV{Key: "pr-number", Value: request.PRNumber},
 		telemetry.AttributeKV{Key: "commit-sha", Value: request.CommitSHA},
 		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},
 		telemetry.AttributeKV{Key: "revision-number", Value: revision.RevisionNumber},
 	)
 	)
 
 
 	resp := &ReportRevisionStatusResponse{}
 	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)
 		c.WriteResult(w, r, resp)
 		return
 		return
 	}
 	}

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

@@ -6,9 +6,7 @@ import (
 	"strings"
 	"strings"
 	"time"
 	"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/internal/telemetry"
 
 
 	"github.com/porter-dev/porter/api/server/authz"
 	"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})
 	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 {
 	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))
 		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 		return
 	}
 	}
 
 
-	namespace := deploymentTargetDetailsResp.Msg.Namespace
+	namespace := deploymentTarget.Namespace
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})
 
 
 	if request.StartRange.IsZero() {
 	if request.StartRange.IsZero() {

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

@@ -8,14 +8,13 @@ import (
 	"strings"
 	"strings"
 	"time"
 	"time"
 
 
+	"github.com/porter-dev/porter/internal/deployment_target"
 	"github.com/porter-dev/porter/internal/kubernetes"
 	"github.com/porter-dev/porter/internal/kubernetes"
 	"github.com/porter-dev/porter/internal/porter_app"
 	"github.com/porter-dev/porter/internal/porter_app"
 
 
 	"github.com/porter-dev/porter/api/server/shared/requestutils"
 	"github.com/porter-dev/porter/api/server/shared/requestutils"
 	"github.com/porter-dev/porter/internal/kubernetes/environment_groups"
 	"github.com/porter-dev/porter/internal/kubernetes/environment_groups"
 
 
-	"connectrpc.com/connect"
-
 	"github.com/porter-dev/api-contracts/generated/go/helpers"
 	"github.com/porter-dev/api-contracts/generated/go/helpers"
 	porterv1 "github.com/porter-dev/api-contracts/generated/go/porter/v1"
 	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
 		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 {
 	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))
 		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 		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: "is-preview", Value: isPreview})
 	telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "namespace", Value: namespace})
 	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);
       setPreviewRevision(null);
 
 
-      if (deploymentTarget.preview) {
+      if (deploymentTarget.isPreview) {
         history.push(
         history.push(
           `/preview-environments/apps/${porterAppRecord.name}/${DEFAULT_TAB}?target=${deploymentTarget.id}`
           `/preview-environments/apps/${porterAppRecord.name}/${DEFAULT_TAB}?target=${deploymentTarget.id}`
         );
         );
@@ -494,7 +494,7 @@ const AppDataContainer: React.FC<AppDataContainerProps> = ({ tabParam }) => {
       { label: "Environment", value: "environment" },
       { label: "Environment", value: "environment" },
     ];
     ];
 
 
-    if (deploymentTarget.preview) {
+    if (deploymentTarget.isPreview) {
       return base;
       return base;
     }
     }
 
 
@@ -519,7 +519,7 @@ const AppDataContainer: React.FC<AppDataContainerProps> = ({ tabParam }) => {
 
 
     base.push({ label: "Settings", value: "settings" });
     base.push({ label: "Settings", value: "settings" });
     return base;
     return base;
-  }, [deploymentTarget.preview, latestProto.build, latestNotifications.length]);
+  }, [deploymentTarget.isPreview, latestProto.build, latestNotifications.length]);
 
 
   useEffect(() => {
   useEffect(() => {
     const newProto = previewRevision
     const newProto = previewRevision
@@ -602,7 +602,7 @@ const AppDataContainer: React.FC<AppDataContainerProps> = ({ tabParam }) => {
           options={tabs}
           options={tabs}
           currentTab={currentTab}
           currentTab={currentTab}
           setCurrentTab={(tab) => {
           setCurrentTab={(tab) => {
-            if (deploymentTarget.preview) {
+            if (deploymentTarget.isPreview) {
               history.push(
               history.push(
                 `/preview-environments/apps/${porterAppRecord.name}/${tab}?target=${deploymentTarget.id}`
                 `/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>
               </A>
             </Container>
             </Container>
             <Spacer inline x={1} />
             <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
                 <PullRequestIcon
                   styles={{
                   styles={{
                     height: "14px",
                     height: "14px",
                     opacity: "0.65",
                     opacity: "0.65",
                     marginRight: "5px",
                     marginRight: "5px",
-                    fill: deploymentTarget.preview ? "" : "#fff",
+                    fill: deploymentTarget.isPreview ? "" : "#fff",
                   }}
                   }}
                 />
                 />
-                {deploymentTarget.preview
+                {deploymentTarget.isPreview
                   ? deploymentTarget.namespace
                   ? deploymentTarget.namespace
                   : gitData.branch}
                   : gitData.branch}
               </BranchTag>
               </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({
           deployment_target: z.object({
             cluster_id: z.number(),
             cluster_id: z.number(),
             namespace: z.string(),
             namespace: z.string(),
-            preview: z.boolean(),
+            is_preview: z.boolean(),
           }),
           }),
         })
         })
         .parseAsync(res.data);
         .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 (
             return (
               <Link
               <Link
                 to={
                 to={
-                  currentDeploymentTarget?.preview
+                  currentDeploymentTarget?.isPreview
                     ? `/preview-environments/apps/${proto.name}/activity?target=${currentDeploymentTarget.id}`
                     ? `/preview-environments/apps/${proto.name}/activity?target=${currentDeploymentTarget.id}`
                     : `/apps/${proto.name}`
                     : `/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({
         .object({
           deployment_target: z.object({
           deployment_target: z.object({
             cluster_id: z.number(),
             cluster_id: z.number(),
             namespace: z.string(),
             namespace: z.string(),
-            preview: z.boolean(),
+            is_preview: z.boolean(),
           }),
           }),
         })
         })
         .parseAsync(res.data);
         .parseAsync(res.data);
 
 
-      return deployment_target;
+      return deploymentTarget;
     },
     },
     {
     {
       enabled:
       enabled:
         !!currentCluster &&
         !!currentCluster &&
         !!currentProject &&
         !!currentProject &&
-        currentDeploymentTarget?.preview,
+        currentDeploymentTarget?.isPreview,
     }
     }
   );
   );
 
 
@@ -172,7 +172,7 @@ const Apps: React.FC<Props> = ({ }) => {
 
 
     if (
     if (
       status === "loading" ||
       status === "loading" ||
-      (currentDeploymentTarget?.preview && deploymentTargetStatus === "loading")
+      (currentDeploymentTarget?.isPreview && deploymentTargetStatus === "loading")
     ) {
     ) {
       return <Loading offset="-150px" />;
       return <Loading offset="-150px" />;
     }
     }
@@ -199,7 +199,7 @@ const Apps: React.FC<Props> = ({ }) => {
 
 
     return (
     return (
       <>
       <>
-        {currentDeploymentTarget?.preview && (
+        {currentDeploymentTarget?.isPreview && (
           <DashboardHeader
           <DashboardHeader
             image={pull_request}
             image={pull_request}
             title={
             title={
@@ -263,7 +263,7 @@ const Apps: React.FC<Props> = ({ }) => {
             activeColor={"transparent"}
             activeColor={"transparent"}
           />
           />
           <Spacer inline x={2} />
           <Spacer inline x={2} />
-          {currentDeploymentTarget?.preview ? (
+          {currentDeploymentTarget?.isPreview ? (
             <Button
             <Button
               onClick={async () => {
               onClick={async () => {
                 setShowDeleteEnvModal(true);
                 setShowDeleteEnvModal(true);
@@ -300,7 +300,7 @@ const Apps: React.FC<Props> = ({ }) => {
 
 
   return (
   return (
     <StyledAppDashboard>
     <StyledAppDashboard>
-      {!currentDeploymentTarget?.preview && (
+      {!currentDeploymentTarget?.isPreview && (
         <DashboardHeader
         <DashboardHeader
           image={web}
           image={web}
           title="Applications"
           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 { useLocation } from "react-router";
 
 
+import { useDefaultDeploymentTarget } from "lib/hooks/useDeploymentTarget";
+
 export type DeploymentTarget = {
 export type DeploymentTarget = {
   id: string;
   id: string;
-  preview: boolean;
+  isPreview: boolean;
 };
 };
 
 
 export const DeploymentTargetContext = createContext<{
 export const DeploymentTargetContext = createContext<{
@@ -43,14 +37,14 @@ const DeploymentTargetProvider = ({ children }: { children: JSX.Element }) => {
     if (idParam) {
     if (idParam) {
       return {
       return {
         id: idParam,
         id: idParam,
-        preview: true,
+        isPreview: true,
       };
       };
     }
     }
 
 
     if (defaultDeploymentTarget) {
     if (defaultDeploymentTarget) {
       return {
       return {
         id: defaultDeploymentTarget.deployment_target_id,
         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/matryer/is v1.4.0
 	github.com/nats-io/nats.go v1.24.0
 	github.com/nats-io/nats.go v1.24.0
 	github.com/open-policy-agent/opa v0.44.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/riandyrn/otelchi v0.5.1
 	github.com/santhosh-tekuri/jsonschema/v5 v5.0.1
 	github.com/santhosh-tekuri/jsonschema/v5 v5.0.1
 	github.com/stefanmcshane/helm v0.0.0-20221213002717-88a4a2c6e77d
 	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 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 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/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 h1:dBuYkiVLa5Ce7059d6qTe9a1C2XEORFEanhbtV92R+M=
 github.com/porter-dev/switchboard v0.0.3/go.mod h1:xSPzqSFMQ6OSbp42fhCi4AbGbQbsm6nRvOkrblFeXU4=
 github.com/porter-dev/switchboard v0.0.3/go.mod h1:xSPzqSFMQ6OSbp42fhCi4AbGbQbsm6nRvOkrblFeXU4=
 github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
 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
 // DeploymentTarget is a struct representing the unique cluster, namespace pair for a deployment target
 type DeploymentTarget struct {
 type DeploymentTarget struct {
 	ID        string `json:"id"`
 	ID        string `json:"id"`
+	Name      string `json:"name"`
 	ClusterID int64  `json:"cluster_id"`
 	ClusterID int64  `json:"cluster_id"`
 	Namespace string `json:"namespace"`
 	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
 // 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")
 		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")
 		return deploymentTarget, telemetry.Error(ctx, span, err, "deployment target details resp cluster id does not match cluster id")
 	}
 	}
 
 
 	deploymentTarget = DeploymentTarget{
 	deploymentTarget = DeploymentTarget{
 		ID:        inp.DeploymentTargetID,
 		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
 	return deploymentTarget, nil