From 6242adf5e0b91884a767465878977ecab2f8b4a4 Mon Sep 17 00:00:00 2001 From: Shivam Purohit Date: Fri, 12 Apr 2024 10:25:36 +0530 Subject: [PATCH 1/2] delete probe command Signed-off-by: Shivam Purohit --- pkg/apis/probe/probe.go | 46 ++++++++++++++ pkg/apis/probe/types.go | 19 ++++++ pkg/cmd/delete/delete.go | 3 + pkg/cmd/delete/probe.go | 129 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 197 insertions(+) create mode 100644 pkg/cmd/delete/probe.go diff --git a/pkg/apis/probe/probe.go b/pkg/apis/probe/probe.go index eb9969ce..c87a3a3e 100644 --- a/pkg/apis/probe/probe.go +++ b/pkg/apis/probe/probe.go @@ -105,3 +105,49 @@ func ListProbeRequest(pid string, probetypes []*models.ProbeType, cred types.Cre return ListProbeResponse{}, errors.New("Unmatched status code:" + string(bodyBytes)) } } + +func DeleteProbeRequest(pid string, probeid string, cred types.Credentials) (DeleteProbeResponse, error) { + var gqlReq DeleteProbeGQLRequest + gqlReq.Query = DeleteProbeQuery + gqlReq.Variables.ProjectID = pid + gqlReq.Variables.ProbeName = probeid + + query, err := json.Marshal(gqlReq) + if err != nil { + return DeleteProbeResponse{}, errors.New("Error in deleting probe" + err.Error()) + } + resp, err := apis.SendRequest( + apis.SendRequestParams{ + Endpoint: cred.ServerEndpoint + utils.GQLAPIPath, + Token: cred.Token, + }, + query, + string(types.Post), + ) + + if err != nil { + return DeleteProbeResponse{}, errors.New("Error in deleting probe" + err.Error()) + } + + bodyBytes, err := io.ReadAll(resp.Body) + defer resp.Body.Close() + if err != nil { + return DeleteProbeResponse{}, errors.New("Error in deleting probe" + err.Error()) + } + + if resp.StatusCode == http.StatusOK { + var deleteProbeResponse DeleteProbeResponse + err = json.Unmarshal(bodyBytes, &deleteProbeResponse) + if err != nil { + return DeleteProbeResponse{}, errors.New("Error in deleting probe" + err.Error()) + } + if len(deleteProbeResponse.Errors) > 0 { + return DeleteProbeResponse{}, errors.New(deleteProbeResponse.Errors[0].Message) + } + return deleteProbeResponse, nil + + } else { + return DeleteProbeResponse{}, errors.New("Unmatched status code:" + string(bodyBytes)) + } + +} diff --git a/pkg/apis/probe/types.go b/pkg/apis/probe/types.go index 13320d0e..99219122 100644 --- a/pkg/apis/probe/types.go +++ b/pkg/apis/probe/types.go @@ -41,3 +41,22 @@ type ListProbeResponse struct { type ListProbeResponseData struct { Probes []model.Probe `json:"listProbes"` } +type DeleteProbeGQLRequest struct { + Query string `json:"query"` + Variables struct { + ProbeName string `json:"probeName"` + ProjectID string `json:"projectID"` + } `json:"variables"` +} + +type DeleteProbeResponse struct { + Errors []struct { + Message string `json:"message"` + Path []string `json:"path"` + } `json:"errors"` + Data DeleteProbeResponseData `json:"data"` +} + +type DeleteProbeResponseData struct { + DeleteProbe bool `json:"deleteProbe"` +} diff --git a/pkg/cmd/delete/delete.go b/pkg/cmd/delete/delete.go index 2c73894d..a7b4d2c0 100644 --- a/pkg/cmd/delete/delete.go +++ b/pkg/cmd/delete/delete.go @@ -30,6 +30,9 @@ var DeleteCmd = &cobra.Command{ #delete a Chaos Environment litmusctl delete chaos-environment --project-id=8adf62d5-64f8-4c66-ab53-63729db9dd9a --environment-id=environmentexample + #delete a Probe + litmusctl delete probe --project-id=8adf62d5-64f8-4c66-ab53-63729db9dd9a --probe-id=exampleprobe + Note: The default location of the config file is $HOME/.litmusconfig, and can be overridden by a --config flag `, } diff --git a/pkg/cmd/delete/probe.go b/pkg/cmd/delete/probe.go new file mode 100644 index 00000000..cdc98988 --- /dev/null +++ b/pkg/cmd/delete/probe.go @@ -0,0 +1,129 @@ +/* +Copyright © 2021 The LitmusChaos Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package delete + +import ( + "github.com/litmuschaos/litmusctl/pkg/apis" + "github.com/litmuschaos/litmusctl/pkg/apis/probe" + "github.com/litmuschaos/litmusctl/pkg/utils" + "os" + + "github.com/manifoldco/promptui" + "github.com/spf13/cobra" +) + +var probeCmd = &cobra.Command{ + Use: "probe", + Short: `Delete a Probe + Example: + #delete a Probe + litmusctl delete probe --project-id=c520650e-7cb6-474c-b0f0-4df07b2b025b --probe-id="example" + Note: The default location of the config file is $HOME/.litmusconfig, and can be overridden by a --config flag + `, + + Run: func(cmd *cobra.Command, args []string) { + + // Fetch user credentials + credentials, err := utils.GetCredentials(cmd) + utils.PrintError(err) + + projectID, err := cmd.Flags().GetString("project-id") + utils.PrintError(err) + + // Handle blank input for project ID + + if projectID == "" { + prompt := promptui.Prompt{ + Label: "Enter the Project ID", + } + result, err := prompt.Run() + if err != nil { + utils.Red.Println("⛔ Error:", err) + os.Exit(1) + } + projectID = result + } + probeID, err := cmd.Flags().GetString("probe-id") + // Handle blank input for Probe ID + if probeID == "" { + prompt := promptui.Prompt{ + Label: "Enter the Probe ID", + } + IDinput, err := prompt.Run() + if err != nil { + utils.Red.Println("⛔ Error:", err) + os.Exit(1) + } + probeID = IDinput + } + + // Perform authorization + userDetails, err := apis.GetProjectDetails(credentials) + utils.PrintError(err) + var editAccess = false + var project apis.Project + for _, p := range userDetails.Data.Projects { + if p.ID == projectID { + project = p + } + } + for _, member := range project.Members { + if (member.UserID == userDetails.Data.ID) && (member.Role == "Owner" || member.Role == "Editor") { + editAccess = true + } + } + if !editAccess { + utils.Red.Println("⛔ User doesn't have edit access to the project!!") + os.Exit(1) + } + + // confirm before deletion + + prompt := promptui.Prompt{ + Label: "Are you sure you want to delete this Probe? (y/n)", + AllowEdit: true, + } + result, err := prompt.Run() + if err != nil { + utils.Red.Println("⛔ Error:", err) + os.Exit(1) + } + + if result != "y" { + utils.White_B.Println("\n❌ Probe was not deleted.") + os.Exit(0) + } + + // Make API call + deleteProbe, err := probe.DeleteProbeRequest(projectID, probeID, credentials) + if err != nil { + utils.Red.Println("\n❌ Error in deleting Probe: ", err.Error()) + os.Exit(1) + } + + if deleteProbe.Data.DeleteProbe { + utils.White_B.Println("\n🚀 Probe was successfully deleted.") + } else { + utils.White_B.Println("\n❌ Failed to delete Probe. Please check if the ID is correct or not.") + } + }, +} + +func init() { + DeleteCmd.AddCommand(probeCmd) + + probeCmd.Flags().String("project-id", "", "Set the project-id to delete Probe for the particular project. To see the projects, apply litmusctl get projects") + probeCmd.Flags().String("probe-id", "", "Set the probe-id to delete that particular probe. To see the probes, apply litmusctl get probes") +} From 7864be1fdec5b014524a3f94854df3c27d69cdb2 Mon Sep 17 00:00:00 2001 From: Shivam Purohit Date: Tue, 16 Apr 2024 18:30:47 +0530 Subject: [PATCH 2/2] delete probe: add warning Signed-off-by: Shivam Purohit --- pkg/cmd/delete/probe.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/cmd/delete/probe.go b/pkg/cmd/delete/probe.go index cdc98988..89a350c3 100644 --- a/pkg/cmd/delete/probe.go +++ b/pkg/cmd/delete/probe.go @@ -8,7 +8,7 @@ You may obtain a copy of the License at Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.W See the License for the specific language governing permissions and limitations under the License. */ @@ -92,7 +92,7 @@ var probeCmd = &cobra.Command{ // confirm before deletion prompt := promptui.Prompt{ - Label: "Are you sure you want to delete this Probe? (y/n)", + Label: "Are you sure you want to delete this probe and all the associations with experiment runs from the chaos control plane (y/n)", AllowEdit: true, } result, err := prompt.Run()