summaryrefslogtreecommitdiff
path: root/cmd/crioctl/image.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/crioctl/image.go')
-rw-r--r--cmd/crioctl/image.go173
1 files changed, 173 insertions, 0 deletions
diff --git a/cmd/crioctl/image.go b/cmd/crioctl/image.go
new file mode 100644
index 000000000..426c67e9d
--- /dev/null
+++ b/cmd/crioctl/image.go
@@ -0,0 +1,173 @@
+package main
+
+import (
+ "fmt"
+
+ "github.com/urfave/cli"
+ "golang.org/x/net/context"
+ pb "k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
+)
+
+var imageCommand = cli.Command{
+ Name: "image",
+ Subcommands: []cli.Command{
+ pullImageCommand,
+ listImageCommand,
+ imageStatusCommand,
+ removeImageCommand,
+ },
+}
+
+var pullImageCommand = cli.Command{
+ Name: "pull",
+ Usage: "pull an image",
+ Action: func(context *cli.Context) error {
+ // Set up a connection to the server.
+ conn, err := getClientConnection(context)
+ if err != nil {
+ return fmt.Errorf("failed to connect: %v", err)
+ }
+ defer conn.Close()
+ client := pb.NewImageServiceClient(conn)
+
+ _, err = PullImage(client, context.Args().Get(0))
+ if err != nil {
+ return fmt.Errorf("pulling image failed: %v", err)
+ }
+ return nil
+ },
+}
+
+var listImageCommand = cli.Command{
+ Name: "list",
+ Usage: "list images",
+ Flags: []cli.Flag{
+ cli.BoolFlag{
+ Name: "quiet",
+ Usage: "list only image IDs",
+ },
+ },
+ Action: func(context *cli.Context) error {
+ // Set up a connection to the server.
+ conn, err := getClientConnection(context)
+ if err != nil {
+ return fmt.Errorf("failed to connect: %v", err)
+ }
+ defer conn.Close()
+ client := pb.NewImageServiceClient(conn)
+
+ r, err := ListImages(client, context.Args().Get(0))
+ if err != nil {
+ return fmt.Errorf("listing images failed: %v", err)
+ }
+ quiet := context.Bool("quiet")
+ for _, image := range r.Images {
+ if quiet {
+ fmt.Printf("%s\n", image.Id)
+ continue
+ }
+ fmt.Printf("ID: %s\n", image.Id)
+ for _, tag := range image.RepoTags {
+ fmt.Printf("Tag: %s\n", tag)
+ }
+ for _, digest := range image.RepoDigests {
+ fmt.Printf("Digest: %s\n", digest)
+ }
+ if image.Size_ != 0 {
+ fmt.Printf("Size: %d\n", image.Size_)
+ }
+ }
+ return nil
+ },
+}
+
+var imageStatusCommand = cli.Command{
+ Name: "status",
+ Usage: "return the status of an image",
+ Flags: []cli.Flag{
+ cli.StringFlag{
+ Name: "id",
+ Usage: "id of the image",
+ },
+ },
+ Action: func(context *cli.Context) error {
+ // Set up a connection to the server.
+ conn, err := getClientConnection(context)
+ if err != nil {
+ return fmt.Errorf("failed to connect: %v", err)
+ }
+ defer conn.Close()
+ client := pb.NewImageServiceClient(conn)
+
+ r, err := ImageStatus(client, context.String("id"))
+ if err != nil {
+ return fmt.Errorf("image status request failed: %v", err)
+ }
+ image := r.Image
+ if image == nil {
+ return fmt.Errorf("no such image present")
+ }
+ fmt.Printf("ID: %s\n", image.Id)
+ for _, tag := range image.RepoTags {
+ fmt.Printf("Tag: %s\n", tag)
+ }
+ for _, digest := range image.RepoDigests {
+ fmt.Printf("Digest: %s\n", digest)
+ }
+ fmt.Printf("Size: %d\n", image.Size_)
+ return nil
+ },
+}
+var removeImageCommand = cli.Command{
+ Name: "remove",
+ Usage: "remove an image",
+ Flags: []cli.Flag{
+ cli.StringFlag{
+ Name: "id",
+ Value: "",
+ Usage: "id of the image",
+ },
+ },
+ Action: func(context *cli.Context) error {
+ // Set up a connection to the server.
+ conn, err := getClientConnection(context)
+ if err != nil {
+ return fmt.Errorf("failed to connect: %v", err)
+ }
+ defer conn.Close()
+ client := pb.NewImageServiceClient(conn)
+
+ _, err = RemoveImage(client, context.String("id"))
+ if err != nil {
+ return fmt.Errorf("removing the image failed: %v", err)
+ }
+ return nil
+ },
+}
+
+// PullImage sends a PullImageRequest to the server, and parses
+// the returned PullImageResponse.
+func PullImage(client pb.ImageServiceClient, image string) (*pb.PullImageResponse, error) {
+ return client.PullImage(context.Background(), &pb.PullImageRequest{Image: &pb.ImageSpec{Image: image}})
+}
+
+// ListImages sends a ListImagesRequest to the server, and parses
+// the returned ListImagesResponse.
+func ListImages(client pb.ImageServiceClient, image string) (*pb.ListImagesResponse, error) {
+ return client.ListImages(context.Background(), &pb.ListImagesRequest{Filter: &pb.ImageFilter{Image: &pb.ImageSpec{Image: image}}})
+}
+
+// ImageStatus sends an ImageStatusRequest to the server, and parses
+// the returned ImageStatusResponse.
+func ImageStatus(client pb.ImageServiceClient, image string) (*pb.ImageStatusResponse, error) {
+ return client.ImageStatus(context.Background(), &pb.ImageStatusRequest{Image: &pb.ImageSpec{Image: image}})
+}
+
+// RemoveImage sends a RemoveImageRequest to the server, and parses
+// the returned RemoveImageResponse.
+func RemoveImage(client pb.ImageServiceClient, image string) (*pb.RemoveImageResponse, error) {
+ if image == "" {
+ return nil, fmt.Errorf("ID cannot be empty")
+ }
+ return client.RemoveImage(context.Background(), &pb.RemoveImageRequest{Image: &pb.ImageSpec{Image: image}})
+}