build-cloud 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/bin/build-cloud +181 -0
- data/build-cloud.gemspec +24 -0
- data/lib/build-cloud/asgroup.rb +68 -0
- data/lib/build-cloud/cachecluster.rb +66 -0
- data/lib/build-cloud/cacheparametergroup.rb +61 -0
- data/lib/build-cloud/cachesubnetgroup.rb +64 -0
- data/lib/build-cloud/component.rb +143 -0
- data/lib/build-cloud/dbparametergroup.rb +62 -0
- data/lib/build-cloud/dbparameters.rb +52 -0
- data/lib/build-cloud/dbsubnetgroup.rb +64 -0
- data/lib/build-cloud/iamrole.rb +84 -0
- data/lib/build-cloud/instance.rb +140 -0
- data/lib/build-cloud/internetgateway.rb +86 -0
- data/lib/build-cloud/launchconfiguration.rb +68 -0
- data/lib/build-cloud/loadbalancer.rb +119 -0
- data/lib/build-cloud/networkinterface.rb +121 -0
- data/lib/build-cloud/r53recordset.rb +110 -0
- data/lib/build-cloud/rdsserver.rb +73 -0
- data/lib/build-cloud/route.rb +110 -0
- data/lib/build-cloud/routetable.rb +106 -0
- data/lib/build-cloud/s3bucket.rb +49 -0
- data/lib/build-cloud/securitygroup.rb +91 -0
- data/lib/build-cloud/subnet.rb +86 -0
- data/lib/build-cloud/vpc.rb +73 -0
- data/lib/build-cloud/zone.rb +96 -0
- data/lib/build-cloud.rb +204 -0
- metadata +132 -0
@@ -0,0 +1,121 @@
|
|
1
|
+
class BuildCloud::NetworkInterface
|
2
|
+
|
3
|
+
include ::BuildCloud::Component
|
4
|
+
|
5
|
+
@@objects = []
|
6
|
+
|
7
|
+
def self.get_id_by_name( name )
|
8
|
+
|
9
|
+
interface = self.search( :name => name ).first
|
10
|
+
|
11
|
+
unless interface
|
12
|
+
raise "Couldn't get an NetworkInterface object for #{name} - is it defined?"
|
13
|
+
end
|
14
|
+
|
15
|
+
interface_fog = interface.read
|
16
|
+
|
17
|
+
unless interface_fog
|
18
|
+
raise "Couldn't get a NetworkInterface fog object for #{name} - is it created?"
|
19
|
+
end
|
20
|
+
|
21
|
+
interface_fog.network_interface_id
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize ( fog_interfaces, log, options = {} )
|
26
|
+
|
27
|
+
@compute = fog_interfaces[:compute]
|
28
|
+
@log = log
|
29
|
+
@options = options
|
30
|
+
|
31
|
+
@log.debug( options.inspect )
|
32
|
+
|
33
|
+
required_options(:name, :private_ip_address)
|
34
|
+
require_one_of(:subnet_id, :subnet_name)
|
35
|
+
require_one_of(:security_groups, :security_group_names)
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
def create
|
40
|
+
|
41
|
+
return if exists?
|
42
|
+
|
43
|
+
@log.info( "Creating network interface #{@options[:private_ip_address]}" )
|
44
|
+
|
45
|
+
options = @options.dup
|
46
|
+
|
47
|
+
unless options[:subnet_id]
|
48
|
+
|
49
|
+
options[:subnet_id] = BuildCloud::Subnet.get_id_by_name( options[:subnet_name] )
|
50
|
+
options.delete(:subnet_name)
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
unless options[:security_groups]
|
55
|
+
|
56
|
+
options[:group_set] = []
|
57
|
+
|
58
|
+
options[:security_group_names].each do |sg|
|
59
|
+
options[:group_set] << BuildCloud::SecurityGroup.get_id_by_name( sg )
|
60
|
+
end
|
61
|
+
|
62
|
+
options.delete(:security_group_names)
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
options[:description] = options[:name]
|
67
|
+
options.delete(:name)
|
68
|
+
|
69
|
+
interface = @compute.network_interfaces.new(options)
|
70
|
+
interface.save
|
71
|
+
|
72
|
+
attributes = {}
|
73
|
+
attributes[:resource_id] = interface.network_interface_id
|
74
|
+
attributes[:key] = 'Name'
|
75
|
+
attributes[:value] = options[:description]
|
76
|
+
interface_tag = @compute.tags.new( attributes )
|
77
|
+
interface_tag.save
|
78
|
+
|
79
|
+
if options[:assign_new_public_ip] and ! options[:existing_public_ip].nil?
|
80
|
+
raise "Cannot specifiy both new and existing IP addresses"
|
81
|
+
end
|
82
|
+
|
83
|
+
if options[:assign_new_public_ip]
|
84
|
+
ip = @compute.addresses.create
|
85
|
+
public_ip = ip.public_ip
|
86
|
+
allocation_id = ip.allocation_id
|
87
|
+
@compute.associate_address(nil, nil, interface.network_interface_id, allocation_id )
|
88
|
+
end
|
89
|
+
|
90
|
+
unless options[:existing_public_ip].nil?
|
91
|
+
ip = @compute.addresses.get(options[:existing_public_ip])
|
92
|
+
public_ip = ip.public_ip
|
93
|
+
allocation_id = ip.allocation_id
|
94
|
+
@compute.associate_address(nil, nil, interface.network_interface_id, allocation_id )
|
95
|
+
end
|
96
|
+
|
97
|
+
@log.debug( interface.inspect )
|
98
|
+
@log.debug( interface_tag.inspect )
|
99
|
+
@log.debug( ip.inspect ) unless ! options[:assign_new_public_ip]
|
100
|
+
@log.debug( ip.inspect ) unless options[:existing_public_ip].nil?
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
def read
|
105
|
+
@compute.network_interfaces.select { |ni| ni.private_ip_address == @options[:private_ip_address]}.first
|
106
|
+
end
|
107
|
+
|
108
|
+
alias_method :fog_object, :read
|
109
|
+
|
110
|
+
def delete
|
111
|
+
|
112
|
+
return unless exists?
|
113
|
+
|
114
|
+
@log.info( "Deleting network interface with IP address #{@options[:private_ip_address]}" )
|
115
|
+
|
116
|
+
fog_object.destroy
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
@@ -0,0 +1,110 @@
|
|
1
|
+
class BuildCloud::R53RecordSet
|
2
|
+
|
3
|
+
include ::BuildCloud::Component
|
4
|
+
|
5
|
+
@@objects = []
|
6
|
+
|
7
|
+
def initialize ( fog_interfaces, log, options = {} )
|
8
|
+
|
9
|
+
@log = log
|
10
|
+
@options = options
|
11
|
+
|
12
|
+
@log.debug( options.inspect )
|
13
|
+
|
14
|
+
required_options(:name, :type, :zone)
|
15
|
+
|
16
|
+
@zone_name = options.delete(:zone)
|
17
|
+
end
|
18
|
+
|
19
|
+
def create
|
20
|
+
|
21
|
+
return if exists?
|
22
|
+
|
23
|
+
@log.info( "Creating record set #{@options[:name]}" )
|
24
|
+
|
25
|
+
options = @options.dup
|
26
|
+
|
27
|
+
if options.has_key?(:alias_target)
|
28
|
+
|
29
|
+
unless options[:alias_target][:dns_name] and options[:alias_target][:hosted_zone_id]
|
30
|
+
|
31
|
+
elb_name = options[:alias_target].delete(:elb)
|
32
|
+
elb = BuildCloud::LoadBalancer.search( :id => elb_name ).first
|
33
|
+
|
34
|
+
unless elb
|
35
|
+
raise "Can't find ELB object for #{elb_name}"
|
36
|
+
end
|
37
|
+
|
38
|
+
options[:alias_target][:dns_name] = elb.read.dns_name
|
39
|
+
options[:alias_target][:hosted_zone_id] = elb.read.hosted_zone_name_id
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
if rds_server = options.delete(:rds_server)
|
46
|
+
|
47
|
+
rds = BuildCloud::RDSServer.search( :id => rds_server ).first
|
48
|
+
|
49
|
+
unless rds
|
50
|
+
raise "Can't find RDS Server for #{rds_server}"
|
51
|
+
end
|
52
|
+
|
53
|
+
options[:value] = [ rds.read.endpoint["Address"] ]
|
54
|
+
end
|
55
|
+
|
56
|
+
if cache_cluster = options.delete(:cache_cluster)
|
57
|
+
|
58
|
+
cache = BuildCloud::CacheCluster.search( :id => cache_cluster ).first
|
59
|
+
|
60
|
+
unless cache
|
61
|
+
raise "Can't find cache cluster for #{cache_cluster}"
|
62
|
+
end
|
63
|
+
|
64
|
+
options[:value] = [ cache.read.nodes.first["Address"] ]
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
record = zone.records.create( options )
|
70
|
+
|
71
|
+
@log.debug(record.inspect)
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
def read
|
76
|
+
if zone
|
77
|
+
return zone.records.select { |r| r.name == @options[:name] }.first
|
78
|
+
end
|
79
|
+
nil
|
80
|
+
end
|
81
|
+
|
82
|
+
alias_method :fog_object, :read
|
83
|
+
|
84
|
+
def delete
|
85
|
+
|
86
|
+
return unless exists?
|
87
|
+
|
88
|
+
@log.info( "Deleting record #{@options[:name]}" )
|
89
|
+
|
90
|
+
# Fog errors unless ttl is set:
|
91
|
+
fog_object.ttl = 1
|
92
|
+
fog_object.destroy
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
def wait_until_ready
|
97
|
+
@log.debug("Can't wait on r53 record set creation")
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
def zone
|
103
|
+
|
104
|
+
BuildCloud::Zone.search( :domain => @zone_name ).first.fog_object
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
end
|
110
|
+
|
@@ -0,0 +1,73 @@
|
|
1
|
+
|
2
|
+
class BuildCloud::RDSServer
|
3
|
+
|
4
|
+
include ::BuildCloud::Component
|
5
|
+
|
6
|
+
@@objects = []
|
7
|
+
|
8
|
+
def initialize ( fog_interfaces, log, options = {} )
|
9
|
+
|
10
|
+
@rds = fog_interfaces[:rds]
|
11
|
+
@log = log
|
12
|
+
@options = options
|
13
|
+
|
14
|
+
@log.debug( options.inspect )
|
15
|
+
|
16
|
+
required_options(:id, :engine, :allocated_storage, :backup_retention_period,
|
17
|
+
:flavor_id, :db_name, :master_username, :password, :vpc_security_group_names)
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
def create
|
22
|
+
|
23
|
+
return if exists?
|
24
|
+
|
25
|
+
@log.info( "Creating RDS Server #{@options[:id]}" )
|
26
|
+
|
27
|
+
options = @options.dup
|
28
|
+
|
29
|
+
options[:db_security_groups] = []
|
30
|
+
|
31
|
+
unless options[:vpc_security_groups]
|
32
|
+
|
33
|
+
options[:vpc_security_groups] = []
|
34
|
+
|
35
|
+
options[:vpc_security_group_names].each do |sg|
|
36
|
+
options[:vpc_security_groups] << BuildCloud::SecurityGroup.get_id_by_name( sg )
|
37
|
+
end
|
38
|
+
|
39
|
+
options.delete(:vpc_security_group_names)
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
@log.debug( options.inspect)
|
44
|
+
|
45
|
+
rds_server = @rds.servers.new( options )
|
46
|
+
rds_server.save
|
47
|
+
|
48
|
+
@log.debug( rds_server.inspect )
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
def ready_timeout
|
53
|
+
20 * 60 # RDS instances take a while
|
54
|
+
end
|
55
|
+
|
56
|
+
def read
|
57
|
+
@rds.servers.select { |r| r.id == @options[:id] }.first
|
58
|
+
end
|
59
|
+
|
60
|
+
alias_method :fog_object, :read
|
61
|
+
|
62
|
+
def delete
|
63
|
+
|
64
|
+
return unless exists?
|
65
|
+
|
66
|
+
@log.info( "Deleting RDS Server #{@options[:id]}" )
|
67
|
+
|
68
|
+
fog_object.destroy
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
@@ -0,0 +1,110 @@
|
|
1
|
+
class BuildCloud::Route
|
2
|
+
|
3
|
+
include ::BuildCloud::Component
|
4
|
+
|
5
|
+
@@objects = []
|
6
|
+
|
7
|
+
def initialize ( fog_interfaces, log, options = {} )
|
8
|
+
|
9
|
+
@compute = fog_interfaces[:compute]
|
10
|
+
@log = log
|
11
|
+
@options = options
|
12
|
+
|
13
|
+
@log.debug( options.inspect )
|
14
|
+
|
15
|
+
required_options(:name, :route_table_name, :destination_cidr_block)
|
16
|
+
require_one_of(:internet_gateway_name, :network_interface_name, :internet_gateway_id, :network_interface_id)
|
17
|
+
require_one_of(:route_table_id, :route_table_name)
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
def create
|
22
|
+
|
23
|
+
return if exists?
|
24
|
+
|
25
|
+
@log.info("Creating route #{@options[:name]}")
|
26
|
+
|
27
|
+
options = @options.dup
|
28
|
+
|
29
|
+
options[:tags] = { 'Name' => options.delete(:name) }
|
30
|
+
|
31
|
+
unless options[:network_interface_name]
|
32
|
+
options[:network_interface_id] = BuildCloud::NetworkInterface.get_id_by_name( options[:network_interface_name] )
|
33
|
+
options.delete(:network_interface_name)
|
34
|
+
end
|
35
|
+
|
36
|
+
unless options[:internet_gateway_name]
|
37
|
+
options[:internet_gateway_id] = BuildCloud::InternetGateway.get_id_by_name( options[:internet_gateway_name] )
|
38
|
+
options.delete(:internet_gateway_name)
|
39
|
+
end
|
40
|
+
|
41
|
+
unless options[:route_table_name]
|
42
|
+
options[:route_table_id] = BuildCloud::RouteTable.get_id_by_name( options[:route_table_name] )
|
43
|
+
options.delete(:route_table_name)
|
44
|
+
end
|
45
|
+
|
46
|
+
route_table_id = options[:route_table_id]
|
47
|
+
destination_cidr_block = options[:destination_cidr_block]
|
48
|
+
internet_gateway_id = options[:internet_gateway_id]
|
49
|
+
network_interface_id = options[:network_interface_id]
|
50
|
+
|
51
|
+
# Using requests instead of model here, because the model
|
52
|
+
# doesn't support associations.
|
53
|
+
|
54
|
+
begin
|
55
|
+
|
56
|
+
if create_route(route_table_id, destination_cidr_block, internet_gateway_id, nil, network_interface_id)
|
57
|
+
@log.debug("route created successfully")
|
58
|
+
else
|
59
|
+
@log.debug("failed to create route")
|
60
|
+
end
|
61
|
+
|
62
|
+
rescue Exception => e
|
63
|
+
@log.error( "An exception - #{e} - occured")
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
def read
|
69
|
+
rt = @compute.route_tables.select { |rt| rt.tags['Name'] == @options[:name] }.first
|
70
|
+
@log.info( rt.inspect )
|
71
|
+
@log.info( rt.routes ) unless rt.routes.empty?
|
72
|
+
|
73
|
+
route = rt.routes.select { |t| t['destinationCidrBlock'] == @options[:destination_cidr_block]}
|
74
|
+
@log.info( route.inspect )
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
alias_method :fog_object, :read
|
79
|
+
|
80
|
+
def delete
|
81
|
+
|
82
|
+
return unless exists?
|
83
|
+
|
84
|
+
@log.info("Deleting route #{@options[:name]}")
|
85
|
+
|
86
|
+
unless options[:route_table_name]
|
87
|
+
options[:route_table_id] = BuildCloud::RouteTable.get_id_by_name( options[:route_table_name] )
|
88
|
+
options.delete(:route_table_name)
|
89
|
+
end
|
90
|
+
|
91
|
+
route_table_id = options[:route_table_id]
|
92
|
+
destination_cidr_block = options[:destination_cidr_block]
|
93
|
+
|
94
|
+
begin
|
95
|
+
|
96
|
+
if delete_route(route_table_id, destination_cidr_block)
|
97
|
+
@log.debug("route deleted successfully")
|
98
|
+
else
|
99
|
+
@log.debug("failed to delet route")
|
100
|
+
end
|
101
|
+
|
102
|
+
rescue Exception => e
|
103
|
+
@log.error( "An exception - #{e} - occured")
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
|
@@ -0,0 +1,106 @@
|
|
1
|
+
class BuildCloud::RouteTable
|
2
|
+
|
3
|
+
include ::BuildCloud::Component
|
4
|
+
|
5
|
+
@@objects = []
|
6
|
+
|
7
|
+
def self.get_id_by_name( name )
|
8
|
+
|
9
|
+
route_table = self.search( :name => name ).first
|
10
|
+
|
11
|
+
unless route_table
|
12
|
+
raise "Couldn't get a RouteTable object for #{name} - is it defined?"
|
13
|
+
end
|
14
|
+
|
15
|
+
route_table_fog = route_table.read
|
16
|
+
|
17
|
+
unless route_table_fog
|
18
|
+
raise "Couldn't get a RouteTable fog object for #{name} - is it created?"
|
19
|
+
end
|
20
|
+
|
21
|
+
route_table_fog.route_table_id
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize ( fog_interfaces, log, options = {} )
|
26
|
+
|
27
|
+
@compute = fog_interfaces[:compute]
|
28
|
+
@log = log
|
29
|
+
@options = options
|
30
|
+
|
31
|
+
@log.debug( options.inspect )
|
32
|
+
|
33
|
+
required_options(:name)
|
34
|
+
require_one_of(:vpc_id, :vpc_name)
|
35
|
+
require_one_of(:subnet_ids, :subnet_names)
|
36
|
+
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
def create
|
41
|
+
|
42
|
+
return if exists?
|
43
|
+
|
44
|
+
@log.info("Creating route table #{@options[:name]}")
|
45
|
+
|
46
|
+
options = @options.dup
|
47
|
+
|
48
|
+
unless options[:subnet_ids]
|
49
|
+
|
50
|
+
options[:subnet_ids] = []
|
51
|
+
|
52
|
+
options[:subnet_names].each do |sn|
|
53
|
+
options[:subnet_ids] << BuildCloud::Subnet.get_id_by_name( sn )
|
54
|
+
end
|
55
|
+
|
56
|
+
options.delete(:subnet_names)
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
unless options[:vpc_id]
|
61
|
+
|
62
|
+
options[:vpc_id] = BuildCloud::VPC.get_id_by_name( options[:vpc_name] )
|
63
|
+
options.delete(:vpc_name)
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
options[:tags] = { 'Name' => options.delete(:name) }
|
68
|
+
|
69
|
+
# Using requests instead of model here, because the model
|
70
|
+
# doesn't support associations.
|
71
|
+
|
72
|
+
rt = @compute.route_tables.new ( options )
|
73
|
+
rt.save
|
74
|
+
@log.debug(rt.inspect)
|
75
|
+
|
76
|
+
@compute.create_tags( rt.id, options[:tags] )
|
77
|
+
|
78
|
+
options[:subnet_ids].each do |s|
|
79
|
+
@compute.associate_route_table( rt.id, s )
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
def read
|
85
|
+
@compute.route_tables.select { |r| r.tags['Name'] == @options[:name] }.first
|
86
|
+
end
|
87
|
+
|
88
|
+
alias_method :fog_object, :read
|
89
|
+
|
90
|
+
def delete
|
91
|
+
|
92
|
+
return unless exists?
|
93
|
+
|
94
|
+
@log.info("Deleting route table #{@options[:name]}")
|
95
|
+
|
96
|
+
read.associations.each do |ra|
|
97
|
+
@compute.disassociate_route_table( ra['routeTableAssociationId'] )
|
98
|
+
end
|
99
|
+
|
100
|
+
fog_object.destroy
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class BuildCloud::S3Bucket
|
2
|
+
|
3
|
+
include ::BuildCloud::Component
|
4
|
+
|
5
|
+
@@objects = []
|
6
|
+
|
7
|
+
def initialize ( fog_interfaces, log, options = {} )
|
8
|
+
|
9
|
+
@s3 = fog_interfaces[:s3]
|
10
|
+
@log = log
|
11
|
+
@options = options
|
12
|
+
|
13
|
+
@log.debug( options.inspect )
|
14
|
+
|
15
|
+
required_options(:key, :location)
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def create
|
20
|
+
|
21
|
+
return if exists?
|
22
|
+
|
23
|
+
@log.info( "Creating new S3 bucket #{@options[:key]}" )
|
24
|
+
|
25
|
+
bucket = @s3.directories.new( @options )
|
26
|
+
bucket.save
|
27
|
+
|
28
|
+
@log.debug( bucket.inspect )
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
def read
|
33
|
+
@s3.directories.select { |d| d.key == @options[:key] }.first
|
34
|
+
end
|
35
|
+
|
36
|
+
alias_method :fog_object, :read
|
37
|
+
|
38
|
+
def delete
|
39
|
+
|
40
|
+
return unless exists?
|
41
|
+
|
42
|
+
@log.info( "Deleting S3 bucket #{@options[:key]}" )
|
43
|
+
|
44
|
+
fog_object.destroy
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
@@ -0,0 +1,91 @@
|
|
1
|
+
class BuildCloud::SecurityGroup
|
2
|
+
|
3
|
+
include ::BuildCloud::Component
|
4
|
+
|
5
|
+
@@objects = []
|
6
|
+
|
7
|
+
def self.get_id_by_name( name )
|
8
|
+
|
9
|
+
sg = self.search( :name => name ).first
|
10
|
+
|
11
|
+
unless sg
|
12
|
+
raise "Couldn't get a SecurityGroup object for #{name} - is it defined?"
|
13
|
+
end
|
14
|
+
|
15
|
+
sg_fog = sg.read
|
16
|
+
|
17
|
+
unless sg_fog
|
18
|
+
raise "Couldn't get a SecurityGroup fog object for #{name} - is it created?"
|
19
|
+
end
|
20
|
+
|
21
|
+
sg_fog.group_id
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize ( fog_interfaces, log, options = {} )
|
26
|
+
|
27
|
+
@compute = fog_interfaces[:compute]
|
28
|
+
@log = log
|
29
|
+
@options = options
|
30
|
+
|
31
|
+
@log.debug( options.inspect )
|
32
|
+
|
33
|
+
required_options(:name, :description)
|
34
|
+
require_one_of(:vpc_id, :vpc_name)
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
def create
|
39
|
+
|
40
|
+
return if exists?
|
41
|
+
|
42
|
+
@log.info( "Creating security group #{@options[:name]}" )
|
43
|
+
|
44
|
+
options = @options.dup
|
45
|
+
|
46
|
+
unless options[:vpc_id]
|
47
|
+
|
48
|
+
options[:vpc_id] = BuildCloud::VPC.get_id_by_name( options[:vpc_name] )
|
49
|
+
options.delete(:vpc_name)
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
authorized_ranges = []
|
54
|
+
if options[:authorized_ranges]
|
55
|
+
authorized_ranges = options[:authorized_ranges]
|
56
|
+
options.delete(:authorized_ranges)
|
57
|
+
end
|
58
|
+
|
59
|
+
security_group = @compute.security_groups.new( options )
|
60
|
+
security_group.save
|
61
|
+
|
62
|
+
authorized_ranges.each do |r|
|
63
|
+
|
64
|
+
security_group.authorize_port_range(
|
65
|
+
r.delete(:min_port)..r.delete(:max_port), r
|
66
|
+
)
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
@log.debug( security_group.inspect )
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
def read
|
75
|
+
@compute.security_groups.select { |sg| sg.name == @options[:name] }.first
|
76
|
+
end
|
77
|
+
|
78
|
+
alias_method :fog_object, :read
|
79
|
+
|
80
|
+
def delete
|
81
|
+
|
82
|
+
return unless exists?
|
83
|
+
|
84
|
+
@log.info( "Deleting security group #{@options[:name]}" )
|
85
|
+
|
86
|
+
fog_object.destroy
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|