Browse Source

Merge branch '0.8.0-api-cleanup' of https://github.com/porter-dev/porter into 0.8.0-api-cleanup

mergin
Alexander Belanger 4 years ago
parent
commit
5a854699f6

+ 18 - 12
api/server/handlers/namespace/create_configmap.go

@@ -69,18 +69,7 @@ func (c *CreateConfigMapHandler) ServeHTTP(w http.ResponseWriter, r *http.Reques
 }
 
 func createConfigMap(agent *kubernetes.Agent, input types.ConfigMapInput) (*v1.ConfigMap, error) {
-	secretData := make(map[string][]byte)
-
-	for key, rawValue := range input.SecretVariables {
-		// encodedValue := base64.StdEncoding.EncodeToString([]byte(rawValue))
-
-		// if err != nil {
-		// 	app.handleErrorInternal(err, w)
-		// 	return
-		// }
-
-		secretData[key] = []byte(rawValue)
-	}
+	secretData := encodeSecrets(input.SecretVariables)
 
 	// create secret first
 	if _, err := agent.CreateLinkedSecret(input.Name, input.Namespace, input.Name, secretData); err != nil {
@@ -94,3 +83,20 @@ func createConfigMap(agent *kubernetes.Agent, input types.ConfigMapInput) (*v1.C
 
 	return agent.CreateConfigMap(input.Name, input.Namespace, input.Variables)
 }
+
+func encodeSecrets(data map[string]string) map[string][]byte {
+	res := make(map[string][]byte)
+
+	for key, rawValue := range data {
+		// encodedValue := base64.StdEncoding.EncodeToString([]byte(rawValue))
+
+		// if err != nil {
+		// 	app.handleErrorInternal(err, w)
+		// 	return
+		// }
+
+		res[key] = []byte(rawValue)
+	}
+
+	return res
+}

+ 76 - 0
api/server/handlers/namespace/update_configmap.go

@@ -0,0 +1,76 @@
+package namespace
+
+import (
+	"fmt"
+	"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"
+	"github.com/porter-dev/porter/internal/models"
+)
+
+type UpdateConfigMapHandler struct {
+	handlers.PorterHandlerReadWriter
+	authz.KubernetesAgentGetter
+}
+
+func NewUpdateConfigMapHandler(
+	config *config.Config,
+	decoderValidator shared.RequestDecoderValidator,
+	writer shared.ResultWriter,
+) *UpdateConfigMapHandler {
+	return &UpdateConfigMapHandler{
+		PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
+		KubernetesAgentGetter:   authz.NewOutOfClusterAgentGetter(config),
+	}
+}
+
+func (c *UpdateConfigMapHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	request := &types.UpdateConfigMapRequest{}
+
+	if ok := c.DecodeAndValidate(w, r, request); !ok {
+		return
+	}
+
+	namespace := r.Context().Value(types.NamespaceScope).(string)
+	cluster, _ := r.Context().Value(types.ClusterScope).(*models.Cluster)
+
+	agent, err := c.GetAgent(r, cluster)
+
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	secretData := encodeSecrets(request.SecretVariables)
+
+	// create secret first
+	err = agent.UpdateLinkedSecret(request.Name, namespace, request.Name, secretData)
+
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	// add all secret env variables to configmap with value PORTERSECRET_${configmap_name}
+	for key, val := range request.SecretVariables {
+		// if val is empty and key does not exist in configmap already, set to empty
+		if _, found := request.Variables[key]; val == "" && !found {
+			request.Variables[key] = ""
+		} else if val != "" {
+			request.Variables[key] = fmt.Sprintf("PORTERSECRET_%s", request.Name)
+		}
+	}
+
+	configMap, err := agent.UpdateConfigMap(request.Name, namespace, request.Variables)
+
+	res := types.UpdateConfigMapResponse{
+		ConfigMap: configMap,
+	}
+
+	c.WriteResult(w, r, res)
+}

+ 31 - 1
api/server/router/namespace.go

@@ -112,7 +112,7 @@ func getNamespaceRoutes(
 		Router:   r,
 	})
 
-	// POST /api/projects/{project_id}/clusters/{cluster_id}/namespaces/{namespace}/configmap/create -> namespace.NewGetConfigMapHandler
+	// POST /api/projects/{project_id}/clusters/{cluster_id}/namespaces/{namespace}/configmap/create -> namespace.NewCreateConfigMapHandler
 	createConfigMapEndpoint := factory.NewAPIEndpoint(
 		&types.APIRequestMetadata{
 			Verb:   types.APIVerbCreate,
@@ -142,6 +142,36 @@ func getNamespaceRoutes(
 		Router:   r,
 	})
 
+	// POST /api/projects/{project_id}/clusters/{cluster_id}/namespaces/{namespace}/configmap/update -> namespace.NewUpdateConfigMapHandler
+	updateConfigMapEndpoint := factory.NewAPIEndpoint(
+		&types.APIRequestMetadata{
+			Verb:   types.APIVerbUpdate,
+			Method: types.HTTPVerbPost,
+			Path: &types.Path{
+				Parent:       basePath,
+				RelativePath: relPath + "/configmap/update",
+			},
+			Scopes: []types.PermissionScope{
+				types.UserScope,
+				types.ProjectScope,
+				types.ClusterScope,
+				types.NamespaceScope,
+			},
+		},
+	)
+
+	updateConfigMapHandler := namespace.NewUpdateConfigMapHandler(
+		config,
+		factory.GetDecoderValidator(),
+		factory.GetResultWriter(),
+	)
+
+	routes = append(routes, &Route{
+		Endpoint: updateConfigMapEndpoint,
+		Handler:  updateConfigMapHandler,
+		Router:   r,
+	})
+
 	// POST /api/projects/{project_id}/clusters/{cluster_id}/namespaces/{namespace}/configmap/rename -> namespace.NewRenameConfigMapHandler
 	renameConfigMapEndpoint := factory.NewAPIEndpoint(
 		&types.APIRequestMetadata{

+ 10 - 0
api/types/namespace.go

@@ -84,6 +84,16 @@ type CreateConfigMapResponse struct {
 	*v1.ConfigMap
 }
 
+type UpdateConfigMapRequest struct {
+	Name            string            `json:"name,required"`
+	Variables       map[string]string `json:"variables,required"`
+	SecretVariables map[string]string `json:"secret_variables,required"`
+}
+
+type UpdateConfigMapResponse struct {
+	*v1.ConfigMap
+}
+
 type RenameConfigMapRequest struct {
 	Name    string `json:"name,required"`
 	NewName string `json:"new_name,required"`

+ 1 - 1
dashboard/src/main/home/cluster-dashboard/env-groups/ExpandedEnvGroup.tsx

@@ -202,13 +202,13 @@ class ExpandedEnvGroup extends Component<PropsType, StateType> {
         "<token>",
         {
           name,
-          namespace,
           variables: apiEnvVariables,
           secret_variables: secretEnvVariables,
         },
         {
           id: this.context.currentProject.id,
           cluster_id: this.props.currentCluster.id,
+          namespace,
         }
       )
       .then((res) => {

+ 6 - 3
dashboard/src/shared/api.tsx

@@ -917,14 +917,17 @@ const createConfigMap = baseApi<
 const updateConfigMap = baseApi<
   {
     name: string;
-    namespace: string;
     variables: Record<string, string>;
     secret_variables?: Record<string, string>;
   },
-  { id: number; cluster_id: number }
+  {
+    id: number;
+    cluster_id: number;
+    namespace: string;
+  }
 >("POST", (pathParams) => {
   let { id, cluster_id } = pathParams;
-  return `/api/projects/${id}/k8s/configmap/update?cluster_id=${cluster_id}`;
+  return `/api/projects/${pathParams.id}/clusters/${pathParams.cluster_id}/namespaces/${pathParams.namespace}/configmap/update`;
 });
 
 const renameConfigMap = baseApi<

+ 6 - 6
docs/developing/backend-refactor-status.md

@@ -82,7 +82,7 @@
 | <li>- [x] `DELETE /api/projects/{project_id}/k8s/configmap/delete`                                                          | AS          | yes             |             | yes              |
 | <li>- [x] `GET /api/projects/{project_id}/k8s/configmap/list`                                                               | AS          | yes             |             | yes              |
 | <li>- [x] `POST /api/projects/{project_id}/k8s/configmap/rename`                                                            | AS          | yes             |             | yes              |
-| <li>- [ ] `POST /api/projects/{project_id}/k8s/configmap/update`                                                            |             |                 |             |                  |
+| <li>- [x] `POST /api/projects/{project_id}/k8s/configmap/update`                                                            | AS          | yes             |             | yes              |
 | <li>- [ ] `GET /api/projects/{project_id}/k8s/helm_releases`                                                                |             |                 |             |                  |
 | <li>- [ ] `DELETE /api/projects/{project_id}/k8s/jobs/{namespace}/{name}`                                                   |             |                 |             |                  |
 | <li>- [ ] `GET /api/projects/{project_id}/k8s/jobs/{namespace}/{name}/pods`                                                 |             |                 |             |                  |
@@ -103,7 +103,7 @@
 | <li>- [ ] `GET /api/projects/{project_id}/k8s/{kind}/status`                                                                |             |                 |             |                  |
 | <li>- [ ] `GET /api/projects/{project_id}/k8s/{namespace}/{name}/jobs/status`                                               |             |                 |             |                  |
 | <li>- [ ] `GET /api/projects/{project_id}/k8s/{namespace}/{chart}/{release_name}/jobs`                                      |             |                 |             |                  |
-| <li>- [x] `GET /api/projects/{project_id}/policy`                                                                           |             |                 |             | yes              |
+| <li>- [x] `GET /api/projects/{project_id}/policy`                                                                           | AS          |                 |             | yes              |
 | <li>- [ ] `POST /api/projects/{project_id}/provision/docr`                                                                  |             |                 |             |                  |
 | <li>- [ ] `POST /api/projects/{project_id}/provision/doks`                                                                  |             |                 |             |                  |
 | <li>- [ ] `POST /api/projects/{project_id}/provision/ecr`                                                                   |             |                 |             |                  |
@@ -146,8 +146,8 @@
 | <li>- [ ] `GET /api/templates`                                                                                              |             |                 |             |                  |
 | <li>- [ ] `GET /api/templates/upgrade_notes/{name}/{version}`                                                               |             |                 |             |                  |
 | <li>- [ ] `GET /api/templates/{name}/{version}`                                                                             |             |                 |             |                  |
-| <li>- [x] `POST /api/users`                                                                                                 |             |                 |             | yes              |
-| <li>- [x] `GET /api/users/{user_id}`                                                                                        |             | yes             |             | yes              |
-| <li>- [x] `DELETE /api/users/{user_id}`                                                                                     |             | yes             |             |                  |
-| <li>- [x] `GET /api/users/{user_id}/projects`                                                                               |             | yes             |             | yes              |
+| <li>- [x] `POST /api/users`                                                                                                 | AB          | yes             |             | yes              |
+| <li>- [x] `GET /api/users/{user_id}`                                                                                        | AB          | yes             |             | yes              |
+| <li>- [x] `DELETE /api/users/{user_id}`                                                                                     | AB          | yes             |             |                  |
+| <li>- [x] `GET /api/users/{user_id}/projects`                                                                               | AB          | yes             |             | yes              |
 | <li>- [ ] `POST /api/webhooks/deploy/{token}`                                                                               |             |                 |             |                  |

+ 3 - 5
internal/kubernetes/agent.go

@@ -111,7 +111,7 @@ type mergeConfigMapData struct {
 }
 
 // UpdateConfigMap updates the configmap given its name and namespace
-func (a *Agent) UpdateConfigMap(name string, namespace string, configMap map[string]string) error {
+func (a *Agent) UpdateConfigMap(name string, namespace string, configMap map[string]string) (*v1.ConfigMap, error) {
 	cmData := make(map[string]*string)
 
 	for key, val := range configMap {
@@ -130,18 +130,16 @@ func (a *Agent) UpdateConfigMap(name string, namespace string, configMap map[str
 	patchBytes, err := json.Marshal(mergeCM)
 
 	if err != nil {
-		return err
+		return nil, err
 	}
 
-	_, err = a.Clientset.CoreV1().ConfigMaps(namespace).Patch(
+	return a.Clientset.CoreV1().ConfigMaps(namespace).Patch(
 		context.Background(),
 		name,
 		types.MergePatchType,
 		patchBytes,
 		metav1.PatchOptions{},
 	)
-
-	return err
 }
 
 type mergeLinkedSecretData struct {