github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/apiserver/storage/poollist_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package storage_test 5 6 import ( 7 "fmt" 8 9 jc "github.com/juju/testing/checkers" 10 "github.com/juju/utils/set" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/apiserver/params" 14 apiserverstorage "github.com/juju/juju/apiserver/storage" 15 "github.com/juju/juju/storage" 16 "github.com/juju/juju/storage/provider" 17 "github.com/juju/juju/storage/provider/registry" 18 ) 19 20 type poolSuite struct { 21 baseStorageSuite 22 } 23 24 var _ = gc.Suite(&poolSuite{}) 25 26 const ( 27 tstName = "testpool" 28 ) 29 30 func (s *poolSuite) createPools(c *gc.C, num int) { 31 var err error 32 for i := 0; i < num; i++ { 33 poolName := fmt.Sprintf("%v%v", tstName, i) 34 s.baseStorageSuite.pools[poolName], err = 35 storage.NewConfig(poolName, provider.LoopProviderType, nil) 36 c.Assert(err, jc.ErrorIsNil) 37 } 38 } 39 40 func (s *poolSuite) TestList(c *gc.C) { 41 s.createPools(c, 1) 42 results, err := s.api.ListPools(params.StoragePoolFilters{[]params.StoragePoolFilter{{}}}) 43 c.Assert(err, jc.ErrorIsNil) 44 c.Assert(results.Results, gc.HasLen, 1) 45 one := results.Results[0] 46 c.Assert(one.Error, gc.IsNil) 47 c.Assert(one.Result, gc.HasLen, 1) 48 c.Assert(one.Result[0].Name, gc.Equals, fmt.Sprintf("%v%v", tstName, 0)) 49 c.Assert(one.Result[0].Provider, gc.Equals, string(provider.LoopProviderType)) 50 } 51 52 func (s *poolSuite) TestListManyResults(c *gc.C) { 53 s.createPools(c, 2) 54 results, err := s.api.ListPools(params.StoragePoolFilters{[]params.StoragePoolFilter{{}}}) 55 c.Assert(err, jc.ErrorIsNil) 56 assertPoolNames(c, results.Results[0].Result, 57 "testpool0", "testpool1", 58 "dummy", "loop", 59 "tmpfs", "rootfs") 60 } 61 62 func (s *poolSuite) TestListByName(c *gc.C) { 63 s.createPools(c, 2) 64 tstName := fmt.Sprintf("%v%v", tstName, 1) 65 66 results, err := s.api.ListPools(params.StoragePoolFilters{ 67 []params.StoragePoolFilter{{ 68 Names: []string{tstName}, 69 }}, 70 }) 71 c.Assert(err, jc.ErrorIsNil) 72 c.Assert(results.Results, gc.HasLen, 1) 73 c.Assert(results.Results[0].Result, gc.HasLen, 1) 74 c.Assert(results.Results[0].Result[0].Name, gc.DeepEquals, tstName) 75 } 76 77 func (s *poolSuite) TestListByType(c *gc.C) { 78 s.createPools(c, 2) 79 s.registerProviders(c) 80 tstType := string(provider.TmpfsProviderType) 81 poolName := "rayofsunshine" 82 var err error 83 s.baseStorageSuite.pools[poolName], err = 84 storage.NewConfig(poolName, provider.TmpfsProviderType, nil) 85 c.Assert(err, jc.ErrorIsNil) 86 87 results, err := s.api.ListPools(params.StoragePoolFilters{ 88 []params.StoragePoolFilter{{ 89 Providers: []string{tstType}, 90 }}, 91 }) 92 c.Assert(err, jc.ErrorIsNil) 93 assertPoolNames(c, results.Results[0].Result, "rayofsunshine", "tmpfs") 94 } 95 96 func (s *poolSuite) TestListByNameAndTypeAnd(c *gc.C) { 97 s.createPools(c, 2) 98 s.registerProviders(c) 99 tstType := string(provider.TmpfsProviderType) 100 poolName := "rayofsunshine" 101 var err error 102 s.baseStorageSuite.pools[poolName], err = 103 storage.NewConfig(poolName, provider.TmpfsProviderType, nil) 104 c.Assert(err, jc.ErrorIsNil) 105 results, err := s.api.ListPools(params.StoragePoolFilters{ 106 []params.StoragePoolFilter{{ 107 Providers: []string{tstType}, 108 Names: []string{poolName}, 109 }}, 110 }) 111 c.Assert(err, jc.ErrorIsNil) 112 c.Assert(results.Results, gc.HasLen, 1) 113 c.Assert(results.Results[0].Result, gc.HasLen, 1) 114 c.Assert(results.Results[0].Result[0].Provider, gc.DeepEquals, tstType) 115 c.Assert(results.Results[0].Result[0].Name, gc.DeepEquals, poolName) 116 } 117 118 func (s *poolSuite) TestListByNamesOr(c *gc.C) { 119 s.createPools(c, 2) 120 s.registerProviders(c) 121 poolName := "rayofsunshine" 122 var err error 123 s.baseStorageSuite.pools[poolName], err = 124 storage.NewConfig(poolName, provider.TmpfsProviderType, nil) 125 c.Assert(err, jc.ErrorIsNil) 126 results, err := s.api.ListPools(params.StoragePoolFilters{ 127 []params.StoragePoolFilter{{ 128 Names: []string{ 129 fmt.Sprintf("%v%v", tstName, 1), 130 fmt.Sprintf("%v%v", tstName, 0), 131 }, 132 }}, 133 }) 134 c.Assert(err, jc.ErrorIsNil) 135 assertPoolNames(c, results.Results[0].Result, "testpool0", "testpool1") 136 } 137 138 func assertPoolNames(c *gc.C, results []params.StoragePool, expected ...string) { 139 expectedNames := set.NewStrings(expected...) 140 c.Assert(len(expectedNames), gc.Equals, len(results)) 141 for _, one := range results { 142 c.Assert(expectedNames.Contains(one.Name), jc.IsTrue) 143 } 144 } 145 146 func (s *poolSuite) TestListByTypesOr(c *gc.C) { 147 s.createPools(c, 2) 148 s.registerProviders(c) 149 tstType := string(provider.TmpfsProviderType) 150 poolName := "rayofsunshine" 151 var err error 152 s.baseStorageSuite.pools[poolName], err = 153 storage.NewConfig(poolName, provider.TmpfsProviderType, nil) 154 c.Assert(err, jc.ErrorIsNil) 155 results, err := s.api.ListPools(params.StoragePoolFilters{ 156 []params.StoragePoolFilter{{ 157 Providers: []string{tstType, string(provider.LoopProviderType)}, 158 }}, 159 }) 160 c.Assert(err, jc.ErrorIsNil) 161 assertPoolNames(c, results.Results[0].Result, "testpool0", "testpool1", "rayofsunshine", "loop", "tmpfs") 162 } 163 164 func (s *poolSuite) TestListNoPools(c *gc.C) { 165 results, err := s.api.ListPools(params.StoragePoolFilters{[]params.StoragePoolFilter{{}}}) 166 c.Assert(err, jc.ErrorIsNil) 167 c.Assert(results.Results, gc.HasLen, 1) 168 assertPoolNames(c, results.Results[0].Result, "dummy", "rootfs", "loop", "tmpfs") 169 } 170 171 func (s *poolSuite) TestListFilterEmpty(c *gc.C) { 172 err := apiserverstorage.ValidatePoolListFilter(s.api, params.StoragePoolFilter{}) 173 c.Assert(err, jc.ErrorIsNil) 174 } 175 176 const ( 177 validProvider = string(provider.LoopProviderType) 178 invalidProvider = "invalid" 179 validName = "pool" 180 invalidName = "7ool" 181 ) 182 183 func (s *poolSuite) TestListFilterValidProviders(c *gc.C) { 184 s.registerProviders(c) 185 err := apiserverstorage.ValidateProviderCriteria( 186 s.api, 187 []string{validProvider}) 188 c.Assert(err, jc.ErrorIsNil) 189 } 190 191 func (s *poolSuite) TestListFilterUnregisteredProvider(c *gc.C) { 192 s.state.modelName = "noprovidersregistered" 193 err := apiserverstorage.ValidateProviderCriteria( 194 s.api, 195 []string{validProvider}) 196 c.Assert(err, gc.ErrorMatches, ".*not supported.*") 197 } 198 199 func (s *poolSuite) TestListFilterUnknownProvider(c *gc.C) { 200 s.registerProviders(c) 201 err := apiserverstorage.ValidateProviderCriteria( 202 s.api, 203 []string{invalidProvider}) 204 c.Assert(err, gc.ErrorMatches, ".*not supported.*") 205 } 206 207 func (s *poolSuite) TestListFilterValidNames(c *gc.C) { 208 err := apiserverstorage.ValidateNameCriteria( 209 s.api, 210 []string{validName}) 211 c.Assert(err, jc.ErrorIsNil) 212 } 213 214 func (s *poolSuite) TestListFilterInvalidNames(c *gc.C) { 215 err := apiserverstorage.ValidateNameCriteria( 216 s.api, 217 []string{invalidName}) 218 c.Assert(err, gc.ErrorMatches, ".*not valid.*") 219 } 220 221 func (s *poolSuite) TestListFilterValidProvidersAndNames(c *gc.C) { 222 s.registerProviders(c) 223 err := apiserverstorage.ValidatePoolListFilter( 224 s.api, 225 params.StoragePoolFilter{ 226 Providers: []string{validProvider}, 227 Names: []string{validName}}) 228 c.Assert(err, jc.ErrorIsNil) 229 } 230 231 func (s *poolSuite) TestListFilterValidProvidersAndInvalidNames(c *gc.C) { 232 s.registerProviders(c) 233 err := apiserverstorage.ValidatePoolListFilter( 234 s.api, 235 params.StoragePoolFilter{ 236 Providers: []string{validProvider}, 237 Names: []string{invalidName}}) 238 c.Assert(err, gc.ErrorMatches, ".*not valid.*") 239 } 240 241 func (s *poolSuite) TestListFilterInvalidProvidersAndValidNames(c *gc.C) { 242 err := apiserverstorage.ValidatePoolListFilter( 243 s.api, 244 params.StoragePoolFilter{ 245 Providers: []string{invalidProvider}, 246 Names: []string{validName}}) 247 c.Assert(err, gc.ErrorMatches, ".*not supported.*") 248 } 249 250 func (s *poolSuite) TestListFilterInvalidProvidersAndNames(c *gc.C) { 251 err := apiserverstorage.ValidatePoolListFilter( 252 s.api, 253 params.StoragePoolFilter{ 254 Providers: []string{invalidProvider}, 255 Names: []string{invalidName}}) 256 c.Assert(err, gc.ErrorMatches, ".*not supported.*") 257 } 258 259 func (s *poolSuite) registerProviders(c *gc.C) { 260 registry.RegisterEnvironStorageProviders(s.state.modelName, "dummy") 261 }