فهرست منبع

support enabling eks logging from frontend (#3209)

* support enabling eks logging from frontend

* import api contracts

* import api contracts

* remove space
Stefan McShane 2 سال پیش
والد
کامیت
cbf0c78ed3
5فایلهای تغییر یافته به همراه102 افزوده شده و 21 حذف شده
  1. 6 0
      Tiltfile
  2. 14 12
      api/server/handlers/api_contract/update.go
  3. 7 7
      dashboard/package-lock.json
  4. 1 1
      dashboard/package.json
  5. 74 1
      dashboard/src/components/ProvisionerSettings.tsx

+ 6 - 0
Tiltfile

@@ -69,6 +69,12 @@ local_resource(
     labels=["z_binaries"],
 )
 
+local_resource(
+    name="disable-porter-helm-test",
+    cmd='tilt disable porter-server-web-test-connection',
+    resource_deps=["porter-server-web"]
+)
+
 docker_build_with_restart(
     ref="porter1/porter-server",
     context=".",

+ 14 - 12
api/server/handlers/api_contract/update.go

@@ -2,7 +2,6 @@ package api_contract
 
 import (
 	"encoding/base64"
-	"fmt"
 	"net/http"
 
 	"github.com/bufbuild/connect-go"
@@ -15,6 +14,7 @@ import (
 	"github.com/porter-dev/porter/api/server/shared/config"
 	"github.com/porter-dev/porter/api/types"
 	"github.com/porter-dev/porter/internal/models"
+	"github.com/porter-dev/porter/internal/telemetry"
 )
 
 type APIContractUpdateHandler struct {
@@ -34,7 +34,9 @@ func NewAPIContractUpdateHandler(
 // ServeHTTP parses the Porter API contract for validity, and forwards the requests for handling on to another service
 // For now, this handling cluster creation only, by inserting a row into the cluster table in order to create an ID for this cluster, as well as stores the raw request JSON for updating later
 func (c *APIContractUpdateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
-	ctx := r.Context()
+	ctx, span := telemetry.NewSpan(r.Context(), "serve-update-api-contract")
+	defer span.End()
+
 	project, _ := ctx.Value(types.ProjectScope).(*models.Project)
 	user, _ := ctx.Value(types.UserScope).(*models.User)
 
@@ -42,8 +44,8 @@ func (c *APIContractUpdateHandler) ServeHTTP(w http.ResponseWriter, r *http.Requ
 
 	err := helpers.UnmarshalContractObjectFromReader(r.Body, &apiContract)
 	if err != nil {
-		e := fmt.Errorf("error parsing api contract: %w", err)
-		c.HandleAPIError(w, r, apierrors.NewErrInternal(e))
+		e := telemetry.Error(ctx, span, err, "error parsing api contract")
+		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(e, http.StatusBadRequest))
 		return
 	}
 
@@ -63,8 +65,8 @@ func (c *APIContractUpdateHandler) ServeHTTP(w http.ResponseWriter, r *http.Requ
 			}
 			dbcl, err := c.Config().Repo.Cluster().CreateCluster(&dbcli)
 			if err != nil {
-				e := fmt.Errorf("error updating mock contract: %w", err)
-				c.HandleAPIError(w, r, apierrors.NewErrInternal(e))
+				e := telemetry.Error(ctx, span, err, "error updating mocking contract")
+				c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(e, http.StatusInternalServerError))
 				return
 			}
 			clusterID = int32(dbcl.ID)
@@ -72,8 +74,8 @@ func (c *APIContractUpdateHandler) ServeHTTP(w http.ResponseWriter, r *http.Requ
 
 		by, err := helpers.MarshalContractObject(ctx, &apiContract)
 		if err != nil {
-			e := fmt.Errorf("error marshalling mock api contract: %w", err)
-			c.HandleAPIError(w, r, apierrors.NewErrInternal(e))
+			e := telemetry.Error(ctx, span, err, "error marshalling mock api contract")
+			c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(e, http.StatusInternalServerError))
 			return
 		}
 		b64Contract := base64.StdEncoding.EncodeToString([]byte(by))
@@ -86,8 +88,8 @@ func (c *APIContractUpdateHandler) ServeHTTP(w http.ResponseWriter, r *http.Requ
 		}
 		revision, err := c.Config().Repo.APIContractRevisioner().Insert(ctx, revisionInput)
 		if err != nil {
-			e := fmt.Errorf("error updating mock contract: %w", err)
-			c.HandleAPIError(w, r, apierrors.NewErrInternal(e))
+			e := telemetry.Error(ctx, span, err, "error updating mock api contract")
+			c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(e, http.StatusInternalServerError))
 			return
 		}
 		resp := &porterv1.ContractRevision{
@@ -108,8 +110,8 @@ func (c *APIContractUpdateHandler) ServeHTTP(w http.ResponseWriter, r *http.Requ
 	})
 	revision, err := c.Config().ClusterControlPlaneClient.UpdateContract(ctx, updateRequest)
 	if err != nil {
-		e := fmt.Errorf("error sending contract for update: %w", err)
-		c.HandleAPIError(w, r, apierrors.NewErrInternal(e))
+		e := telemetry.Error(ctx, span, err, "error sending contract for update")
+		c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(e, http.StatusInternalServerError))
 		return
 	}
 

+ 7 - 7
dashboard/package-lock.json

@@ -12,7 +12,7 @@
         "@loadable/component": "^5.15.2",
         "@material-ui/core": "^4.11.3",
         "@material-ui/lab": "^4.0.0-alpha.61",
-        "@porter-dev/api-contracts": "^0.0.68",
+        "@porter-dev/api-contracts": "^0.0.70",
         "@sentry/react": "^6.13.2",
         "@sentry/tracing": "^6.13.2",
         "@tanstack/react-query": "^4.13.0",
@@ -2434,9 +2434,9 @@
       }
     },
     "node_modules/@porter-dev/api-contracts": {
-      "version": "0.0.68",
-      "resolved": "https://registry.npmjs.org/@porter-dev/api-contracts/-/api-contracts-0.0.68.tgz",
-      "integrity": "sha512-T4lsYOn8ympv5OrY6CkXDR3W9/J4UaOTrDjdnaVkMmQK8P0V71CvTRP6S66BCeYqxV7yDQ+3IMRTeDv5Ov/OtQ==",
+      "version": "0.0.70",
+      "resolved": "https://registry.npmjs.org/@porter-dev/api-contracts/-/api-contracts-0.0.70.tgz",
+      "integrity": "sha512-JOaxn7ihyAQgikbq/4AIQmPoJqR6y+NxBlOtTGyFN/80hUegkWwIy4zCTVj8fqcvUoE0yWaROVFl9rZ7ofRIgg==",
       "dependencies": {
         "@bufbuild/protobuf": "^1.1.0"
       }
@@ -16671,9 +16671,9 @@
       "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="
     },
     "@porter-dev/api-contracts": {
-      "version": "0.0.68",
-      "resolved": "https://registry.npmjs.org/@porter-dev/api-contracts/-/api-contracts-0.0.68.tgz",
-      "integrity": "sha512-T4lsYOn8ympv5OrY6CkXDR3W9/J4UaOTrDjdnaVkMmQK8P0V71CvTRP6S66BCeYqxV7yDQ+3IMRTeDv5Ov/OtQ==",
+      "version": "0.0.70",
+      "resolved": "https://registry.npmjs.org/@porter-dev/api-contracts/-/api-contracts-0.0.70.tgz",
+      "integrity": "sha512-JOaxn7ihyAQgikbq/4AIQmPoJqR6y+NxBlOtTGyFN/80hUegkWwIy4zCTVj8fqcvUoE0yWaROVFl9rZ7ofRIgg==",
       "requires": {
         "@bufbuild/protobuf": "^1.1.0"
       }

+ 1 - 1
dashboard/package.json

@@ -7,7 +7,7 @@
     "@loadable/component": "^5.15.2",
     "@material-ui/core": "^4.11.3",
     "@material-ui/lab": "^4.0.0-alpha.61",
-    "@porter-dev/api-contracts": "^0.0.68",
+    "@porter-dev/api-contracts": "^0.0.70",
     "@sentry/react": "^6.13.2",
     "@sentry/tracing": "^6.13.2",
     "@tanstack/react-query": "^4.13.0",

+ 74 - 1
dashboard/src/components/ProvisionerSettings.tsx

@@ -22,6 +22,7 @@ import {
   Cluster,
   LoadBalancer,
   LoadBalancerType,
+  EKSLogging
 } from "@porter-dev/api-contracts";
 import { ClusterType } from "shared/types";
 import Button from "./porter/Button";
@@ -97,6 +98,7 @@ const ProvisionerSettings: React.FC<Props> = (props) => {
   const [loadBalancerType, setLoadBalancerType] = useState(false);
   const [wildCardDomain, setWildCardDomain] = useState("")
   const [IPAllowList, setIPAllowList] = useState<string>("")
+  const [controlPlaneLogs, setControlPlaneLogs] = useState<EKSLogging>(new EKSLogging())
   //const [accessS3Logs, setAccessS3Logs] = useState<boolean>(false)
   const [wafV2Enabled, setWaf2Enabled] = useState<boolean>(false)
   const [awsTags, setAwsTags] = useState<string>("")
@@ -108,7 +110,6 @@ const ProvisionerSettings: React.FC<Props> = (props) => {
   const [additionalNodePolicies, setAdditionalNodePolicies] = useState<string[]>([]);
   const [cidrRange, setCidrRange] = useState("10.78.0.0/16");
   const [clusterVersion, setClusterVersion] = useState("v1.24.0");
-  const [loadBalancer, setLoadBalancer] = useState<LoadBalancer | undefined>();
   const [isReadOnly, setIsReadOnly] = useState(false);
   const [errorMessage, setErrorMessage] = useState<string>(undefined);
   const [isClicked, setIsClicked] = useState(false);
@@ -258,6 +259,7 @@ const ProvisionerSettings: React.FC<Props> = (props) => {
             cidrRange: cidrRange || "10.78.0.0/16",
             region: awsRegion,
             loadBalancer: loadBalancerObj,
+            logging: controlPlaneLogs,
             nodeGroups: [
               new EKSNodeGroup({
                 instanceType: "t3.medium",
@@ -416,6 +418,16 @@ const ProvisionerSettings: React.FC<Props> = (props) => {
         setwafV2ARN(eksValues.loadBalancer.wafv2Arn)
         setWaf2Enabled(eksValues.loadBalancer.enableWafv2)
       }
+
+      if (eksValues.logging != null) {
+        const l = new EKSLogging();
+        l.enableApiServerLogs = eksValues.logging.enableApiServerLogs;
+        l.enableAuditLogs = eksValues.logging.enableAuditLogs;
+        l.enableAuthenticatorLogs = eksValues.logging.enableAuthenticatorLogs;
+        l.enableControllerManagerLogs = eksValues.logging.enableControllerManagerLogs;
+        l.enableSchedulerLogs = eksValues.logging.enableSchedulerLogs;
+        setControlPlaneLogs(l);
+      }
     }
 
   }, [isExpanded, props.selectedClusterVersion]);
@@ -514,6 +526,67 @@ const ProvisionerSettings: React.FC<Props> = (props) => {
 
             {!currentProject.simplified_view_enabled &&
               <>
+
+                <Spacer y={1} />
+                <Checkbox
+                  checked={controlPlaneLogs.enableApiServerLogs}
+                  disabled={isReadOnly}
+                  toggleChecked={() => {
+                    setControlPlaneLogs(new EKSLogging({ ...controlPlaneLogs, enableApiServerLogs: !controlPlaneLogs.enableApiServerLogs }))
+                  }}
+                  disabledTooltip={"Wait for provisioning to complete before editing this field."}
+                >
+                  <Text color="helper">Enable API Server logs in CloudWatch for this cluster</Text>
+                </Checkbox>
+
+                <Spacer y={1} />
+                <Checkbox
+                  checked={controlPlaneLogs.enableAuditLogs}
+                  disabled={isReadOnly}
+                  toggleChecked={() => {
+                    setControlPlaneLogs(new EKSLogging({ ...controlPlaneLogs, enableAuditLogs: !controlPlaneLogs.enableAuditLogs }))
+                  }}
+                  disabledTooltip={"Wait for provisioning to complete before editing this field."}
+                >
+                  <Text color="helper">Enable Audit logs in CloudWatch for this cluster</Text>
+                </Checkbox>
+
+                <Spacer y={1} />
+                <Checkbox
+                  checked={controlPlaneLogs.enableAuthenticatorLogs}
+                  disabled={isReadOnly}
+                  toggleChecked={() => {
+                    setControlPlaneLogs(new EKSLogging({ ...controlPlaneLogs, enableAuthenticatorLogs: !controlPlaneLogs.enableAuthenticatorLogs }))
+                  }}
+                  disabledTooltip={"Wait for provisioning to complete before editing this field."}
+                >
+                  <Text color="helper">Enable Authenticator logs in CloudWatch for this cluster</Text>
+                </Checkbox>
+
+                <Spacer y={1} />
+                <Checkbox
+                  checked={controlPlaneLogs.enableControllerManagerLogs}
+                  disabled={isReadOnly}
+                  toggleChecked={() => {
+                    setControlPlaneLogs(new EKSLogging({ ...controlPlaneLogs, enableControllerManagerLogs: !controlPlaneLogs.enableControllerManagerLogs }))
+                  }}
+                  disabledTooltip={"Wait for provisioning to complete before editing this field."}
+                >
+                  <Text color="helper">Enable Controller Manager logs in CloudWatch for this cluster</Text>
+                </Checkbox>
+
+                <Spacer y={1} />
+                <Checkbox
+                  checked={controlPlaneLogs.enableSchedulerLogs}
+                  disabled={isReadOnly}
+                  toggleChecked={() => {
+                    setControlPlaneLogs(new EKSLogging({ ...controlPlaneLogs, enableSchedulerLogs: !controlPlaneLogs.enableSchedulerLogs }))
+                  }}
+                  disabledTooltip={"Wait for provisioning to complete before editing this field."}
+                >
+                  <Text color="helper">Enable Scheduler logs in CloudWatch for this cluster</Text>
+                </Checkbox>
+
                 <Spacer y={1} />
                 <Checkbox
                   checked={loadBalancerType}