github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/apiserver/imagemanager/imagemanager_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package imagemanager_test 5 6 import ( 7 "bytes" 8 "io" 9 "time" 10 11 "github.com/juju/names" 12 jc "github.com/juju/testing/checkers" 13 gc "gopkg.in/check.v1" 14 15 "github.com/juju/juju/apiserver/common" 16 commontesting "github.com/juju/juju/apiserver/common/testing" 17 "github.com/juju/juju/apiserver/imagemanager" 18 "github.com/juju/juju/apiserver/params" 19 apiservertesting "github.com/juju/juju/apiserver/testing" 20 jujutesting "github.com/juju/juju/juju/testing" 21 "github.com/juju/juju/state/imagestorage" 22 ) 23 24 type imageManagerSuite struct { 25 jujutesting.JujuConnSuite 26 27 imagemanager *imagemanager.ImageManagerAPI 28 resources *common.Resources 29 authoriser apiservertesting.FakeAuthorizer 30 31 commontesting.BlockHelper 32 } 33 34 var _ = gc.Suite(&imageManagerSuite{}) 35 36 func (s *imageManagerSuite) SetUpTest(c *gc.C) { 37 s.JujuConnSuite.SetUpTest(c) 38 s.resources = common.NewResources() 39 s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() }) 40 41 s.authoriser = apiservertesting.FakeAuthorizer{ 42 Tag: s.AdminUserTag(c), 43 } 44 var err error 45 s.imagemanager, err = imagemanager.NewImageManagerAPI(s.State, s.resources, s.authoriser) 46 c.Assert(err, jc.ErrorIsNil) 47 48 s.BlockHelper = commontesting.NewBlockHelper(s.APIState) 49 s.AddCleanup(func(*gc.C) { s.BlockHelper.Close() }) 50 } 51 52 func (s *imageManagerSuite) TestNewImageManagerAPIAcceptsClient(c *gc.C) { 53 endPoint, err := imagemanager.NewImageManagerAPI(s.State, s.resources, s.authoriser) 54 c.Assert(err, jc.ErrorIsNil) 55 c.Assert(endPoint, gc.NotNil) 56 } 57 58 func (s *imageManagerSuite) TestNewImageManagerAPIRefusesNonClient(c *gc.C) { 59 anAuthoriser := s.authoriser 60 anAuthoriser.Tag = names.NewUnitTag("mysql/0") 61 anAuthoriser.EnvironManager = false 62 endPoint, err := imagemanager.NewImageManagerAPI(s.State, s.resources, anAuthoriser) 63 c.Assert(endPoint, gc.IsNil) 64 c.Assert(err, gc.ErrorMatches, "permission denied") 65 } 66 67 func (s *imageManagerSuite) addImage(c *gc.C, content string) { 68 var r io.Reader = bytes.NewReader([]byte(content)) 69 addedMetadata := &imagestorage.Metadata{ 70 ModelUUID: s.State.ModelUUID(), 71 Kind: "lxc", 72 Series: "trusty", 73 Arch: "amd64", 74 Size: int64(len(content)), 75 SHA256: "hash(" + content + ")", 76 SourceURL: "http://lxc-trusty-amd64", 77 } 78 stor := s.State.ImageStorage() 79 err := stor.AddImage(r, addedMetadata) 80 c.Assert(err, gc.IsNil) 81 _, rdr, err := stor.Image("lxc", "trusty", "amd64") 82 c.Assert(err, jc.ErrorIsNil) 83 rdr.Close() 84 } 85 86 func (s *imageManagerSuite) TestListAllImages(c *gc.C) { 87 s.addImage(c, "image") 88 args := params.ImageFilterParams{} 89 result, err := s.imagemanager.ListImages(args) 90 c.Assert(err, jc.ErrorIsNil) 91 c.Assert(result.Result, gc.HasLen, 1) 92 dummyTime := time.Now() 93 result.Result[0].Created = dummyTime 94 c.Assert(result.Result[0], gc.Equals, params.ImageMetadata{ 95 Kind: "lxc", Arch: "amd64", Series: "trusty", URL: "http://lxc-trusty-amd64", Created: dummyTime, 96 }) 97 } 98 99 func (s *imageManagerSuite) TestListImagesWithSingleFilter(c *gc.C) { 100 s.addImage(c, "image") 101 args := params.ImageFilterParams{ 102 Images: []params.ImageSpec{ 103 { 104 Kind: "lxc", 105 Series: "trusty", 106 Arch: "amd64", 107 }, 108 }, 109 } 110 result, err := s.imagemanager.ListImages(args) 111 c.Assert(err, jc.ErrorIsNil) 112 c.Assert(result.Result, gc.HasLen, 1) 113 dummyTime := time.Now() 114 result.Result[0].Created = dummyTime 115 c.Assert(result.Result[0], gc.Equals, params.ImageMetadata{ 116 Kind: "lxc", Arch: "amd64", Series: "trusty", URL: "http://lxc-trusty-amd64", Created: dummyTime, 117 }) 118 } 119 120 func (s *imageManagerSuite) TestListImagesWithMultipleFiltersFails(c *gc.C) { 121 s.addImage(c, "image") 122 args := params.ImageFilterParams{ 123 Images: []params.ImageSpec{ 124 { 125 Kind: "lxc", 126 Series: "trusty", 127 Arch: "amd64", 128 }, { 129 Kind: "lxc", 130 Series: "precise", 131 Arch: "amd64", 132 }, 133 }, 134 } 135 _, err := s.imagemanager.ListImages(args) 136 c.Assert(err, gc.ErrorMatches, "image filter with multiple terms not supported") 137 } 138 139 func (s *imageManagerSuite) TestDeleteImages(c *gc.C) { 140 s.addImage(c, "image") 141 args := params.ImageFilterParams{ 142 Images: []params.ImageSpec{ 143 { 144 Kind: "lxc", 145 Series: "trusty", 146 Arch: "amd64", 147 }, { 148 Kind: "lxc", 149 Series: "precise", 150 Arch: "amd64", 151 }, 152 }, 153 } 154 results, err := s.imagemanager.DeleteImages(args) 155 c.Assert(err, jc.ErrorIsNil) 156 c.Assert(results, gc.DeepEquals, params.ErrorResults{ 157 Results: []params.ErrorResult{ 158 {Error: nil}, 159 {Error: apiservertesting.NotFoundError("image lxc/precise/amd64")}, 160 }, 161 }) 162 stor := s.State.ImageStorage() 163 _, _, err = stor.Image("lxc", "trusty", "amd64") 164 c.Assert(err, gc.ErrorMatches, ".*-lxc-trusty-amd64 image metadata not found") 165 } 166 167 func (s *imageManagerSuite) TestBlockDeleteImages(c *gc.C) { 168 s.addImage(c, "image") 169 args := params.ImageFilterParams{ 170 Images: []params.ImageSpec{{ 171 Kind: "lxc", 172 Series: "trusty", 173 Arch: "amd64", 174 }}, 175 } 176 177 s.BlockAllChanges(c, "TestBlockDeleteImages") 178 _, err := s.imagemanager.DeleteImages(args) 179 // Check that the call is blocked 180 s.AssertBlocked(c, err, "TestBlockDeleteImages") 181 // Check the image still exists. 182 stor := s.State.ImageStorage() 183 _, rdr, err := stor.Image("lxc", "trusty", "amd64") 184 c.Assert(err, jc.ErrorIsNil) 185 rdr.Close() 186 }