github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/provider/openstack/provider_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package openstack_test 5 6 import ( 7 "flag" 8 "testing" 9 10 gc "gopkg.in/check.v1" 11 "launchpad.net/goose/identity" 12 "launchpad.net/goose/nova" 13 14 "github.com/juju/juju/network" 15 "github.com/juju/juju/provider/openstack" 16 ) 17 18 var live = flag.Bool("live", false, "Include live OpenStack tests") 19 20 func Test(t *testing.T) { 21 if *live { 22 cred, err := identity.CompleteCredentialsFromEnv() 23 if err != nil { 24 t.Fatalf("Error setting up test suite: %s", err.Error()) 25 } 26 registerLiveTests(cred) 27 } 28 registerLocalTests() 29 gc.TestingT(t) 30 } 31 32 // localTests contains tests which do not require a live service or test double to run. 33 type localTests struct{} 34 35 var _ = gc.Suite(&localTests{}) 36 37 // ported from lp:juju/juju/providers/openstack/tests/test_machine.py 38 var addressTests = []struct { 39 summary string 40 floatingIP string 41 private []nova.IPAddress 42 public []nova.IPAddress 43 networks []string 44 expected string 45 failure error 46 }{{ 47 summary: "missing", 48 expected: "", 49 }, { 50 summary: "empty", 51 private: []nova.IPAddress{}, 52 networks: []string{"private"}, 53 expected: "", 54 }, { 55 summary: "private IPv4 only", 56 private: []nova.IPAddress{{4, "192.168.0.1"}}, 57 networks: []string{"private"}, 58 expected: "192.168.0.1", 59 }, { 60 summary: "private IPv6 only", 61 private: []nova.IPAddress{{6, "fc00::1"}}, 62 networks: []string{"private"}, 63 expected: "fc00::1", 64 }, { 65 summary: "private only, both IPv4 and IPv6", 66 private: []nova.IPAddress{{4, "192.168.0.1"}, {6, "fc00::1"}}, 67 networks: []string{"private"}, 68 expected: "192.168.0.1", 69 }, { 70 summary: "private only, both IPv6 and IPv4", 71 private: []nova.IPAddress{{6, "fc00::1"}, {4, "192.168.0.1"}}, 72 networks: []string{"private"}, 73 expected: "fc00::1", 74 }, { 75 summary: "private IPv4 plus (HP cloud)", 76 private: []nova.IPAddress{{4, "10.0.0.1"}, {4, "8.8.4.4"}}, 77 networks: []string{"private"}, 78 expected: "8.8.4.4", 79 }, { 80 summary: "public IPv4 only", 81 public: []nova.IPAddress{{4, "8.8.8.8"}}, 82 networks: []string{"", "public"}, 83 expected: "8.8.8.8", 84 }, { 85 summary: "public IPv6 only", 86 public: []nova.IPAddress{{6, "2001:db8::1"}}, 87 networks: []string{"", "public"}, 88 expected: "2001:db8::1", 89 }, { 90 summary: "public only, both IPv4 and IPv6", 91 public: []nova.IPAddress{{4, "8.8.8.8"}, {6, "2001:db8::1"}}, 92 networks: []string{"", "public"}, 93 expected: "8.8.8.8", 94 }, { 95 summary: "public only, both IPv6 and IPv4", 96 public: []nova.IPAddress{{6, "2001:db8::1"}, {4, "8.8.8.8"}}, 97 networks: []string{"", "public"}, 98 expected: "2001:db8::1", 99 }, { 100 summary: "public and private both IPv4", 101 private: []nova.IPAddress{{4, "10.0.0.4"}}, 102 public: []nova.IPAddress{{4, "8.8.4.4"}}, 103 networks: []string{"private", "public"}, 104 expected: "8.8.4.4", 105 }, { 106 summary: "public and private both IPv6", 107 private: []nova.IPAddress{{6, "fc00::1"}}, 108 public: []nova.IPAddress{{6, "2001:db8::1"}}, 109 networks: []string{"private", "public"}, 110 expected: "2001:db8::1", 111 }, { 112 summary: "public, private, and localhost IPv4", 113 private: []nova.IPAddress{{4, "127.0.0.4"}, {4, "192.168.0.1"}}, 114 public: []nova.IPAddress{{4, "8.8.8.8"}}, 115 networks: []string{"private", "public"}, 116 expected: "8.8.8.8", 117 }, { 118 summary: "public, private, and localhost IPv6", 119 private: []nova.IPAddress{{6, "::1"}, {6, "fc00::1"}}, 120 public: []nova.IPAddress{{6, "2001:db8::1"}}, 121 networks: []string{"private", "public"}, 122 expected: "2001:db8::1", 123 }, { 124 summary: "public, private, and localhost - both IPv4 and IPv6", 125 private: []nova.IPAddress{{4, "127.0.0.4"}, {4, "192.168.0.1"}, {6, "::1"}, {6, "fc00::1"}}, 126 public: []nova.IPAddress{{4, "8.8.8.8"}, {6, "2001:db8::1"}}, 127 networks: []string{"private", "public"}, 128 expected: "8.8.8.8", 129 }, { 130 summary: "public, private, and localhost - both IPv6 and IPv4", 131 private: []nova.IPAddress{{6, "::1"}, {6, "fc00::1"}, {4, "127.0.0.4"}, {4, "192.168.0.1"}}, 132 public: []nova.IPAddress{{6, "2001:db8::1"}, {4, "8.8.8.8"}}, 133 networks: []string{"private", "public"}, 134 expected: "2001:db8::1", 135 }, { 136 summary: "custom only IPv4", 137 private: []nova.IPAddress{{4, "192.168.0.1"}}, 138 networks: []string{"special"}, 139 expected: "192.168.0.1", 140 }, { 141 summary: "custom only IPv6", 142 private: []nova.IPAddress{{6, "fc00::1"}}, 143 networks: []string{"special"}, 144 expected: "fc00::1", 145 }, { 146 summary: "custom only - both IPv4 and IPv6", 147 private: []nova.IPAddress{{4, "192.168.0.1"}, {6, "fc00::1"}}, 148 networks: []string{"special"}, 149 expected: "192.168.0.1", 150 }, { 151 summary: "custom only - both IPv6 and IPv4", 152 private: []nova.IPAddress{{6, "fc00::1"}, {4, "192.168.0.1"}}, 153 networks: []string{"special"}, 154 expected: "fc00::1", 155 }, { 156 summary: "custom and public IPv4", 157 private: []nova.IPAddress{{4, "172.16.0.1"}}, 158 public: []nova.IPAddress{{4, "8.8.8.8"}}, 159 networks: []string{"special", "public"}, 160 expected: "8.8.8.8", 161 }, { 162 summary: "custom and public IPv6", 163 private: []nova.IPAddress{{6, "fc00::1"}}, 164 public: []nova.IPAddress{{6, "2001:db8::1"}}, 165 networks: []string{"special", "public"}, 166 expected: "2001:db8::1", 167 }, { 168 summary: "custom and public - both IPv4 and IPv6", 169 private: []nova.IPAddress{{4, "172.16.0.1"}, {6, "fc00::1"}}, 170 public: []nova.IPAddress{{4, "8.8.8.8"}, {6, "2001:db8::1"}}, 171 networks: []string{"special", "public"}, 172 expected: "8.8.8.8", 173 }, { 174 summary: "custom and public - both IPv6 and IPv4", 175 private: []nova.IPAddress{{6, "fc00::1"}, {4, "172.16.0.1"}}, 176 public: []nova.IPAddress{{6, "2001:db8::1"}, {4, "8.8.8.8"}}, 177 networks: []string{"special", "public"}, 178 expected: "2001:db8::1", 179 }, { 180 summary: "floating and public, same address", 181 floatingIP: "8.8.8.8", 182 public: []nova.IPAddress{{4, "8.8.8.8"}}, 183 networks: []string{"", "public"}, 184 expected: "8.8.8.8", 185 }, { 186 summary: "floating and public, different address", 187 floatingIP: "8.8.4.4", 188 public: []nova.IPAddress{{4, "8.8.8.8"}}, 189 networks: []string{"", "public"}, 190 expected: "8.8.4.4", 191 }, { 192 summary: "floating and private", 193 floatingIP: "8.8.4.4", 194 private: []nova.IPAddress{{4, "10.0.0.1"}}, 195 networks: []string{"private"}, 196 expected: "8.8.4.4", 197 }, { 198 summary: "floating, custom and public", 199 floatingIP: "8.8.4.4", 200 private: []nova.IPAddress{{4, "172.16.0.1"}}, 201 public: []nova.IPAddress{{4, "8.8.8.8"}}, 202 networks: []string{"special", "public"}, 203 expected: "8.8.4.4", 204 }} 205 206 func (t *localTests) TestGetServerAddresses(c *gc.C) { 207 for i, t := range addressTests { 208 c.Logf("#%d. %s -> %s (%v)", i, t.summary, t.expected, t.failure) 209 addresses := make(map[string][]nova.IPAddress) 210 if t.private != nil { 211 if len(t.networks) < 1 { 212 addresses["private"] = t.private 213 } else { 214 addresses[t.networks[0]] = t.private 215 } 216 } 217 if t.public != nil { 218 if len(t.networks) < 2 { 219 addresses["public"] = t.public 220 } else { 221 addresses[t.networks[1]] = t.public 222 } 223 } 224 addr := openstack.InstanceAddress(t.floatingIP, addresses) 225 c.Assert(addr, gc.Equals, t.expected) 226 } 227 } 228 229 func (*localTests) TestPortsToRuleInfo(c *gc.C) { 230 groupId := "groupid" 231 testCases := []struct { 232 about string 233 ports []network.PortRange 234 expected []nova.RuleInfo 235 }{{ 236 about: "single port", 237 ports: []network.PortRange{{ 238 FromPort: 80, 239 ToPort: 80, 240 Protocol: "tcp", 241 }}, 242 expected: []nova.RuleInfo{{ 243 IPProtocol: "tcp", 244 FromPort: 80, 245 ToPort: 80, 246 Cidr: "0.0.0.0/0", 247 ParentGroupId: groupId, 248 }}, 249 }, { 250 about: "multiple ports", 251 ports: []network.PortRange{{ 252 FromPort: 80, 253 ToPort: 82, 254 Protocol: "tcp", 255 }}, 256 expected: []nova.RuleInfo{{ 257 IPProtocol: "tcp", 258 FromPort: 80, 259 ToPort: 82, 260 Cidr: "0.0.0.0/0", 261 ParentGroupId: groupId, 262 }}, 263 }, { 264 about: "multiple port ranges", 265 ports: []network.PortRange{{ 266 FromPort: 80, 267 ToPort: 82, 268 Protocol: "tcp", 269 }, { 270 FromPort: 100, 271 ToPort: 120, 272 Protocol: "tcp", 273 }}, 274 expected: []nova.RuleInfo{{ 275 IPProtocol: "tcp", 276 FromPort: 80, 277 ToPort: 82, 278 Cidr: "0.0.0.0/0", 279 ParentGroupId: groupId, 280 }, { 281 IPProtocol: "tcp", 282 FromPort: 100, 283 ToPort: 120, 284 Cidr: "0.0.0.0/0", 285 ParentGroupId: groupId, 286 }}, 287 }} 288 289 for i, t := range testCases { 290 c.Logf("test %d: %s", i, t.about) 291 rules := openstack.PortsToRuleInfo(groupId, t.ports) 292 c.Check(len(rules), gc.Equals, len(t.expected)) 293 c.Check(rules, gc.DeepEquals, t.expected) 294 } 295 } 296 297 func (*localTests) TestRuleMatchesPortRange(c *gc.C) { 298 proto_tcp := "tcp" 299 proto_udp := "udp" 300 port_80 := 80 301 port_85 := 85 302 303 testCases := []struct { 304 about string 305 ports network.PortRange 306 rule nova.SecurityGroupRule 307 expected bool 308 }{{ 309 about: "single port", 310 ports: network.PortRange{ 311 FromPort: 80, 312 ToPort: 80, 313 Protocol: "tcp", 314 }, 315 rule: nova.SecurityGroupRule{ 316 IPProtocol: &proto_tcp, 317 FromPort: &port_80, 318 ToPort: &port_80, 319 }, 320 expected: true, 321 }, { 322 about: "multiple port", 323 ports: network.PortRange{ 324 FromPort: port_80, 325 ToPort: port_85, 326 Protocol: proto_tcp, 327 }, 328 rule: nova.SecurityGroupRule{ 329 IPProtocol: &proto_tcp, 330 FromPort: &port_80, 331 ToPort: &port_85, 332 }, 333 expected: true, 334 }, { 335 about: "nil rule components", 336 ports: network.PortRange{ 337 FromPort: port_80, 338 ToPort: port_85, 339 Protocol: proto_tcp, 340 }, 341 rule: nova.SecurityGroupRule{ 342 IPProtocol: nil, 343 FromPort: nil, 344 ToPort: nil, 345 }, 346 expected: false, 347 }, { 348 about: "mismatched port range and rule", 349 ports: network.PortRange{ 350 FromPort: port_80, 351 ToPort: port_85, 352 Protocol: proto_tcp, 353 }, 354 rule: nova.SecurityGroupRule{ 355 IPProtocol: &proto_udp, 356 FromPort: &port_80, 357 ToPort: &port_80, 358 }, 359 expected: false, 360 }} 361 for i, t := range testCases { 362 c.Logf("test %d: %s", i, t.about) 363 c.Check(openstack.RuleMatchesPortRange(t.rule, t.ports), gc.Equals, t.expected) 364 } 365 }