github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/modelcmd/base_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package modelcmd_test
     5  
     6  import (
     7  	"io/ioutil"
     8  	"strings"
     9  
    10  	"github.com/juju/cmd"
    11  	"github.com/juju/cmd/cmdtesting"
    12  	"github.com/juju/errors"
    13  	"github.com/juju/testing"
    14  	jc "github.com/juju/testing/checkers"
    15  	gc "gopkg.in/check.v1"
    16  
    17  	"github.com/juju/juju/api"
    18  	"github.com/juju/juju/apiserver/params"
    19  	"github.com/juju/juju/cloud"
    20  	"github.com/juju/juju/cmd/modelcmd"
    21  	"github.com/juju/juju/core/model"
    22  	"github.com/juju/juju/environs"
    23  	"github.com/juju/juju/jujuclient"
    24  	coretesting "github.com/juju/juju/testing"
    25  )
    26  
    27  type BaseCommandSuite struct {
    28  	testing.IsolationSuite
    29  	store *jujuclient.MemStore
    30  }
    31  
    32  var _ = gc.Suite(&BaseCommandSuite{})
    33  
    34  func (s *BaseCommandSuite) SetUpTest(c *gc.C) {
    35  	s.IsolationSuite.SetUpTest(c)
    36  
    37  	s.store = jujuclient.NewMemStore()
    38  	s.store.CurrentControllerName = "foo"
    39  	s.store.Controllers["foo"] = jujuclient.ControllerDetails{
    40  		APIEndpoints: []string{"testing.invalid:1234"},
    41  	}
    42  	s.store.Models["foo"] = &jujuclient.ControllerModels{
    43  		Models: map[string]jujuclient.ModelDetails{
    44  			"admin/badmodel":  {ModelUUID: "deadbeef", ModelType: model.IAAS},
    45  			"admin/goodmodel": {ModelUUID: "deadbeef2", ModelType: model.IAAS},
    46  		},
    47  		CurrentModel: "admin/badmodel",
    48  	}
    49  	s.store.Accounts["foo"] = jujuclient.AccountDetails{
    50  		User: "bar", Password: "hunter2",
    51  	}
    52  }
    53  
    54  func (s *BaseCommandSuite) assertUnknownModel(c *gc.C, baseCmd *modelcmd.ModelCommandBase, current, expectedCurrent string) {
    55  	s.store.Models["foo"].CurrentModel = current
    56  	apiOpen := func(*api.Info, api.DialOpts) (api.Connection, error) {
    57  		return nil, errors.Trace(&params.Error{Code: params.CodeModelNotFound, Message: "model deaddeaf not found"})
    58  	}
    59  	baseCmd.SetClientStore(s.store)
    60  	baseCmd.SetAPIOpen(apiOpen)
    61  	modelcmd.InitContexts(&cmd.Context{Stderr: ioutil.Discard}, baseCmd)
    62  	modelcmd.SetRunStarted(baseCmd)
    63  	baseCmd.SetModelName("foo:admin/badmodel", false)
    64  	conn, err := baseCmd.NewAPIRoot()
    65  	c.Assert(conn, gc.IsNil)
    66  	msg := strings.Replace(err.Error(), "\n", "", -1)
    67  	c.Assert(msg, gc.Equals, `model "admin/badmodel" has been removed from the controller, run 'juju models' and switch to one of them.`)
    68  	c.Assert(s.store.Models["foo"].Models, gc.HasLen, 1)
    69  	c.Assert(s.store.Models["foo"].Models["admin/goodmodel"], gc.DeepEquals,
    70  		jujuclient.ModelDetails{ModelUUID: "deadbeef2", ModelType: model.IAAS})
    71  	c.Assert(s.store.Models["foo"].CurrentModel, gc.Equals, expectedCurrent)
    72  }
    73  
    74  func (s *BaseCommandSuite) TestUnknownModel(c *gc.C) {
    75  	s.assertUnknownModel(c, new(modelcmd.ModelCommandBase), "admin/badmodel", "admin/badmodel")
    76  }
    77  
    78  func (s *BaseCommandSuite) TestUnknownUncachedModel(c *gc.C) {
    79  	baseCmd := new(modelcmd.ModelCommandBase)
    80  	baseCmd.CanClearCurrentModel = false
    81  	baseCmd.RemoveModelFromClientStore(s.store, "foo", "admin/nonexistent")
    82  	// expecting silence in the logs since this model has never been cached.
    83  	c.Assert(c.GetTestLog(), gc.DeepEquals, "")
    84  }
    85  
    86  func (s *BaseCommandSuite) TestUnknownModelCanRemoveCachedCurrent(c *gc.C) {
    87  	baseCmd := new(modelcmd.ModelCommandBase)
    88  	baseCmd.CanClearCurrentModel = true
    89  	s.assertUnknownModel(c, baseCmd, "admin/badmodel", "")
    90  }
    91  
    92  func (s *BaseCommandSuite) TestUnknownModelNotCurrent(c *gc.C) {
    93  	s.assertUnknownModel(c, new(modelcmd.ModelCommandBase), "admin/goodmodel", "admin/goodmodel")
    94  }
    95  
    96  func (s *BaseCommandSuite) TestUnknownModelNotCurrentCanRemoveCachedCurrent(c *gc.C) {
    97  	baseCmd := new(modelcmd.ModelCommandBase)
    98  	baseCmd.CanClearCurrentModel = true
    99  	s.assertUnknownModel(c, baseCmd, "admin/goodmodel", "admin/goodmodel")
   100  }
   101  
   102  type NewGetBootstrapConfigParamsFuncSuite struct {
   103  	testing.IsolationSuite
   104  }
   105  
   106  var _ = gc.Suite(&NewGetBootstrapConfigParamsFuncSuite{})
   107  
   108  func (NewGetBootstrapConfigParamsFuncSuite) TestDetectCredentials(c *gc.C) {
   109  	clientStore := jujuclient.NewMemStore()
   110  	clientStore.Controllers["foo"] = jujuclient.ControllerDetails{}
   111  	clientStore.BootstrapConfig["foo"] = jujuclient.BootstrapConfig{
   112  		Cloud:               "cloud",
   113  		CloudType:           "cloud-type",
   114  		ControllerModelUUID: coretesting.ModelTag.Id(),
   115  		Config: map[string]interface{}{
   116  			"name": "foo",
   117  			"type": "cloud-type",
   118  		},
   119  	}
   120  	var registry mockProviderRegistry
   121  
   122  	f := modelcmd.NewGetBootstrapConfigParamsFunc(
   123  		cmdtesting.Context(c),
   124  		clientStore,
   125  		&registry,
   126  	)
   127  	_, params, err := f("foo")
   128  	c.Assert(err, jc.ErrorIsNil)
   129  	c.Assert(params.Cloud.Credential.Label, gc.Equals, "finalized")
   130  }
   131  
   132  func (NewGetBootstrapConfigParamsFuncSuite) TestCloudCACert(c *gc.C) {
   133  	fakeCert := coretesting.CACert
   134  	clientStore := jujuclient.NewMemStore()
   135  	clientStore.Controllers["foo"] = jujuclient.ControllerDetails{}
   136  	clientStore.BootstrapConfig["foo"] = jujuclient.BootstrapConfig{
   137  		Cloud:               "cloud",
   138  		CloudType:           "cloud-type",
   139  		ControllerModelUUID: coretesting.ModelTag.Id(),
   140  		Config: map[string]interface{}{
   141  			"name": "foo",
   142  			"type": "cloud-type",
   143  		},
   144  		CloudCACertificates: []string{fakeCert},
   145  	}
   146  	var registry mockProviderRegistry
   147  
   148  	f := modelcmd.NewGetBootstrapConfigParamsFunc(
   149  		cmdtesting.Context(c),
   150  		clientStore,
   151  		&registry,
   152  	)
   153  	_, params, err := f("foo")
   154  	c.Assert(err, jc.ErrorIsNil)
   155  	c.Assert(params.Cloud.CACertificates, jc.SameContents, []string{fakeCert})
   156  }
   157  
   158  type mockProviderRegistry struct {
   159  	environs.ProviderRegistry
   160  }
   161  
   162  func (r *mockProviderRegistry) Provider(t string) (environs.EnvironProvider, error) {
   163  	return &mockEnvironProvider{}, nil
   164  }
   165  
   166  type mockEnvironProvider struct {
   167  	environs.EnvironProvider
   168  }
   169  
   170  func (p *mockEnvironProvider) DetectCredentials() (*cloud.CloudCredential, error) {
   171  	return cloud.NewEmptyCloudCredential(), nil
   172  }
   173  
   174  func (p *mockEnvironProvider) FinalizeCredential(
   175  	_ environs.FinalizeCredentialContext,
   176  	args environs.FinalizeCredentialParams,
   177  ) (*cloud.Credential, error) {
   178  	out := args.Credential
   179  	out.Label = "finalized"
   180  	return &out, nil
   181  }
   182  
   183  func (p *mockEnvironProvider) CredentialSchemas() map[cloud.AuthType]cloud.CredentialSchema {
   184  	return map[cloud.AuthType]cloud.CredentialSchema{cloud.EmptyAuthType: {}}
   185  }