github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/featuretests/cmd_juju_subnet_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package featuretests
     5  
     6  import (
     7  	"github.com/juju/cmd"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	jujutesting "github.com/juju/juju/juju/testing"
    12  	"github.com/juju/juju/network"
    13  	"github.com/juju/juju/state"
    14  	"github.com/juju/juju/testing"
    15  )
    16  
    17  type cmdSubnetSuite struct {
    18  	jujutesting.JujuConnSuite
    19  }
    20  
    21  func (s *cmdSubnetSuite) AddSubnet(c *gc.C, info state.SubnetInfo) *state.Subnet {
    22  	subnet, err := s.State.AddSubnet(info)
    23  	c.Assert(err, jc.ErrorIsNil)
    24  	c.Assert(subnet.CIDR(), gc.Equals, info.CIDR)
    25  	return subnet
    26  }
    27  
    28  func (s *cmdSubnetSuite) AddSpace(c *gc.C, name string, ids []string, public bool) *state.Space {
    29  	space, err := s.State.AddSpace(name, "", ids, public)
    30  	c.Assert(err, jc.ErrorIsNil)
    31  	c.Assert(space.Name(), gc.Equals, name)
    32  	subnets, err := space.Subnets()
    33  	c.Assert(err, jc.ErrorIsNil)
    34  	c.Assert(subnets, gc.HasLen, len(ids))
    35  	return space
    36  }
    37  
    38  func (s *cmdSubnetSuite) Run(c *gc.C, expectedError string, args ...string) *cmd.Context {
    39  	context, err := runJujuCommand(c, args...)
    40  	if expectedError != "" {
    41  		c.Assert(err, gc.ErrorMatches, expectedError)
    42  	} else {
    43  		c.Assert(err, jc.ErrorIsNil)
    44  	}
    45  	return context
    46  }
    47  
    48  func (s *cmdSubnetSuite) RunAdd(c *gc.C, expectedError string, args ...string) (string, string, error) {
    49  	cmdArgs := append([]string{"add-subnet"}, args...)
    50  	ctx, err := runJujuCommand(c, cmdArgs...)
    51  	stdout, stderr := "", ""
    52  	if ctx != nil {
    53  		stdout = testing.Stdout(ctx)
    54  		stderr = testing.Stderr(ctx)
    55  	}
    56  	if expectedError != "" {
    57  		c.Assert(err, gc.NotNil)
    58  		c.Assert(stderr, jc.Contains, expectedError)
    59  	}
    60  	return stdout, stderr, err
    61  }
    62  
    63  func (s *cmdSubnetSuite) AssertOutput(c *gc.C, context *cmd.Context, expectedOut, expectedErr string) {
    64  	c.Assert(testing.Stdout(context), gc.Equals, expectedOut)
    65  	c.Assert(testing.Stderr(context), gc.Equals, expectedErr)
    66  }
    67  
    68  func (s *cmdSubnetSuite) TestSubnetAddNoArguments(c *gc.C) {
    69  	expectedError := "invalid arguments specified: either CIDR or provider ID is required"
    70  	s.Run(c, expectedError, "add-subnet")
    71  }
    72  
    73  func (s *cmdSubnetSuite) TestSubnetAddInvalidCIDRTakenAsProviderId(c *gc.C) {
    74  	expectedError := "invalid arguments specified: space name is required"
    75  	s.Run(c, expectedError, "add-subnet", "subnet-xyz")
    76  }
    77  
    78  func (s *cmdSubnetSuite) TestSubnetAddCIDRAndInvalidSpaceName(c *gc.C) {
    79  	expectedError := `invalid arguments specified: " f o o " is not a valid space name`
    80  	s.Run(c, expectedError, "add-subnet", "10.0.0.0/8", " f o o ")
    81  }
    82  
    83  func (s *cmdSubnetSuite) TestSubnetAddAlreadyExistingCIDR(c *gc.C) {
    84  	s.AddSpace(c, "foo", nil, true)
    85  	s.AddSubnet(c, state.SubnetInfo{CIDR: "0.10.0.0/24"})
    86  
    87  	expectedError := `cannot add subnet: adding subnet "0.10.0.0/24": subnet "0.10.0.0/24" already exists`
    88  	s.RunAdd(c, expectedError, "0.10.0.0/24", "foo")
    89  }
    90  
    91  func (s *cmdSubnetSuite) TestSubnetAddValidCIDRUnknownByTheProvider(c *gc.C) {
    92  	expectedError := `cannot add subnet: subnet with CIDR "10.0.0.0/8" not found`
    93  	s.RunAdd(c, expectedError, "10.0.0.0/8", "myspace")
    94  }
    95  
    96  func (s *cmdSubnetSuite) TestSubnetAddWithoutAnySpaces(c *gc.C) {
    97  	expectedError := `cannot add subnet: no spaces defined`
    98  	s.RunAdd(c, expectedError, "0.10.0.0/24", "whatever")
    99  }
   100  
   101  func (s *cmdSubnetSuite) TestSubnetAddWithUnknownSpace(c *gc.C) {
   102  	s.AddSpace(c, "yourspace", nil, true)
   103  
   104  	expectedError := `cannot add subnet: space "myspace" not found`
   105  	s.RunAdd(c, expectedError, "0.10.0.0/24", "myspace")
   106  }
   107  
   108  func (s *cmdSubnetSuite) TestSubnetAddWithoutZonesWhenProviderHasZones(c *gc.C) {
   109  	s.AddSpace(c, "myspace", nil, true)
   110  
   111  	context := s.Run(c, expectedSuccess, "add-subnet", "0.10.0.0/24", "myspace")
   112  	s.AssertOutput(c, context,
   113  		"", // no stdout output
   114  		"added subnet with CIDR \"0.10.0.0/24\" in space \"myspace\"\n",
   115  	)
   116  
   117  	subnet, err := s.State.Subnet("0.10.0.0/24")
   118  	c.Assert(err, jc.ErrorIsNil)
   119  	c.Assert(subnet.CIDR(), gc.Equals, "0.10.0.0/24")
   120  	c.Assert(subnet.SpaceName(), gc.Equals, "myspace")
   121  	c.Assert(subnet.ProviderId(), gc.Equals, network.Id("dummy-private"))
   122  	c.Assert(subnet.AvailabilityZone(), gc.Equals, "zone1")
   123  }
   124  
   125  func (s *cmdSubnetSuite) TestSubnetAddWithUnavailableZones(c *gc.C) {
   126  	s.AddSpace(c, "myspace", nil, true)
   127  
   128  	expectedError := `cannot add subnet: Zones contain unavailable zones: "zone2"`
   129  	s.RunAdd(c, expectedError, "dummy-private", "myspace", "zone1", "zone2")
   130  }
   131  
   132  func (s *cmdSubnetSuite) TestSubnetAddWithZonesWithNoProviderZones(c *gc.C) {
   133  	s.AddSpace(c, "myspace", nil, true)
   134  
   135  	context := s.Run(c, expectedSuccess, "add-subnet", "dummy-public", "myspace", "zone1")
   136  	s.AssertOutput(c, context,
   137  		"", // no stdout output
   138  		"added subnet with ProviderId \"dummy-public\" in space \"myspace\"\n",
   139  	)
   140  
   141  	subnet, err := s.State.Subnet("0.20.0.0/24")
   142  	c.Assert(err, jc.ErrorIsNil)
   143  	c.Assert(subnet.CIDR(), gc.Equals, "0.20.0.0/24")
   144  	c.Assert(subnet.SpaceName(), gc.Equals, "myspace")
   145  	c.Assert(subnet.ProviderId(), gc.Equals, network.Id("dummy-public"))
   146  	c.Assert(subnet.AvailabilityZone(), gc.Equals, "zone1")
   147  }
   148  
   149  func (s *cmdSubnetSuite) TestSubnetListNoResults(c *gc.C) {
   150  	context := s.Run(c, expectedSuccess, "list-subnets")
   151  	s.AssertOutput(c, context,
   152  		"", // no stdout output
   153  		"no subnets to display\n",
   154  	)
   155  }
   156  
   157  func (s *cmdSubnetSuite) TestSubnetListResultsWithFilters(c *gc.C) {
   158  	//	s.AddSpace(c, "myspace", nil, true)
   159  	s.AddSubnet(c, state.SubnetInfo{
   160  		CIDR: "10.0.0.0/8",
   161  	})
   162  	s.AddSubnet(c, state.SubnetInfo{
   163  		CIDR:             "10.10.0.0/16",
   164  		AvailabilityZone: "zone1",
   165  	})
   166  	s.AddSpace(c, "myspace", []string{"10.10.0.0/16"}, true)
   167  
   168  	context := s.Run(c,
   169  		expectedSuccess,
   170  		"subnets", "--zone", "zone1", "--space", "myspace",
   171  	)
   172  	c.Assert(testing.Stderr(context), gc.Equals, "") // no stderr expected
   173  	stdout := testing.Stdout(context)
   174  	c.Assert(stdout, jc.Contains, "subnets:")
   175  	c.Assert(stdout, jc.Contains, "10.10.0.0/16:")
   176  	c.Assert(stdout, jc.Contains, "space: myspace")
   177  	c.Assert(stdout, jc.Contains, "zones:")
   178  	c.Assert(stdout, jc.Contains, "- zone1")
   179  	c.Assert(stdout, gc.Not(jc.Contains), "10.0.0.0/8:")
   180  }