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