فهرست منبع

fix: scale up the correct ack deployment (#3854)

jose-fully-ported 2 سال پیش
والد
کامیت
5c833c4636
1فایلهای تغییر یافته به همراه44 افزوده شده و 20 حذف شده
  1. 44 20
      api/server/handlers/release/create_addon.go

+ 44 - 20
api/server/handlers/release/create_addon.go

@@ -17,6 +17,7 @@ import (
 	"github.com/porter-dev/porter/internal/analytics"
 	"github.com/porter-dev/porter/internal/helm"
 	"github.com/porter-dev/porter/internal/helm/loader"
+	"github.com/porter-dev/porter/internal/kubernetes"
 	"github.com/porter-dev/porter/internal/models"
 	"github.com/porter-dev/porter/internal/oauth"
 	"github.com/porter-dev/porter/internal/telemetry"
@@ -66,7 +67,7 @@ func (c *CreateAddonHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	helmAgent, err := c.GetHelmAgent(ctx, r, cluster, "")
 	if err != nil {
 		err = telemetry.Error(ctx, span, nil, "error creating helm agent")
-		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 	}
 
@@ -96,27 +97,27 @@ func (c *CreateAddonHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	})
 	if err != nil {
 		err = telemetry.Error(ctx, span, nil, "error loading chart")
-		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 	}
 
 	registries, err := c.Repo().Registry().ListRegistriesByProjectID(cluster.ProjectID)
 	if err != nil {
 		err = telemetry.Error(ctx, span, err, "error retrieving project registry")
-		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 	}
 
 	vpcConfig, err := c.getVPCConfig(ctx, request, proj, cluster)
 	if err != nil {
 		err = telemetry.Error(ctx, span, err, "error retrieving vpc config")
-		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 	}
 
 	if err := c.performAddonPreinstall(ctx, r, request.TemplateName, cluster); err != nil {
 		err = telemetry.Error(ctx, span, err, "error performing addon preinstall")
-		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 	}
 
@@ -199,11 +200,19 @@ func LoadChart(ctx context.Context, config *config.Config, opts *LoadAddonChartO
 }
 
 func (c *CreateAddonHandler) performAddonPreinstall(ctx context.Context, r *http.Request, templateName string, cluster *models.Cluster) error {
+	ctx, span := telemetry.NewSpan(ctx, "addon-preinstall")
+	defer span.End()
+
 	awsTemplates := map[string][]string{
-		"rds-postgresql":        {"ec2-chart", "rds-chart"},
-		"rds-postgresql-aurora": {"ec2-chart", "rds-chart"},
+		"rds-postgresql":        {"ack-chart-ec2", "ack-chart-rds"},
+		"rds-postgresql-aurora": {"ack-chart-ec2", "ack-chart-rds"},
 	}
 
+	telemetry.WithAttributes(span,
+		telemetry.AttributeKV{Key: "template-name", Value: templateName},
+		telemetry.AttributeKV{Key: "cloud-provider", Value: cluster.CloudProvider},
+	)
+
 	if cluster.CloudProvider != "AWS" {
 		return nil
 	}
@@ -214,29 +223,44 @@ func (c *CreateAddonHandler) performAddonPreinstall(ctx context.Context, r *http
 
 	agent, err := c.GetAgent(r, cluster, "")
 	if err != nil {
-		return err
+		return telemetry.Error(ctx, span, err, "failed to get k8s agent")
 	}
 
 	if _, err = agent.GetNamespace(Namespace_EnvironmentGroups); err != nil {
 		if _, err := agent.CreateNamespace(Namespace_EnvironmentGroups, map[string]string{}); err != nil {
-			return err
+			return telemetry.Error(ctx, span, err, "failed creating porter-env-group namespace")
 		}
 	}
 
 	for _, chart := range awsTemplates[templateName] {
-		scale, err := agent.Clientset.AppsV1().Deployments(Namespace_ACKSystem).GetScale(context.TODO(), chart, metav1.GetOptions{})
-		if err != nil {
-			return err
-		}
-		if scale.Spec.Replicas > 0 {
-			continue
+		if c.scaleAckChartDeployment(ctx, chart, agent); err != nil {
+			return telemetry.Error(ctx, span, err, "failed scaling ack chart deployment")
 		}
+	}
 
-		// scale the charts specific to the ack controller
-		scale.Spec.Replicas = 1
-		if _, err := agent.Clientset.AppsV1().Deployments(Namespace_ACKSystem).UpdateScale(ctx, chart, scale, metav1.UpdateOptions{}); err != nil {
-			return err
-		}
+	return nil
+}
+
+func (c *CreateAddonHandler) scaleAckChartDeployment(ctx context.Context, chart string, agent *kubernetes.Agent) error {
+	ctx, span := telemetry.NewSpan(ctx, "scale-ack-chart")
+	defer span.End()
+
+	telemetry.WithAttributes(span,
+		telemetry.AttributeKV{Key: "namespace", Value: Namespace_ACKSystem},
+		telemetry.AttributeKV{Key: "chart-name", Value: chart},
+	)
+
+	scale, err := agent.Clientset.AppsV1().Deployments(Namespace_ACKSystem).GetScale(ctx, chart, metav1.GetOptions{})
+	if err != nil {
+		return telemetry.Error(ctx, span, err, "failed getting deployment")
+	}
+	if scale.Spec.Replicas > 0 {
+		return nil
+	}
+
+	scale.Spec.Replicas = 1
+	if _, err := agent.Clientset.AppsV1().Deployments(Namespace_ACKSystem).UpdateScale(ctx, chart, scale, metav1.UpdateOptions{}); err != nil {
+		return telemetry.Error(ctx, span, err, "failed scaling deployment up")
 	}
 
 	return nil