bosh_aws_cpi 0.6.0 → 0.6.2

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.
@@ -261,6 +261,10 @@ module Bosh::AwsCloud
261
261
  end
262
262
  end
263
263
 
264
+ # Configures network for a running instance
265
+ # @param [String] instance_id instance identifier
266
+ # @param [Hash] network_spec network properties
267
+ # @raises [Bosh::Clouds:NotSupported] if the security groups change
264
268
  def configure_networks(instance_id, network_spec)
265
269
  with_thread_name("configure_networks(#{instance_id}, ...)") do
266
270
  @logger.info("Configuring `#{instance_id}' to use the following " \
@@ -269,6 +273,18 @@ module Bosh::AwsCloud
269
273
  network_configurator = NetworkConfigurator.new(network_spec)
270
274
  instance = @ec2.instances[instance_id]
271
275
 
276
+ actual = instance.security_groups.collect {|sg| sg.name }.sort
277
+ new = network_configurator.security_groups(@default_security_groups)
278
+
279
+ # If the security groups change, we need to recreate the VM
280
+ # as you can't change the security group of a running instance,
281
+ # we need to send the InstanceUpdater a request to do it for us
282
+ unless actual == new
283
+ raise Bosh::Clouds::NotSupported,
284
+ "security groups change requires VM recreation: %s to %s" %
285
+ [actual.join(", "), new.join(", ")]
286
+ end
287
+
272
288
  network_configurator.configure(@ec2, instance)
273
289
 
274
290
  update_agent_settings(instance) do |settings|
@@ -17,8 +17,8 @@ module Bosh::AwsCloud
17
17
  ##
18
18
  # Configures EC2 dynamic network. Right now it's a no-op,
19
19
  # as dynamic networks are completely managed by EC2
20
- # @param [AWS:EC2] instance EC2 client
21
- # @param [AWS::EC2::Instance] EC2 instance to configure
20
+ # @param [AWS:EC2] ec2 instance EC2 client
21
+ # @param [AWS::EC2::Instance] instance EC2 instance to configure
22
22
  def configure(ec2, instance)
23
23
  end
24
24
 
@@ -37,14 +37,14 @@ module Bosh::AwsCloud
37
37
  cloud_error("More than one dynamic network for `#{name}'")
38
38
  else
39
39
  @dynamic_network = DynamicNetwork.new(name, spec)
40
- # only extract security groups for dynamic networks
41
- extract_security_groups(spec)
40
+ @security_groups += extract_security_groups(spec)
42
41
  end
43
42
  when "vip"
44
43
  if @vip_network
45
44
  cloud_error("More than one vip network for `#{name}'")
46
45
  else
47
46
  @vip_network = VipNetwork.new(name, spec)
47
+ @security_groups += extract_security_groups(spec)
48
48
  end
49
49
  else
50
50
  cloud_error("Invalid network type `#{network_type}': AWS CPI " \
@@ -58,6 +58,9 @@ module Bosh::AwsCloud
58
58
  end
59
59
  end
60
60
 
61
+ # Applies network configuration to the vm
62
+ # @param [AWS:EC2] ec2 instance EC2 client
63
+ # @param [AWS::EC2::Instance] instance EC2 instance to configure
61
64
  def configure(ec2, instance)
62
65
  @dynamic_network.configure(ec2, instance)
63
66
 
@@ -84,27 +87,30 @@ module Bosh::AwsCloud
84
87
  # @return [Array] security groups
85
88
  def security_groups(default)
86
89
  if @security_groups.empty? && default
87
- return default
90
+ default.sort
88
91
  else
89
- return @security_groups
92
+ @security_groups.sort
90
93
  end
91
94
  end
92
95
 
96
+ private
97
+
93
98
  ##
94
99
  # Extracts the security groups from the network configuration
95
100
  # @param [Hash] network_spec Network specification
96
101
  # @raise [ArgumentError] if the security groups in the network_spec
97
102
  # is not an Array
98
- def extract_security_groups(spec)
99
- if spec && spec["cloud_properties"]
100
- cloud_properties = spec["cloud_properties"]
103
+ def extract_security_groups(network_spec)
104
+ if network_spec && network_spec["cloud_properties"]
105
+ cloud_properties = network_spec["cloud_properties"]
101
106
  if cloud_properties && cloud_properties["security_groups"]
102
107
  unless cloud_properties["security_groups"].is_a?(Array)
103
108
  raise ArgumentError, "security groups must be an Array"
104
109
  end
105
- @security_groups += cloud_properties["security_groups"]
110
+ return cloud_properties["security_groups"]
106
111
  end
107
112
  end
113
+ []
108
114
  end
109
115
 
110
116
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Bosh
4
4
  module AwsCloud
5
- VERSION = "0.6.0"
5
+ VERSION = "0.6.2"
6
6
  end
7
7
  end
@@ -86,7 +86,12 @@ def mock_cloud(options = nil)
86
86
  end
87
87
 
88
88
  def dynamic_network_spec
89
- { "type" => "dynamic" }
89
+ {
90
+ "type" => "dynamic",
91
+ "cloud_properties" => {
92
+ "security_groups" => %w[default]
93
+ }
94
+ }
90
95
  end
91
96
 
92
97
  def vip_network_spec
@@ -8,9 +8,28 @@ describe Bosh::AwsCloud::Cloud do
8
8
  @registry = mock_registry
9
9
  end
10
10
 
11
+ it "forces recreation when security groups differ" do
12
+ sec_grp = double("security_group", :name => "newgroup")
13
+ instance = double("instance",
14
+ :id => "i-foobar",
15
+ :security_groups => [sec_grp])
16
+
17
+ cloud = mock_cloud do |ec2|
18
+ ec2.instances.stub(:[]).
19
+ with("i-foobar").
20
+ and_return(instance)
21
+ end
22
+
23
+ lambda {
24
+ cloud.configure_networks("i-foobar", combined_network_spec)
25
+ }.should raise_error Bosh::Clouds::NotSupported
26
+ end
27
+
11
28
  it "adds elastic ip from to the instance for vip network" do
29
+ sec_grp = double("security_group", :name => "default")
12
30
  instance = double("instance",
13
- :id => "i-foobar")
31
+ :id => "i-foobar",
32
+ :security_groups => [sec_grp])
14
33
 
15
34
  cloud = mock_cloud do |ec2|
16
35
  ec2.instances.stub(:[]).
@@ -33,8 +52,10 @@ describe Bosh::AwsCloud::Cloud do
33
52
  end
34
53
 
35
54
  it "removes elastic ip from the instance if vip network is gone" do
55
+ sec_grp = double("security_group", :name => "default")
36
56
  instance = double("instance",
37
- :id => "i-foobar")
57
+ :id => "i-foobar",
58
+ :security_groups => [sec_grp])
38
59
 
39
60
  cloud = mock_cloud do |ec2|
40
61
  ec2.instances.stub(:[]).
@@ -54,14 +54,16 @@ describe Bosh::AwsCloud::Cloud, "create_vm" do
54
54
  }
55
55
  }
56
56
 
57
+ sec_grp = double("security_group", :name => "default")
57
58
  instance = double("instance",
58
59
  :id => "i-test",
59
- :elastic_ip => nil)
60
+ :elastic_ip => nil,
61
+ :security_groups => [sec_grp])
60
62
  client = double("client", :describe_images => fake_image_set)
61
63
 
62
64
  cloud = mock_cloud do |ec2|
63
65
  ec2.instances.should_receive(:create).
64
- with(ec2_params(user_data)).
66
+ with(ec2_params(user_data, %w[default])).
65
67
  and_return(instance)
66
68
  ec2.should_receive(:client).and_return(client)
67
69
  end
@@ -90,10 +92,11 @@ describe Bosh::AwsCloud::Cloud, "create_vm" do
90
92
 
91
93
  instance = double("instance",
92
94
  :id => "i-test",
93
- :elastic_ip => nil)
95
+ :elastic_ip => nil,
96
+ :security_groups => [])
94
97
  client = double("client", :describe_images => fake_image_set)
95
98
 
96
- security_groups = %w[foo bar]
99
+ security_groups = %w[bar foo]
97
100
  network_spec = dynamic_network_spec
98
101
  network_spec["cloud_properties"] = {
99
102
  "security_groups" => security_groups
@@ -120,9 +123,11 @@ describe Bosh::AwsCloud::Cloud, "create_vm" do
120
123
  end
121
124
 
122
125
  it "associates instance with elastic ip if vip network is provided" do
126
+ sec_grp = double("security_group", :name => "default")
123
127
  instance = double("instance",
124
128
  :id => "i-test",
125
- :elastic_ip => nil)
129
+ :elastic_ip => nil,
130
+ :security_groups => [sec_grp])
126
131
  client = double("client", :describe_images => fake_image_set)
127
132
 
128
133
  cloud = mock_cloud do |ec2|
@@ -17,7 +17,7 @@ describe Bosh::AwsCloud::NetworkConfigurator do
17
17
  end
18
18
 
19
19
  describe "security groups" do
20
- it "should only be extracted from dynamic network" do
20
+ it "should be extracted from both dynamic and vip network" do
21
21
  spec = {}
22
22
  spec["network_a"] = dynamic_network_spec
23
23
  set_security_groups(spec["network_a"], %w[foo])
@@ -25,12 +25,12 @@ describe Bosh::AwsCloud::NetworkConfigurator do
25
25
  set_security_groups(spec["network_b"], %w[bar])
26
26
 
27
27
  nc = Bosh::AwsCloud::NetworkConfigurator.new(spec)
28
- nc.security_groups(nil).should == %w[foo]
28
+ nc.security_groups(nil).should == %w[bar foo]
29
29
  end
30
30
 
31
31
  it "should return the default groups if none are extracted" do
32
32
  spec = {}
33
- spec["network_a"] = dynamic_network_spec
33
+ spec["network_a"] = {"type" => "dynamic"}
34
34
 
35
35
  nc = Bosh::AwsCloud::NetworkConfigurator.new(spec)
36
36
  nc.security_groups(%w[foo]).should == %w[foo]
@@ -38,7 +38,7 @@ describe Bosh::AwsCloud::NetworkConfigurator do
38
38
 
39
39
  it "should return an empty list if no default group is set" do
40
40
  spec = {}
41
- spec["network_a"] = dynamic_network_spec
41
+ spec["network_a"] = {"type" => "dynamic"}
42
42
 
43
43
  nc = Bosh::AwsCloud::NetworkConfigurator.new(spec)
44
44
  nc.security_groups(nil).should == []
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bosh_aws_cpi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.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: 2012-07-23 00:00:00.000000000 Z
12
+ date: 2012-08-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk
@@ -34,7 +34,7 @@ dependencies:
34
34
  requirements:
35
35
  - - ! '>='
36
36
  - !ruby/object:Gem::Version
37
- version: 0.4.0
37
+ version: 0.5.0
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,7 +42,7 @@ dependencies:
42
42
  requirements:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
- version: 0.4.0
45
+ version: 0.5.0
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: bosh_cpi
48
48
  requirement: !ruby/object:Gem::Requirement
@@ -50,7 +50,7 @@ dependencies:
50
50
  requirements:
51
51
  - - ! '>='
52
52
  - !ruby/object:Gem::Version
53
- version: 0.4.3
53
+ version: 0.4.4
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,7 +58,7 @@ dependencies:
58
58
  requirements:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
- version: 0.4.3
61
+ version: 0.4.4
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: httpclient
64
64
  requirement: !ruby/object:Gem::Requirement
@@ -158,7 +158,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
158
158
  version: '0'
159
159
  segments:
160
160
  - 0
161
- hash: 3392403251669276232
161
+ hash: -2760126620918151960
162
162
  required_rubygems_version: !ruby/object:Gem::Requirement
163
163
  none: false
164
164
  requirements:
@@ -167,7 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
167
  version: '0'
168
168
  segments:
169
169
  - 0
170
- hash: 3392403251669276232
170
+ hash: -2760126620918151960
171
171
  requirements: []
172
172
  rubyforge_project:
173
173
  rubygems_version: 1.8.24