github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/cmd/plugins/juju-metadata/addimage.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package main 5 6 import ( 7 "fmt" 8 9 "github.com/juju/cmd" 10 "github.com/juju/errors" 11 "launchpad.net/gnuflag" 12 13 "github.com/juju/juju/apiserver/params" 14 ) 15 16 const AddImageCommandDoc = ` 17 Add image metadata to Juju environment. 18 19 Image metadata properties vary between providers. Consequently, some properties 20 are optional for this command but they may still be needed by your provider. 21 22 options: 23 -e, --environment (= "") 24 juju environment to operate in 25 --image-id 26 image identifier 27 --region 28 cloud region 29 --series (= "trusty") 30 image series 31 --arch (= "amd64") 32 image architectures 33 --virt-type 34 virtualisation type [provider specific], e.g. hmv 35 --storage-type 36 root storage type [provider specific], e.g. ebs 37 --storage-size 38 root storage size [provider specific] 39 --stream (= "released") 40 image stream 41 ` 42 43 // AddImageMetadataCommand stores image metadata in Juju environment. 44 type AddImageMetadataCommand struct { 45 CloudImageMetadataCommandBase 46 47 ImageId string 48 Region string 49 Series string 50 Arch string 51 VirtType string 52 RootStorageType string 53 RootStorageSize uint64 54 Stream string 55 } 56 57 // Init implements Command.Init. 58 func (c *AddImageMetadataCommand) Init(args []string) (err error) { 59 if err := checkArgumentSet(c.ImageId, "image id"); err != nil { 60 return err 61 } 62 return nil 63 } 64 65 // Info implements Command.Info. 66 func (c *AddImageMetadataCommand) Info() *cmd.Info { 67 return &cmd.Info{ 68 Name: "add-image", 69 Purpose: "adds image metadata to environment", 70 Doc: AddImageCommandDoc, 71 } 72 } 73 74 // SetFlags implements Command.SetFlags. 75 func (c *AddImageMetadataCommand) SetFlags(f *gnuflag.FlagSet) { 76 c.CloudImageMetadataCommandBase.SetFlags(f) 77 78 f.StringVar(&c.ImageId, "image-id", "", "metadata image id") 79 f.StringVar(&c.Region, "region", "", "image cloud region") 80 // TODO (anastasiamac 2015-09-30) Ideally default should be latest LTS. 81 // Hard-coding "trusty" for now. 82 f.StringVar(&c.Series, "series", "trusty", "image series") 83 f.StringVar(&c.Arch, "arch", "amd64", "image architecture") 84 f.StringVar(&c.VirtType, "virt-type", "", "image metadata virtualisation type") 85 f.StringVar(&c.RootStorageType, "storage-type", "", "image metadata root storage type") 86 f.Uint64Var(&c.RootStorageSize, "storage-size", 0, "image metadata root storage size") 87 f.StringVar(&c.Stream, "stream", "released", "image metadata stream") 88 } 89 90 // Run implements Command.Run. 91 func (c *AddImageMetadataCommand) Run(ctx *cmd.Context) (err error) { 92 api, err := getImageMetadataAddAPI(c) 93 if err != nil { 94 return err 95 } 96 defer api.Close() 97 98 m := c.constructMetadataParam() 99 found, err := api.Save([]params.CloudImageMetadata{m}) 100 if err != nil { 101 return err 102 } 103 if len(found) == 0 { 104 return nil 105 } 106 if len(found) > 1 { 107 return errors.New(fmt.Sprintf("expected one result, got %d", len(found))) 108 } 109 if found[0].Error != nil { 110 return errors.New(found[0].Error.GoString()) 111 } 112 return nil 113 } 114 115 // MetadataAddAPI defines the API methods that add image metadata command uses. 116 type MetadataAddAPI interface { 117 Close() error 118 Save(metadata []params.CloudImageMetadata) ([]params.ErrorResult, error) 119 } 120 121 var getImageMetadataAddAPI = (*AddImageMetadataCommand).getImageMetadataAddAPI 122 123 func (c *AddImageMetadataCommand) getImageMetadataAddAPI() (MetadataAddAPI, error) { 124 return c.NewImageMetadataAPI() 125 } 126 127 func checkArgumentSet(arg, name string) (err error) { 128 if arg == "" { 129 return errors.New(fmt.Sprintf("%v must be supplied when adding an image metadata", name)) 130 } 131 return nil 132 } 133 134 // constructMetadataParam returns cloud image metadata as a param. 135 func (c *AddImageMetadataCommand) constructMetadataParam() params.CloudImageMetadata { 136 info := params.CloudImageMetadata{ 137 ImageId: c.ImageId, 138 Region: c.Region, 139 Series: c.Series, 140 Arch: c.Arch, 141 VirtType: c.VirtType, 142 RootStorageType: c.RootStorageType, 143 Stream: c.Stream, 144 Source: "custom", 145 } 146 if c.RootStorageSize != 0 { 147 info.RootStorageSize = &c.RootStorageSize 148 } 149 return info 150 }