From dc417f53d2d0a022bfc3f854dea9d46cb0a93a3d Mon Sep 17 00:00:00 2001 From: boris Date: Thu, 3 Sep 2020 14:52:09 +0800 Subject: [PATCH] add remove cap center cli and api (#237) * add remove cap center cli * add delete cap center api * doc: capability center delete api * test: capability center delete e2e --- .../api/vela-restful-api-reference.md | 9 +++++ e2e/capability/capability_test.go | 8 +++++ pkg/cmd/capability.go | 29 ++++++++++++++++ pkg/oam/capability.go | 33 +++++++++++++++++++ pkg/server/handler/capabilityHandlers.go | 6 ++++ pkg/server/route.go | 1 + 6 files changed, 86 insertions(+) diff --git a/documentation/api/vela-restful-api-reference.md b/documentation/api/vela-restful-api-reference.md index 5b998d69a..1a867d1ac 100644 --- a/documentation/api/vela-restful-api-reference.md +++ b/documentation/api/vela-restful-api-reference.md @@ -478,6 +478,15 @@ sample request ```json {"Name":"c1","Address":"https://github.com/wonderflow/catalog/tree/repos/repos"} ``` +### DELETE /capability-centers/:capabilityCenterName/ (Capability Center delete) +- example +sample response +```json +{ +"code": 200, +"data": "mycenter capability center removed successfully" +} +``` ### PUT /capability-centers/:capabilityCenterName/capabilities/ (Capability Center sync) diff --git a/e2e/capability/capability_test.go b/e2e/capability/capability_test.go index 0974f09b4..94faef75e 100644 --- a/e2e/capability/capability_test.go +++ b/e2e/capability/capability_test.go @@ -65,5 +65,13 @@ var _ = ginkgo.Describe("Capability", func() { gomega.Expect(output).To(gomega.ContainSubstring(capabilityBasic.Name)) gomega.Expect(output).To(gomega.ContainSubstring("installed")) }) + + ginkgo.It("delete a capability center", func() { + cli := fmt.Sprintf("vela cap center remove %s", capabilityCenterBasic.Name) + output, err := e2e.Exec(cli) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + expectedOutput := fmt.Sprintf("%s capability center removed successfully", capabilityCenterBasic.Name) + gomega.Expect(output).To(gomega.ContainSubstring(expectedOutput)) + }) }) }) diff --git a/pkg/cmd/capability.go b/pkg/cmd/capability.go index 10080c7d1..208ca3a4d 100644 --- a/pkg/cmd/capability.go +++ b/pkg/cmd/capability.go @@ -47,6 +47,7 @@ func NewCenterCommand(c types.Args, ioStream cmdutil.IOStreams) *cobra.Command { NewCapCenterConfigCommand(ioStream), NewCapCenterSyncCommand(ioStream), NewCapCenterListCommand(ioStream), + NewCapCenterRemoveCommand(ioStream), ) return cmd } @@ -215,6 +216,22 @@ func NewCapCenterListCommand(ioStreams cmdutil.IOStreams) *cobra.Command { return cmd } +func NewCapCenterRemoveCommand(ioStreams cmdutil.IOStreams) *cobra.Command { + cmd := &cobra.Command{ + Use: "remove ", + Short: "Remove specified capability center", + Long: "Remove specified capability center", + Example: "vela cap center remove mycenter", + RunE: func(cmd *cobra.Command, args []string) error { + return RemoveCapCenter(args, ioStreams) + }, + Annotations: map[string]string{ + types.TagCommandType: types.TypeOthers, + }, + } + return cmd +} + func ListCapCenters(args []string, ioStreams cmdutil.IOStreams) error { table := uitable.New() table.AddRow("NAME", "ADDRESS") @@ -228,3 +245,15 @@ func ListCapCenters(args []string, ioStreams cmdutil.IOStreams) error { ioStreams.Info(table.String()) return nil } + +func RemoveCapCenter(args []string, ioStreams cmdutil.IOStreams) error { + if len(args) < 1 { + return errors.New("you must specify for capability center you want to remove") + } + centerName := args[0] + msg, err := oam.RemoveCapabilityCenter(centerName) + if err == nil { + ioStreams.Info(msg) + } + return err +} diff --git a/pkg/oam/capability.go b/pkg/oam/capability.go index ef6679894..b828d53ef 100644 --- a/pkg/oam/capability.go +++ b/pkg/oam/capability.go @@ -314,6 +314,39 @@ func ListCenterCapabilities(repoDir string) ([]types.Capability, error) { return templates, nil } +func RemoveCapabilityCenter(centerName string) (string, error) { + var message string + var err error + dir, _ := system.GetCapCenterDir() + repoDir := filepath.Join(dir, centerName) + // 1.remove capability center dir + if _, err := os.Stat(repoDir); err != nil { + if os.IsNotExist(err) { + err = fmt.Errorf("%s capability center has not successfully synced", centerName) + return message, err + } + } + if err = os.RemoveAll(repoDir); err != nil { + return message, err + } + // 2.remove center from capability center config + repos, err := plugins.LoadRepos() + if err != nil { + return message, err + } + for idx, r := range repos { + if r.Name == centerName { + repos = append(repos[:idx], repos[idx+1:]...) + break + } + } + if err = plugins.StoreRepos(repos); err != nil { + return message, err + } + message = fmt.Sprintf("%s capability center removed successfully", centerName) + return message, err +} + func GatherWorkloads(templates []types.Capability) []types.Capability { workloads, err := plugins.LoadInstalledCapabilityWithType(types.TypeWorkload) if err != nil { diff --git a/pkg/server/handler/capabilityHandlers.go b/pkg/server/handler/capabilityHandlers.go index 0c0761653..2a8d38413 100644 --- a/pkg/server/handler/capabilityHandlers.go +++ b/pkg/server/handler/capabilityHandlers.go @@ -54,6 +54,12 @@ func AddCapabilityIntoCluster(c *gin.Context) { util.AssembleResponse(c, msg, nil) } +func DeleteCapabilityCenter(c *gin.Context) { + capabilityCenterName := c.Param("capabilityCenterName") + msg, err := oam.RemoveCapabilityCenter(capabilityCenterName) + util.AssembleResponse(c, msg, err) +} + func RemoveCapabilityFromCluster(c *gin.Context) { capabilityCenterName := c.Param("capabilityName") kubeClient := c.MustGet("KubeClient") diff --git a/pkg/server/route.go b/pkg/server/route.go index ad6dc9adb..92daaa156 100644 --- a/pkg/server/route.go +++ b/pkg/server/route.go @@ -93,6 +93,7 @@ func setupRoute(kubeClient client.Client) http.Handler { { capCenters.PUT("/", handler.AddCapabilityCenter) capCenters.GET("/", handler.ListCapabilityCenters) + capCenters.DELETE("/:capabilityCenterName", handler.DeleteCapabilityCenter) caps := capCenters.Group("/:capabilityCenterName" + util.CapabilityPath) {