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

fix up agent apis for log/namespace flexibility

David Townley 3 лет назад
Родитель
Сommit
af79e87704

+ 61 - 0
api/server/handlers/cluster/get_logs_pod_namespace_values.go

@@ -0,0 +1,61 @@
+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"
+	"github.com/porter-dev/porter/api/server/shared/config"
+	"github.com/porter-dev/porter/api/types"
+	porter_agent "github.com/porter-dev/porter/internal/kubernetes/porter_agent/v2"
+	"github.com/porter-dev/porter/internal/models"
+)
+
+type GetLogPodNamespaceValuesHandler struct {
+	handlers.PorterHandlerReadWriter
+	authz.KubernetesAgentGetter
+}
+
+func NewGetLogPodNamespaceValuesHandler(
+	config *config.Config,
+	decoderValidator shared.RequestDecoderValidator,
+	writer shared.ResultWriter,
+) *GetLogPodValuesHandler {
+	return &GetLogPodValuesHandler{
+		PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
+		KubernetesAgentGetter:   authz.NewOutOfClusterAgentGetter(config),
+	}
+}
+
+func (c *GetLogPodNamespaceValuesHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	cluster, _ := r.Context().Value(types.ClusterScope).(*models.Cluster)
+
+	request := &types.GetPodNamespaceValuesRequest{}
+
+	if ok := c.DecodeAndValidate(w, r, request); !ok {
+		return
+	}
+
+	agent, err := c.GetAgent(r, cluster, "")
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	// get agent service
+	agentSvc, err := porter_agent.GetAgentService(agent.Clientset)
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	podVals, err := porter_agent.GetPodNamespaceValues(agent.Clientset, agentSvc, request)
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	c.WriteResult(w, r, podVals)
+}

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

@@ -1430,6 +1430,35 @@ func getClusterRoutes(
 		Router:   r,
 	})
 
+	// GET /api/projects/{project_id}/clusters/{cluster_id}/logs/pod_namespace_values -> cluster.NewGetLogPodNamespaceValuesHandler
+	getLogPodNamespaceValuesEndpoint := factory.NewAPIEndpoint(
+		&types.APIRequestMetadata{
+			Verb:   types.APIVerbGet,
+			Method: types.HTTPVerbGet,
+			Path: &types.Path{
+				Parent:       basePath,
+				RelativePath: fmt.Sprintf("%s/logs/pod_namespace_values", relPath),
+			},
+			Scopes: []types.PermissionScope{
+				types.UserScope,
+				types.ProjectScope,
+				types.ClusterScope,
+			},
+		},
+	)
+
+	getLogPodNamespaceValuesHandler := cluster.NewGetLogPodNamespaceValuesHandler(
+		config,
+		factory.GetDecoderValidator(),
+		factory.GetResultWriter(),
+	)
+
+	routes = append(routes, &router.Route{
+		Endpoint: getLogPodNamespaceValuesEndpoint,
+		Handler:  getLogPodNamespaceValuesHandler,
+		Router:   r,
+	})
+
 	// GET /api/projects/{project_id}/clusters/{cluster_id}/logs/revision_values -> cluster.NewGetLogPodValuesHandler
 	getLogRevisionValuesEndpoint := factory.NewAPIEndpoint(
 		&types.APIRequestMetadata{

+ 8 - 1
api/types/incident.go

@@ -107,7 +107,7 @@ type GetLogRequest struct {
 	SearchParam string     `schema:"search_param"`
 	Revision    string     `schema:"revision"`
 	PodSelector string     `schema:"pod_selector" form:"required"`
-	Namespace   string     `schema:"namespace" form:"required"`
+	Namespace   string     `schema:"namespace"`
 	Direction   string     `schema:"direction"`
 }
 
@@ -119,6 +119,13 @@ type GetPodValuesRequest struct {
 	Revision    string     `schema:"revision"`
 }
 
+type GetPodNamespaceValuesRequest struct {
+	StartRange  *time.Time `schema:"start_range"`
+	EndRange    *time.Time `schema:"end_range"`
+	MatchPrefix string     `schema:"match_prefix"`
+	Revision    string     `schema:"revision"`
+}
+
 type GetRevisionValuesRequest struct {
 	StartRange  *time.Time `schema:"start_range"`
 	EndRange    *time.Time `schema:"end_range"`

+ 56 - 1
internal/kubernetes/porter_agent/v2/agent_server.go

@@ -271,7 +271,11 @@ func GetHistoricalLogs(
 	}
 
 	vals["pod_selector"] = req.PodSelector
-	vals["namespace"] = req.Namespace
+
+	if req.Namespace != "" {
+		vals["namespace"] = req.Namespace
+	}
+
 	vals["revision"] = req.Revision
 
 	if req.SearchParam != "" {
@@ -357,6 +361,57 @@ func GetPodValues(
 	return valsResp, nil
 }
 
+func GetPodNamespaceValues(
+	clientset kubernetes.Interface,
+	service *v1.Service,
+	req *types.GetPodNamespaceValuesRequest,
+) ([]map[string]string, error) {
+	vals := make(map[string]string)
+
+	if req.StartRange != nil {
+		startVal, err := req.StartRange.MarshalText()
+		if err != nil {
+			return nil, err
+		}
+
+		vals["start_range"] = string(startVal)
+	}
+
+	if req.EndRange != nil {
+		endVal, err := req.EndRange.MarshalText()
+		if err != nil {
+			return nil, err
+		}
+
+		vals["end_range"] = string(endVal)
+	}
+
+	vals["match_prefix"] = req.MatchPrefix
+	vals["revision"] = req.Revision
+
+	resp := clientset.CoreV1().Services(service.Namespace).ProxyGet(
+		"http",
+		service.Name,
+		fmt.Sprintf("%d", service.Spec.Ports[0].Port),
+		"/logs/pod_namespace_values",
+		vals,
+	)
+
+	rawQuery, err := resp.DoRaw(context.Background())
+	if err != nil {
+		return nil, err
+	}
+
+	valsResp := make([]map[string]string, 0)
+
+	err = json.Unmarshal(rawQuery, &valsResp)
+	if err != nil {
+		return nil, err
+	}
+
+	return valsResp, nil
+}
+
 func GetRevisionValues(
 	clientset kubernetes.Interface,
 	service *v1.Service,