Przeglądaj źródła

env group create/list/get/delete calls

sunguroku 5 lat temu
rodzic
commit
e28b231d96

+ 56 - 1
dashboard/src/main/home/cluster-dashboard/ClusterDashboard.tsx

@@ -107,11 +107,66 @@ class ClusterDashboard extends Component<PropsType, StateType> {
 
   renderBody = () => {
     let { currentCluster, setSidebar, currentView } = this.props;
+    let { currentProject } = this.context;
+    api
+    .listConfigMaps(
+      "<token>",
+      {
+        namespace: "default",
+        cluster_id: currentCluster.id
+      },
+      { id: currentProject.id }
+    )
+    .then((res) => {
+      console.log("CONFIGMAP", res)
+    })
+    .catch((err) => {
+      console.log("CONFIGMAP", err)
+    });
     if (currentView === "env-groups") {
       return (
         <>
           <ControlRow>
-            <Button onClick={() => this.props.history.push("launch")}>
+            <Button onClick={() => {
+              // api
+              // .createConfigMap(
+              //   "<token>",
+              //   {
+              //     name: "black-skirts",
+              //     namespace: "default",
+              //     variables: {
+              //       hey: "dev",
+              //       bro: "cha",
+              //       BROTHER: 'ok'
+              //     },
+              //   },
+              //   { id: currentProject.id, cluster_id: currentCluster.id }
+              // )
+              // .then((res) => {
+              //   console.log("CONFIGMAP", res)
+              // })
+              // .catch((err) => {
+              //   console.log("CONFIGMAP", err)
+              // });
+
+              api
+              .deleteConfigMap(
+                "<token>",
+                {
+                  name: "black-skirts",
+                  namespace: "default",
+                  cluster_id: currentCluster.id
+                },
+                { id: currentProject.id }
+              )
+              .then((res) => {
+                console.log("CONFIGMAP", res)
+              })
+              .catch((err) => {
+                console.log("CONFIGMAP", err)
+              });
+
+            }}>
               <i className="material-icons">add</i> Create Env Group
             </Button>
             <SortFilterWrapper>

+ 61 - 0
dashboard/src/shared/api.tsx

@@ -710,6 +710,62 @@ const upgradeChartValues = baseApi<
   return `/api/projects/${id}/releases/${name}/upgrade?cluster_id=${cluster_id}`;
 });
 
+const listConfigMaps = baseApi<
+  {
+    namespace: string;
+    cluster_id: number;
+  },
+  { id: number }
+>("GET", (pathParams) => {
+  return `/api/projects/${pathParams.id}/k8s/configmap/list`;
+});
+
+const getConfigMap = baseApi<
+  {
+    name: string;
+    namespace: string;
+    cluster_id: number;
+  },
+  { id: number }
+>("GET", (pathParams) => {
+  return `/api/projects/${pathParams.id}/k8s/configmap`;
+});
+
+const createConfigMap = baseApi<
+  {
+    name: string;
+    namespace: string;
+    variables: Record<string, string>;
+  },
+  { id: number, cluster_id: number }
+>("POST", (pathParams) => {
+  let { id, cluster_id } = pathParams;
+  return `/api/projects/${id}/k8s/configmap/create?cluster_id=${cluster_id}`;
+});
+
+const updateConfigMap = baseApi<
+  {
+    name: string;
+    namespace: string;
+    variables: Record<string, string>;
+  },
+  { id: number, cluster_id: number }
+>("POST", (pathParams) => {
+  let { id, cluster_id } = pathParams;
+  return `/api/projects/${id}/k8s/configmap/update?cluster_id=${cluster_id}`;
+});
+
+const deleteConfigMap = baseApi<
+  {
+    name: string,
+    namespace: string,
+    cluster_id: number;
+  },
+  { id: number }
+>("DELETE", (pathParams) => {
+  return `/api/projects/${pathParams.id}/k8s/configmap/delete`;
+});
+
 // Bundle export to allow default api import (api.<method> is more readable)
 export default {
   checkAuth,
@@ -728,7 +784,9 @@ export default {
   createPasswordResetVerify,
   createPasswordResetFinalize,
   createProject,
+  createConfigMap,
   deleteCluster,
+  deleteConfigMap,
   deleteGitRepoIntegration,
   deleteInvite,
   deletePod,
@@ -747,6 +805,7 @@ export default {
   getChartControllers,
   getClusterIntegrations,
   getClusters,
+  getConfigMap,
   getGitRepoList,
   getGitRepos,
   getImageRepos,
@@ -776,6 +835,7 @@ export default {
   getApplicationTemplates,
   getUser,
   linkGithubProject,
+  listConfigMaps,
   logInUser,
   logOutUser,
   provisionECR,
@@ -784,5 +844,6 @@ export default {
   rollbackChart,
   uninstallTemplate,
   updateUser,
+  updateConfigMap,
   upgradeChartValues,
 };

+ 8 - 0
internal/kubernetes/agent.go

@@ -106,6 +106,14 @@ func (a *Agent) GetConfigMap(name string, namespace string) (*v1.ConfigMap, erro
 	)
 }
 
+// ListConfigMaps simply lists namespaces
+func (a *Agent) ListConfigMaps(namespace string) (*v1.ConfigMapList, error) {
+	return a.Clientset.CoreV1().ConfigMaps(namespace).List(
+		context.TODO(),
+		metav1.ListOptions{},
+	)
+}
+
 // ListNamespaces simply lists namespaces
 func (a *Agent) ListNamespaces() (*v1.NamespaceList, error) {
 	return a.Clientset.CoreV1().Namespaces().List(

+ 63 - 18
server/api/k8s_handler.go

@@ -76,8 +76,8 @@ func (app *App) HandleListNamespaces(w http.ResponseWriter, r *http.Request) {
 
 // HandleCreateConfigMap deletes the pod given the name and namespace.
 func (app *App) HandleCreateConfigMap(w http.ResponseWriter, r *http.Request) {
+	fmt.Println("CREATING CONFGIMAP")
 	vals, err := url.ParseQuery(r.URL.RawQuery)
-
 	if err != nil {
 		app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
 		return
@@ -110,8 +110,8 @@ func (app *App) HandleCreateConfigMap(w http.ResponseWriter, r *http.Request) {
 
 	configMap := &forms.ConfigMapForm{}
 
-	if err := json.NewDecoder(r.Body).Decode(form); err != nil {
-		app.handleErrorFormDecoding(err, ErrEnvDecode, w)
+	if err := json.NewDecoder(r.Body).Decode(configMap); err != nil {
+		app.handleErrorFormDecoding(err, ErrUserDecode, w)
 		return
 	}
 
@@ -122,14 +122,19 @@ func (app *App) HandleCreateConfigMap(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
+	if err := json.NewEncoder(w).Encode(configMap); err != nil {
+		app.handleErrorFormDecoding(err, ErrEnvDecode, w)
+		return
+	}
+
 	w.WriteHeader(http.StatusOK)
 	return
 }
 
-// HandleGetConfigMap retreives the configmap given the name and namespace.
-func (app *App) HandleGetConfigMap(w http.ResponseWriter, r *http.Request) {
+// HandleListConfigMaps lists all configmaps in a namespace.
+func (app *App) HandleListConfigMaps(w http.ResponseWriter, r *http.Request) {
 	vals, err := url.ParseQuery(r.URL.RawQuery)
-
+	
 	if err != nil {
 		app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
 		return
@@ -160,14 +165,57 @@ func (app *App) HandleGetConfigMap(w http.ResponseWriter, r *http.Request) {
 		agent, err = kubernetes.GetAgentOutOfClusterConfig(form.OutOfClusterConfig)
 	}
 
-	cmForm := &forms.ConfigMapForm{}
+	configMaps, err := agent.ListConfigMaps(vals["namespace"][0])
+
+	if err != nil {
+		app.handleErrorInternal(err, w)
+		return
+	}
 
-	if err := json.NewDecoder(r.Body).Decode(cmForm); err != nil {
+	if err := json.NewEncoder(w).Encode(configMaps); err != nil {
 		app.handleErrorFormDecoding(err, ErrEnvDecode, w)
 		return
 	}
 
-	configMap, err := agent.GetConfigMap(cmForm.Name, cmForm.Namespace)
+	w.WriteHeader(http.StatusOK)
+	return
+}
+
+// HandleGetConfigMap retreives the configmap given the name and namespace.
+func (app *App) HandleGetConfigMap(w http.ResponseWriter, r *http.Request) {
+	vals, err := url.ParseQuery(r.URL.RawQuery)
+	
+	if err != nil {
+		app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
+		return
+	}
+
+	// get the filter options
+	form := &forms.K8sForm{
+		OutOfClusterConfig: &kubernetes.OutOfClusterConfig{
+			Repo:              app.Repo,
+			DigitalOceanOAuth: app.DOConf,
+		},
+	}
+
+	form.PopulateK8sOptionsFromQueryParams(vals, app.Repo.Cluster)
+
+	// validate the form
+	if err := app.validator.Struct(form); err != nil {
+		app.handleErrorFormValidation(err, ErrK8sValidate, w)
+		return
+	}
+
+	// create a new agent
+	var agent *kubernetes.Agent
+
+	if app.ServerConf.IsTesting {
+		agent = app.TestAgents.K8sAgent
+	} else {
+		agent, err = kubernetes.GetAgentOutOfClusterConfig(form.OutOfClusterConfig)
+	}
+
+	configMap, err := agent.GetConfigMap(vals["name"][0], vals["namespace"][0])
 
 	if err != nil {
 		app.handleErrorInternal(err, w)
@@ -186,7 +234,6 @@ func (app *App) HandleGetConfigMap(w http.ResponseWriter, r *http.Request) {
 // HandleDeleteConfigMap deletes the pod given the name and namespace.
 func (app *App) HandleDeleteConfigMap(w http.ResponseWriter, r *http.Request) {
 	vals, err := url.ParseQuery(r.URL.RawQuery)
-
 	if err != nil {
 		app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
 		return
@@ -217,14 +264,7 @@ func (app *App) HandleDeleteConfigMap(w http.ResponseWriter, r *http.Request) {
 		agent, err = kubernetes.GetAgentOutOfClusterConfig(form.OutOfClusterConfig)
 	}
 
-	configMap := &forms.ConfigMapForm{}
-
-	if err := json.NewDecoder(r.Body).Decode(configMap); err != nil {
-		app.handleErrorFormDecoding(err, ErrEnvDecode, w)
-		return
-	}
-
-	err = agent.DeleteConfigMap(configMap.Name, configMap.Namespace)
+	err = agent.DeleteConfigMap(vals["name"][0], vals["namespace"][0])
 
 	if err != nil {
 		app.handleErrorInternal(err, w)
@@ -283,6 +323,11 @@ func (app *App) HandleUpdateConfigMap(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
+	if err := json.NewEncoder(w).Encode(configMap); err != nil {
+		app.handleErrorFormDecoding(err, ErrEnvDecode, w)
+		return
+	}
+
 	w.WriteHeader(http.StatusOK)
 	return
 }

+ 15 - 1
server/router/router.go

@@ -1254,7 +1254,7 @@ func New(a *api.App) *chi.Mux {
 
 		r.Method(
 			"GET",
-			"/projects/{project_id}/k8s/configmap/get",
+			"/projects/{project_id}/k8s/configmap",
 			auth.DoesUserHaveProjectAccess(
 				auth.DoesUserHaveClusterAccess(
 					requestlog.NewHandler(a.HandleGetConfigMap, l),
@@ -1266,6 +1266,20 @@ func New(a *api.App) *chi.Mux {
 			),
 		)
 
+		r.Method(
+			"GET",
+			"/projects/{project_id}/k8s/configmap/list",
+			auth.DoesUserHaveProjectAccess(
+				auth.DoesUserHaveClusterAccess(
+					requestlog.NewHandler(a.HandleListConfigMaps, l),
+					mw.URLParam,
+					mw.QueryParam,
+				),
+				mw.URLParam,
+				mw.ReadAccess,
+			),
+		)
+
 		r.Method(
 			"POST",
 			"/projects/{project_id}/k8s/configmap/update",