github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/agent/fanconfigurer/fanconfigurer_test.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package fanconfigurer_test
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"github.com/juju/cmd/cmdtesting"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  	"gopkg.in/juju/names.v2"
    13  
    14  	"github.com/juju/juju/apiserver/common"
    15  	"github.com/juju/juju/apiserver/facades/agent/fanconfigurer"
    16  	"github.com/juju/juju/apiserver/params"
    17  	apiservertesting "github.com/juju/juju/apiserver/testing"
    18  	"github.com/juju/juju/cmd/modelcmd"
    19  	"github.com/juju/juju/environs/bootstrap"
    20  	"github.com/juju/juju/environs/config"
    21  	"github.com/juju/juju/jujuclient"
    22  	"github.com/juju/juju/provider/dummy"
    23  	"github.com/juju/juju/state"
    24  	"github.com/juju/juju/testing"
    25  )
    26  
    27  type fanconfigurerSuite struct {
    28  	testing.BaseSuite
    29  	testingEnvConfig *config.Config
    30  }
    31  
    32  var _ = gc.Suite(&fanconfigurerSuite{})
    33  
    34  type fakeModelAccessor struct {
    35  	modelConfig      *config.Config
    36  	modelConfigError error
    37  }
    38  
    39  func (*fakeModelAccessor) WatchForModelConfigChanges() state.NotifyWatcher {
    40  	return apiservertesting.NewFakeNotifyWatcher()
    41  }
    42  
    43  func (f *fakeModelAccessor) ModelConfig() (*config.Config, error) {
    44  	if f.modelConfigError != nil {
    45  		return nil, f.modelConfigError
    46  	}
    47  	return f.modelConfig, nil
    48  }
    49  
    50  func (s *fanconfigurerSuite) TearDownTest(c *gc.C) {
    51  	dummy.Reset(c)
    52  	s.BaseSuite.TearDownTest(c)
    53  }
    54  
    55  func (s *fanconfigurerSuite) TestWatchSuccess(c *gc.C) {
    56  	resources := common.NewResources()
    57  	authorizer := apiservertesting.FakeAuthorizer{
    58  		Tag: names.NewMachineTag("0"),
    59  	}
    60  	s.AddCleanup(func(_ *gc.C) { resources.StopAll() })
    61  	e, err := fanconfigurer.NewFanConfigurerAPIForModel(
    62  		&fakeModelAccessor{},
    63  		resources,
    64  		authorizer,
    65  	)
    66  	c.Assert(err, jc.ErrorIsNil)
    67  	result, err := e.WatchForFanConfigChanges()
    68  	c.Assert(err, jc.ErrorIsNil)
    69  	c.Assert(result, gc.DeepEquals, params.NotifyWatchResult{"1", nil})
    70  	c.Assert(resources.Count(), gc.Equals, 1)
    71  }
    72  
    73  func (s *fanconfigurerSuite) TestWatchAuthFailed(c *gc.C) {
    74  	resources := common.NewResources()
    75  	authorizer := apiservertesting.FakeAuthorizer{
    76  		Tag: names.NewUserTag("vito"),
    77  	}
    78  	s.AddCleanup(func(_ *gc.C) { resources.StopAll() })
    79  	_, err := fanconfigurer.NewFanConfigurerAPIForModel(
    80  		&fakeModelAccessor{},
    81  		resources,
    82  		authorizer,
    83  	)
    84  	c.Assert(err, gc.ErrorMatches, "permission denied")
    85  }
    86  
    87  func (s *fanconfigurerSuite) TestFanConfigSuccess(c *gc.C) {
    88  	resources := common.NewResources()
    89  	authorizer := apiservertesting.FakeAuthorizer{
    90  		Tag:        names.NewMachineTag("0"),
    91  		Controller: true,
    92  	}
    93  	s.AddCleanup(func(_ *gc.C) { resources.StopAll() })
    94  	testingEnvConfig := testingEnvConfig(c)
    95  	e, err := fanconfigurer.NewFanConfigurerAPIForModel(
    96  		&fakeModelAccessor{
    97  			modelConfig: testingEnvConfig,
    98  		},
    99  		resources,
   100  		authorizer,
   101  	)
   102  	c.Assert(err, jc.ErrorIsNil)
   103  	result, err := e.FanConfig()
   104  	c.Assert(err, jc.ErrorIsNil)
   105  	c.Assert(result.Fans, gc.HasLen, 2)
   106  	c.Check(result.Fans[0].Underlay, gc.Equals, "10.100.0.0/16")
   107  	c.Check(result.Fans[0].Overlay, gc.Equals, "251.0.0.0/8")
   108  	c.Check(result.Fans[1].Underlay, gc.Equals, "192.168.0.0/16")
   109  	c.Check(result.Fans[1].Overlay, gc.Equals, "252.0.0.0/8")
   110  }
   111  
   112  func (s *fanconfigurerSuite) TestFanConfigFetchError(c *gc.C) {
   113  	resources := common.NewResources()
   114  	authorizer := apiservertesting.FakeAuthorizer{
   115  		Tag:        names.NewMachineTag("0"),
   116  		Controller: true,
   117  	}
   118  	s.AddCleanup(func(_ *gc.C) { resources.StopAll() })
   119  	e, err := fanconfigurer.NewFanConfigurerAPIForModel(
   120  		&fakeModelAccessor{
   121  			modelConfigError: fmt.Errorf("pow"),
   122  		},
   123  		nil,
   124  		authorizer,
   125  	)
   126  	c.Assert(err, jc.ErrorIsNil)
   127  	_, err = e.FanConfig()
   128  	c.Assert(err, gc.ErrorMatches, "pow")
   129  }
   130  
   131  func testingEnvConfig(c *gc.C) *config.Config {
   132  	env, err := bootstrap.PrepareController(
   133  		false,
   134  		modelcmd.BootstrapContext(cmdtesting.Context(c)),
   135  		jujuclient.NewMemStore(),
   136  		bootstrap.PrepareParams{
   137  			ControllerConfig: testing.FakeControllerConfig(),
   138  			ControllerName:   "dummycontroller",
   139  			ModelConfig:      dummy.SampleConfig().Merge(testing.Attrs{"fan-config": "10.100.0.0/16=251.0.0.0/8 192.168.0.0/16=252.0.0.0/8"}),
   140  			Cloud:            dummy.SampleCloudSpec(),
   141  			AdminSecret:      "admin-secret",
   142  		},
   143  	)
   144  	c.Assert(err, jc.ErrorIsNil)
   145  	return env.Config()
   146  }