Add leases subcommand in ctr
Signed-off-by: Derek McGowan <derek@mcgstyle.net>
This commit is contained in:
parent
4c2ad9cefb
commit
00a99c0472
@ -24,6 +24,7 @@ import (
|
||||
"github.com/containerd/containerd/cmd/ctr/commands/content"
|
||||
"github.com/containerd/containerd/cmd/ctr/commands/events"
|
||||
"github.com/containerd/containerd/cmd/ctr/commands/images"
|
||||
"github.com/containerd/containerd/cmd/ctr/commands/leases"
|
||||
namespacesCmd "github.com/containerd/containerd/cmd/ctr/commands/namespaces"
|
||||
"github.com/containerd/containerd/cmd/ctr/commands/plugins"
|
||||
"github.com/containerd/containerd/cmd/ctr/commands/pprof"
|
||||
@ -96,6 +97,7 @@ containerd CLI
|
||||
content.Command,
|
||||
events.Command,
|
||||
images.Command,
|
||||
leases.Command,
|
||||
namespacesCmd.Command,
|
||||
pprof.Command,
|
||||
run.Command,
|
||||
|
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
|
||||
},
|
||||
}
|
Loading…
Reference in New Issue
Block a user