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  }