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  }