github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/plugins/juju-metadata/addimage_test.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 "regexp" 9 10 "github.com/juju/cmd" 11 "github.com/juju/cmd/cmdtesting" 12 "github.com/juju/errors" 13 jc "github.com/juju/testing/checkers" 14 gc "gopkg.in/check.v1" 15 16 "github.com/juju/juju/apiserver/params" 17 "github.com/juju/juju/cmd/modelcmd" 18 "github.com/juju/juju/jujuclient/jujuclienttesting" 19 ) 20 21 type addImageSuite struct { 22 BaseCloudImageMetadataSuite 23 24 data []params.CloudImageMetadata 25 26 mockAPI *mockAddAPI 27 } 28 29 var _ = gc.Suite(&addImageSuite{}) 30 31 var emptyMetadata = []params.CloudImageMetadata{} 32 33 func (s *addImageSuite) SetUpTest(c *gc.C) { 34 s.BaseCloudImageMetadataSuite.SetUpTest(c) 35 36 s.data = emptyMetadata 37 38 s.mockAPI = &mockAddAPI{} 39 s.mockAPI.add = func(metadata []params.CloudImageMetadata) error { 40 s.data = append(s.data, metadata...) 41 return nil 42 } 43 s.PatchValue(&getImageMetadataAddAPI, func(c *addImageMetadataCommand) (MetadataAddAPI, error) { 44 return s.mockAPI, nil 45 }) 46 } 47 48 func (s *addImageSuite) TestAddImageMetadata(c *gc.C) { 49 s.assertValidAddImageMetadata(c, constructTestImageMetadata()) 50 } 51 52 func (s *addImageSuite) TestAddImageMetadataWithStream(c *gc.C) { 53 m := constructTestImageMetadata() 54 m.Stream = "streamV" 55 s.assertValidAddImageMetadata(c, m) 56 } 57 58 func (s *addImageSuite) TestAddImageMetadataWithRegion(c *gc.C) { 59 m := constructTestImageMetadata() 60 m.Region = "region" 61 s.assertValidAddImageMetadata(c, m) 62 } 63 64 func (s *addImageSuite) TestAddImageMetadataAWS(c *gc.C) { 65 m := constructTestImageMetadata() 66 m.VirtType = "vType" 67 m.RootStorageType = "sType" 68 s.assertValidAddImageMetadata(c, m) 69 } 70 71 func (s *addImageSuite) TestAddImageMetadataAWSWithSize(c *gc.C) { 72 m := constructTestImageMetadata() 73 m.VirtType = "vType" 74 m.RootStorageType = "sType" 75 76 size := uint64(100) 77 m.RootStorageSize = &size 78 79 s.assertValidAddImageMetadata(c, m) 80 } 81 82 func (s *addImageSuite) TestAddImageMetadataFailed(c *gc.C) { 83 msg := "failed" 84 s.mockAPI.add = func(metadata []params.CloudImageMetadata) error { 85 return errors.New(msg) 86 } 87 88 s.assertAddImageMetadataErr(c, constructTestImageMetadata(), msg) 89 } 90 91 func (s *addImageSuite) TestAddImageMetadataNoImageId(c *gc.C) { 92 m := constructTestImageMetadata() 93 m.ImageId = "" 94 95 s.assertAddImageMetadataErr(c, m, "image id must be supplied when adding image metadata") 96 } 97 98 func (s *addImageSuite) TestAddImageMetadataNoSeries(c *gc.C) { 99 m := constructTestImageMetadata() 100 m.Series = "" 101 // Series will default to config default, for e.g. "trusty" 102 s.assertValidAddImageMetadata(c, m) 103 } 104 105 func (s *addImageSuite) TestAddImageMetadataInvalidSeries(c *gc.C) { 106 m := constructTestImageMetadata() 107 m.Series = "blah" 108 109 s.assertAddImageMetadataErr(c, m, regexp.QuoteMeta(`unknown version for series: "blah"`)) 110 } 111 112 func (s *addImageSuite) TestAddImageMetadataNoArch(c *gc.C) { 113 m := constructTestImageMetadata() 114 m.Arch = "" 115 116 s.assertValidAddImageMetadata(c, m) 117 } 118 119 func (s *addImageSuite) assertValidAddImageMetadata(c *gc.C, m params.CloudImageMetadata) { 120 args := getAddImageMetadataCmdFlags(c, m) 121 122 _, err := runAddImageMetadata(c, args...) 123 c.Assert(err, jc.ErrorIsNil) 124 125 // Need to make sure that defaults are populated 126 if m.Arch == "" { 127 m.Arch = "amd64" 128 } 129 if m.Stream == "" { 130 m.Stream = "released" 131 } 132 133 c.Assert(s.data, gc.DeepEquals, []params.CloudImageMetadata{m}) 134 } 135 136 func runAddImageMetadata(c *gc.C, args ...string) (*cmd.Context, error) { 137 cmd := &addImageMetadataCommand{} 138 cmd.SetClientStore(jujuclienttesting.MinimalStore()) 139 return cmdtesting.RunCommand(c, modelcmd.Wrap(cmd), args...) 140 } 141 142 func (s *addImageSuite) assertAddImageMetadataErr(c *gc.C, m params.CloudImageMetadata, msg string) { 143 args := getAddImageMetadataCmdFlags(c, m) 144 _, err := runAddImageMetadata(c, args...) 145 c.Assert(err, gc.ErrorMatches, fmt.Sprintf(".*%v.*", msg)) 146 c.Assert(s.data, gc.DeepEquals, emptyMetadata) 147 } 148 149 func constructTestImageMetadata() params.CloudImageMetadata { 150 return params.CloudImageMetadata{ 151 ImageId: "im-33333", 152 Series: "trusty", 153 Arch: "arch", 154 Source: "custom", 155 } 156 } 157 158 func getAddImageMetadataCmdFlags(c *gc.C, data params.CloudImageMetadata) []string { 159 args := []string{} 160 161 addFlag := func(flag, value, defaultValue string) { 162 if value != "" { 163 args = append(args, flag, value) 164 } else { 165 if defaultValue != "" { 166 args = append(args, flag, defaultValue) 167 } 168 } 169 } 170 171 addFlag("--series", data.Series, "") 172 addFlag("--region", data.Region, "") 173 addFlag("--arch", data.Arch, "amd64") 174 addFlag("--virt-type", data.VirtType, "") 175 addFlag("--storage-type", data.RootStorageType, "") 176 addFlag("--stream", data.Stream, "released") 177 178 if data.RootStorageSize != nil { 179 args = append(args, "--storage-size", fmt.Sprintf("%d", *data.RootStorageSize)) 180 } 181 182 // image id is an argument 183 if data.ImageId != "" { 184 args = append(args, data.ImageId) 185 } 186 return args 187 } 188 189 type mockAddAPI struct { 190 add func(metadata []params.CloudImageMetadata) error 191 } 192 193 func (s mockAddAPI) Close() error { 194 return nil 195 } 196 197 func (s mockAddAPI) Save(metadata []params.CloudImageMetadata) error { 198 return s.add(metadata) 199 }