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.
- data/.rspec +1 -0
- data/.travis.yml +0 -1
- data/ChangeLog.md +23 -4
- data/Gemfile +5 -2
- data/Guardfile +2 -0
- data/README.md +209 -197
- data/TODO.md +55 -0
- data/bosh-bootstrap.gemspec +5 -12
- data/lib/bosh/cli/commands/bootstrap.rb +42 -0
- data/lib/bosh-bootstrap/cli/commands/delete.rb +26 -0
- data/lib/bosh-bootstrap/cli/commands/deploy.rb +89 -0
- data/lib/bosh-bootstrap/cli/commands/ssh.rb +32 -0
- data/lib/bosh-bootstrap/cli/helpers/bundle.rb +12 -0
- data/lib/bosh-bootstrap/cli/helpers/interactions.rb +15 -0
- data/lib/bosh-bootstrap/cli/helpers/settings.rb +61 -0
- data/lib/bosh-bootstrap/cli/helpers.rb +11 -0
- data/lib/bosh-bootstrap/key_pair.rb +21 -0
- data/lib/bosh-bootstrap/microbosh.rb +74 -0
- data/lib/bosh-bootstrap/microbosh_providers/aws.rb +104 -0
- data/lib/bosh-bootstrap/microbosh_providers/base.rb +50 -0
- data/lib/bosh-bootstrap/microbosh_providers/openstack.rb +61 -0
- data/lib/bosh-bootstrap/microbosh_providers/vsphere.rb +78 -0
- data/lib/bosh-bootstrap/microbosh_providers.rb +11 -0
- data/lib/bosh-bootstrap/network.rb +33 -0
- data/lib/bosh-bootstrap/network_providers/aws.rb +28 -0
- data/lib/bosh-bootstrap/network_providers/dummy.rb +10 -0
- data/lib/bosh-bootstrap/network_providers/openstack.rb +28 -0
- data/lib/bosh-bootstrap/network_providers.rb +11 -0
- data/lib/bosh-bootstrap/version.rb +1 -1
- data/lib/bosh-bootstrap.rb +3 -4
- data/spec/assets/microbosh_yml/micro_bosh.aws_ec2.yml +37 -0
- data/spec/assets/microbosh_yml/micro_bosh.aws_vpc.yml +39 -0
- data/spec/assets/microbosh_yml/micro_bosh.openstack.yml +30 -0
- data/spec/assets/microbosh_yml/micro_bosh.vsphere.yml +34 -0
- data/spec/integration/aws/aws_ec2_basic_spec.rb +39 -0
- data/spec/integration/aws/aws_helpers.rb +8 -61
- data/spec/spec_helper.rb +8 -3
- data/spec/support/capture_stdout.rb +18 -0
- data/spec/unit/cli/bootstrap_spec.rb +41 -0
- data/spec/unit/commands/delete_spec.rb +20 -0
- data/spec/unit/commands/deploy_spec.rb +64 -0
- data/spec/unit/commands/ssh_spec.rb +19 -0
- data/spec/unit/key_pair_spec.rb +13 -0
- data/spec/unit/microbosh_providers/aws_spec.rb +68 -0
- data/spec/unit/microbosh_providers/openstack_spec.rb +27 -0
- data/spec/unit/microbosh_providers/vsphere_spec.rb +42 -0
- data/spec/unit/microbosh_spec.rb +27 -0
- data/spec/unit/network_providers/aws_spec.rb +29 -0
- data/spec/unit/network_providers/openstack_spec.rb +29 -0
- data/spec/unit/network_spec.rb +17 -0
- metadata +71 -235
- data/CleanupCi.md +0 -8
- data/bin/bosh-bootstrap +0 -8
- data/docs/README.md +0 -3
- data/docs/devstack-openstack-tutorial.md +0 -215
- data/lib/bosh/providers/README.md +0 -5
- data/lib/bosh/providers/aws.rb +0 -258
- data/lib/bosh/providers/base_provider.rb +0 -48
- data/lib/bosh/providers/openstack.rb +0 -79
- data/lib/bosh/providers.rb +0 -21
- data/lib/bosh-bootstrap/cli.rb +0 -1347
- data/lib/bosh-bootstrap/commander/README.md +0 -47
- data/lib/bosh-bootstrap/commander/command.rb +0 -25
- data/lib/bosh-bootstrap/commander/commands.rb +0 -80
- data/lib/bosh-bootstrap/commander/local_server.rb +0 -68
- data/lib/bosh-bootstrap/commander/remote_script_command.rb +0 -51
- data/lib/bosh-bootstrap/commander/remote_server.rb +0 -137
- data/lib/bosh-bootstrap/commander/upload_command.rb +0 -17
- data/lib/bosh-bootstrap/commander.rb +0 -9
- data/lib/bosh-bootstrap/helpers/fog_setup.rb +0 -50
- data/lib/bosh-bootstrap/helpers/settings.rb +0 -99
- data/lib/bosh-bootstrap/helpers/settings_setter.rb +0 -41
- data/lib/bosh-bootstrap/helpers.rb +0 -3
- data/lib/bosh-bootstrap/stages/stage_micro_bosh_delete/bosh_micro_delete +0 -19
- data/lib/bosh-bootstrap/stages/stage_micro_bosh_delete.rb +0 -90
- data/lib/bosh-bootstrap/stages/stage_micro_bosh_deploy/bosh_micro_deploy +0 -79
- data/lib/bosh-bootstrap/stages/stage_micro_bosh_deploy/install_key_pair_for_user +0 -23
- data/lib/bosh-bootstrap/stages/stage_micro_bosh_deploy.rb +0 -146
- data/lib/bosh-bootstrap/stages/stage_micro_bosh_download/download_micro_bosh_stemcell +0 -93
- data/lib/bosh-bootstrap/stages/stage_micro_bosh_download.rb +0 -139
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/configure_git +0 -25
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/create_vcap_user +0 -79
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_base_packages +0 -30
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_bosh +0 -11
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_bosh_plugins +0 -25
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_hub +0 -26
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_ruby +0 -30
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_useful_gems +0 -29
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/validate_bosh_deployer +0 -18
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm.rb +0 -69
- data/lib/bosh-bootstrap/stages/stage_salted_password/convert_salted_password +0 -11
- data/lib/bosh-bootstrap/stages/stage_salted_password.rb +0 -51
- data/lib/bosh-bootstrap/stages/stage_setup_new_bosh/setup_bosh_user +0 -29
- data/lib/bosh-bootstrap/stages/stage_setup_new_bosh.rb +0 -51
- data/lib/bosh-bootstrap/stages/stage_validate_inception_vm/validate_ubuntu +0 -6
- data/lib/bosh-bootstrap/stages/stage_validate_inception_vm.rb +0 -39
- data/lib/bosh-bootstrap/stages.rb +0 -10
- data/spec/assets/bosh/public_stemcells/aws_micro.out +0 -7
- data/spec/assets/micro_bosh_yml/micro_bosh.aws_ec2.yml +0 -35
- data/spec/assets/micro_bosh_yml/micro_bosh.aws_vpc.yml +0 -37
- data/spec/integration/aws/aws_basic_spec.rb +0 -39
- data/spec/integration/aws/aws_edge_prebuilt_ami_spec.rb +0 -46
- data/spec/integration/aws/aws_edge_prebuilt_spec.rb +0 -46
- data/spec/integration/aws/aws_edge_spec.rb +0 -45
- data/spec/unit/aws_spec.rb +0 -177
- data/spec/unit/bosh/providers/aws_spec.rb +0 -174
- data/spec/unit/cli_spec.rb +0 -134
- data/spec/unit/cli_ssh_spec.rb +0 -95
- data/spec/unit/cli_upgrade_inception_spec.rb +0 -29
- data/spec/unit/settings_setter_spec.rb +0 -29
- data/vendor/cache/POpen4-0.1.4.gem +0 -0
- data/vendor/cache/Platform-0.4.0.gem +0 -0
- data/vendor/cache/activesupport-3.2.8.gem +0 -0
- data/vendor/cache/awesome_print-1.1.0.gem +0 -0
- data/vendor/cache/aws-s3-0.6.3.gem +0 -0
- data/vendor/cache/blobstore_client-0.4.0.gem +0 -0
- data/vendor/cache/bosh_cli-1.0.3.gem +0 -0
- data/vendor/cache/bosh_common-0.5.4.gem +0 -0
- data/vendor/cache/builder-3.2.0.gem +0 -0
- data/vendor/cache/coderay-1.0.8.gem +0 -0
- data/vendor/cache/diff-lcs-1.1.3.gem +0 -0
- data/vendor/cache/escape-0.0.4.gem +0 -0
- data/vendor/cache/excon-0.20.1.gem +0 -0
- data/vendor/cache/fog-1.8.0.gem +0 -0
- data/vendor/cache/formatador-0.2.4.gem +0 -0
- data/vendor/cache/guard-1.6.2.gem +0 -0
- data/vendor/cache/guard-rspec-2.4.0.gem +0 -0
- data/vendor/cache/highline-1.6.18.gem +0 -0
- data/vendor/cache/httpclient-2.2.4.gem +0 -0
- data/vendor/cache/i18n-0.6.1.gem +0 -0
- data/vendor/cache/json_pure-1.6.8.gem +0 -0
- data/vendor/cache/listen-0.7.2.gem +0 -0
- data/vendor/cache/log4r-1.1.10.gem +0 -0
- data/vendor/cache/lumberjack-1.0.2.gem +0 -0
- data/vendor/cache/method_source-0.8.1.gem +0 -0
- data/vendor/cache/mime-types-1.22.gem +0 -0
- data/vendor/cache/multi_json-1.1.0.gem +0 -0
- data/vendor/cache/net-scp-1.0.4.gem +0 -0
- data/vendor/cache/net-ssh-2.2.2.gem +0 -0
- data/vendor/cache/net-ssh-gateway-1.1.0.gem +0 -0
- data/vendor/cache/netaddr-1.5.0.gem +0 -0
- data/vendor/cache/nokogiri-1.5.9.gem +0 -0
- data/vendor/cache/open4-1.3.0.gem +0 -0
- data/vendor/cache/progressbar-0.9.2.gem +0 -0
- data/vendor/cache/pry-0.9.11.4-java.gem +0 -0
- data/vendor/cache/pry-0.9.11.4.gem +0 -0
- data/vendor/cache/rake-10.0.3.gem +0 -0
- data/vendor/cache/rb-fsevent-0.9.3.gem +0 -0
- data/vendor/cache/redcard-1.0.0.gem +0 -0
- data/vendor/cache/rspec-2.12.0.gem +0 -0
- data/vendor/cache/rspec-core-2.12.2.gem +0 -0
- data/vendor/cache/rspec-expectations-2.12.1.gem +0 -0
- data/vendor/cache/rspec-mocks-2.12.2.gem +0 -0
- data/vendor/cache/ruby-atmos-pure-1.0.5.gem +0 -0
- data/vendor/cache/ruby-hmac-0.4.0.gem +0 -0
- data/vendor/cache/settingslogic-2.0.9.gem +0 -0
- data/vendor/cache/slop-3.4.3.gem +0 -0
- data/vendor/cache/spoon-0.0.1.gem +0 -0
- data/vendor/cache/terminal-table-1.4.5.gem +0 -0
- data/vendor/cache/thor-0.17.0.gem +0 -0
- data/vendor/cache/uuidtools-2.1.3.gem +0 -0
- data/vendor/cache/xml-simple-1.1.2.gem +0 -0
data/lib/bosh/providers/aws.rb
DELETED
|
@@ -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
|
data/lib/bosh/providers.rb
DELETED
|
@@ -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
|