github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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 }