github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/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  	stdtesting "testing"
     8  	"time"
     9  
    10  	gitjujutesting "github.com/juju/testing"
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/environs"
    15  	"github.com/juju/juju/environs/bootstrap"
    16  	"github.com/juju/juju/environs/config"
    17  	"github.com/juju/juju/environs/jujutest"
    18  	envtesting "github.com/juju/juju/environs/testing"
    19  	"github.com/juju/juju/instance"
    20  	jujutesting "github.com/juju/juju/juju/testing"
    21  	"github.com/juju/juju/network"
    22  	"github.com/juju/juju/provider/dummy"
    23  	"github.com/juju/juju/testing"
    24  )
    25  
    26  func TestPackage(t *stdtesting.T) {
    27  	testing.MgoTestPackage(t)
    28  }
    29  
    30  func init() {
    31  	gc.Suite(&liveSuite{
    32  		LiveTests: jujutest.LiveTests{
    33  			TestConfig:     dummy.SampleConfig(),
    34  			CanOpenState:   true,
    35  			HasProvisioner: false,
    36  		},
    37  	})
    38  	gc.Suite(&suite{
    39  		Tests: jujutest.Tests{
    40  			TestConfig: dummy.SampleConfig(),
    41  		},
    42  	})
    43  }
    44  
    45  type liveSuite struct {
    46  	testing.BaseSuite
    47  	gitjujutesting.MgoSuite
    48  	jujutest.LiveTests
    49  }
    50  
    51  func (s *liveSuite) SetUpSuite(c *gc.C) {
    52  	s.BaseSuite.SetUpSuite(c)
    53  	s.MgoSuite.SetUpSuite(c)
    54  	s.LiveTests.SetUpSuite(c)
    55  }
    56  
    57  func (s *liveSuite) TearDownSuite(c *gc.C) {
    58  	s.LiveTests.TearDownSuite(c)
    59  	s.MgoSuite.TearDownSuite(c)
    60  	s.BaseSuite.TearDownSuite(c)
    61  }
    62  
    63  func (s *liveSuite) SetUpTest(c *gc.C) {
    64  	s.BaseSuite.SetUpTest(c)
    65  	s.MgoSuite.SetUpTest(c)
    66  	s.LiveTests.SetUpTest(c)
    67  }
    68  
    69  func (s *liveSuite) TearDownTest(c *gc.C) {
    70  	s.Destroy(c)
    71  	s.LiveTests.TearDownTest(c)
    72  	s.MgoSuite.TearDownTest(c)
    73  	s.BaseSuite.TearDownTest(c)
    74  }
    75  
    76  type suite struct {
    77  	testing.BaseSuite
    78  	gitjujutesting.MgoSuite
    79  	jujutest.Tests
    80  }
    81  
    82  func (s *suite) SetUpSuite(c *gc.C) {
    83  	s.BaseSuite.SetUpSuite(c)
    84  	s.MgoSuite.SetUpSuite(c)
    85  }
    86  
    87  func (s *suite) TearDownSuite(c *gc.C) {
    88  	s.MgoSuite.TearDownSuite(c)
    89  	s.BaseSuite.TearDownSuite(c)
    90  }
    91  
    92  func (s *suite) SetUpTest(c *gc.C) {
    93  	s.BaseSuite.SetUpTest(c)
    94  	s.MgoSuite.SetUpTest(c)
    95  	s.Tests.SetUpTest(c)
    96  }
    97  
    98  func (s *suite) TearDownTest(c *gc.C) {
    99  	s.Tests.TearDownTest(c)
   100  	s.MgoSuite.TearDownTest(c)
   101  	dummy.Reset()
   102  	s.BaseSuite.TearDownTest(c)
   103  }
   104  
   105  func (s *suite) bootstrapTestEnviron(c *gc.C, preferIPv6 bool) environs.NetworkingEnviron {
   106  	s.TestConfig["prefer-ipv6"] = preferIPv6
   107  	cfg, err := config.New(config.NoDefaults, s.TestConfig)
   108  	c.Assert(err, jc.ErrorIsNil)
   109  	env, err := environs.Prepare(cfg, envtesting.BootstrapContext(c), s.ConfigStore)
   110  	c.Assert(err, gc.IsNil, gc.Commentf("preparing environ %#v", s.TestConfig))
   111  	c.Assert(env, gc.NotNil)
   112  	netenv, supported := environs.SupportsNetworking(env)
   113  	c.Assert(supported, jc.IsTrue)
   114  
   115  	err = bootstrap.EnsureNotBootstrapped(netenv)
   116  	c.Assert(err, jc.ErrorIsNil)
   117  	err = bootstrap.Bootstrap(envtesting.BootstrapContext(c), netenv, bootstrap.BootstrapParams{})
   118  	c.Assert(err, jc.ErrorIsNil)
   119  	return netenv
   120  }
   121  
   122  func (s *suite) TestAvailabilityZone(c *gc.C) {
   123  	e := s.bootstrapTestEnviron(c, true)
   124  	defer func() {
   125  		err := e.Destroy()
   126  		c.Assert(err, jc.ErrorIsNil)
   127  	}()
   128  
   129  	inst, hwc := jujutesting.AssertStartInstance(c, e, "0")
   130  	c.Assert(inst, gc.NotNil)
   131  	c.Check(hwc.AvailabilityZone, gc.IsNil)
   132  }
   133  
   134  func (s *suite) TestAllocateAddress(c *gc.C) {
   135  	e := s.bootstrapTestEnviron(c, false)
   136  	defer func() {
   137  		err := e.Destroy()
   138  		c.Assert(err, jc.ErrorIsNil)
   139  	}()
   140  
   141  	inst, _ := jujutesting.AssertStartInstance(c, e, "0")
   142  	c.Assert(inst, gc.NotNil)
   143  	subnetId := network.Id("net1")
   144  
   145  	opc := make(chan dummy.Operation, 200)
   146  	dummy.Listen(opc)
   147  
   148  	newAddress := network.NewAddress("0.1.2.1", network.ScopeCloudLocal)
   149  	err := e.AllocateAddress(inst.Id(), subnetId, newAddress)
   150  	c.Assert(err, jc.ErrorIsNil)
   151  
   152  	assertAllocateAddress(c, e, opc, inst.Id(), subnetId, newAddress)
   153  
   154  	newAddress = network.NewAddress("0.1.2.2", network.ScopeCloudLocal)
   155  	err = e.AllocateAddress(inst.Id(), subnetId, newAddress)
   156  	c.Assert(err, jc.ErrorIsNil)
   157  	assertAllocateAddress(c, e, opc, inst.Id(), subnetId, newAddress)
   158  }
   159  
   160  func (s *suite) TestReleaseAddress(c *gc.C) {
   161  	e := s.bootstrapTestEnviron(c, false)
   162  	defer func() {
   163  		err := e.Destroy()
   164  		c.Assert(err, jc.ErrorIsNil)
   165  	}()
   166  
   167  	inst, _ := jujutesting.AssertStartInstance(c, e, "0")
   168  	c.Assert(inst, gc.NotNil)
   169  	subnetId := network.Id("net1")
   170  
   171  	opc := make(chan dummy.Operation, 200)
   172  	dummy.Listen(opc)
   173  
   174  	address := network.NewAddress("0.1.2.1", network.ScopeCloudLocal)
   175  	err := e.ReleaseAddress(inst.Id(), subnetId, address)
   176  	c.Assert(err, jc.ErrorIsNil)
   177  
   178  	assertReleaseAddress(c, e, opc, inst.Id(), subnetId, address)
   179  
   180  	address = network.NewAddress("0.1.2.2", network.ScopeCloudLocal)
   181  	err = e.ReleaseAddress(inst.Id(), subnetId, address)
   182  	c.Assert(err, jc.ErrorIsNil)
   183  	assertReleaseAddress(c, e, opc, inst.Id(), subnetId, address)
   184  }
   185  
   186  func (s *suite) TestNetworkInterfaces(c *gc.C) {
   187  	e := s.bootstrapTestEnviron(c, false)
   188  	defer func() {
   189  		err := e.Destroy()
   190  		c.Assert(err, jc.ErrorIsNil)
   191  	}()
   192  
   193  	opc := make(chan dummy.Operation, 200)
   194  	dummy.Listen(opc)
   195  
   196  	expectInfo := []network.InterfaceInfo{{
   197  		ProviderId:     "dummy-private",
   198  		NetworkName:    "juju-private",
   199  		CIDR:           "0.1.2.0/24",
   200  		InterfaceName:  "eth0",
   201  		VLANTag:        0,
   202  		MACAddress:     "aa:bb:cc:dd:ee:f0",
   203  		Disabled:       false,
   204  		NoAutoStart:    false,
   205  		ConfigType:     network.ConfigDHCP,
   206  		Address:        network.NewAddress("0.1.2.1", network.ScopeUnknown),
   207  		DNSServers:     network.NewAddresses("ns1.dummy", "ns2.dummy"),
   208  		GatewayAddress: network.NewAddress("0.1.2.1", network.ScopeUnknown),
   209  		ExtraConfig:    nil,
   210  	}, {
   211  		ProviderId:     "dummy-public",
   212  		NetworkName:    "juju-public",
   213  		CIDR:           "0.2.2.0/24",
   214  		InterfaceName:  "eth1",
   215  		VLANTag:        1,
   216  		MACAddress:     "aa:bb:cc:dd:ee:f1",
   217  		Disabled:       true,
   218  		NoAutoStart:    true,
   219  		ConfigType:     network.ConfigDHCP,
   220  		Address:        network.NewAddress("0.2.2.1", network.ScopeUnknown),
   221  		DNSServers:     network.NewAddresses("ns1.dummy", "ns2.dummy"),
   222  		GatewayAddress: network.NewAddress("0.2.2.1", network.ScopeUnknown),
   223  		ExtraConfig:    nil,
   224  	}}
   225  	info, err := e.NetworkInterfaces(instance.Id("i-42"))
   226  	c.Assert(err, jc.ErrorIsNil)
   227  	c.Assert(info, jc.DeepEquals, expectInfo)
   228  	assertInterfaces(c, e, opc, instance.Id("i-42"), expectInfo)
   229  }
   230  
   231  func (s *suite) TestSubnets(c *gc.C) {
   232  	e := s.bootstrapTestEnviron(c, false)
   233  	defer func() {
   234  		err := e.Destroy()
   235  		c.Assert(err, jc.ErrorIsNil)
   236  	}()
   237  
   238  	opc := make(chan dummy.Operation, 200)
   239  	dummy.Listen(opc)
   240  
   241  	expectInfo := []network.SubnetInfo{
   242  		{CIDR: "0.10.0.0/8", ProviderId: "dummy-private"},
   243  		{CIDR: "0.20.0.0/24", ProviderId: "dummy-public"},
   244  	}
   245  	netInfo, err := e.Subnets("", []network.Id{"dummy-private", "dummy-public"})
   246  	c.Assert(err, jc.ErrorIsNil)
   247  	c.Assert(netInfo, jc.DeepEquals, expectInfo)
   248  	assertSubnets(c, e, opc, expectInfo)
   249  }
   250  
   251  func (s *suite) TestPreferIPv6On(c *gc.C) {
   252  	e := s.bootstrapTestEnviron(c, true)
   253  	defer func() {
   254  		err := e.Destroy()
   255  		c.Assert(err, jc.ErrorIsNil)
   256  	}()
   257  
   258  	inst, _ := jujutesting.AssertStartInstance(c, e, "0")
   259  	c.Assert(inst, gc.NotNil)
   260  	addrs, err := inst.Addresses()
   261  	c.Assert(err, jc.ErrorIsNil)
   262  	c.Assert(addrs, jc.DeepEquals, network.NewAddresses("only-0.dns", "127.0.0.1", "fc00::1"))
   263  }
   264  
   265  func (s *suite) TestPreferIPv6Off(c *gc.C) {
   266  	e := s.bootstrapTestEnviron(c, false)
   267  	defer func() {
   268  		err := e.Destroy()
   269  		c.Assert(err, jc.ErrorIsNil)
   270  	}()
   271  
   272  	inst, _ := jujutesting.AssertStartInstance(c, e, "0")
   273  	c.Assert(inst, gc.NotNil)
   274  	addrs, err := inst.Addresses()
   275  	c.Assert(err, jc.ErrorIsNil)
   276  	c.Assert(addrs, jc.DeepEquals, network.NewAddresses("only-0.dns", "127.0.0.1"))
   277  }
   278  
   279  func assertAllocateAddress(c *gc.C, e environs.Environ, opc chan dummy.Operation, expectInstId instance.Id, expectSubnetId network.Id, expectAddress network.Address) {
   280  	select {
   281  	case op := <-opc:
   282  		addrOp, ok := op.(dummy.OpAllocateAddress)
   283  		if !ok {
   284  			c.Fatalf("unexpected op: %#v", op)
   285  		}
   286  		c.Check(addrOp.SubnetId, gc.Equals, expectSubnetId)
   287  		c.Check(addrOp.InstanceId, gc.Equals, expectInstId)
   288  		c.Check(addrOp.Address, gc.Equals, expectAddress)
   289  		return
   290  	case <-time.After(testing.ShortWait):
   291  		c.Fatalf("time out wating for operation")
   292  	}
   293  }
   294  
   295  func assertReleaseAddress(c *gc.C, e environs.Environ, opc chan dummy.Operation, expectInstId instance.Id, expectSubnetId network.Id, expectAddress network.Address) {
   296  	select {
   297  	case op := <-opc:
   298  		addrOp, ok := op.(dummy.OpReleaseAddress)
   299  		if !ok {
   300  			c.Fatalf("unexpected op: %#v", op)
   301  		}
   302  		c.Check(addrOp.SubnetId, gc.Equals, expectSubnetId)
   303  		c.Check(addrOp.InstanceId, gc.Equals, expectInstId)
   304  		c.Check(addrOp.Address, gc.Equals, expectAddress)
   305  		return
   306  	case <-time.After(testing.ShortWait):
   307  		c.Fatalf("time out wating for operation")
   308  	}
   309  }
   310  
   311  func assertInterfaces(c *gc.C, e environs.Environ, opc chan dummy.Operation, expectInstId instance.Id, expectInfo []network.InterfaceInfo) {
   312  	select {
   313  	case op := <-opc:
   314  		netOp, ok := op.(dummy.OpNetworkInterfaces)
   315  		if !ok {
   316  			c.Fatalf("unexpected op: %#v", op)
   317  		}
   318  		c.Check(netOp.Env, gc.Equals, e.Config().Name())
   319  		c.Check(netOp.InstanceId, gc.Equals, expectInstId)
   320  		c.Check(netOp.Info, jc.DeepEquals, expectInfo)
   321  		return
   322  	case <-time.After(testing.ShortWait):
   323  		c.Fatalf("time out wating for operation")
   324  	}
   325  }
   326  
   327  func assertSubnets(c *gc.C, e environs.Environ, opc chan dummy.Operation, expectInfo []network.SubnetInfo) {
   328  	select {
   329  	case op := <-opc:
   330  		netOp, ok := op.(dummy.OpListNetworks)
   331  		if !ok {
   332  			c.Fatalf("unexpected op: %#v", op)
   333  		}
   334  		c.Check(netOp.Info, jc.DeepEquals, expectInfo)
   335  		return
   336  	case <-time.After(testing.ShortWait):
   337  		c.Fatalf("time out wating for operation")
   338  	}
   339  }