Add leases subcommand in ctr
Signed-off-by: Derek McGowan <derek@mcgstyle.net>
This commit is contained in:
		
							
								
								
									
										190
									
								
								cmd/ctr/commands/leases/leases.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								cmd/ctr/commands/leases/leases.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,190 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The containerd 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 leases
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"text/tabwriter"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/containerd/containerd/cmd/ctr/commands"
 | 
			
		||||
	"github.com/containerd/containerd/leases"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	"github.com/urfave/cli"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Command is the cli command for managing content
 | 
			
		||||
var Command = cli.Command{
 | 
			
		||||
	Name:  "leases",
 | 
			
		||||
	Usage: "manage leases",
 | 
			
		||||
	Subcommands: cli.Commands{
 | 
			
		||||
		listCommand,
 | 
			
		||||
		createCommand,
 | 
			
		||||
		deleteCommand,
 | 
			
		||||
	},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var listCommand = cli.Command{
 | 
			
		||||
 | 
			
		||||
	Name:        "list",
 | 
			
		||||
	Aliases:     []string{"ls"},
 | 
			
		||||
	Usage:       "list all active leases",
 | 
			
		||||
	ArgsUsage:   "[flags] <filter>",
 | 
			
		||||
	Description: "list active leases by containerd",
 | 
			
		||||
	Flags: []cli.Flag{
 | 
			
		||||
		cli.BoolFlag{
 | 
			
		||||
			Name:  "quiet, q",
 | 
			
		||||
			Usage: "print only the blob digest",
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	Action: func(context *cli.Context) error {
 | 
			
		||||
		var (
 | 
			
		||||
			filters = context.Args()
 | 
			
		||||
			quiet   = context.Bool("quiet")
 | 
			
		||||
		)
 | 
			
		||||
		client, ctx, cancel, err := commands.NewClient(context)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		defer cancel()
 | 
			
		||||
 | 
			
		||||
		ls := client.LeasesService()
 | 
			
		||||
 | 
			
		||||
		leaseList, err := ls.List(ctx, filters...)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return errors.Wrap(err, "failed to list leases")
 | 
			
		||||
		}
 | 
			
		||||
		if quiet {
 | 
			
		||||
			for _, l := range leaseList {
 | 
			
		||||
				fmt.Println(l.ID)
 | 
			
		||||
			}
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		tw := tabwriter.NewWriter(os.Stdout, 1, 8, 1, ' ', 0)
 | 
			
		||||
		fmt.Fprintln(tw, "ID\tCREATED AT\tLABELS\t")
 | 
			
		||||
		for _, l := range leaseList {
 | 
			
		||||
			labels := "-"
 | 
			
		||||
			if len(l.Labels) > 0 {
 | 
			
		||||
				var pairs []string
 | 
			
		||||
				for k, v := range l.Labels {
 | 
			
		||||
					pairs = append(pairs, fmt.Sprintf("%v=%v", k, v))
 | 
			
		||||
				}
 | 
			
		||||
				sort.Strings(pairs)
 | 
			
		||||
				labels = strings.Join(pairs, ",")
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			fmt.Fprintf(tw, "%v\t%v\t%s\t\n",
 | 
			
		||||
				l.ID,
 | 
			
		||||
				l.CreatedAt.Local().Format(time.RFC3339),
 | 
			
		||||
				labels)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return tw.Flush()
 | 
			
		||||
	},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var createCommand = cli.Command{
 | 
			
		||||
	Name:        "create",
 | 
			
		||||
	Usage:       "create lease",
 | 
			
		||||
	ArgsUsage:   "[flags] <label>=<value> ...",
 | 
			
		||||
	Description: "create a new lease",
 | 
			
		||||
	Flags: []cli.Flag{
 | 
			
		||||
		cli.StringFlag{
 | 
			
		||||
			Name:  "id",
 | 
			
		||||
			Usage: "set the id for the lease, will be generated by default",
 | 
			
		||||
		},
 | 
			
		||||
		cli.DurationFlag{
 | 
			
		||||
			Name:  "expires, x",
 | 
			
		||||
			Usage: "expiration of lease (0 value will not expire)",
 | 
			
		||||
			Value: 24 * 3600 * time.Second,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	Action: func(context *cli.Context) error {
 | 
			
		||||
		var labelstr = context.Args()
 | 
			
		||||
		client, ctx, cancel, err := commands.NewClient(context)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		defer cancel()
 | 
			
		||||
 | 
			
		||||
		ls := client.LeasesService()
 | 
			
		||||
		opts := []leases.Opt{}
 | 
			
		||||
		if len(labelstr) > 0 {
 | 
			
		||||
			labels := map[string]string{}
 | 
			
		||||
			for _, lstr := range labelstr {
 | 
			
		||||
				l := strings.SplitN(lstr, "=", 2)
 | 
			
		||||
				if len(l) == 1 {
 | 
			
		||||
					labels[l[0]] = ""
 | 
			
		||||
				} else {
 | 
			
		||||
					labels[l[0]] = l[1]
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			opts = append(opts, leases.WithLabels(labels))
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if id := context.String("id"); id != "" {
 | 
			
		||||
			opts = append(opts, leases.WithID(id))
 | 
			
		||||
		}
 | 
			
		||||
		if exp := context.Duration("expires"); exp > 0 {
 | 
			
		||||
			opts = append(opts, leases.WithExpiration(exp))
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		l, err := ls.Create(ctx, opts...)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		fmt.Println(l.ID)
 | 
			
		||||
 | 
			
		||||
		return nil
 | 
			
		||||
	},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var deleteCommand = cli.Command{
 | 
			
		||||
	Name:        "delete",
 | 
			
		||||
	Aliases:     []string{"rm"},
 | 
			
		||||
	Usage:       "delete a lease",
 | 
			
		||||
	ArgsUsage:   "[flags] <lease id> ...",
 | 
			
		||||
	Description: "delete a lease",
 | 
			
		||||
	Action: func(context *cli.Context) error {
 | 
			
		||||
		var lids = context.Args()
 | 
			
		||||
		if len(lids) == 0 {
 | 
			
		||||
			return cli.ShowSubcommandHelp(context)
 | 
			
		||||
		}
 | 
			
		||||
		client, ctx, cancel, err := commands.NewClient(context)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		defer cancel()
 | 
			
		||||
 | 
			
		||||
		ls := client.LeasesService()
 | 
			
		||||
		for _, lid := range lids {
 | 
			
		||||
			lease := leases.Lease{
 | 
			
		||||
				ID: lid,
 | 
			
		||||
			}
 | 
			
		||||
			if err := ls.Delete(ctx, lease); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			fmt.Println(lid)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return nil
 | 
			
		||||
	},
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user