github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/provider/dummy/environs_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package dummy_test
     5  
     6  import (
     7  	"strings"
     8  	stdtesting "testing"
     9  	"time"
    10  
    11  	"github.com/juju/errors"
    12  	gitjujutesting "github.com/juju/testing"
    13  	jc "github.com/juju/testing/checkers"
    14  	gc "gopkg.in/check.v1"
    15  
    16  	"github.com/juju/juju/cloud"
    17  	"github.com/juju/juju/environs"
    18  	"github.com/juju/juju/environs/bootstrap"
    19  	"github.com/juju/juju/environs/jujutest"
    20  	sstesting "github.com/juju/juju/environs/simplestreams/testing"
    21  	envtesting "github.com/juju/juju/environs/testing"
    22  	"github.com/juju/juju/instance"
    23  	"github.com/juju/juju/juju/keys"
    24  	jujutesting "github.com/juju/juju/juju/testing"
    25  	"github.com/juju/juju/network"
    26  	"github.com/juju/juju/provider/dummy"
    27  	"github.com/juju/juju/testing"
    28  	jujuversion "github.com/juju/juju/version"
    29  )
    30  
    31  const AdminSecret = "admin-secret"
    32  
    33  func TestPackage(t *stdtesting.T) {
    34  	testing.MgoTestPackage(t)
    35  }
    36  
    37  func init() {
    38  	gc.Suite(&liveSuite{
    39  		LiveTests: jujutest.LiveTests{
    40  			TestConfig:     dummy.SampleConfig(),
    41  			CanOpenState:   true,
    42  			HasProvisioner: false,
    43  		},
    44  	})
    45  	gc.Suite(&suite{
    46  		Tests: jujutest.Tests{
    47  			TestConfig: dummy.SampleConfig(),
    48  		},
    49  	})
    50  }
    51  
    52  type liveSuite struct {
    53  	testing.BaseSuite
    54  	gitjujutesting.MgoSuite
    55  	jujutest.LiveTests
    56  }
    57  
    58  func (s *liveSuite) SetUpSuite(c *gc.C) {
    59  	s.BaseSuite.SetUpSuite(c)
    60  	s.MgoSuite.SetUpSuite(c)
    61  	s.LiveTests.SetUpSuite(c)
    62  	s.BaseSuite.PatchValue(&keys.JujuPublicKey, sstesting.SignedMetadataPublicKey)
    63  }
    64  
    65  func (s *liveSuite) TearDownSuite(c *gc.C) {
    66  	s.LiveTests.TearDownSuite(c)
    67  	s.MgoSuite.TearDownSuite(c)
    68  	s.BaseSuite.TearDownSuite(c)
    69  }
    70  
    71  func (s *liveSuite) SetUpTest(c *gc.C) {
    72  	s.BaseSuite.SetUpTest(c)
    73  	s.MgoSuite.SetUpTest(c)
    74  	s.LiveTests.SetUpTest(c)
    75  	s.BaseSuite.PatchValue(&dummy.LogDir, c.MkDir())
    76  }
    77  
    78  func (s *liveSuite) TearDownTest(c *gc.C) {
    79  	s.Destroy(c)
    80  	s.LiveTests.TearDownTest(c)
    81  	s.MgoSuite.TearDownTest(c)
    82  	s.BaseSuite.TearDownTest(c)
    83  }
    84  
    85  type suite struct {
    86  	testing.BaseSuite
    87  	gitjujutesting.MgoSuite
    88  	jujutest.Tests
    89  }
    90  
    91  func (s *suite) SetUpSuite(c *gc.C) {
    92  	s.BaseSuite.SetUpSuite(c)
    93  	s.MgoSuite.SetUpSuite(c)
    94  }
    95  
    96  func (s *suite) TearDownSuite(c *gc.C) {
    97  	s.MgoSuite.TearDownSuite(c)
    98  	s.BaseSuite.TearDownSuite(c)
    99  }
   100  
   101  func (s *suite) SetUpTest(c *gc.C) {
   102  	s.BaseSuite.SetUpTest(c)
   103  	s.PatchValue(&jujuversion.Current, testing.FakeVersionNumber)
   104  	s.MgoSuite.SetUpTest(c)
   105  	s.Tests.SetUpTest(c)
   106  	s.PatchValue(&dummy.LogDir, c.MkDir())
   107  }
   108  
   109  func (s *suite) TearDownTest(c *gc.C) {
   110  	s.Tests.TearDownTest(c)
   111  	s.MgoSuite.TearDownTest(c)
   112  	dummy.Reset(c)
   113  	s.BaseSuite.TearDownTest(c)
   114  }
   115  
   116  func (s *suite) bootstrapTestEnviron(c *gc.C) environs.NetworkingEnviron {
   117  	env, err := bootstrap.Prepare(
   118  		envtesting.BootstrapContext(c),
   119  		s.ControllerStore,
   120  		bootstrap.PrepareParams{
   121  			ControllerConfig: testing.FakeControllerConfig(),
   122  			ModelConfig:      s.TestConfig,
   123  			ControllerName:   s.TestConfig["name"].(string),
   124  			Cloud:            dummy.SampleCloudSpec(),
   125  			AdminSecret:      AdminSecret,
   126  		},
   127  	)
   128  	c.Assert(err, gc.IsNil, gc.Commentf("preparing environ %#v", s.TestConfig))
   129  	c.Assert(env, gc.NotNil)
   130  	netenv, supported := environs.SupportsNetworking(env)
   131  	c.Assert(supported, jc.IsTrue)
   132  
   133  	err = bootstrap.Bootstrap(envtesting.BootstrapContext(c), netenv, bootstrap.BootstrapParams{
   134  		ControllerConfig: testing.FakeControllerConfig(),
   135  		CloudName:        "dummy",
   136  		Cloud: cloud.Cloud{
   137  			Type:      "dummy",
   138  			AuthTypes: []cloud.AuthType{cloud.EmptyAuthType},
   139  		},
   140  		AdminSecret:  AdminSecret,
   141  		CAPrivateKey: testing.CAKey,
   142  	})
   143  	c.Assert(err, jc.ErrorIsNil)
   144  	return netenv
   145  }
   146  
   147  func (s *suite) TestAvailabilityZone(c *gc.C) {
   148  	e := s.bootstrapTestEnviron(c)
   149  	defer func() {
   150  		err := e.Destroy()
   151  		c.Assert(err, jc.ErrorIsNil)
   152  	}()
   153  
   154  	inst, hwc := jujutesting.AssertStartInstance(c, e, s.ControllerUUID, "0")
   155  	c.Assert(inst, gc.NotNil)
   156  	c.Check(hwc.AvailabilityZone, gc.IsNil)
   157  }
   158  
   159  func (s *suite) TestSupportsSpaces(c *gc.C) {
   160  	e := s.bootstrapTestEnviron(c)
   161  	defer func() {
   162  		err := e.Destroy()
   163  		c.Assert(err, jc.ErrorIsNil)
   164  	}()
   165  
   166  	// Without change spaces are supported.
   167  	ok, err := e.SupportsSpaces()
   168  	c.Assert(ok, jc.IsTrue)
   169  	c.Assert(err, jc.ErrorIsNil)
   170  
   171  	// Now turn it off.
   172  	isEnabled := dummy.SetSupportsSpaces(false)
   173  	c.Assert(isEnabled, jc.IsTrue)
   174  	ok, err = e.SupportsSpaces()
   175  	c.Assert(ok, jc.IsFalse)
   176  	c.Assert(err, jc.Satisfies, errors.IsNotSupported)
   177  
   178  	// And finally turn it on again.
   179  	isEnabled = dummy.SetSupportsSpaces(true)
   180  	c.Assert(isEnabled, jc.IsFalse)
   181  	ok, err = e.SupportsSpaces()
   182  	c.Assert(ok, jc.IsTrue)
   183  	c.Assert(err, jc.ErrorIsNil)
   184  }
   185  
   186  func (s *suite) TestSupportsSpaceDiscovery(c *gc.C) {
   187  	e := s.bootstrapTestEnviron(c)
   188  	defer func() {
   189  		err := e.Destroy()
   190  		c.Assert(err, jc.ErrorIsNil)
   191  	}()
   192  
   193  	// Without change space discovery is not supported.
   194  	ok, err := e.SupportsSpaceDiscovery()
   195  	c.Assert(ok, jc.IsFalse)
   196  	c.Assert(err, jc.ErrorIsNil)
   197  
   198  	// Now turn it on.
   199  	isEnabled := dummy.SetSupportsSpaceDiscovery(true)
   200  	c.Assert(isEnabled, jc.IsFalse)
   201  	ok, err = e.SupportsSpaceDiscovery()
   202  	c.Assert(ok, jc.IsTrue)
   203  	c.Assert(err, jc.ErrorIsNil)
   204  
   205  	// And finally turn it off again.
   206  	isEnabled = dummy.SetSupportsSpaceDiscovery(false)
   207  	c.Assert(isEnabled, jc.IsTrue)
   208  	ok, err = e.SupportsSpaceDiscovery()
   209  	c.Assert(ok, jc.IsFalse)
   210  	c.Assert(err, jc.ErrorIsNil)
   211  }
   212  
   213  func (s *suite) breakMethods(c *gc.C, e environs.NetworkingEnviron, names ...string) {
   214  	cfg := e.Config()
   215  	brokenCfg, err := cfg.Apply(map[string]interface{}{
   216  		"broken": strings.Join(names, " "),
   217  	})
   218  	c.Assert(err, jc.ErrorIsNil)
   219  	err = e.SetConfig(brokenCfg)
   220  	c.Assert(err, jc.ErrorIsNil)
   221  }
   222  
   223  func (s *suite) TestNetworkInterfaces(c *gc.C) {
   224  	e := s.bootstrapTestEnviron(c)
   225  	defer func() {
   226  		err := e.Destroy()
   227  		c.Assert(err, jc.ErrorIsNil)
   228  	}()
   229  
   230  	opc := make(chan dummy.Operation, 200)
   231  	dummy.Listen(opc)
   232  
   233  	expectInfo := []network.InterfaceInfo{{
   234  		ProviderId:       "dummy-eth0",
   235  		ProviderSubnetId: "dummy-private",
   236  		CIDR:             "0.10.0.0/24",
   237  		DeviceIndex:      0,
   238  		InterfaceName:    "eth0",
   239  		InterfaceType:    "ethernet",
   240  		VLANTag:          0,
   241  		MACAddress:       "aa:bb:cc:dd:ee:f0",
   242  		Disabled:         false,
   243  		NoAutoStart:      false,
   244  		ConfigType:       network.ConfigDHCP,
   245  		Address:          network.NewAddress("0.10.0.2"),
   246  		DNSServers:       network.NewAddresses("ns1.dummy", "ns2.dummy"),
   247  		GatewayAddress:   network.NewAddress("0.10.0.1"),
   248  	}, {
   249  		ProviderId:       "dummy-eth1",
   250  		ProviderSubnetId: "dummy-public",
   251  		CIDR:             "0.20.0.0/24",
   252  		DeviceIndex:      1,
   253  		InterfaceName:    "eth1",
   254  		InterfaceType:    "ethernet",
   255  		VLANTag:          1,
   256  		MACAddress:       "aa:bb:cc:dd:ee:f1",
   257  		Disabled:         false,
   258  		NoAutoStart:      true,
   259  		ConfigType:       network.ConfigDHCP,
   260  		Address:          network.NewAddress("0.20.0.2"),
   261  		DNSServers:       network.NewAddresses("ns1.dummy", "ns2.dummy"),
   262  		GatewayAddress:   network.NewAddress("0.20.0.1"),
   263  	}, {
   264  		ProviderId:       "dummy-eth2",
   265  		ProviderSubnetId: "dummy-disabled",
   266  		CIDR:             "0.30.0.0/24",
   267  		DeviceIndex:      2,
   268  		InterfaceName:    "eth2",
   269  		InterfaceType:    "ethernet",
   270  		VLANTag:          2,
   271  		MACAddress:       "aa:bb:cc:dd:ee:f2",
   272  		Disabled:         true,
   273  		NoAutoStart:      false,
   274  		ConfigType:       network.ConfigDHCP,
   275  		Address:          network.NewAddress("0.30.0.2"),
   276  		DNSServers:       network.NewAddresses("ns1.dummy", "ns2.dummy"),
   277  		GatewayAddress:   network.NewAddress("0.30.0.1"),
   278  	}}
   279  	info, err := e.NetworkInterfaces("i-42")
   280  	c.Assert(err, jc.ErrorIsNil)
   281  	c.Assert(info, jc.DeepEquals, expectInfo)
   282  	assertInterfaces(c, e, opc, "i-42", expectInfo)
   283  
   284  	// Test we can induce errors.
   285  	s.breakMethods(c, e, "NetworkInterfaces")
   286  	info, err = e.NetworkInterfaces("i-any")
   287  	c.Assert(err, gc.ErrorMatches, `dummy\.NetworkInterfaces is broken`)
   288  	c.Assert(info, gc.HasLen, 0)
   289  }
   290  
   291  func (s *suite) TestSubnets(c *gc.C) {
   292  	e := s.bootstrapTestEnviron(c)
   293  	defer func() {
   294  		err := e.Destroy()
   295  		c.Assert(err, jc.ErrorIsNil)
   296  	}()
   297  
   298  	opc := make(chan dummy.Operation, 200)
   299  	dummy.Listen(opc)
   300  
   301  	expectInfo := []network.SubnetInfo{{
   302  		CIDR:              "0.10.0.0/24",
   303  		ProviderId:        "dummy-private",
   304  		AvailabilityZones: []string{"zone1", "zone2"},
   305  	}, {
   306  		CIDR:       "0.20.0.0/24",
   307  		ProviderId: "dummy-public",
   308  	}}
   309  
   310  	ids := []network.Id{"dummy-private", "dummy-public", "foo-bar"}
   311  	netInfo, err := e.Subnets("i-foo", ids)
   312  	c.Assert(err, jc.ErrorIsNil)
   313  	c.Assert(netInfo, jc.DeepEquals, expectInfo)
   314  	assertSubnets(c, e, opc, "i-foo", ids, expectInfo)
   315  
   316  	// Test filtering by id(s).
   317  	netInfo, err = e.Subnets("i-foo", nil)
   318  	c.Assert(err, jc.ErrorIsNil)
   319  	c.Assert(netInfo, jc.DeepEquals, expectInfo)
   320  	assertSubnets(c, e, opc, "i-foo", nil, expectInfo)
   321  	netInfo, err = e.Subnets("i-foo", ids[0:1])
   322  	c.Assert(err, jc.ErrorIsNil)
   323  	c.Assert(netInfo, jc.DeepEquals, expectInfo[0:1])
   324  	assertSubnets(c, e, opc, "i-foo", ids[0:1], expectInfo[0:1])
   325  	netInfo, err = e.Subnets("i-foo", ids[1:])
   326  	c.Assert(err, jc.ErrorIsNil)
   327  	c.Assert(netInfo, jc.DeepEquals, expectInfo[1:])
   328  	assertSubnets(c, e, opc, "i-foo", ids[1:], expectInfo[1:])
   329  
   330  	// Test we can induce errors.
   331  	s.breakMethods(c, e, "Subnets")
   332  	netInfo, err = e.Subnets("i-any", nil)
   333  	c.Assert(err, gc.ErrorMatches, `dummy\.Subnets is broken`)
   334  	c.Assert(netInfo, gc.HasLen, 0)
   335  }
   336  
   337  func assertInterfaces(c *gc.C, e environs.Environ, opc chan dummy.Operation, expectInstId instance.Id, expectInfo []network.InterfaceInfo) {
   338  	select {
   339  	case op := <-opc:
   340  		netOp, ok := op.(dummy.OpNetworkInterfaces)
   341  		if !ok {
   342  			c.Fatalf("unexpected op: %#v", op)
   343  		}
   344  		c.Check(netOp.Env, gc.Equals, e.Config().Name())
   345  		c.Check(netOp.InstanceId, gc.Equals, expectInstId)
   346  		c.Check(netOp.Info, jc.DeepEquals, expectInfo)
   347  		return
   348  	case <-time.After(testing.ShortWait):
   349  		c.Fatalf("time out wating for operation")
   350  	}
   351  }
   352  
   353  func assertSubnets(
   354  	c *gc.C,
   355  	e environs.Environ,
   356  	opc chan dummy.Operation,
   357  	instId instance.Id,
   358  	subnetIds []network.Id,
   359  	expectInfo []network.SubnetInfo,
   360  ) {
   361  	select {
   362  	case op := <-opc:
   363  		netOp, ok := op.(dummy.OpSubnets)
   364  		if !ok {
   365  			c.Fatalf("unexpected op: %#v", op)
   366  		}
   367  		c.Check(netOp.InstanceId, gc.Equals, instId)
   368  		c.Check(netOp.SubnetIds, jc.DeepEquals, subnetIds)
   369  		c.Check(netOp.Info, jc.DeepEquals, expectInfo)
   370  		return
   371  	case <-time.After(testing.ShortWait):
   372  		c.Fatalf("time out wating for operation")
   373  	}
   374  }