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