github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/controller/modelmanager/createmodel_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package modelmanager_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/testing"
     9  	jc "github.com/juju/testing/checkers"
    10  	"github.com/juju/utils"
    11  	"github.com/juju/version"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/cloud"
    15  	"github.com/juju/juju/controller/modelmanager"
    16  	"github.com/juju/juju/environs"
    17  	"github.com/juju/juju/environs/config"
    18  	_ "github.com/juju/juju/provider/all"
    19  	_ "github.com/juju/juju/provider/azure"
    20  	_ "github.com/juju/juju/provider/dummy"
    21  	_ "github.com/juju/juju/provider/ec2"
    22  	_ "github.com/juju/juju/provider/joyent"
    23  	_ "github.com/juju/juju/provider/maas"
    24  	_ "github.com/juju/juju/provider/openstack"
    25  	coretesting "github.com/juju/juju/testing"
    26  	"github.com/juju/juju/tools"
    27  )
    28  
    29  type ModelConfigCreatorSuite struct {
    30  	coretesting.BaseSuite
    31  	fake       fakeProvider
    32  	creator    modelmanager.ModelConfigCreator
    33  	baseConfig *config.Config
    34  }
    35  
    36  var _ = gc.Suite(&ModelConfigCreatorSuite{})
    37  
    38  func (s *ModelConfigCreatorSuite) SetUpTest(c *gc.C) {
    39  	s.BaseSuite.SetUpTest(c)
    40  	s.fake = fakeProvider{
    41  		restrictedConfigAttributes: []string{"restricted"},
    42  	}
    43  	s.creator = modelmanager.ModelConfigCreator{
    44  		Provider: func(provider string) (environs.EnvironProvider, error) {
    45  			if provider != "fake" {
    46  				return nil, errors.Errorf("expected fake, got %s", provider)
    47  			}
    48  			return &s.fake, nil
    49  		},
    50  	}
    51  	baseConfig, err := config.New(
    52  		config.UseDefaults,
    53  		coretesting.FakeConfig().Merge(coretesting.Attrs{
    54  			"type":          "fake",
    55  			"restricted":    "area51",
    56  			"agent-version": "2.0.0",
    57  		}),
    58  	)
    59  	c.Assert(err, jc.ErrorIsNil)
    60  	s.baseConfig = baseConfig
    61  }
    62  
    63  func (s *ModelConfigCreatorSuite) newModelConfig(attrs map[string]interface{}) (*config.Config, error) {
    64  	cloudSpec := environs.CloudSpec{Type: "fake"}
    65  	return s.creator.NewModelConfig(cloudSpec, s.baseConfig, attrs)
    66  }
    67  
    68  func (s *ModelConfigCreatorSuite) TestCreateModelValidatesConfig(c *gc.C) {
    69  	newModelUUID := utils.MustNewUUID().String()
    70  	cfg, err := s.newModelConfig(coretesting.Attrs(
    71  		s.baseConfig.AllAttrs(),
    72  	).Merge(coretesting.Attrs{
    73  		"name":       "new-model",
    74  		"additional": "value",
    75  		"uuid":       newModelUUID,
    76  	}))
    77  	c.Assert(err, jc.ErrorIsNil)
    78  	expected := s.baseConfig.AllAttrs()
    79  	expected["name"] = "new-model"
    80  	expected["type"] = "fake"
    81  	expected["additional"] = "value"
    82  	expected["uuid"] = newModelUUID
    83  	c.Assert(cfg.AllAttrs(), jc.DeepEquals, expected)
    84  
    85  	s.fake.Stub.CheckCallNames(c,
    86  		"PrepareConfig",
    87  		"Validate",
    88  	)
    89  	validateCall := s.fake.Stub.Calls()[1]
    90  	c.Assert(validateCall.Args, gc.HasLen, 2)
    91  	c.Assert(validateCall.Args[0], gc.Equals, cfg)
    92  	c.Assert(validateCall.Args[1], gc.IsNil)
    93  }
    94  
    95  func (s *ModelConfigCreatorSuite) TestCreateModelSameAgentVersion(c *gc.C) {
    96  	cfg, err := s.newModelConfig(coretesting.Attrs(
    97  		s.baseConfig.AllAttrs(),
    98  	).Merge(coretesting.Attrs{
    99  		"name": "new-model",
   100  		"uuid": utils.MustNewUUID().String(),
   101  	}))
   102  	c.Assert(err, jc.ErrorIsNil)
   103  
   104  	baseAgentVersion, ok := s.baseConfig.AgentVersion()
   105  	c.Assert(ok, jc.IsTrue)
   106  	agentVersion, ok := cfg.AgentVersion()
   107  	c.Assert(ok, jc.IsTrue)
   108  	c.Assert(agentVersion, gc.Equals, baseAgentVersion)
   109  }
   110  
   111  func (s *ModelConfigCreatorSuite) TestCreateModelGreaterAgentVersion(c *gc.C) {
   112  	_, err := s.newModelConfig(coretesting.Attrs(
   113  		s.baseConfig.AllAttrs(),
   114  	).Merge(coretesting.Attrs{
   115  		"name":          "new-model",
   116  		"uuid":          utils.MustNewUUID().String(),
   117  		"agent-version": "2.0.1",
   118  	}))
   119  	c.Assert(err, gc.ErrorMatches,
   120  		"agent-version .* cannot be greater than the controller .*")
   121  }
   122  
   123  func (s *ModelConfigCreatorSuite) TestCreateModelLesserAgentVersionNoToolsFinder(c *gc.C) {
   124  	_, err := s.newModelConfig(coretesting.Attrs(
   125  		s.baseConfig.AllAttrs(),
   126  	).Merge(coretesting.Attrs{
   127  		"name":          "new-model",
   128  		"uuid":          utils.MustNewUUID().String(),
   129  		"agent-version": "1.9.9",
   130  	}))
   131  	c.Assert(err, gc.ErrorMatches,
   132  		"agent-version does not match base config, and no tools-finder is supplied")
   133  }
   134  
   135  func (s *ModelConfigCreatorSuite) TestCreateModelLesserAgentVersionToolsFinderFound(c *gc.C) {
   136  	s.creator.FindTools = func(version.Number) (tools.List, error) {
   137  		return tools.List{
   138  			{}, //contents don't matter, just need a non-empty list
   139  		}, nil
   140  	}
   141  	cfg, err := s.newModelConfig(coretesting.Attrs(
   142  		s.baseConfig.AllAttrs(),
   143  	).Merge(coretesting.Attrs{
   144  		"name":          "new-model",
   145  		"uuid":          utils.MustNewUUID().String(),
   146  		"agent-version": "1.9.9",
   147  	}))
   148  	c.Assert(err, jc.ErrorIsNil)
   149  	agentVersion, ok := cfg.AgentVersion()
   150  	c.Assert(ok, jc.IsTrue)
   151  	c.Assert(agentVersion, gc.Equals, version.MustParse("1.9.9"))
   152  }
   153  
   154  func (s *ModelConfigCreatorSuite) TestCreateModelLesserAgentVersionToolsFinderNotFound(c *gc.C) {
   155  	s.creator.FindTools = func(version.Number) (tools.List, error) {
   156  		return tools.List{}, nil
   157  	}
   158  	_, err := s.newModelConfig(coretesting.Attrs(
   159  		s.baseConfig.AllAttrs(),
   160  	).Merge(coretesting.Attrs{
   161  		"name":          "new-model",
   162  		"uuid":          utils.MustNewUUID().String(),
   163  		"agent-version": "1.9.9",
   164  	}))
   165  	c.Assert(err, gc.ErrorMatches, "no agent binaries found for version .*")
   166  }
   167  
   168  type fakeProvider struct {
   169  	testing.Stub
   170  	environs.EnvironProvider
   171  	restrictedConfigAttributes []string
   172  }
   173  
   174  func (p *fakeProvider) Validate(cfg, old *config.Config) (*config.Config, error) {
   175  	p.MethodCall(p, "Validate", cfg, old)
   176  	return cfg, p.NextErr()
   177  }
   178  
   179  func (p *fakeProvider) PrepareConfig(args environs.PrepareConfigParams) (*config.Config, error) {
   180  	p.MethodCall(p, "PrepareConfig", args)
   181  	return args.Config, p.NextErr()
   182  }
   183  
   184  func (p *fakeProvider) CredentialSchemas() map[cloud.AuthType]cloud.CredentialSchema {
   185  	return map[cloud.AuthType]cloud.CredentialSchema{
   186  		cloud.UserPassAuthType: {
   187  			{
   188  				"username", cloud.CredentialAttr{Description: "The username"},
   189  			}, {
   190  				"password", cloud.CredentialAttr{
   191  					Description: "The password",
   192  					Hidden:      true,
   193  				},
   194  			},
   195  		},
   196  	}
   197  }
   198  
   199  func (p *fakeProvider) DetectCredentials() (*cloud.CloudCredential, error) {
   200  	return nil, errors.NotFoundf("credentials")
   201  }