github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/storage/poolmanager/poolmanager_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package poolmanager_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/state"
    12  	statetesting "github.com/juju/juju/state/testing"
    13  	"github.com/juju/juju/storage"
    14  	"github.com/juju/juju/storage/poolmanager"
    15  	dummystorage "github.com/juju/juju/storage/provider/dummy"
    16  )
    17  
    18  type poolSuite struct {
    19  	// TODO - don't use state directly, mock it out and add feature tests.
    20  	statetesting.StateSuite
    21  	registry    storage.StaticProviderRegistry
    22  	poolManager poolmanager.PoolManager
    23  	settings    poolmanager.SettingsManager
    24  }
    25  
    26  var _ = gc.Suite(&poolSuite{})
    27  
    28  var poolAttrs = map[string]interface{}{
    29  	"name": "testpool", "type": "loop", "foo": "bar", "bleep": "bloop",
    30  }
    31  
    32  func (s *poolSuite) SetUpTest(c *gc.C) {
    33  	s.StateSuite.SetUpTest(c)
    34  	s.settings = state.NewStateSettings(s.State)
    35  	s.registry = storage.StaticProviderRegistry{
    36  		map[storage.ProviderType]storage.Provider{
    37  			"loop": &dummystorage.StorageProvider{},
    38  		},
    39  	}
    40  	s.poolManager = poolmanager.New(s.settings, s.registry)
    41  }
    42  
    43  func (s *poolSuite) createSettings(c *gc.C) {
    44  	err := s.settings.CreateSettings("pool#testpool", poolAttrs)
    45  	c.Assert(err, jc.ErrorIsNil)
    46  	// Create settings that isn't a pool.
    47  	err = s.settings.CreateSettings("r#1", nil)
    48  	c.Assert(err, jc.ErrorIsNil)
    49  }
    50  
    51  func (s *poolSuite) TestList(c *gc.C) {
    52  	s.createSettings(c)
    53  	pools, err := s.poolManager.List()
    54  	c.Assert(err, jc.ErrorIsNil)
    55  	c.Assert(pools, gc.HasLen, 1)
    56  	c.Assert(pools[0].Attrs(), gc.DeepEquals, map[string]interface{}{"foo": "bar", "bleep": "bloop"})
    57  	c.Assert(pools[0].Name(), gc.Equals, "testpool")
    58  	c.Assert(pools[0].Provider(), gc.Equals, storage.ProviderType("loop"))
    59  }
    60  
    61  func (s *poolSuite) TestListManyResults(c *gc.C) {
    62  	s.createSettings(c)
    63  	err := s.settings.CreateSettings("pool#testpool2", map[string]interface{}{
    64  		"name": "testpool2", "type": "loop", "foo2": "bar2",
    65  	})
    66  	c.Assert(err, jc.ErrorIsNil)
    67  	pools, err := s.poolManager.List()
    68  	c.Assert(err, jc.ErrorIsNil)
    69  	c.Assert(pools, gc.HasLen, 2)
    70  	poolCfgs := make(map[string]map[string]interface{})
    71  	for _, p := range pools {
    72  		poolCfgs[p.Name()] = p.Attrs()
    73  	}
    74  	c.Assert(poolCfgs, jc.DeepEquals, map[string]map[string]interface{}{
    75  		"testpool":  {"foo": "bar", "bleep": "bloop"},
    76  		"testpool2": {"foo2": "bar2"},
    77  	})
    78  }
    79  
    80  func (s *poolSuite) TestListNoPools(c *gc.C) {
    81  	pools, err := s.poolManager.List()
    82  	c.Assert(err, jc.ErrorIsNil)
    83  	c.Assert(pools, gc.HasLen, 0)
    84  }
    85  
    86  func (s *poolSuite) TestPool(c *gc.C) {
    87  	s.createSettings(c)
    88  	p, err := s.poolManager.Get("testpool")
    89  	c.Assert(err, jc.ErrorIsNil)
    90  	c.Assert(p.Attrs(), gc.DeepEquals, map[string]interface{}{"foo": "bar", "bleep": "bloop"})
    91  	c.Assert(p.Name(), gc.Equals, "testpool")
    92  	c.Assert(p.Provider(), gc.Equals, storage.ProviderType("loop"))
    93  }
    94  
    95  func (s *poolSuite) TestCreate(c *gc.C) {
    96  	created, err := s.poolManager.Create("testpool", storage.ProviderType("loop"), map[string]interface{}{"foo": "bar"})
    97  	c.Assert(err, jc.ErrorIsNil)
    98  	p, err := s.poolManager.Get("testpool")
    99  	c.Assert(created, gc.DeepEquals, p)
   100  	c.Assert(err, jc.ErrorIsNil)
   101  	c.Assert(p.Attrs(), gc.DeepEquals, map[string]interface{}{"foo": "bar"})
   102  	c.Assert(p.Name(), gc.Equals, "testpool")
   103  	c.Assert(p.Provider(), gc.Equals, storage.ProviderType("loop"))
   104  }
   105  
   106  func (s *poolSuite) TestCreateAlreadyExists(c *gc.C) {
   107  	_, err := s.poolManager.Create("testpool", storage.ProviderType("loop"), map[string]interface{}{"foo": "bar"})
   108  	c.Assert(err, jc.ErrorIsNil)
   109  	_, err = s.poolManager.Create("testpool", storage.ProviderType("loop"), map[string]interface{}{"foo": "bar"})
   110  	c.Assert(err, gc.ErrorMatches, ".*cannot overwrite.*")
   111  }
   112  
   113  func (s *poolSuite) TestCreateMissingName(c *gc.C) {
   114  	_, err := s.poolManager.Create("", "loop", map[string]interface{}{"foo": "bar"})
   115  	c.Assert(err, gc.ErrorMatches, "pool name is missing")
   116  }
   117  
   118  func (s *poolSuite) TestCreateMissingType(c *gc.C) {
   119  	_, err := s.poolManager.Create("testpool", "", map[string]interface{}{"foo": "bar"})
   120  	c.Assert(err, gc.ErrorMatches, "provider type is missing")
   121  }
   122  
   123  func (s *poolSuite) TestCreateInvalidConfig(c *gc.C) {
   124  	s.registry.Providers["invalid"] = &dummystorage.StorageProvider{
   125  		ValidateConfigFunc: func(*storage.Config) error {
   126  			return errors.New("no good")
   127  		},
   128  	}
   129  	_, err := s.poolManager.Create("testpool", "invalid", nil)
   130  	c.Assert(err, gc.ErrorMatches, "validating storage provider config: no good")
   131  }
   132  
   133  func (s *poolSuite) TestReplace(c *gc.C) {
   134  	s.createSettings(c)
   135  	err := s.poolManager.Replace("testpool", "", map[string]interface{}{"zip": "zap"})
   136  	c.Assert(err, jc.ErrorIsNil)
   137  	p, err := s.poolManager.Get("testpool")
   138  	c.Assert(err, jc.ErrorIsNil)
   139  	c.Assert(p.Attrs(), gc.DeepEquals, map[string]interface{}{"zip": "zap"})
   140  	c.Assert(p.Name(), gc.Equals, "testpool")
   141  	c.Assert(p.Provider(), gc.Equals, storage.ProviderType("loop"))
   142  }
   143  
   144  func (s *poolSuite) TestReplaceMissingName(c *gc.C) {
   145  	err := s.poolManager.Replace("", "", map[string]interface{}{"foo": "bar"})
   146  	c.Assert(err, gc.ErrorMatches, "pool name is missing")
   147  }
   148  
   149  func (s *poolSuite) TestReplaceNewProvider(c *gc.C) {
   150  	s.registry.Providers["notebook"] = &dummystorage.StorageProvider{}
   151  	s.createSettings(c)
   152  	err := s.poolManager.Replace("testpool", "notebook", map[string]interface{}{"handwritten": "true"})
   153  	c.Assert(err, jc.ErrorIsNil)
   154  	p, err := s.poolManager.Get("testpool")
   155  	c.Assert(err, jc.ErrorIsNil)
   156  	c.Assert(p.Attrs(), gc.DeepEquals, map[string]interface{}{"handwritten": "true"})
   157  	c.Assert(p.Name(), gc.Equals, "testpool")
   158  	c.Assert(p.Provider(), gc.Equals, storage.ProviderType("notebook"))
   159  }
   160  
   161  func (s *poolSuite) TestReplaceInvalidConfig(c *gc.C) {
   162  	s.registry.Providers["invalid"] = &dummystorage.StorageProvider{
   163  		ValidateConfigFunc: func(*storage.Config) error {
   164  			return errors.New("no good")
   165  		},
   166  	}
   167  	s.createSettings(c)
   168  	err := s.poolManager.Replace("testpool", "invalid", map[string]interface{}{"zip": "zap"})
   169  	c.Assert(err, gc.ErrorMatches, "validating storage provider config: no good")
   170  }
   171  
   172  func (s *poolSuite) TestReplaceNotFound(c *gc.C) {
   173  	err := s.poolManager.Replace("deadpool", "", map[string]interface{}{"zip": "zap"})
   174  	c.Assert(err, gc.ErrorMatches, "pool \"deadpool\" not found")
   175  }
   176  
   177  func (s *poolSuite) TestDelete(c *gc.C) {
   178  	s.createSettings(c)
   179  	err := s.poolManager.Delete("testpool")
   180  	c.Assert(err, jc.ErrorIsNil)
   181  	_, err = s.poolManager.Get("testpool")
   182  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   183  	// Delete again, no error.
   184  	err = s.poolManager.Delete("testpool")
   185  	c.Assert(err, jc.ErrorIsNil)
   186  }