Add client changes for filtering containers by labels

Signed-off-by: Mrunal Patel <mpatel@redhat.com>
This commit is contained in:
Mrunal Patel 2016-10-13 17:02:02 -07:00
parent d2cae34243
commit f12d94100c

View file

@ -3,6 +3,7 @@ package main
import ( import (
"fmt" "fmt"
"log" "log"
"strings"
"time" "time"
"github.com/urfave/cli" "github.com/urfave/cli"
@ -171,6 +172,19 @@ var containerStatusCommand = cli.Command{
}, },
} }
type listOptions struct {
// id of the container
id string
// podID of the container
podID string
// state of the container
state string
// quiet is for listing just container IDs
quiet bool
// labels are selectors for the container
labels map[string]string
}
var listContainersCommand = cli.Command{ var listContainersCommand = cli.Command{
Name: "list", Name: "list",
Usage: "list containers", Usage: "list containers",
@ -194,6 +208,10 @@ var listContainersCommand = cli.Command{
Value: "", Value: "",
Usage: "filter by container state", Usage: "filter by container state",
}, },
cli.StringSliceFlag{
Name: "label",
Usage: "filter by key=value label",
},
}, },
Action: func(context *cli.Context) error { Action: func(context *cli.Context) error {
// Set up a connection to the server. // Set up a connection to the server.
@ -203,8 +221,23 @@ var listContainersCommand = cli.Command{
} }
defer conn.Close() defer conn.Close()
client := pb.NewRuntimeServiceClient(conn) client := pb.NewRuntimeServiceClient(conn)
opts := listOptions{
id: context.String("id"),
podID: context.String("pod"),
state: context.String("state"),
quiet: context.Bool("quiet"),
labels: make(map[string]string),
}
err = ListContainers(client, context.Bool("quiet"), context.String("id"), context.String("pod"), context.String("state")) for _, l := range context.StringSlice("label") {
pair := strings.Split(l, "=")
if len(pair) != 2 {
return fmt.Errorf("incorrectly specified label: %v", l)
}
opts.labels[pair[0]] = pair[1]
}
err = ListContainers(client, opts)
if err != nil { if err != nil {
return fmt.Errorf("listing containers failed: %v", err) return fmt.Errorf("listing containers failed: %v", err)
} }
@ -320,17 +353,17 @@ func ContainerStatus(client pb.RuntimeServiceClient, ID string) error {
// ListContainers sends a ListContainerRequest to the server, and parses // ListContainers sends a ListContainerRequest to the server, and parses
// the returned ListContainerResponse. // the returned ListContainerResponse.
func ListContainers(client pb.RuntimeServiceClient, quiet bool, id string, podID string, state string) error { func ListContainers(client pb.RuntimeServiceClient, opts listOptions) error {
filter := &pb.ContainerFilter{} filter := &pb.ContainerFilter{}
if id != "" { if opts.id != "" {
filter.Id = &id filter.Id = &opts.id
} }
if podID != "" { if opts.podID != "" {
filter.PodSandboxId = &podID filter.PodSandboxId = &opts.podID
} }
if state != "" { if opts.state != "" {
st := pb.ContainerState_UNKNOWN st := pb.ContainerState_UNKNOWN
switch state { switch opts.state {
case "created": case "created":
st = pb.ContainerState_CREATED st = pb.ContainerState_CREATED
filter.State = &st filter.State = &st
@ -344,6 +377,9 @@ func ListContainers(client pb.RuntimeServiceClient, quiet bool, id string, podID
log.Fatalf("--state should be one of created, running or stopped") log.Fatalf("--state should be one of created, running or stopped")
} }
} }
if opts.labels != nil {
filter.LabelSelector = opts.labels
}
r, err := client.ListContainers(context.Background(), &pb.ListContainersRequest{ r, err := client.ListContainers(context.Background(), &pb.ListContainersRequest{
Filter: filter, Filter: filter,
}) })
@ -351,7 +387,7 @@ func ListContainers(client pb.RuntimeServiceClient, quiet bool, id string, podID
return err return err
} }
for _, c := range r.GetContainers() { for _, c := range r.GetContainers() {
if quiet { if opts.quiet {
fmt.Println(*c.Id) fmt.Println(*c.Id)
continue continue
} }
@ -364,6 +400,18 @@ func ListContainers(client pb.RuntimeServiceClient, quiet bool, id string, podID
ctm := time.Unix(*c.CreatedAt, 0) ctm := time.Unix(*c.CreatedAt, 0)
fmt.Printf("Created: %v\n", ctm) fmt.Printf("Created: %v\n", ctm)
} }
if c.Labels != nil {
fmt.Println("Labels:")
for k, v := range c.Labels {
fmt.Printf("\t%s -> %s\n", k, v)
}
}
if c.Annotations != nil {
fmt.Println("Annotations:")
for k, v := range c.Annotations {
fmt.Printf("\t%s -> %s\n", k, v)
}
}
} }
return nil return nil
} }