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