vcloud-edge_gateway 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,8 +1,14 @@
1
+ ## 0.2.2 (2014-03-05)
2
+
3
+ Bugfixes:
4
+
5
+ - Default healthcheck URI is now '/'. Previous default caused incorrect 'OPTIONS *' query [#66941992]
6
+
1
7
  ## 0.2.1 (2014-02-27)
2
8
 
3
9
  Bugfixes:
4
10
 
5
- - [#66591522] Firewall rules with 'protocol: any' broken
11
+ - Now handles firewall rules with 'protocol: any' correctly [#66591522]
6
12
 
7
13
  ## 0.2.0 (2014-02-21)
8
14
 
data/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # vCloud Edge Gateway
2
2
 
3
- vCloud Edge Gateway is a tool that supports automated provisiong of a VMware vCloud Edge Gateway. It depends on [vCloud Core](https://github.com/alphagov/vcloud-core) and uses Fog under the hood.
3
+ vCloud Edge Gateway is a CLI tool and Ruby library that supports automated
4
+ provisiong of a VMware vCloud Director Edge Gateway appliance. It depends on
5
+ [vCloud Core](https://rubygems.org/gems/vcloud-core) and uses
6
+ [Fog](http://fog.io) under the hood.
4
7
 
5
8
  ## Installation
6
9
 
@@ -22,6 +25,7 @@ To configure an Edge Gateway:
22
25
 
23
26
  $ vcloud-configure-edge input.yaml
24
27
 
28
+
25
29
  ## Contributing
26
30
 
27
31
  1. Fork it
@@ -30,160 +34,196 @@ To configure an Edge Gateway:
30
34
  4. Push to the branch (`git push origin my-new-feature`)
31
35
  5. Create new Pull Request
32
36
 
33
- #Below here, rules are out of date - they will be updated shortly
34
37
 
35
- ###Configure edge gateway services
38
+ ### Configure edge gateway services
39
+
40
+ You can configure the following services on an existing edgegateway using
41
+ `vcloud-configure-edge`.
42
+
43
+ - firewall_service
44
+ - nat_service
45
+ - load_balancer_service
46
+
47
+ NB: DHCP and VPN Services are not yet supported by the Fog platform underneath.
48
+ Support for these is being considered.
49
+
50
+ The `vcloud-configure-edge` tool takes an input YAML file describing one
51
+ or more of these services and updates the edge gateway configuration to match,
52
+ obeying the following rules:
53
+
54
+ * A given service will not be reconfigured if its input configuration matches
55
+ the live configuration - to prevent unneccessary service reloads.
56
+ * If a service is not defined in the input config, it will not be updated on
57
+ the remote edge gateway - to permit per-service configurations.
58
+ * If more than one service is defined and have changed, then all changed
59
+ services will be updated in the same API request.
60
+
61
+ #### firewall_service
62
+
63
+ The edge gateway firewall service offers basic inbound and outbound
64
+ IPv4 firewall rules, applied on top of a default policy.
65
+
66
+ We default to the global firewall policy being 'drop', and each individual
67
+ rule to be 'allow'. Rules are applied in order, with the last match winning.
68
+
69
+ Each rule has the following form:
70
+
71
+ ```
72
+ - description: "Description of your rule"
73
+ destination_port_range: "53" # defaults to 'Any'
74
+ destination_ip: "192.0.2.15"
75
+ source_ip: "Any"
76
+ source_port_range: "1024-65535" # defaults to 'Any'
77
+ protocol: 'udp' # defaults to 'tcp'
78
+ policy: 'allow' # defaults to 'drop'
79
+ ```
80
+
81
+ Rule fields have the following behaviour
82
+
83
+ * `policy` defaults to 'allow', can also be 'drop'.
84
+ * `protocol` defaults to 'tcp'. Can be 'icmp', 'udp', 'tcp+udp' or 'any'
85
+ * `source_port_range` and `destination_port_range` can be `Any` (default),
86
+ a single port number (eg '443'), or a port range such as '10000-20000'
87
+ * `source_ip` and `destination_ip` *must* be specified.
88
+ * `source_ip` and `destination_ip` can be one of:
89
+ * `Any` to match any address.
90
+ * `external`, or `internal` to refer to addresses on the respective 'sides'
91
+ of the edge gateway.
92
+ * A single IP address, such as `192.0.2.44`
93
+ * A CIDR range, eg `192.0.2.0/24`
94
+ * A hyphened range, such as `192.0.2.50-192.0.2.60`
95
+
96
+ #### nat_service
97
+
98
+ The edge gateway NAT service offers simple stateful Source-NAT and
99
+ Destination-NAT rules.
100
+
101
+ SNAT rules take a source IP address range and 'Translated IP address'. The translated
102
+ address is generally the public address that you wish traffic to appear to be
103
+ coming from. SNAT rules are typically used to enable outbound connectivity from
104
+ a private address range behind the edge. The UUID of the external network that
105
+ the traffic should appear to come from must also be specified, as per the
106
+ `network_id` field below.
107
+
108
+ A SNAT rule has the following form:
109
+
110
+ ```
111
+ - rule_type: 'SNAT'
112
+ network_id: '12345678-1234-1234-1234-1234567890bb' # id of EdgeGateway external network
113
+ original_ip: "10.10.10.0/24" # internal IP range
114
+ translated_ip: "192.0.2.100
115
+ ```
116
+
117
+ * `original_ip` can be a single IP address, a CIDR range, or a hyphenated
118
+ IP range.
119
+ * `network_id` must be the UUID of the network on which the `translated_ip` sits.
120
+ Instructions are in the [finding external network
121
+ details](#finding-external-network-details-from-vcloud-walk) section below.
122
+ * `translated_ip` must be an available address on the network specified by
123
+ `network_id`
124
+
36
125
 
37
- You can configure following services on an existing edgegateway using fog.
38
- - FirewallService
39
- - NatService
40
- - LoadBalancerService
126
+ DNAT rules translate packets addressed to a particular destination IP (and
127
+ typically port) and translate it to an internal address - they are usually
128
+ defined to allow external hosts to connect to services on hosts with private IP
129
+ addresses.
41
130
 
42
- ###How to configure:
131
+ A DNAT rule has the following form, and translates packets going to the
132
+ `original_ip` (and `original_port`) to the `translated_ip` and
133
+ `translated_port` values.
43
134
 
44
- ```ruby
45
- require 'fog'
46
- vcloud = Fog::Compute::VcloudDirector.new
47
- vcloud.post_configure_edge_gateway_services edge_gateway_id, configuration
48
- vcloud.process_task(task.body)
49
135
  ```
136
+ - rule_type: 'DNAT'
137
+ network_id: '12345678-1234-1234-1234-1234567890bb' # id of EdgeGateway external network
138
+ original_ip: "192.0.2.98" # Useable address on external network
139
+ original_port: "22" # external port
140
+ translated_ip: "10.10.10.10" # internal address to DNAT to
141
+ translated_port: "22"
142
+ ```
143
+
144
+ * `network_id` specifies the UUID of the external network that packets are
145
+ translated from.
146
+ * `original_ip` is an IP address on the external network above.
147
+
148
+ #### load_balancer_service
149
+
150
+ The load balancer service comprises two sets of configurations: 'pools' and
151
+ 'virtual_servers'. These are coupled together to form a load balanced service:
152
+
153
+ * A virtual_server provides the front-end of a load balancer - the port and
154
+ IP that clients connect to.
155
+ * A pool is a collection of one or more back-end nodes (IP+port combination)
156
+ that traffic is balanced across.
157
+ * Each virtual_server entry specifies a pool that serves requests destined to
158
+ it.
159
+ * Multiple virtual_servers can specify the same pool (to run the same service
160
+ on different FQDNs, for example)
161
+
162
+ A typical load balancer configuration (for one service) would look something like:
50
163
 
51
- The Configuration contain definitions of any of the services listed.Details of service configurations may vary,
52
- but the mechanism is the same for updating any Edge Gateway service.<br/>You can include one or more services when you configure an Edge Gateway.
53
-
54
- ###Examples:
55
-
56
- Service examples, to be used in place of the `configuration` object above.
57
-
58
- Firewall:
59
- ```ruby
60
- configuration = {
61
- :FirewallService => {
62
- :IsEnabled => true,
63
- :DefaultAction => 'allow',
64
- :LogDefaultAction => false,
65
- :FirewallRule => [
66
- {
67
- :Policy => 'allow',
68
- :Description => 'description',
69
- :Protocols => {:Tcp => true},
70
- :Port => 22,
71
- :DestinationPortRange => 22,
72
- :DestinationIp => 'Internal',
73
- :SourcePort => 22,
74
- :SourceIp => 'External',
75
- :SourcePortRange => '22'
76
- }
77
- ]
78
- }
79
- }
80
164
  ```
165
+ load_balancer_service:
166
+
167
+ pools:
168
+ - name: 'example-pool-1'
169
+ description: 'A pool balancing traffic across backend nodes on port 8080'
170
+ service:
171
+ http:
172
+ port: 8080
173
+ members:
174
+ - ip_address: 10.10.10.11
175
+ - ip_address: 10.10.10.12
176
+ - ip_address: 10.10.10.13
177
+
178
+ virtual_servers:
179
+ - name: 'example-virtual-server-1'
180
+ description: 'A virtual server connecting to example-pool-1'
181
+ ip_address: 192.0.2.10
182
+ network: '12345678-1234-1234-1234-123456789012' # id of external network
183
+ pool: 'example-pool-1' # must refer to a pool name detailed above
184
+ service_profiles:
185
+ http: # protocol to balance, can be tcp/http/https.
186
+ port: '80' # external port
187
+ ```
188
+
189
+ ### Finding external network details from vcloud-walk
81
190
 
82
- Load balancer:
83
- ```ruby
84
- configuration = {
85
- :LoadBalancerService => {
86
- :IsEnabled => "true",
87
- :Pool => [
88
- {
89
- :Name => 'web-app',
90
- :ServicePort => [
91
- {
92
- :IsEnabled => "true",
93
- :Protocol => "HTTP",
94
- :Algorithm => "ROUND_ROBIN",
95
- :Port => 80,
96
- :HealthCheckPort => 80,
97
- :HealthCheck => {
98
- :Mode => "HTTP", :HealthThreshold => 1, :UnhealthThreshold => 6, :Interval => 20, :Timeout => 25
99
- }
100
- },
101
- {
102
- :IsEnabled => true,
103
- :Protocol => "HTTPS",
104
- :Algorithm => "ROUND_ROBIN",
105
- :Port => 443,
106
- :HealthCheckPort => 443,
107
- :HealthCheck => {
108
- :Mode => "SSL", :HealthThreshold => 1, :UnhealthThreshold => 6, :Interval => 20, :Timeout => 25
109
- }
110
- }
111
- ],
112
- :Member => [
113
- {
114
- :IpAddress => "192.0.2.0",
115
- :Weight => 1,
116
- :ServicePort => [
117
- {:Protocol => "HTTP", :Port => 80, :HealthCheckPort => 80}
118
- ]
119
- }
120
- ]
121
- }
122
- ],
123
- :VirtualServer => [
124
- {
125
- :IsEnabled => "true",
126
- :Name => "app1",
127
- :Description => "app1",
128
- :Interface => {:name => "Default", :href => "https://vmware.api.net/api/admin/network/2ad93597-7b54-43dd-9eb1-631dd337e5a7"},
129
- :IpAddress => '192.0.2.0',
130
- :ServiceProfile => [
131
- {:IsEnabled => "true", :Protocol => "HTTP", :Port => 80, :Persistence => {:Method => ""}},
132
- {:IsEnabled => "true", :Protocol => "HTTPS", :Port => 443, :Persistence => {:Method => ""}}
133
- ],
134
- :Logging => false,
135
- :Pool => 'web-app'
136
- }
137
- ]
138
- }
139
- }
191
+ You can find the network UUID and external address allocations using [vCloud
192
+ Walker](https://rubygems.org/gems/vcloud-walker):
193
+
194
+ To do this, do:
195
+
196
+ ```
197
+ export FOG_CREDENTIAL={crediental-tag-for-your-organization}
198
+ vcloud-walk edgegateways > edges.out
140
199
  ```
141
200
 
142
- Nat:
143
- ```ruby
144
- configuration = {
145
- :NatService => {
146
- :IsEnabled => true,
147
- :nat_type => 'ipTranslation',
148
- :Policy => 'allowTrafficIn',
149
- :NatRule => [
150
- {
151
- :Description => 'a snat rule',
152
- :RuleType => 'SNAT',
153
- :IsEnabled => true,
154
- :Id => '65538',
155
- :GatewayNatRule => {
156
- :Interface => {
157
- :name => 'nft00001',
158
- :href => 'https://vmware.api.net/api/admin/network/44265cc3-6d63-4ea9-ac72-4905b5aa6111'
159
- },
160
- :OriginalIp => "192.0.2.0",
161
- :TranslatedIp => "203.0.113.10"
162
- }
163
- },
164
- {
165
- :Description => 'a dnat rule',
166
- :RuleType => 'DNAT',
167
- :IsEnabled => true,
168
- :Id => '65539',
169
- :GatewayNatRule =>
170
- {
171
- :Interface => {
172
- :name => 'nft00001',
173
- :href => 'https://vmware.api.net/api/admin/network/44265cc3-6d63-4ea9-ac72-4905b5aa6111'
174
- },
175
- :Protocol => 'tcp',
176
- :OriginalIp => "203.0.113.10",
177
- :OriginalPort => 22,
178
- :TranslatedIp => "192.0.2.0",
179
- :TranslatedPort => 22
180
- },
181
- }
182
- ]
183
- }
184
- }
201
+ `edges.out` will contain the complete configuration of all edge gateways in
202
+ your organization. Find the edge gateway you are interested in by searching for
203
+ its name, then look for a GatewayInterface section that has an InterfaceType of
204
+ 'uplink'. This should define:
205
+
206
+ * a 'href' element in a Network section. The UUID at the end of this href is
207
+ what you need.
208
+ * an IpRange section with a StartAddress and EndAddress -- these define the
209
+ addresses that you can use for services on this external network.
210
+
211
+ You can use [jq](http://stedolan.github.io/jq/) to make this easier:
185
212
  ```
213
+ cat edges.out | jq '
214
+ .[] | select(.name == "NAME_OF_YOUR_EDGE_GATEWAY")
215
+ | .Configuration.GatewayInterfaces.GatewayInterface[]
216
+ | select(.InterfaceType == "uplink")
217
+ | ( .Network.href, .SubnetParticipation )
218
+ '
219
+ ```
220
+
221
+
222
+
223
+ ### Debug output
224
+
225
+ Set environment variable `DEBUG=true` and/or `EXCON_DEBUG=true` to see Fog debug info.
186
226
 
187
- ###Debug
227
+ ### References
188
228
 
189
- Set environment variable DEBUG=true to see fog debug info.
229
+ * [vCloud Director Edge Gateway documentation](http://pubs.vmware.com/vcd-51/topic/com.vmware.vcloud.admin.doc_51/GUID-ADE1DCAB-874F-45A9-9337-1E971DAC0F7D.html)
@@ -3,8 +3,8 @@ module Vcloud
3
3
  module ConfigurationGenerator
4
4
  class LoadBalancerService
5
5
 
6
- def initialize edge_gateway
7
- @edge_gateway = Vcloud::Core::EdgeGateway.get_by_name(edge_gateway)
6
+ def initialize(edge_gateway_interfaces)
7
+ @edge_gateway_interfaces = edge_gateway_interfaces
8
8
  end
9
9
 
10
10
  def generate_fog_config(load_balancer_input_config)
@@ -51,25 +51,17 @@ module Vcloud
51
51
  end
52
52
 
53
53
  def generate_virtual_server_interface_section(network_id)
54
+ edge_gw_interface = @edge_gateway_interfaces.find do |interface|
55
+ interface.network_id == network_id
56
+ end
57
+ raise "unable to find gateway network interface with id #{network_id}" unless edge_gw_interface
54
58
  vcloud_virtual_server_interface = {}
55
59
  vcloud_virtual_server_interface[:type] = 'application/vnd.vmware.vcloud.orgVdcNetwork+xml'
56
- vcloud_virtual_server_interface[:name] = look_up_network_name(network_id)
57
- vcloud_virtual_server_interface[:href] = look_up_network_href(network_id)
60
+ vcloud_virtual_server_interface[:name] = edge_gw_interface.network_name
61
+ vcloud_virtual_server_interface[:href] = edge_gw_interface.network_href
58
62
  vcloud_virtual_server_interface
59
63
  end
60
64
 
61
- def look_up_network_name(network_id)
62
- gateway_interface = @edge_gateway.vcloud_gateway_interface_by_id(network_id)
63
- raise "Could not find network #{network_id}" unless gateway_interface
64
- gateway_interface[:Network][:name]
65
- end
66
-
67
- def look_up_network_href(network_id)
68
- gateway_interface = @edge_gateway.vcloud_gateway_interface_by_id(network_id)
69
- raise "Could not find network #{network_id}" unless gateway_interface
70
- gateway_interface[:Network][:href]
71
- end
72
-
73
65
  def generate_virtual_server_service_profile_section(input_service_profile)
74
66
  input_service_profile = {} if input_service_profile.nil?
75
67
  vcloud_service_profiles = []
@@ -197,7 +189,7 @@ module Vcloud
197
189
  vcloud_pool_healthcheck_entry = {
198
190
  Mode: default_mode,
199
191
  }
200
- vcloud_pool_healthcheck_entry[:Uri] = ''
192
+ vcloud_pool_healthcheck_entry[:Uri] = '/'
201
193
  vcloud_pool_healthcheck_entry[:HealthThreshold] = '2'
202
194
  vcloud_pool_healthcheck_entry[:UnhealthThreshold] = '3'
203
195
  vcloud_pool_healthcheck_entry[:Interval] = '5'
@@ -37,7 +37,7 @@ module Vcloud
37
37
 
38
38
  load_balancer_service_config =
39
39
  EdgeGateway::ConfigurationGenerator::LoadBalancerService.new(
40
- @local_config[:gateway]
40
+ @edge_gateway_interfaces
41
41
  ).generate_fog_config(@local_config[:load_balancer_service])
42
42
 
43
43
  unless load_balancer_service_config.nil?
@@ -1,6 +1,6 @@
1
1
  module Vcloud
2
2
  module EdgeGateway
3
- VERSION = '0.2.1'
3
+ VERSION = '0.2.2'
4
4
  end
5
5
  end
6
6
 
@@ -30,6 +30,7 @@ module Vcloud
30
30
  POOL_SERVICE_SECTION = {
31
31
  type: Hash,
32
32
  required: false,
33
+ allowed_empty: true,
33
34
  internals: {
34
35
  enabled: { type: 'boolean', required: false },
35
36
  port: { type: 'string_or_number', required: false },
@@ -78,6 +79,7 @@ module Vcloud
78
79
  VIRTUAL_SERVER_SERVICE_PROFILE_ENTRY = {
79
80
  type: Hash,
80
81
  required: false,
82
+ allowed_empty: true,
81
83
  internals: {
82
84
  enabled: { type: 'boolean', required: false },
83
85
  port: { type: 'string_or_number', required: false },
@@ -49,7 +49,7 @@ module Vcloud
49
49
  Vcloud::Schema::EDGE_GATEWAY_SERVICES
50
50
  )
51
51
  @local_vcloud_config = EdgeGateway::ConfigurationGenerator::LoadBalancerService.new(
52
- @edge_name
52
+ @edge_gateway.interfaces
53
53
  ).generate_fog_config(local_config[:load_balancer_service])
54
54
  end
55
55
 
@@ -30,7 +30,7 @@
30
30
  name: 'router', #req
31
31
  description: 'describe it', #opt
32
32
  ip_address: '192.2.0.55', #req
33
- network: 'ExternalNetwork', #req
33
+ network: '12345678-1234-1234-1234-123456789012', #req
34
34
  pool: 'web-app', #req
35
35
  logging: 'false', #opt, default false
36
36
  service_profiles: {
@@ -13,7 +13,7 @@
13
13
  HealthCheckPort: '80',
14
14
  HealthCheck:
15
15
  {
16
- Mode: "HTTP", Uri: '', HealthThreshold: '1', UnhealthThreshold: '6', Interval: '20', Timeout: '25'
16
+ Mode: "HTTP", Uri: '/', HealthThreshold: '1', UnhealthThreshold: '6', Interval: '20', Timeout: '25'
17
17
  }
18
18
  },
19
19
  {
@@ -24,7 +24,7 @@
24
24
  HealthCheckPort: '',
25
25
  HealthCheck:
26
26
  {
27
- Mode: "SSL", Uri: '', HealthThreshold: '2', UnhealthThreshold: '3', Interval: '5', Timeout: '15'
27
+ Mode: "SSL", Uri: '/', HealthThreshold: '2', UnhealthThreshold: '3', Interval: '5', Timeout: '15'
28
28
  }
29
29
  },
30
30
  {
@@ -35,7 +35,7 @@
35
35
  HealthCheckPort: '',
36
36
  HealthCheck:
37
37
  {
38
- Mode: "TCP", Uri: '', HealthThreshold: '2', UnhealthThreshold: '3', Interval: '5', Timeout: '15'
38
+ Mode: "TCP", Uri: '/', HealthThreshold: '2', UnhealthThreshold: '3', Interval: '5', Timeout: '15'
39
39
  }
40
40
  }
41
41
  ],
@@ -23,7 +23,7 @@
23
23
  name: 'test-vs-1',
24
24
  description: 'Our VirtualServer description',
25
25
  ip_address: '192.2.0.88',
26
- network: 'ExternalNetwork',
26
+ network: '12345678-1234-1234-1234-123456789012',
27
27
  pool: 'test-pool-1',
28
28
  service_profiles: {
29
29
  https: {
@@ -11,7 +11,7 @@
11
11
  :HealthCheckPort: ''
12
12
  :HealthCheck:
13
13
  :Mode: HTTP
14
- :Uri: ''
14
+ :Uri: '/'
15
15
  :HealthThreshold: '2'
16
16
  :UnhealthThreshold: '3'
17
17
  :Interval: '5'
@@ -23,7 +23,7 @@
23
23
  :HealthCheckPort: ''
24
24
  :HealthCheck:
25
25
  :Mode: SSL
26
- :Uri: ''
26
+ :Uri: '/'
27
27
  :HealthThreshold: '2'
28
28
  :UnhealthThreshold: '3'
29
29
  :Interval: '5'
@@ -35,7 +35,7 @@
35
35
  :HealthCheckPort: ''
36
36
  :HealthCheck:
37
37
  :Mode: TCP
38
- :Uri: ''
38
+ :Uri: '/'
39
39
  :HealthThreshold: '2'
40
40
  :UnhealthThreshold: '3'
41
41
  :Interval: '5'
@@ -38,7 +38,7 @@
38
38
  name: 'test-vs-1',
39
39
  description: 'Description of VirtualServer',
40
40
  ip_address: '192.2.0.88',
41
- network: 'ExternalNetwork',
41
+ network: '12345678-1234-1234-1234-123456789012',
42
42
  pool: 'test-pool-2',
43
43
  service_profiles: {
44
44
  http: {
@@ -10,7 +10,7 @@
10
10
  :HealthCheckPort: '8081'
11
11
  :HealthCheck:
12
12
  :Mode: TCP
13
- :Uri: ''
13
+ :Uri: '/'
14
14
  :HealthThreshold: '2'
15
15
  :UnhealthThreshold: '3'
16
16
  :Interval: '5'
@@ -22,7 +22,7 @@
22
22
  :HealthCheckPort: '443'
23
23
  :HealthCheck:
24
24
  :Mode: TCP
25
- :Uri: ''
25
+ :Uri: '/'
26
26
  :HealthThreshold: '2'
27
27
  :UnhealthThreshold: '3'
28
28
  :Interval: '5'
@@ -34,7 +34,7 @@
34
34
  :HealthCheckPort: ''
35
35
  :HealthCheck:
36
36
  :Mode: TCP
37
- :Uri: ''
37
+ :Uri: '/'
38
38
  :HealthThreshold: '2'
39
39
  :UnhealthThreshold: '3'
40
40
  :Interval: '5'
@@ -6,27 +6,26 @@ module Vcloud
6
6
  describe LoadBalancerService do
7
7
 
8
8
  before(:each) do
9
- @edge_gw_name = 'EdgeGateway1'
10
- @edge_gw_id = '1111111-7b54-43dd-9eb1-631dd337e5a7'
11
- edge_gateway = double(:edge_gateway,
12
- :vcloud_gateway_interface_by_id => {
13
- Network: {
14
- :name => 'ExternalNetwork',
15
- :href => 'https://example.com/api/admin/network/12345678-1234-1234-1234-123456789012'
16
- }
17
- }
9
+ mock_uplink_interface = double(
10
+ :mock_uplink,
11
+ :network_name => "ExternalNetwork",
12
+ :network_id => "12345678-1234-1234-1234-123456789012",
13
+ :network_href => 'https://example.com/api/admin/network/12345678-1234-1234-1234-123456789012',
18
14
  )
19
- expect(Vcloud::Core::EdgeGateway).
20
- to receive(:get_by_name).
21
- with(@edge_gw_name).
22
- and_return(edge_gateway)
15
+ mock_internal_interface = double(
16
+ :mock_uplink,
17
+ :network_name => "InternalNetwork",
18
+ :network_id => "12346788-1234-1234-1234-123456789000",
19
+ :network_href => "https://example.com/api/admin/network/12346788-1234-1234-1234-123456789000",
20
+ )
21
+ @edge_gw_interface_list = [ mock_internal_interface, mock_uplink_interface ]
23
22
  end
24
23
 
25
24
  context "top level LoadBalancer configuration defaults" do
26
25
 
27
26
  before(:each) do
28
27
  input = { } # minimum configuration
29
- @output = LoadBalancerService.new(@edge_gw_name).generate_fog_config(input)
28
+ @output = LoadBalancerService.new(@edge_gw_interface_list).generate_fog_config(input)
30
29
  end
31
30
 
32
31
  it 'should default to LoadBalancerService enabled' do
@@ -47,10 +46,10 @@ module Vcloud
47
46
  input = { virtual_servers: [{
48
47
  name: "virtual-server-1",
49
48
  ip_address: '192.2.0.1',
50
- network: "12345678-1234-1234-1234-123456789aa",
49
+ network: "12345678-1234-1234-1234-123456789012",
51
50
  pool: "pool-1",
52
51
  }]}
53
- output = LoadBalancerService.new(@edge_gw_name).generate_fog_config(input)
52
+ output = LoadBalancerService.new(@edge_gw_interface_list).generate_fog_config(input)
54
53
  @rule = output[:VirtualServer].first
55
54
  end
56
55
 
@@ -107,7 +106,7 @@ module Vcloud
107
106
  name: "pool-1",
108
107
  members: [ { ip_address: '10.10.10.10' } ],
109
108
  }]}
110
- output = LoadBalancerService.new(@edge_gw_name).generate_fog_config(input)
109
+ output = LoadBalancerService.new(@edge_gw_interface_list).generate_fog_config(input)
111
110
  @rule = output[:Pool].first
112
111
  end
113
112
 
@@ -127,7 +126,7 @@ module Vcloud
127
126
  :HealthCheckPort=>"",
128
127
  :HealthCheck=>{
129
128
  :Mode=>"HTTP",
130
- :Uri=>"",
129
+ :Uri=>"/",
131
130
  :HealthThreshold=>"2",
132
131
  :UnhealthThreshold=>"3",
133
132
  :Interval=>"5",
@@ -142,7 +141,7 @@ module Vcloud
142
141
  :HealthCheckPort=>"",
143
142
  :HealthCheck=>{
144
143
  :Mode=>"SSL",
145
- :Uri=>"",
144
+ :Uri=>"/",
146
145
  :HealthThreshold=>"2",
147
146
  :UnhealthThreshold=>"3",
148
147
  :Interval=>"5",
@@ -157,7 +156,7 @@ module Vcloud
157
156
  :HealthCheckPort=>"",
158
157
  :HealthCheck=>{
159
158
  :Mode=>"TCP",
160
- :Uri=>"",
159
+ :Uri=>"/",
161
160
  :HealthThreshold=>"2",
162
161
  :UnhealthThreshold=>"3",
163
162
  :Interval=>"5",
@@ -190,7 +189,7 @@ module Vcloud
190
189
  it 'should expand out input config into Fog expected input' do
191
190
  input = read_data_file('load_balancer_http-input.yaml')
192
191
  expected_output = read_data_file('load_balancer_http-output.yaml')
193
- generated_config = LoadBalancerService.new(@edge_gw_name).
192
+ generated_config = LoadBalancerService.new(@edge_gw_interface_list).
194
193
  generate_fog_config input
195
194
  expect(generated_config).to eq(expected_output)
196
195
  end
@@ -202,7 +201,7 @@ module Vcloud
202
201
  it 'should expand out input config into Fog expected input' do
203
202
  input = read_data_file('load_balancer_https-input.yaml')
204
203
  expected_output = read_data_file('load_balancer_https-output.yaml')
205
- generated_config = LoadBalancerService.new(@edge_gw_name).
204
+ generated_config = LoadBalancerService.new(@edge_gw_interface_list).
206
205
  generate_fog_config input
207
206
  expect(generated_config).to eq(expected_output)
208
207
  end
@@ -214,7 +213,7 @@ module Vcloud
214
213
  it 'should expand out input config into Fog expected input' do
215
214
  input = read_data_file('load_balancer_mixed_complex-input.yaml')
216
215
  expected_output = read_data_file('load_balancer_mixed_complex-output.yaml')
217
- generated_config = LoadBalancerService.new(@edge_gw_name).
216
+ generated_config = LoadBalancerService.new(@edge_gw_interface_list).
218
217
  generate_fog_config input
219
218
  expect(generated_config).to eq(expected_output)
220
219
  end
@@ -6,15 +6,6 @@ module Vcloud
6
6
 
7
7
  before(:each) do
8
8
  @edge_gateway_id = "1111111-7b54-43dd-9eb1-631dd337e5a7"
9
- @edge_gateway = double(:edge_gateway,
10
- :vcloud_gateway_interface_by_id => {
11
- Network: {
12
- :type => "application/vnd.vmware.admin.network+xml",
13
- :name => 'ane012345',
14
- :href => 'https://vmware.example.com/api/admin/network/01234567-1234-1234-1234-0123456789aa'
15
- }
16
- })
17
- Vcloud::Core::EdgeGateway.stub(:get_by_name).with(@edge_gateway_id).and_return(@edge_gateway)
18
9
  mock_edge_gateway_interface = double(
19
10
  :mock_edge_gateway_interface,
20
11
  :network_name => "ane012345",
@@ -654,7 +645,7 @@ module Vcloud
654
645
  :HealthCheckPort=>"",
655
646
  :HealthCheck=>{
656
647
  :Mode=>"HTTP",
657
- :Uri=>"",
648
+ :Uri=>"/",
658
649
  :HealthThreshold=>"2",
659
650
  :UnhealthThreshold=>"3",
660
651
  :Interval=>"5",
@@ -668,7 +659,7 @@ module Vcloud
668
659
  :HealthCheckPort=>"",
669
660
  :HealthCheck=>{
670
661
  :Mode=>"SSL",
671
- :Uri=>"",
662
+ :Uri=>"/",
672
663
  :HealthThreshold=>"2",
673
664
  :UnhealthThreshold=>"3",
674
665
  :Interval=>"5",
@@ -682,7 +673,7 @@ module Vcloud
682
673
  :HealthCheckPort=>"",
683
674
  :HealthCheck=>{
684
675
  :Mode=>"TCP",
685
- :Uri=>"",
676
+ :Uri=>"/",
686
677
  :HealthThreshold=>"2",
687
678
  :UnhealthThreshold=>"3",
688
679
  :Interval=>"5",
@@ -839,7 +830,7 @@ module Vcloud
839
830
  :HealthCheckPort=>"",
840
831
  :HealthCheck=>{
841
832
  :Mode=>"HTTP",
842
- :Uri=>"",
833
+ :Uri=>"/",
843
834
  :HealthThreshold=>"2",
844
835
  :UnhealthThreshold=>"3",
845
836
  :Interval=>"5",
@@ -853,7 +844,7 @@ module Vcloud
853
844
  :HealthCheckPort=>"",
854
845
  :HealthCheck=>{
855
846
  :Mode=>"SSL",
856
- :Uri=>"",
847
+ :Uri=>"/",
857
848
  :HealthThreshold=>"2",
858
849
  :UnhealthThreshold=>"3",
859
850
  :Interval=>"5",
@@ -867,7 +858,7 @@ module Vcloud
867
858
  :HealthCheckPort=>"",
868
859
  :HealthCheck=>{
869
860
  :Mode=>"TCP",
870
- :Uri=>"",
861
+ :Uri=>"/",
871
862
  :HealthThreshold=>"2",
872
863
  :UnhealthThreshold=>"3",
873
864
  :Interval=>"5",
@@ -1025,7 +1016,7 @@ module Vcloud
1025
1016
  :HealthCheckPort=>"",
1026
1017
  :HealthCheck=>{
1027
1018
  :Mode=>"HTTP",
1028
- :Uri=>"",
1019
+ :Uri=>"/",
1029
1020
  :HealthThreshold=>"2",
1030
1021
  :UnhealthThreshold=>"3",
1031
1022
  :Interval=>"5",
@@ -1039,7 +1030,7 @@ module Vcloud
1039
1030
  :HealthCheckPort=>"",
1040
1031
  :HealthCheck=>{
1041
1032
  :Mode=>"SSL",
1042
- :Uri=>"",
1033
+ :Uri=>"/",
1043
1034
  :HealthThreshold=>"2",
1044
1035
  :UnhealthThreshold=>"3",
1045
1036
  :Interval=>"5",
@@ -1053,7 +1044,7 @@ module Vcloud
1053
1044
  :HealthCheckPort=>"",
1054
1045
  :HealthCheck=>{
1055
1046
  :Mode=>"TCP",
1056
- :Uri=>"",
1047
+ :Uri=>"/",
1057
1048
  :HealthThreshold=>"2",
1058
1049
  :UnhealthThreshold=>"3",
1059
1050
  :Interval=>"5",
@@ -129,6 +129,48 @@ module Vcloud
129
129
  expect(validator.valid?).to be_true
130
130
  end
131
131
 
132
+ it "should validate ok if an empty pool service section is provided" do
133
+ input = {
134
+ pools: [
135
+ {
136
+ name: 'pool entry 1',
137
+ service: {
138
+ http: {},
139
+ },
140
+ members: [
141
+ { ip_address: "192.2.0.40" },
142
+ { ip_address: "192.2.0.41" },
143
+ ]
144
+ },
145
+ ],
146
+ }
147
+ validator = ConfigValidator.validate(:base, input, Vcloud::Schema::LOAD_BALANCER_SERVICE)
148
+ expect(validator.errors).to eq([])
149
+ expect(validator.valid?).to be_true
150
+ end
151
+
152
+ it "should validate ok if an empty virtual_server service_profile section is provided" do
153
+ input = {
154
+ pools: [{
155
+ name: 'pool-1',
156
+ service: { http: {} },
157
+ members: [ { ip_address: '10.10.10.10' } ],
158
+ }],
159
+ virtual_servers: [
160
+ {
161
+ name: 'virtual_server entry 1',
162
+ ip_address: "192.2.0.40",
163
+ network: "TestNetwork",
164
+ service_profiles: { http: {} },
165
+ pool: "pool-1",
166
+ },
167
+ ],
168
+ }
169
+ validator = ConfigValidator.validate(:base, input, Vcloud::Schema::LOAD_BALANCER_SERVICE)
170
+ expect(validator.errors).to eq([])
171
+ expect(validator.valid?).to be_true
172
+ end
173
+
132
174
  it "should be ok if no pools are specified" do
133
175
  input = {
134
176
  virtual_servers: []
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vcloud-edge_gateway
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-27 00:00:00.000000000 Z
12
+ date: 2014-03-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fog
@@ -220,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
220
220
  version: '0'
221
221
  segments:
222
222
  - 0
223
- hash: 2498590766883653195
223
+ hash: 4166614673467124064
224
224
  requirements: []
225
225
  rubyforge_project:
226
226
  rubygems_version: 1.8.23