bosh_aws_cpi 0.6.0 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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