From adc0fae3df898a34ba0081b504a22f5112dbebe3 Mon Sep 17 00:00:00 2001 From: Dan Ramich Date: Thu, 15 Feb 2018 10:49:01 -0700 Subject: [PATCH] Add delete methods to cluster and project --- cmd/cluster.go | 70 +++++++++++++++++++++++++++++------------ cmd/project.go | 82 ++++++++++++++++++++++++++++++++++++++++++------ config/config.go | 4 +++ 3 files changed, 127 insertions(+), 29 deletions(-) diff --git a/cmd/cluster.go b/cmd/cluster.go index 566f1600..27499ebd 100644 --- a/cmd/cluster.go +++ b/cmd/cluster.go @@ -6,7 +6,6 @@ import ( "github.com/rancher/cli/cliclient" managementClient "github.com/rancher/types/client/management/v3" - "github.com/sirupsen/logrus" "github.com/urfave/cli" ) @@ -47,14 +46,14 @@ func ClusterCommand() cli.Command { Name: "import", Usage: "Import an existing Kubernetes cluster into a Rancher cluster", Description: importDescription, - ArgsUsage: "[NEWCLUSTERNAME...]", + ArgsUsage: "[CLUSTERID]", Action: clusterImport, }, { Name: "add-node", Usage: "Returns the command needed to add a node to an existing Rancher cluster", - ArgsUsage: "[CLUSTERNAME]", - Action: getDockerCommand, + ArgsUsage: "[CLUSTERID]", + Action: clusterAddNode, Flags: []cli.Flag{ cli.StringSliceFlag{ Name: "label", @@ -74,6 +73,13 @@ func ClusterCommand() cli.Command { }, }, }, + { + Name: "delete", + Aliases: []string{"rm"}, + Usage: "Delete a cluster", + ArgsUsage: "[CLUSTERID]", + Action: deleteCluster, + }, }, } } @@ -93,6 +99,7 @@ func clusterLs(ctx *cli.Context) error { {"ID", "Cluster.ID"}, {"NAME", "Cluster.Name"}, {"STATE", "Cluster.State"}, + {"DESCRIPTION", "Cluster.Description"}, }, ctx) defer writer.Close() @@ -137,7 +144,7 @@ func clusterImport(ctx *cli.Context) error { return err } - cluster, err := getClusterByName(ctx, c, ctx.Args().First()) + cluster, err := getClusterByID(ctx, c, ctx.Args().First()) if nil != err { return err } @@ -147,13 +154,13 @@ func clusterImport(ctx *cli.Context) error { return err } - //FIXME probably need more info here - logrus.Printf("Run the following command in your cluster: %v", clusterToken.Command) + fmt.Printf("Run the following command in your cluster: %v", clusterToken.Command) + return nil } -// getDockerCommand prints the command needed to add a node to a cluster -func getDockerCommand(ctx *cli.Context) error { +// clusterAddNode prints the command needed to add a node to a cluster +func clusterAddNode(ctx *cli.Context) error { var clusterName string if ctx.NArg() == 0 { @@ -167,7 +174,7 @@ func getDockerCommand(ctx *cli.Context) error { return err } - cluster, err := getClusterByName(ctx, c, clusterName) + cluster, err := getClusterByID(ctx, c, clusterName) if nil != err { return err } @@ -205,6 +212,29 @@ func getDockerCommand(ctx *cli.Context) error { return nil } +func deleteCluster(ctx *cli.Context) error { + if ctx.NArg() == 0 { + return errors.New(clusterNameError) + } + + c, err := GetClient(ctx) + if nil != err { + return err + } + + cluster, err := getClusterByID(ctx, c, ctx.Args().First()) + if nil != err { + return err + } + + err = c.ManagementClient.Cluster.Delete(&cluster) + if nil != err { + return err + } + + return nil +} + // getClusterRegToken will return an existing token or create one if none exist func getClusterRegToken( ctx *cli.Context, @@ -232,22 +262,22 @@ func getClusterRegToken( return clusterTokenCollection.Data[0], nil } -func getClusterByName( +func getClusterByID( ctx *cli.Context, c *cliclient.MasterClient, - clusterName string, + clusterID string, ) (managementClient.Cluster, error) { - opts := defaultListOpts(ctx) - opts.Filters["name"] = clusterName - - clusterCollection, err := c.ManagementClient.Cluster.List(opts) + clusterCollection, err := c.ManagementClient.Cluster.List(defaultListOpts(ctx)) if nil != err { return managementClient.Cluster{}, err } - if len(clusterCollection.Data) == 0 { - return managementClient.Cluster{}, fmt.Errorf("no cluster found with the name [%s], run "+ - "`rancher clusters` to see available clusters", clusterName) + for _, cluster := range clusterCollection.Data { + if cluster.ID == clusterID { + return cluster, nil + } } - return clusterCollection.Data[0], nil + + return managementClient.Cluster{}, fmt.Errorf("no cluster found with the ID [%s], run "+ + "`rancher clusters` to see available clusters", clusterID) } diff --git a/cmd/project.go b/cmd/project.go index 44efd6c8..c2dd6c73 100644 --- a/cmd/project.go +++ b/cmd/project.go @@ -2,8 +2,10 @@ package cmd import ( "errors" + "fmt" "strings" + "github.com/rancher/cli/cliclient" managementClient "github.com/rancher/types/client/management/v3" "github.com/urfave/cli" ) @@ -33,12 +35,24 @@ func ProjectCommand() cli.Command { ArgsUsage: "[NEWPROJECTNAME...]", Action: projectCreate, }, + { + Name: "delete", + Aliases: []string{"rm"}, + Usage: "Delete a project by ID", + ArgsUsage: "[PROJECTID]", + Action: deleteProject, + }, }, } } func projectLs(ctx *cli.Context) error { - collection, err := getProjectList(ctx) + c, err := GetClient(ctx) + if err != nil { + return err + } + + collection, err := getProjectList(ctx, c) if err != nil { return err } @@ -47,6 +61,7 @@ func projectLs(ctx *cli.Context) error { {"ID", "Project.ID"}, {"NAME", "Project.Name"}, {"STATE", "Project.State"}, + {"DESCRIPTION", "Project.Description"}, }, ctx) defer writer.Close() @@ -61,22 +76,22 @@ func projectLs(ctx *cli.Context) error { } func projectCreate(ctx *cli.Context) error { + if ctx.NArg() == 0 { + return errors.New("project name is required") + } + config, err := lookupConfig(ctx) if nil != err { return err } + c, err := GetClient(ctx) if err != nil { return err } - if ctx.NArg() == 0 { - return errors.New("name is required") - } - - name := ctx.Args().First() newProj := &managementClient.Project{ - Name: name, + Name: ctx.Args().First(), ClusterId: strings.Split(config.Project, ":")[0], } @@ -84,15 +99,64 @@ func projectCreate(ctx *cli.Context) error { return nil } -func getProjectList(ctx *cli.Context) (*managementClient.ProjectCollection, error) { +func deleteProject(ctx *cli.Context) error { + if ctx.NArg() == 0 { + return errors.New("project name is required") + } + c, err := GetClient(ctx) + if err != nil { + return err + } + + project, err := getProjectByID(ctx, c, ctx.Args().First()) + if nil != err { + return err + } + + err = c.ManagementClient.Project.Delete(&project) + if nil != err { + return err + } + + return nil +} + +func getProjectList( + ctx *cli.Context, + c *cliclient.MasterClient, +) (*managementClient.ProjectCollection, error) { + config, err := lookupConfig(ctx) if err != nil { return nil, err } - collection, err := c.ManagementClient.Project.List(defaultListOpts(ctx)) + filter := defaultListOpts(ctx) + filter.Filters["clusterId"] = config.FocusedCluster() + + collection, err := c.ManagementClient.Project.List(filter) if err != nil { return nil, err } return collection, nil } + +func getProjectByID( + ctx *cli.Context, + c *cliclient.MasterClient, + projectID string, +) (managementClient.Project, error) { + projectCollection, err := getProjectList(ctx, c) + if nil != err { + return managementClient.Project{}, err + } + + for _, project := range projectCollection.Data { + if project.ID == projectID { + return project, nil + } + } + + return managementClient.Project{}, fmt.Errorf("no project found with the ID [%s], run "+ + "`rancher projects` to see available projects", projectID) +} diff --git a/config/config.go b/config/config.go index c90558ca..4685c074 100644 --- a/config/config.go +++ b/config/config.go @@ -51,6 +51,10 @@ func (c Config) FocusedServer() *ServerConfig { return c.Servers[c.CurrentServer] } +func (c ServerConfig) FocusedCluster() string { + return strings.Split(c.Project, ":")[0] +} + func (c ServerConfig) EnvironmentURL() (string, error) { url, err := baseURL(c.URL) if err != nil {