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  }