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

Merge branch 'belanger/agent-v3-integration' into dev

Alexander Belanger 3 лет назад
Родитель
Сommit
b7ce65cdbc
4 измененных файлов с 209 добавлено и 109 удалено
  1. 66 0
      api/server/handlers/cluster/get_incident.go
  2. 32 3
      api/server/router/cluster.go
  3. 0 106
      api/types/cluster.go
  4. 111 0
      api/types/incident.go

+ 66 - 0
api/server/handlers/cluster/get_incident.go

@@ -0,0 +1,66 @@
+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/server/shared/requestutils"
+	"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 GetIncidentHandler struct {
+	handlers.PorterHandlerReadWriter
+	authz.KubernetesAgentGetter
+}
+
+func NewGetIncidentHandler(
+	config *config.Config,
+	decoderValidator shared.RequestDecoderValidator,
+	writer shared.ResultWriter,
+) *GetIncidentHandler {
+	return &GetIncidentHandler{
+		PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
+		KubernetesAgentGetter:   authz.NewOutOfClusterAgentGetter(config),
+	}
+}
+
+func (c *GetIncidentHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	cluster, _ := r.Context().Value(types.ClusterScope).(*models.Cluster)
+
+	incidentID, reqErr := requestutils.GetURLParamString(r, types.URLParamIncidentID)
+
+	if reqErr != nil {
+		c.HandleAPIError(w, r, reqErr)
+		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
+	}
+
+	incident, err := porter_agent.GetIncidentByID(agent.Clientset, agentSvc, incidentID)
+
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	c.WriteResult(w, r, incident)
+}

+ 32 - 3
api/server/router/cluster.go

@@ -1155,7 +1155,7 @@ func getClusterRoutes(
 		Router:   r,
 		Router:   r,
 	})
 	})
 
 
-	// GET /api/projects/{project_id}/clusters/{cluster_id}/incidents -> cluster.NewGetIncidentsHandler
+	// GET /api/projects/{project_id}/clusters/{cluster_id}/incidents -> cluster.NewListIncidentsHandler
 	listIncidentsEndpoint := factory.NewAPIEndpoint(
 	listIncidentsEndpoint := factory.NewAPIEndpoint(
 		&types.APIRequestMetadata{
 		&types.APIRequestMetadata{
 			Verb:   types.APIVerbGet,
 			Verb:   types.APIVerbGet,
@@ -1172,7 +1172,7 @@ func getClusterRoutes(
 		},
 		},
 	)
 	)
 
 
-	getIncidentsHandler := cluster.NewListIncidentsHandler(
+	listIncidentsHandler := cluster.NewListIncidentsHandler(
 		config,
 		config,
 		factory.GetDecoderValidator(),
 		factory.GetDecoderValidator(),
 		factory.GetResultWriter(),
 		factory.GetResultWriter(),
@@ -1180,7 +1180,36 @@ func getClusterRoutes(
 
 
 	routes = append(routes, &router.Route{
 	routes = append(routes, &router.Route{
 		Endpoint: listIncidentsEndpoint,
 		Endpoint: listIncidentsEndpoint,
-		Handler:  getIncidentsHandler,
+		Handler:  listIncidentsHandler,
+		Router:   r,
+	})
+
+	// GET /api/projects/{project_id}/clusters/{cluster_id}/incidents/{incident_id} -> cluster.NewGetIncidentHandler
+	getIncidentEndpoint := factory.NewAPIEndpoint(
+		&types.APIRequestMetadata{
+			Verb:   types.APIVerbGet,
+			Method: types.HTTPVerbGet,
+			Path: &types.Path{
+				Parent:       basePath,
+				RelativePath: fmt.Sprintf("%s/incidents/{%s}", relPath, types.URLParamIncidentID),
+			},
+			Scopes: []types.PermissionScope{
+				types.UserScope,
+				types.ProjectScope,
+				types.ClusterScope,
+			},
+		},
+	)
+
+	getIncidentHandler := cluster.NewListIncidentsHandler(
+		config,
+		factory.GetDecoderValidator(),
+		factory.GetResultWriter(),
+	)
+
+	routes = append(routes, &router.Route{
+		Endpoint: getIncidentEndpoint,
+		Handler:  getIncidentHandler,
 		Router:   r,
 		Router:   r,
 	})
 	})
 
 

+ 0 - 106
api/types/cluster.go

@@ -1,8 +1,6 @@
 package types
 package types
 
 
 import (
 import (
-	"time"
-
 	"github.com/porter-dev/porter/internal/kubernetes/prometheus"
 	"github.com/porter-dev/porter/internal/kubernetes/prometheus"
 )
 )
 
 
@@ -274,107 +272,3 @@ type ListClusterResponse []*Cluster
 type CreateClusterCandidateResponse []*ClusterCandidate
 type CreateClusterCandidateResponse []*ClusterCandidate
 
 
 type ListClusterCandidateResponse []*ClusterCandidate
 type ListClusterCandidateResponse []*ClusterCandidate
-
-type SeverityType string
-
-const (
-	SeverityCritical SeverityType = "critical"
-	SeverityNormal   SeverityType = "normal"
-)
-
-type InvolvedObjectKind string
-
-const (
-	InvolvedObjectDeployment InvolvedObjectKind = "deployment"
-	InvolvedObjectJob        InvolvedObjectKind = "job"
-	InvolvedObjectPod        InvolvedObjectKind = "pod"
-)
-
-type IncidentStatus string
-
-const (
-	IncidentStatusResolved IncidentStatus = "resolved"
-	IncidentStatusActive   IncidentStatus = "active"
-)
-
-type IncidentMeta struct {
-	ID                      string             `json:"id" form:"required"`
-	ReleaseName             string             `json:"release_name" form:"required"`
-	ReleaseNamespace        string             `json:"release_namespace" form:"required"`
-	ChartName               string             `json:"chart_name" form:"required"`
-	CreatedAt               time.Time          `json:"created_at" form:"required"`
-	UpdatedAt               time.Time          `json:"updated_at" form:"required"`
-	LastSeen                *time.Time         `json:"last_seen" form:"required"`
-	Status                  IncidentStatus     `json:"status" form:"required"`
-	Summary                 string             `json:"summary" form:"required"`
-	Severity                SeverityType       `json:"severity" form:"required"`
-	InvolvedObjectKind      InvolvedObjectKind `json:"involved_object_kind" form:"required"`
-	InvolvedObjectName      string             `json:"involved_object_name" form:"required"`
-	InvolvedObjectNamespace string             `json:"involved_object_namespace" form:"required"`
-}
-
-type PaginationRequest struct {
-	Page int64 `schema:"page"`
-}
-
-type PaginationResponse struct {
-	NumPages    int64 `json:"num_pages" form:"required"`
-	CurrentPage int64 `json:"current_page" form:"required"`
-	NextPage    int64 `json:"next_page" form:"required"`
-}
-
-type ListIncidentsRequest struct {
-	*PaginationRequest
-	Status           *IncidentStatus `schema:"status"`
-	ReleaseName      *string         `schema:"release_name"`
-	ReleaseNamespace *string         `schema:"release_namespace"`
-}
-
-type ListIncidentsResponse struct {
-	Incidents  []*IncidentMeta     `json:"incidents" form:"required"`
-	Pagination *PaginationResponse `json:"pagination"`
-}
-
-type Incident struct {
-	*IncidentMeta
-	Pods   []string `json:"pods" form:"required"`
-	Detail string   `json:"detail" form:"required"`
-}
-
-type IncidentEvent struct {
-	ID           string     `json:"id" form:"required"`
-	LastSeen     *time.Time `json:"last_seen" form:"required"`
-	PodName      string     `json:"pod_name" form:"required"`
-	PodNamespace string     `json:"pod_namespace" form:"required"`
-	Summary      string     `json:"summary" form:"required"`
-	Detail       string     `json:"detail" form:"required"`
-}
-
-type ListIncidentEventsRequest struct {
-	*PaginationRequest
-	PodName      *string `schema:"pod_name"`
-	PodNamespace *string `schema:"pod_namespace"`
-	Summary      *string `schema:"summary"`
-}
-
-type ListIncidentEventsResponse struct {
-	Events     []*IncidentEvent    `json:"events" form:"required"`
-	Pagination *PaginationResponse `json:"pagination"`
-}
-
-type GetLogRequest struct {
-	Limit      uint       `json:"limit"`
-	StartRange *time.Time `json:"start_range"`
-	EndRange   *time.Time `json:"end_range"`
-	Pods       []string   `json:"pods"`
-}
-
-type LogLine struct {
-	Timestamp *time.Time `json:"timestamp"`
-	Line      string     `json:"line"`
-}
-
-type GetLogResponse struct {
-	ContinueTime *time.Time `json:"continue_time"`
-	Logs         []LogLine  `json:"logs"`
-}

+ 111 - 0
api/types/incident.go

@@ -0,0 +1,111 @@
+package types
+
+import "time"
+
+const URLParamIncidentID URLParam = "incident_id"
+
+type SeverityType string
+
+const (
+	SeverityCritical SeverityType = "critical"
+	SeverityNormal   SeverityType = "normal"
+)
+
+type InvolvedObjectKind string
+
+const (
+	InvolvedObjectDeployment InvolvedObjectKind = "deployment"
+	InvolvedObjectJob        InvolvedObjectKind = "job"
+	InvolvedObjectPod        InvolvedObjectKind = "pod"
+)
+
+type IncidentStatus string
+
+const (
+	IncidentStatusResolved IncidentStatus = "resolved"
+	IncidentStatusActive   IncidentStatus = "active"
+)
+
+type IncidentMeta struct {
+	ID                      string             `json:"id" form:"required"`
+	ReleaseName             string             `json:"release_name" form:"required"`
+	ReleaseNamespace        string             `json:"release_namespace" form:"required"`
+	ChartName               string             `json:"chart_name" form:"required"`
+	CreatedAt               time.Time          `json:"created_at" form:"required"`
+	UpdatedAt               time.Time          `json:"updated_at" form:"required"`
+	LastSeen                *time.Time         `json:"last_seen" form:"required"`
+	Status                  IncidentStatus     `json:"status" form:"required"`
+	Summary                 string             `json:"summary" form:"required"`
+	Severity                SeverityType       `json:"severity" form:"required"`
+	InvolvedObjectKind      InvolvedObjectKind `json:"involved_object_kind" form:"required"`
+	InvolvedObjectName      string             `json:"involved_object_name" form:"required"`
+	InvolvedObjectNamespace string             `json:"involved_object_namespace" form:"required"`
+}
+
+type PaginationRequest struct {
+	Page int64 `schema:"page"`
+}
+
+type PaginationResponse struct {
+	NumPages    int64 `json:"num_pages" form:"required"`
+	CurrentPage int64 `json:"current_page" form:"required"`
+	NextPage    int64 `json:"next_page" form:"required"`
+}
+
+type ListIncidentsRequest struct {
+	*PaginationRequest
+	Status           *IncidentStatus `schema:"status"`
+	ReleaseName      *string         `schema:"release_name"`
+	ReleaseNamespace *string         `schema:"release_namespace"`
+}
+
+type ListIncidentsResponse struct {
+	Incidents  []*IncidentMeta     `json:"incidents" form:"required"`
+	Pagination *PaginationResponse `json:"pagination"`
+}
+
+type GetIncidentResponse *Incident
+
+type Incident struct {
+	*IncidentMeta
+	Pods   []string `json:"pods" form:"required"`
+	Detail string   `json:"detail" form:"required"`
+}
+
+type IncidentEvent struct {
+	ID           string     `json:"id" form:"required"`
+	LastSeen     *time.Time `json:"last_seen" form:"required"`
+	PodName      string     `json:"pod_name" form:"required"`
+	PodNamespace string     `json:"pod_namespace" form:"required"`
+	Summary      string     `json:"summary" form:"required"`
+	Detail       string     `json:"detail" form:"required"`
+}
+
+type ListIncidentEventsRequest struct {
+	*PaginationRequest
+	PodName      *string `schema:"pod_name"`
+	PodNamespace *string `schema:"pod_namespace"`
+	Summary      *string `schema:"summary"`
+}
+
+type ListIncidentEventsResponse struct {
+	Events     []*IncidentEvent    `json:"events" form:"required"`
+	Pagination *PaginationResponse `json:"pagination"`
+}
+
+type GetLogRequest struct {
+	Limit      uint       `json:"limit"`
+	StartRange *time.Time `json:"start_range"`
+	EndRange   *time.Time `json:"end_range"`
+	Pods       []string   `json:"pods"`
+}
+
+type LogLine struct {
+	Timestamp *time.Time `json:"timestamp"`
+	Line      string     `json:"line"`
+}
+
+type GetLogResponse struct {
+	ContinueTime *time.Time `json:"continue_time"`
+	Logs         []LogLine  `json:"logs"`
+}