Răsfoiți Sursa

add agent to context with getter

Alexander Belanger 4 ani în urmă
părinte
comite
2e2e451cf2

+ 52 - 0
api/server/authz/cluster.go

@@ -2,15 +2,20 @@ package authz
 
 import (
 	"context"
+	"fmt"
 	"net/http"
 
 	"github.com/porter-dev/porter/api/server/authz/policy"
 	"github.com/porter-dev/porter/api/server/shared"
 	"github.com/porter-dev/porter/api/server/shared/apierrors"
 	"github.com/porter-dev/porter/api/types"
+	"github.com/porter-dev/porter/internal/kubernetes"
 	"github.com/porter-dev/porter/internal/models"
 )
 
+const KubernetesAgentCtxKey string = "k8s-agent"
+const HelmAgentCtxKey string = "helm-agent"
+
 type ClusterScopedFactory struct {
 	config *shared.Config
 }
@@ -51,3 +56,50 @@ func (p *ClusterScopedMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Reque
 func NewClusterContext(ctx context.Context, cluster *models.Cluster) context.Context {
 	return context.WithValue(ctx, types.ClusterScope, cluster)
 }
+
+type KubernetesAgentGetter interface {
+	GetOutOfClusterConfig(cluster *models.Cluster) *kubernetes.OutOfClusterConfig
+	GetAgent(r *http.Request, cluster *models.Cluster) (*kubernetes.Agent, error)
+}
+
+type OutOfClusterAgentGetter struct {
+	config *shared.Config
+}
+
+func NewOutOfClusterAgentGetter(config *shared.Config) KubernetesAgentGetter {
+	return &OutOfClusterAgentGetter{config}
+}
+
+func (d *OutOfClusterAgentGetter) GetOutOfClusterConfig(cluster *models.Cluster) *kubernetes.OutOfClusterConfig {
+	return &kubernetes.OutOfClusterConfig{
+		Repo:              d.config.Repo,
+		DigitalOceanOAuth: d.config.DOConf,
+		Cluster:           cluster,
+	}
+}
+
+func (d *OutOfClusterAgentGetter) GetAgent(r *http.Request, cluster *models.Cluster) (*kubernetes.Agent, error) {
+	// look for the agent in context
+	ctxAgentVal := r.Context().Value(types.ClusterScope)
+
+	if ctxAgentVal != nil {
+		if agent, ok := ctxAgentVal.(*kubernetes.Agent); ok {
+			return agent, nil
+		}
+	}
+
+	// if agent not found in context, get the agent from out of cluster config
+	ooc := d.GetOutOfClusterConfig(cluster)
+
+	agent, err := kubernetes.GetAgentOutOfClusterConfig(ooc)
+
+	if err != nil {
+		return nil, fmt.Errorf("failed to get agent: %s", err.Error())
+	}
+
+	newCtx := context.WithValue(r.Context(), KubernetesAgentCtxKey, agent)
+
+	r = r.WithContext(newCtx)
+
+	return agent, nil
+}

+ 3 - 4
api/server/authz/release.go

@@ -5,7 +5,6 @@ import (
 	"net/http"
 
 	"github.com/porter-dev/porter/api/server/authz/policy"
-	"github.com/porter-dev/porter/api/server/handlers/cluster"
 	"github.com/porter-dev/porter/api/server/shared"
 	"github.com/porter-dev/porter/api/server/shared/apierrors"
 	"github.com/porter-dev/porter/api/types"
@@ -25,13 +24,13 @@ func NewReleaseScopedFactory(
 }
 
 func (p *ReleaseScopedFactory) Middleware(next http.Handler) http.Handler {
-	return &ReleaseScopedMiddleware{next, p.config, cluster.NewDefaultKubernetesAgentGetter(p.config)}
+	return &ReleaseScopedMiddleware{next, p.config, NewOutOfClusterAgentGetter(p.config)}
 }
 
 type ReleaseScopedMiddleware struct {
 	next        http.Handler
 	config      *shared.Config
-	agentGetter cluster.KubernetesAgentGetter
+	agentGetter KubernetesAgentGetter
 }
 
 func (p *ReleaseScopedMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
@@ -44,7 +43,7 @@ func (p *ReleaseScopedMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Reque
 
 	cluster, _ := r.Context().Value(types.ClusterScope).(*models.Cluster)
 
-	k8sAgent, err := p.agentGetter.GetAgent(cluster)
+	k8sAgent, err := p.agentGetter.GetAgent(r, cluster)
 
 	if err != nil {
 		apierrors.HandleAPIError(w, p.config.Logger, apierrors.NewErrInternal(err))

+ 0 - 34
api/server/handlers/cluster/agent.go

@@ -1,34 +0,0 @@
-package cluster
-
-import (
-	"github.com/porter-dev/porter/api/server/shared"
-	"github.com/porter-dev/porter/internal/kubernetes"
-	"github.com/porter-dev/porter/internal/models"
-)
-
-type KubernetesAgentGetter interface {
-	GetOutOfClusterConfig(cluster *models.Cluster) *kubernetes.OutOfClusterConfig
-	GetAgent(cluster *models.Cluster) (*kubernetes.Agent, error)
-}
-
-type DefaultKubernetesAgentGetter struct {
-	config *shared.Config
-}
-
-func NewDefaultKubernetesAgentGetter(config *shared.Config) KubernetesAgentGetter {
-	return &DefaultKubernetesAgentGetter{config}
-}
-
-func (d *DefaultKubernetesAgentGetter) GetOutOfClusterConfig(cluster *models.Cluster) *kubernetes.OutOfClusterConfig {
-	return &kubernetes.OutOfClusterConfig{
-		Repo:              d.config.Repo,
-		DigitalOceanOAuth: d.config.DOConf,
-		Cluster:           cluster,
-	}
-}
-
-func (d *DefaultKubernetesAgentGetter) GetAgent(cluster *models.Cluster) (*kubernetes.Agent, error) {
-	ooc := d.GetOutOfClusterConfig(cluster)
-
-	return kubernetes.GetAgentOutOfClusterConfig(ooc)
-}

+ 4 - 3
api/server/handlers/cluster/create_namespace.go

@@ -3,6 +3,7 @@ package cluster
 import (
 	"net/http"
 
+	"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"
@@ -12,7 +13,7 @@ import (
 
 type CreateNamespaceHandler struct {
 	handlers.PorterHandlerReadWriter
-	KubernetesAgentGetter
+	authz.KubernetesAgentGetter
 }
 
 func NewCreateNamespaceHandler(
@@ -22,7 +23,7 @@ func NewCreateNamespaceHandler(
 ) *CreateNamespaceHandler {
 	return &CreateNamespaceHandler{
 		PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
-		KubernetesAgentGetter:   NewDefaultKubernetesAgentGetter(config),
+		KubernetesAgentGetter:   authz.NewOutOfClusterAgentGetter(config),
 	}
 }
 
@@ -35,7 +36,7 @@ func (c *CreateNamespaceHandler) ServeHTTP(w http.ResponseWriter, r *http.Reques
 
 	cluster, _ := r.Context().Value(types.ClusterScope).(*models.Cluster)
 
-	agent, err := c.GetAgent(cluster)
+	agent, err := c.GetAgent(r, cluster)
 
 	if err != nil {
 		c.HandleAPIError(w, apierrors.NewErrInternal(err))