github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/provider/maas/instance_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package maas
     5  
     6  import (
     7  	"fmt"
     8  
     9  	gc "launchpad.net/gocheck"
    10  
    11  	"github.com/juju/juju/instance"
    12  )
    13  
    14  type instanceTest struct {
    15  	providerSuite
    16  }
    17  
    18  var _ = gc.Suite(&instanceTest{})
    19  
    20  func (s *instanceTest) TestId(c *gc.C) {
    21  	jsonValue := `{"system_id": "system_id", "test": "test"}`
    22  	obj := s.testMAASObject.TestServer.NewNode(jsonValue)
    23  	resourceURI, _ := obj.GetField("resource_uri")
    24  	instance := maasInstance{maasObject: &obj, environ: s.makeEnviron()}
    25  
    26  	c.Check(string(instance.Id()), gc.Equals, resourceURI)
    27  }
    28  
    29  func (s *instanceTest) TestString(c *gc.C) {
    30  	jsonValue := `{"hostname": "thethingintheplace", "system_id": "system_id", "test": "test"}`
    31  	obj := s.testMAASObject.TestServer.NewNode(jsonValue)
    32  	instance := &maasInstance{maasObject: &obj, environ: s.makeEnviron()}
    33  	hostname, err := instance.hostname()
    34  	c.Assert(err, gc.IsNil)
    35  	expected := hostname + ":" + string(instance.Id())
    36  	c.Assert(fmt.Sprint(instance), gc.Equals, expected)
    37  }
    38  
    39  func (s *instanceTest) TestStringWithoutHostname(c *gc.C) {
    40  	// For good measure, test what happens if we don't have a hostname.
    41  	jsonValue := `{"system_id": "system_id", "test": "test"}`
    42  	obj := s.testMAASObject.TestServer.NewNode(jsonValue)
    43  	instance := &maasInstance{maasObject: &obj, environ: s.makeEnviron()}
    44  	_, err := instance.hostname()
    45  	c.Assert(err, gc.NotNil)
    46  	expected := fmt.Sprintf("<DNSName failed: %q>", err) + ":" + string(instance.Id())
    47  	c.Assert(fmt.Sprint(instance), gc.Equals, expected)
    48  }
    49  
    50  func (s *instanceTest) TestRefreshInstance(c *gc.C) {
    51  	jsonValue := `{"system_id": "system_id", "test": "test"}`
    52  	obj := s.testMAASObject.TestServer.NewNode(jsonValue)
    53  	s.testMAASObject.TestServer.ChangeNode("system_id", "test2", "test2")
    54  	instance := maasInstance{maasObject: &obj, environ: s.makeEnviron()}
    55  
    56  	err := instance.Refresh()
    57  
    58  	c.Check(err, gc.IsNil)
    59  	testField, err := (*instance.maasObject).GetField("test2")
    60  	c.Check(err, gc.IsNil)
    61  	c.Check(testField, gc.Equals, "test2")
    62  }
    63  
    64  func (s *instanceTest) TestAddresses(c *gc.C) {
    65  	jsonValue := `{
    66  			"hostname": "testing.invalid",
    67  			"system_id": "system_id",
    68  			"ip_addresses": [ "1.2.3.4", "fe80::d806:dbff:fe23:1199" ]
    69  		}`
    70  	obj := s.testMAASObject.TestServer.NewNode(jsonValue)
    71  	inst := maasInstance{maasObject: &obj, environ: s.makeEnviron()}
    72  
    73  	expected := []instance.Address{
    74  		{Value: "testing.invalid", Type: instance.HostName, NetworkScope: instance.NetworkPublic},
    75  		instance.NewAddress("1.2.3.4", instance.NetworkUnknown),
    76  		instance.NewAddress("fe80::d806:dbff:fe23:1199", instance.NetworkUnknown),
    77  	}
    78  
    79  	addr, err := inst.Addresses()
    80  
    81  	c.Assert(err, gc.IsNil)
    82  	c.Check(addr, gc.DeepEquals, expected)
    83  }
    84  
    85  func (s *instanceTest) TestAddressesMissing(c *gc.C) {
    86  	// Older MAAS versions do not have ip_addresses returned, for these
    87  	// just the DNS name should be returned without error.
    88  	jsonValue := `{
    89  		"hostname": "testing.invalid",
    90  		"system_id": "system_id"
    91  		}`
    92  	obj := s.testMAASObject.TestServer.NewNode(jsonValue)
    93  	inst := maasInstance{maasObject: &obj, environ: s.makeEnviron()}
    94  
    95  	addr, err := inst.Addresses()
    96  	c.Assert(err, gc.IsNil)
    97  	c.Check(addr, gc.DeepEquals, []instance.Address{
    98  		{Value: "testing.invalid", Type: instance.HostName, NetworkScope: instance.NetworkPublic},
    99  	})
   100  }
   101  
   102  func (s *instanceTest) TestAddressesInvalid(c *gc.C) {
   103  	jsonValue := `{
   104  		"hostname": "testing.invalid",
   105  		"system_id": "system_id",
   106  		"ip_addresses": "incompatible"
   107  		}`
   108  	obj := s.testMAASObject.TestServer.NewNode(jsonValue)
   109  	inst := maasInstance{maasObject: &obj, environ: s.makeEnviron()}
   110  
   111  	_, err := inst.Addresses()
   112  	c.Assert(err, gc.NotNil)
   113  }
   114  
   115  func (s *instanceTest) TestAddressesInvalidContents(c *gc.C) {
   116  	jsonValue := `{
   117  		"hostname": "testing.invalid",
   118  		"system_id": "system_id",
   119  		"ip_addresses": [42]
   120  		}`
   121  	obj := s.testMAASObject.TestServer.NewNode(jsonValue)
   122  	inst := maasInstance{maasObject: &obj, environ: s.makeEnviron()}
   123  
   124  	_, err := inst.Addresses()
   125  	c.Assert(err, gc.NotNil)
   126  }