add support for bulk deletion to ark schedule delete

refactor and move DeleteOptions struct and methods

unexport fields not used outside the package in DeleteOptions struct

refactor BindFlags() to work with name of command

fix constructor

Signed-off-by: Shubheksha Jalan <jshubheksha@gmail.com>
This commit is contained in:
Shubheksha Jalan
2018-10-05 19:45:18 +02:00
parent 889b220a5a
commit 66bcbc058c
5 changed files with 221 additions and 193 deletions
+82 -12
View File
@@ -19,29 +19,99 @@ package schedule
import (
"fmt"
"github.com/pkg/errors"
"github.com/spf13/cobra"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
kubeerrs "k8s.io/apimachinery/pkg/util/errors"
arkv1api "github.com/heptio/ark/pkg/apis/ark/v1"
"github.com/heptio/ark/pkg/client"
"github.com/heptio/ark/pkg/cmd"
"github.com/heptio/ark/pkg/cmd/cli"
)
// NewDeleteCommand creates and returns a new cobra command for deleting schedules.
func NewDeleteCommand(f client.Factory, use string) *cobra.Command {
o := cli.NewDeleteOptions("schedule")
c := &cobra.Command{
Use: fmt.Sprintf("%s NAME", use),
Short: "Delete a schedule",
Args: cobra.ExactArgs(1),
Use: fmt.Sprintf("%s [NAMES]", use),
Short: "Delete schedules",
Example: ` # delete a schedule named "schedule-1"
ark schedule delete schedule-1
# delete a schedule named "schedule-1" without prompting for confirmation
ark schedule delete schedule-1 --confirm
# delete schedules named "schedule-1" and "schedule-2"
ark schedule delete schedule-1 schedule-2
# delete all schedules labelled with foo=bar"
ark schedule delete --selector foo=bar
# delete all schedules
ark schedule delete --all`,
Run: func(c *cobra.Command, args []string) {
arkClient, err := f.Client()
cmd.CheckError(err)
name := args[0]
err = arkClient.ArkV1().Schedules(f.Namespace()).Delete(name, nil)
cmd.CheckError(err)
fmt.Printf("Schedule %q deleted\n", name)
cmd.CheckError(o.Complete(f, args))
cmd.CheckError(o.Validate(c, f, args))
cmd.CheckError(Run(o))
},
}
o.BindFlags(c.Flags())
return c
}
// Run performs the deletion of schedules.
func Run(o *cli.DeleteOptions) error {
if !o.Confirm && !cli.GetConfirmation() {
return nil
}
var (
schedules []*arkv1api.Schedule
errs []error
)
switch {
case len(o.Names) > 0:
for _, name := range o.Names {
schedule, err := o.Client.ArkV1().Schedules(o.Namespace).Get(name, metav1.GetOptions{})
if err != nil {
errs = append(errs, errors.WithStack(err))
continue
}
schedules = append(schedules, schedule)
}
default:
selector := labels.Everything().String()
if o.Selector.LabelSelector != nil {
selector = o.Selector.String()
}
res, err := o.Client.ArkV1().Schedules(o.Namespace).List(metav1.ListOptions{
LabelSelector: selector,
})
if err != nil {
errs = append(errs, errors.WithStack(err))
}
for i := range res.Items {
schedules = append(schedules, &res.Items[i])
}
}
if len(schedules) == 0 {
fmt.Println("No schedules found")
return nil
}
for _, s := range schedules {
err := o.Client.ArkV1().Schedules(s.Namespace).Delete(s.Name, nil)
if err != nil {
errs = append(errs, errors.WithStack(err))
continue
}
fmt.Printf("Schedule deleted: %v/n", s.Name)
}
return kubeerrs.NewAggregate(errs)
}