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 }