bosh-bootstrap 0.10.2 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. data/.rspec +1 -0
  2. data/.travis.yml +0 -1
  3. data/ChangeLog.md +23 -4
  4. data/Gemfile +5 -2
  5. data/Guardfile +2 -0
  6. data/README.md +209 -197
  7. data/TODO.md +55 -0
  8. data/bosh-bootstrap.gemspec +5 -12
  9. data/lib/bosh/cli/commands/bootstrap.rb +42 -0
  10. data/lib/bosh-bootstrap/cli/commands/delete.rb +26 -0
  11. data/lib/bosh-bootstrap/cli/commands/deploy.rb +89 -0
  12. data/lib/bosh-bootstrap/cli/commands/ssh.rb +32 -0
  13. data/lib/bosh-bootstrap/cli/helpers/bundle.rb +12 -0
  14. data/lib/bosh-bootstrap/cli/helpers/interactions.rb +15 -0
  15. data/lib/bosh-bootstrap/cli/helpers/settings.rb +61 -0
  16. data/lib/bosh-bootstrap/cli/helpers.rb +11 -0
  17. data/lib/bosh-bootstrap/key_pair.rb +21 -0
  18. data/lib/bosh-bootstrap/microbosh.rb +74 -0
  19. data/lib/bosh-bootstrap/microbosh_providers/aws.rb +104 -0
  20. data/lib/bosh-bootstrap/microbosh_providers/base.rb +50 -0
  21. data/lib/bosh-bootstrap/microbosh_providers/openstack.rb +61 -0
  22. data/lib/bosh-bootstrap/microbosh_providers/vsphere.rb +78 -0
  23. data/lib/bosh-bootstrap/microbosh_providers.rb +11 -0
  24. data/lib/bosh-bootstrap/network.rb +33 -0
  25. data/lib/bosh-bootstrap/network_providers/aws.rb +28 -0
  26. data/lib/bosh-bootstrap/network_providers/dummy.rb +10 -0
  27. data/lib/bosh-bootstrap/network_providers/openstack.rb +28 -0
  28. data/lib/bosh-bootstrap/network_providers.rb +11 -0
  29. data/lib/bosh-bootstrap/version.rb +1 -1
  30. data/lib/bosh-bootstrap.rb +3 -4
  31. data/spec/assets/microbosh_yml/micro_bosh.aws_ec2.yml +37 -0
  32. data/spec/assets/microbosh_yml/micro_bosh.aws_vpc.yml +39 -0
  33. data/spec/assets/microbosh_yml/micro_bosh.openstack.yml +30 -0
  34. data/spec/assets/microbosh_yml/micro_bosh.vsphere.yml +34 -0
  35. data/spec/integration/aws/aws_ec2_basic_spec.rb +39 -0
  36. data/spec/integration/aws/aws_helpers.rb +8 -61
  37. data/spec/spec_helper.rb +8 -3
  38. data/spec/support/capture_stdout.rb +18 -0
  39. data/spec/unit/cli/bootstrap_spec.rb +41 -0
  40. data/spec/unit/commands/delete_spec.rb +20 -0
  41. data/spec/unit/commands/deploy_spec.rb +64 -0
  42. data/spec/unit/commands/ssh_spec.rb +19 -0
  43. data/spec/unit/key_pair_spec.rb +13 -0
  44. data/spec/unit/microbosh_providers/aws_spec.rb +68 -0
  45. data/spec/unit/microbosh_providers/openstack_spec.rb +27 -0
  46. data/spec/unit/microbosh_providers/vsphere_spec.rb +42 -0
  47. data/spec/unit/microbosh_spec.rb +27 -0
  48. data/spec/unit/network_providers/aws_spec.rb +29 -0
  49. data/spec/unit/network_providers/openstack_spec.rb +29 -0
  50. data/spec/unit/network_spec.rb +17 -0
  51. metadata +71 -235
  52. data/CleanupCi.md +0 -8
  53. data/bin/bosh-bootstrap +0 -8
  54. data/docs/README.md +0 -3
  55. data/docs/devstack-openstack-tutorial.md +0 -215
  56. data/lib/bosh/providers/README.md +0 -5
  57. data/lib/bosh/providers/aws.rb +0 -258
  58. data/lib/bosh/providers/base_provider.rb +0 -48
  59. data/lib/bosh/providers/openstack.rb +0 -79
  60. data/lib/bosh/providers.rb +0 -21
  61. data/lib/bosh-bootstrap/cli.rb +0 -1347
  62. data/lib/bosh-bootstrap/commander/README.md +0 -47
  63. data/lib/bosh-bootstrap/commander/command.rb +0 -25
  64. data/lib/bosh-bootstrap/commander/commands.rb +0 -80
  65. data/lib/bosh-bootstrap/commander/local_server.rb +0 -68
  66. data/lib/bosh-bootstrap/commander/remote_script_command.rb +0 -51
  67. data/lib/bosh-bootstrap/commander/remote_server.rb +0 -137
  68. data/lib/bosh-bootstrap/commander/upload_command.rb +0 -17
  69. data/lib/bosh-bootstrap/commander.rb +0 -9
  70. data/lib/bosh-bootstrap/helpers/fog_setup.rb +0 -50
  71. data/lib/bosh-bootstrap/helpers/settings.rb +0 -99
  72. data/lib/bosh-bootstrap/helpers/settings_setter.rb +0 -41
  73. data/lib/bosh-bootstrap/helpers.rb +0 -3
  74. data/lib/bosh-bootstrap/stages/stage_micro_bosh_delete/bosh_micro_delete +0 -19
  75. data/lib/bosh-bootstrap/stages/stage_micro_bosh_delete.rb +0 -90
  76. data/lib/bosh-bootstrap/stages/stage_micro_bosh_deploy/bosh_micro_deploy +0 -79
  77. data/lib/bosh-bootstrap/stages/stage_micro_bosh_deploy/install_key_pair_for_user +0 -23
  78. data/lib/bosh-bootstrap/stages/stage_micro_bosh_deploy.rb +0 -146
  79. data/lib/bosh-bootstrap/stages/stage_micro_bosh_download/download_micro_bosh_stemcell +0 -93
  80. data/lib/bosh-bootstrap/stages/stage_micro_bosh_download.rb +0 -139
  81. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/configure_git +0 -25
  82. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/create_vcap_user +0 -79
  83. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_base_packages +0 -30
  84. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_bosh +0 -11
  85. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_bosh_plugins +0 -25
  86. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_hub +0 -26
  87. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_ruby +0 -30
  88. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_useful_gems +0 -29
  89. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/validate_bosh_deployer +0 -18
  90. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm.rb +0 -69
  91. data/lib/bosh-bootstrap/stages/stage_salted_password/convert_salted_password +0 -11
  92. data/lib/bosh-bootstrap/stages/stage_salted_password.rb +0 -51
  93. data/lib/bosh-bootstrap/stages/stage_setup_new_bosh/setup_bosh_user +0 -29
  94. data/lib/bosh-bootstrap/stages/stage_setup_new_bosh.rb +0 -51
  95. data/lib/bosh-bootstrap/stages/stage_validate_inception_vm/validate_ubuntu +0 -6
  96. data/lib/bosh-bootstrap/stages/stage_validate_inception_vm.rb +0 -39
  97. data/lib/bosh-bootstrap/stages.rb +0 -10
  98. data/spec/assets/bosh/public_stemcells/aws_micro.out +0 -7
  99. data/spec/assets/micro_bosh_yml/micro_bosh.aws_ec2.yml +0 -35
  100. data/spec/assets/micro_bosh_yml/micro_bosh.aws_vpc.yml +0 -37
  101. data/spec/integration/aws/aws_basic_spec.rb +0 -39
  102. data/spec/integration/aws/aws_edge_prebuilt_ami_spec.rb +0 -46
  103. data/spec/integration/aws/aws_edge_prebuilt_spec.rb +0 -46
  104. data/spec/integration/aws/aws_edge_spec.rb +0 -45
  105. data/spec/unit/aws_spec.rb +0 -177
  106. data/spec/unit/bosh/providers/aws_spec.rb +0 -174
  107. data/spec/unit/cli_spec.rb +0 -134
  108. data/spec/unit/cli_ssh_spec.rb +0 -95
  109. data/spec/unit/cli_upgrade_inception_spec.rb +0 -29
  110. data/spec/unit/settings_setter_spec.rb +0 -29
  111. data/vendor/cache/POpen4-0.1.4.gem +0 -0
  112. data/vendor/cache/Platform-0.4.0.gem +0 -0
  113. data/vendor/cache/activesupport-3.2.8.gem +0 -0
  114. data/vendor/cache/awesome_print-1.1.0.gem +0 -0
  115. data/vendor/cache/aws-s3-0.6.3.gem +0 -0
  116. data/vendor/cache/blobstore_client-0.4.0.gem +0 -0
  117. data/vendor/cache/bosh_cli-1.0.3.gem +0 -0
  118. data/vendor/cache/bosh_common-0.5.4.gem +0 -0
  119. data/vendor/cache/builder-3.2.0.gem +0 -0
  120. data/vendor/cache/coderay-1.0.8.gem +0 -0
  121. data/vendor/cache/diff-lcs-1.1.3.gem +0 -0
  122. data/vendor/cache/escape-0.0.4.gem +0 -0
  123. data/vendor/cache/excon-0.20.1.gem +0 -0
  124. data/vendor/cache/fog-1.8.0.gem +0 -0
  125. data/vendor/cache/formatador-0.2.4.gem +0 -0
  126. data/vendor/cache/guard-1.6.2.gem +0 -0
  127. data/vendor/cache/guard-rspec-2.4.0.gem +0 -0
  128. data/vendor/cache/highline-1.6.18.gem +0 -0
  129. data/vendor/cache/httpclient-2.2.4.gem +0 -0
  130. data/vendor/cache/i18n-0.6.1.gem +0 -0
  131. data/vendor/cache/json_pure-1.6.8.gem +0 -0
  132. data/vendor/cache/listen-0.7.2.gem +0 -0
  133. data/vendor/cache/log4r-1.1.10.gem +0 -0
  134. data/vendor/cache/lumberjack-1.0.2.gem +0 -0
  135. data/vendor/cache/method_source-0.8.1.gem +0 -0
  136. data/vendor/cache/mime-types-1.22.gem +0 -0
  137. data/vendor/cache/multi_json-1.1.0.gem +0 -0
  138. data/vendor/cache/net-scp-1.0.4.gem +0 -0
  139. data/vendor/cache/net-ssh-2.2.2.gem +0 -0
  140. data/vendor/cache/net-ssh-gateway-1.1.0.gem +0 -0
  141. data/vendor/cache/netaddr-1.5.0.gem +0 -0
  142. data/vendor/cache/nokogiri-1.5.9.gem +0 -0
  143. data/vendor/cache/open4-1.3.0.gem +0 -0
  144. data/vendor/cache/progressbar-0.9.2.gem +0 -0
  145. data/vendor/cache/pry-0.9.11.4-java.gem +0 -0
  146. data/vendor/cache/pry-0.9.11.4.gem +0 -0
  147. data/vendor/cache/rake-10.0.3.gem +0 -0
  148. data/vendor/cache/rb-fsevent-0.9.3.gem +0 -0
  149. data/vendor/cache/redcard-1.0.0.gem +0 -0
  150. data/vendor/cache/rspec-2.12.0.gem +0 -0
  151. data/vendor/cache/rspec-core-2.12.2.gem +0 -0
  152. data/vendor/cache/rspec-expectations-2.12.1.gem +0 -0
  153. data/vendor/cache/rspec-mocks-2.12.2.gem +0 -0
  154. data/vendor/cache/ruby-atmos-pure-1.0.5.gem +0 -0
  155. data/vendor/cache/ruby-hmac-0.4.0.gem +0 -0
  156. data/vendor/cache/settingslogic-2.0.9.gem +0 -0
  157. data/vendor/cache/slop-3.4.3.gem +0 -0
  158. data/vendor/cache/spoon-0.0.1.gem +0 -0
  159. data/vendor/cache/terminal-table-1.4.5.gem +0 -0
  160. data/vendor/cache/thor-0.17.0.gem +0 -0
  161. data/vendor/cache/uuidtools-2.1.3.gem +0 -0
  162. data/vendor/cache/xml-simple-1.1.2.gem +0 -0
@@ -1,258 +0,0 @@
1
- # Copyright (c) 2012-2013 Stark & Wayne, LLC
2
-
3
- module Bosh; module Providers; end; end
4
-
5
- require "bosh/providers/base_provider"
6
-
7
- class Bosh::Providers::AWS < Bosh::Providers::BaseProvider
8
- # supported by fog 1.6.0
9
- # FIXME weird that fog has no method to return this list
10
- def region_labels
11
- ['ap-northeast-1', 'ap-southeast-1', 'eu-west-1', 'sa-east-1', 'us-east-1', 'us-west-1', 'us-west-2']
12
- end
13
-
14
- def default_region_label
15
- 'us-east-1'
16
- end
17
-
18
- # @return [Integer] megabytes of RAM for requested flavor of server
19
- def ram_for_server_flavor(server_flavor_id)
20
- if flavor = fog_compute_flavor(server_flavor_id)
21
- flavor[:ram]
22
- else
23
- raise "Unknown AWS flavor '#{server_flavor_id}'"
24
- end
25
- end
26
-
27
- # @return [Hash] e.g. { :bits => 0, :cores => 2, :disk => 0,
28
- # :id => 't1.micro', :name => 'Micro Instance', :ram => 613}
29
- # or nil if +server_flavor_id+ is not a supported flavor ID
30
- def fog_compute_flavor(server_flavor_id)
31
- aws_compute_flavors.find { |fl| fl[:id] == server_flavor_id }
32
- end
33
-
34
- # @return [Array] of [Hash] for each supported compute flavor
35
- # Example [Hash] { :bits => 0, :cores => 2, :disk => 0,
36
- # :id => 't1.micro', :name => 'Micro Instance', :ram => 613}
37
- def aws_compute_flavors
38
- Fog::Compute::AWS::FLAVORS
39
- end
40
-
41
- def aws_compute_flavor_ids
42
- aws_compute_flavors.map { |fl| fl[:id] }
43
- end
44
-
45
- # Provision an EC2 or VPC elastic IP addess.
46
- # * VPC - provision_public_ip_address(vpc: true)
47
- # * EC2 - provision_public_ip_address
48
- # @return [String] provisions a new public IP address in target region
49
- # TODO nil if none available
50
- def provision_public_ip_address(options={})
51
- if options.delete(:vpc)
52
- options[:domain] = "vpc"
53
- else
54
- options[:domain] = options.delete(:domain) || "standard"
55
- end
56
- address = fog_compute.addresses.create(options)
57
- address.public_ip
58
- # TODO catch error and return nil
59
- end
60
-
61
- def associate_ip_address_with_server(ip_address, server)
62
- address = fog_compute.addresses.get(ip_address)
63
- address.server = server
64
- end
65
-
66
- def create_vpc(name, cidr_block)
67
- vpc = fog_compute.vpcs.create(name: name, cidr_block: cidr_block)
68
- vpc.id
69
- end
70
-
71
- # Creates a VPC subnet
72
- # @return [String] the subnet_id
73
- def create_subnet(vpc_id, cidr_block)
74
- subnet = fog_compute.subnets.create(vpc_id: vpc_id, cidr_block: cidr_block)
75
- subnet.subnet_id
76
- end
77
-
78
- def create_internet_gateway(vpc_id)
79
- gateway = fog_compute.internet_gateways.create(vpc_id: vpc_id)
80
- gateway.id
81
- end
82
-
83
- # Creates or reuses an AWS security group and opens ports.
84
- #
85
- # +security_group_name+ is the name to be created or reused
86
- # +ports+ is a hash of name/port for ports to open, for example:
87
- # {
88
- # ssh: 22,
89
- # http: 80,
90
- # https: 443
91
- # }
92
- # protocol defaults to TCP
93
- # You can also use a more verbose +ports+ using the format:
94
- # {
95
- # ssh: 22,
96
- # http: { ports: (80..82) },
97
- # mosh: { protocol: "udp", ports: (60000..60050) }
98
- # mosh: { protocol: "rdp", ports: (3398..3398), ip_ranges: [ { cidrIp: "196.212.12.34/32" } ] }
99
- # }
100
- # In this example,
101
- # * TCP 22 will be opened for ssh from any ip_range,
102
- # * TCP ports 80, 81, 82 for http from any ip_range,
103
- # * UDP 60000 -> 60050 for mosh from any ip_range and
104
- # * TCP 3398 for RDP from ip range: 96.212.12.34/32
105
- def create_security_group(security_group_name, description, ports)
106
- unless sg = fog_compute.security_groups.get(security_group_name)
107
- sg = fog_compute.security_groups.create(name: security_group_name, description: description)
108
- puts "Created security group #{security_group_name}"
109
- else
110
- puts "Reusing security group #{security_group_name}"
111
- end
112
- ip_permissions = sg.ip_permissions
113
- ports_opened = 0
114
- ports.each do |name, port_defn|
115
- (protocol, port_range, ip_range) = extract_port_definition(port_defn)
116
- unless port_open?(ip_permissions, port_range, protocol, ip_range)
117
- sg.authorize_port_range(port_range, {:ip_protocol => protocol, :cidr_ip => ip_range})
118
- puts " -> opened #{name} ports #{protocol.upcase} #{port_range.min}..#{port_range.max} from IP range #{ip_range}"
119
- ports_opened += 1
120
- end
121
- end
122
- puts " -> no additional ports opened" if ports_opened == 0
123
- true
124
- end
125
-
126
- def port_open?(ip_permissions, port_range, protocol, ip_range)
127
- ip_permissions && ip_permissions.find do |ip|
128
- ip["ipProtocol"] == protocol \
129
- && ip["ipRanges"].detect { |range| range["cidrIp"] == ip_range } \
130
- && ip["fromPort"] <= port_range.min \
131
- && ip["toPort"] >= port_range.max
132
- end
133
- end
134
-
135
- def find_server_device(server, device)
136
- server.volumes.all.find {|v| v.device == device}
137
- end
138
-
139
- def create_and_attach_volume(name, disk_size, server, device)
140
- volume = fog_compute.volumes.create(
141
- size: disk_size,
142
- name: name,
143
- description: '',
144
- device: device,
145
- availability_zone: server.availability_zone)
146
- # TODO: the following works in fog 1.9.0+ (but which has a bug in bootstrap)
147
- # https://github.com/fog/fog/issues/1516
148
- #
149
- # volume.wait_for { volume.status == 'available' }
150
- # volume.attach(server.id, "/dev/vdc")
151
- # volume.wait_for { volume.status == 'in-use' }
152
- #
153
- # Instead, using:
154
- volume.server = server
155
- end
156
-
157
- # Ubuntu 12.10 64bit (EBS) - Quantal
158
- def quantal_image_id(region)
159
- # http://cloud-images.ubuntu.com/quantal/current/
160
- image_id = case region.to_s
161
- when 'ap-northeast-1'
162
- 'ami-ccf270cd'
163
- when 'ap-southeast-1'
164
- 'ami-16e8a444'
165
- when 'ap-southeast-2'
166
- 'ami-5af36360'
167
- when 'eu-west-1'
168
- 'ami-789c890c'
169
- when 'sa-east-1'
170
- 'ami-35b36928'
171
- when 'us-east-1'
172
- 'ami-1c80e475'
173
- when 'us-west-1'
174
- 'ami-28567a6d'
175
- when 'us-west-2'
176
- 'ami-5822b668'
177
- end
178
- image_id || raise("Please add Ubuntu 12.10 64bit (EBS) AMI image id to aws.rb#image_id method for region '#{region}'")
179
- end
180
-
181
- def bootstrap(new_attributes = {})
182
- if new_attributes.delete(:quantal)
183
- new_attributes[:image_id] ||= quantal_image_id(fog_compute.region)
184
- end
185
- vpc = new_attributes[:subnet_id]
186
-
187
- server = fog_compute.servers.new(new_attributes)
188
-
189
- unless new_attributes[:key_name]
190
- raise "please provide :key_name attribute"
191
- end
192
- unless private_key_path = new_attributes.delete(:private_key_path)
193
- raise "please provide :private_key_path attribute"
194
- end
195
-
196
- if vpc
197
- # TODO setup security group on new server
198
- else
199
- # make sure port 22 is open in the first security group
200
- security_group = fog_compute.security_groups.get(server.groups.first)
201
- authorized = security_group.ip_permissions.detect do |ip_permission|
202
- ip_permission['ipRanges'].first && ip_permission['ipRanges'].first['cidrIp'] == '0.0.0.0/0' &&
203
- ip_permission['fromPort'] == 22 &&
204
- ip_permission['ipProtocol'] == 'tcp' &&
205
- ip_permission['toPort'] == 22
206
- end
207
- unless authorized
208
- security_group.authorize_port_range(22..22)
209
- end
210
- end
211
-
212
- server.save
213
- server.wait_for { ready? }
214
- server.setup(:keys => [private_key_path])
215
- server
216
- end
217
-
218
- def servers_with_sg(sg_name)
219
- inception_sg = fog_compute.security_groups.find {|sg| sg.name == sg_name }
220
- if inception_sg
221
- fog_compute.servers.select {|s| s.security_group_ids.include? inception_sg.group_id }
222
- else
223
- $stderr.puts "no security group #{sg_name} was found"
224
- []
225
- end
226
- end
227
-
228
- def delete_security_group_and_servers(sg_name)
229
- sg = fog_compute.security_groups.find {|sg| sg.name == sg_name }
230
- if sg
231
- fog_compute.servers.select {|s| s.security_group_ids.include? sg.group_id }.each do |server|
232
- puts "Destroying server #{server.id}..."
233
- server.destroy
234
- end
235
- begin
236
- puts "Destroying security group #{sg.name}..."
237
- sg.destroy
238
- rescue Fog::Compute::AWS::Error => e
239
- $stderr.puts e
240
- end
241
- end
242
- end
243
-
244
- def delete_key_pair(kp_name)
245
- if kp = fog_compute.key_pairs.find {|kp| kp.name == kp_name}
246
- puts "Deleting key pair #{kp.name}..."
247
- kp.destroy
248
- end
249
- end
250
-
251
- # Destroy all IP addresses that aren't bound to a server
252
- def cleanup_unused_ip_addresses
253
- fog_compute.addresses.each do |a|
254
- puts "Deleting IP address #{a.public_ip}..."
255
- a.destroy unless a.server
256
- end
257
- end
258
- end
@@ -1,48 +0,0 @@
1
- # Copyright (c) 2012-2013 Stark & Wayne, LLC
2
-
3
- module Bosh; module Providers; end; end
4
-
5
- class Bosh::Providers::BaseProvider
6
- attr_reader :fog_compute
7
-
8
- def initialize(fog_compute)
9
- @fog_compute = fog_compute
10
- end
11
-
12
- def create_key_pair(key_pair_name)
13
- fog_compute.key_pairs.create(:name => key_pair_name)
14
- end
15
-
16
- def delete_key_pair_if_exists(key_pair_name)
17
- if fog_key_pair = fog_compute.key_pairs.get(key_pair_name)
18
- fog_key_pair.destroy
19
- end
20
- end
21
-
22
- # Any of the following +port_defn+ can be used:
23
- # {
24
- # ssh: 22,
25
- # http: { ports: (80..82) },
26
- # mosh: { protocol: "udp", ports: (60000..60050) }
27
- # mosh: { protocol: "rdp", ports: (3398..3398), ip_range: "196.212.12.34/32" }
28
- # }
29
- # In this example,
30
- # * TCP 22 will be opened for ssh from any ip_range,
31
- # * TCP ports 80, 81, 82 for http from any ip_range,
32
- # * UDP 60000 -> 60050 for mosh from any ip_range and
33
- # * TCP 3398 for RDP from ip range: 96.212.12.34/32
34
- def extract_port_definition(port_defn)
35
- protocol = "tcp"
36
- ip_range = "0.0.0.0/0"
37
- if port_defn.is_a? Integer
38
- port_range = (port_defn..port_defn)
39
- elsif port_defn.is_a? Range
40
- port_range = port_defn
41
- elsif port_defn.is_a? Hash
42
- protocol = port_defn[:protocol] if port_defn[:protocol]
43
- port_range = port_defn[:ports] if port_defn[:ports]
44
- ip_range = port_defn[:ip_range] if port_defn[:ip_range]
45
- end
46
- [protocol, port_range, ip_range]
47
- end
48
- end
@@ -1,79 +0,0 @@
1
- # Copyright (c) 2012-2013 Stark & Wayne, LLC
2
-
3
- module Bosh; module Providers; end; end
4
-
5
- require "bosh/providers/base_provider"
6
-
7
- class Bosh::Providers::OpenStack < Bosh::Providers::BaseProvider
8
- # @return [String] provisions a new public IP address in target region
9
- # TODO nil if none available
10
- def provision_public_ip_address(options={})
11
- address = fog_compute.addresses.create
12
- address.ip
13
- # TODO catch error and return nil
14
- end
15
-
16
- def associate_ip_address_with_server(ip_address, server)
17
- address = fog_compute.addresses.find { |a| a.ip == ip_address }
18
- address.server = server
19
- end
20
-
21
- # Creates or reuses an OpenStack security group and opens ports.
22
- #
23
- # +security_group_name+ is the name to be created or reused
24
- # +ports+ is a hash of name/port for ports to open, for example:
25
- # {
26
- # ssh: 22,
27
- # http: 80,
28
- # https: 443
29
- # }
30
- def create_security_group(security_group_name, description, ports)
31
- security_groups = fog_compute.security_groups
32
- unless sg = security_groups.find { |s| s.name == security_group_name }
33
- sg = fog_compute.security_groups.create(name: security_group_name, description: description)
34
- puts "Created security group #{security_group_name}"
35
- else
36
- puts "Reusing security group #{security_group_name}"
37
- end
38
- ip_permissions = sg.rules
39
- ports_opened = 0
40
- ports.each do |name, port_defn|
41
- (protocol, port_range, ip_range) = extract_port_definition(port_defn)
42
- unless port_open?(ip_permissions, port_range, protocol, ip_range)
43
- sg.create_security_group_rule(port_range.min, port_range.max, protocol, ip_range)
44
- puts " -> opened #{name} ports #{protocol.upcase} #{port_range.min}..#{port_range.max} from IP range #{ip_range}"
45
- ports_opened += 1
46
- end
47
- end
48
- puts " -> no additional ports opened" if ports_opened == 0
49
- true
50
- end
51
-
52
- def port_open?(ip_permissions, port_range, protocol, ip_range)
53
- ip_permissions && ip_permissions.find do |ip|
54
- ip["ip_protocol"] == protocol \
55
- && ip["ip_range"].detect { |range| range["cidr"] == ip_range } \
56
- && ip["from_port"] <= port_range.min \
57
- && ip["to_port"] >= port_range.max
58
- end
59
- end
60
-
61
- def find_server_device(server, device)
62
- va = fog_compute.get_server_volumes(server.id).body['volumeAttachments']
63
- va.find { |v| v["device"] == device }
64
- end
65
-
66
- def create_and_attach_volume(name, disk_size, server, device)
67
- volume = fog_compute.volumes.create(:name => name,
68
- :description => "",
69
- :size => disk_size,
70
- :availability_zone => server.availability_zone)
71
- volume.wait_for { volume.status == 'available' }
72
- volume.attach(server.id, device)
73
- volume.wait_for { volume.status == 'in-use' }
74
- end
75
-
76
- def delete_security_group_and_servers(sg_name)
77
- raise "not implemented yet"
78
- end
79
- end
@@ -1,21 +0,0 @@
1
- # Copyright (c) 2012-2013 Stark & Wayne, LLC
2
-
3
- module Bosh; end
4
-
5
- module Bosh::Providers
6
- extend self
7
- # returns a BOSH provider (CPI) specific object
8
- # with helpers related to that provider
9
- def for_bosh_provider_name(provider_name, fog_compute)
10
- case provider_name.to_sym
11
- when :aws
12
- require "bosh/providers/aws"
13
- Bosh::Providers::AWS.new(fog_compute)
14
- when :openstack
15
- require "bosh/providers/openstack"
16
- Bosh::Providers::OpenStack.new(fog_compute)
17
- else
18
- raise "please support #{provider_name} provider"
19
- end
20
- end
21
- end