bosh_agent 1.5.0.pre.1257 → 1.5.0.pre.1259

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.
@@ -6,15 +6,13 @@ module Bosh::Agent
6
6
 
7
7
  def validate_spec(spec)
8
8
  unless spec.is_a?(Hash)
9
- raise ArgumentError, "Invalid #{self.class} spec: " +
10
- "Hash expected, #{spec.class} given"
9
+ raise ArgumentError, "Invalid #{self.class} spec: Hash expected, #{spec.class} given"
11
10
  end
12
11
 
13
12
  required_keys = %w(name version sha1 blobstore_id)
14
13
  missing_keys = required_keys.select { |k| spec[k].nil? }
15
14
  unless missing_keys.empty?
16
- raise ArgumentError, "Invalid #{self.class} spec: " +
17
- "#{missing_keys.join(', ')} missing"
15
+ raise ArgumentError, "Invalid #{self.class} spec: #{missing_keys.join(', ')} missing"
18
16
  end
19
17
  end
20
18
 
@@ -22,9 +20,17 @@ module Bosh::Agent
22
20
  FileUtils.mkdir_p(File.dirname(@install_path))
23
21
  FileUtils.mkdir_p(File.dirname(@link_path))
24
22
 
25
- Bosh::Agent::Util.unpack_blob(@blobstore_id, @checksum, @install_path)
23
+ # Once directory is created we'll never do the fetch a second time;
24
+ # we make a best effort to ensure directory is in a consistent state
25
+ unless Dir.exist?(@install_path)
26
+ Bosh::Agent::Util.unpack_blob(@blobstore_id, @checksum, @install_path)
27
+ end
28
+ end
29
+
30
+ def fetch_bits_and_symlink
31
+ fetch_bits
26
32
  Bosh::Agent::Util.create_symlink(@install_path, @link_path)
27
33
  end
28
34
  end
29
35
  end
30
- end
36
+ end
@@ -39,8 +39,12 @@ module Bosh::Agent
39
39
  @link_path = File.join(@base_dir, 'jobs', @template)
40
40
  end
41
41
 
42
- def install
42
+ def prepare_for_install
43
43
  fetch_bits
44
+ end
45
+
46
+ def install
47
+ fetch_bits_and_symlink
44
48
  bind_configuration
45
49
  harden_permissions
46
50
  rescue SystemCallError => e
@@ -25,11 +25,12 @@ module Bosh::Agent
25
25
  @link_path = File.join(@base_dir, 'packages', @name)
26
26
  end
27
27
 
28
+ def prepare_for_install
29
+ fetch_bits
30
+ end
31
+
28
32
  def install_for_job(job)
29
- unless @installed_for_sys
30
- fetch_bits
31
- @installed_for_sys = true
32
- end
33
+ fetch_bits_and_symlink
33
34
  create_symlink_in_job(job) if job
34
35
  rescue SystemCallError => e
35
36
  install_failed("System call error: #{e.message}")
@@ -88,10 +88,6 @@ module Bosh::Agent
88
88
  job.configure(job_index)
89
89
  end
90
90
  end
91
-
92
- def has_prepared_spec?(new_spec)
93
- @spec['prepared_spec'] == new_spec
94
- end
95
91
  end
96
92
  end
97
93
  end
@@ -108,9 +108,7 @@ module Bosh::Agent
108
108
  end
109
109
 
110
110
  def apply_job
111
- if @old_plan.has_prepared_spec?(@new_spec)
112
- logger.info("New jobs already installed")
113
- elsif @new_plan.has_jobs?
111
+ if @new_plan.has_jobs?
114
112
  @new_plan.install_jobs
115
113
  else
116
114
  logger.info("No job")
@@ -118,9 +116,7 @@ module Bosh::Agent
118
116
  end
119
117
 
120
118
  def apply_packages
121
- if @old_plan.has_prepared_spec?(@new_spec)
122
- logger.info("New packages already installed")
123
- elsif @new_plan.has_packages?
119
+ if @new_plan.has_packages?
124
120
  @new_plan.install_packages
125
121
  else
126
122
  logger.info("No packages")
@@ -1,86 +1,25 @@
1
1
  module Bosh::Agent::Message
2
2
  class Prepare < Base
3
- def initialize(args)
4
- @platform = Bosh::Agent::Config.platform
5
-
6
- if args.size < 1
7
- raise ArgumentError, "not enough arguments"
8
- end
9
-
10
- @new_spec = args.first
11
- unless @new_spec.is_a?(Hash)
12
- raise ArgumentError, "invalid spec, Hash expected, " +
13
- "#{@new_spec.class} given"
14
- end
15
- end
16
-
17
- def prepare
18
- initialize_plans
19
-
20
- %w(bosh jobs packages monit).each do |dir|
21
- FileUtils.mkdir_p(File.join(base_dir, dir))
22
- end
23
-
24
- logger.info("Preparing: #{@new_spec.inspect}")
25
-
26
- if @new_plan.configured?
27
- begin
28
- apply_job
29
- apply_packages
30
- log_bit_download_with_agent_state
31
- rescue Exception => e
32
- raise Bosh::Agent::MessageHandlerError,
33
- "#{e.message}: #{e.backtrace}"
34
- end
35
- end
3
+ def self.process(args)
4
+ new(*args).run
36
5
  end
37
6
 
38
- private
39
-
40
- def initialize_plans
41
- initialize_networks
42
-
43
- @old_spec = Bosh::Agent::Config.state.to_hash
44
-
45
- @old_plan = Bosh::Agent::ApplyPlan::Plan.new(@old_spec)
46
- @new_plan = Bosh::Agent::ApplyPlan::Plan.new(@new_spec)
47
- end
48
-
49
- def initialize_networks
50
- if @new_spec["networks"]
51
- @new_spec["networks"].each do |network, properties|
52
- infrastructure = Bosh::Agent::Config.infrastructure
53
- network_settings =
54
- infrastructure.get_network_settings(network, properties)
55
- logger.debug("current network settings from VM: #{network_settings.inspect}")
56
- logger.debug("new network settings to be applied: #{properties.inspect}")
57
- if network_settings
58
- @new_spec["networks"][network].merge!(network_settings)
59
- logger.debug("merged network settings: #{@new_spec["networks"].inspect}")
60
- end
61
- end
62
- end
63
- end
64
-
65
- def apply_job
66
- if @new_plan.has_jobs?
67
- @new_plan.install_jobs
68
- else
69
- logger.info("No job")
70
- end
71
- end
7
+ def initialize(apply_spec)
8
+ @platform = Bosh::Agent::Config.platform
9
+ @apply_spec = apply_spec
72
10
 
73
- def apply_packages
74
- if @new_plan.has_packages?
75
- @new_plan.install_packages
76
- else
77
- logger.info("No packages")
11
+ unless @apply_spec.is_a?(Hash)
12
+ raise ArgumentError, "invalid spec, Hash expected, #{@apply_spec.class} given"
78
13
  end
79
14
  end
80
15
 
81
- def log_bit_download_with_agent_state
82
- @old_spec['prepared_spec'] = @new_spec
83
- Bosh::Agent::Config.state.write(@old_spec)
16
+ def run
17
+ plan = Bosh::Agent::ApplyPlan::Plan.new(@apply_spec)
18
+ plan.jobs.each(&:prepare_for_install)
19
+ plan.packages.each(&:prepare_for_install)
20
+ {}
21
+ rescue Exception => e
22
+ raise Bosh::Agent::MessageHandlerError, "#{e.inspect}\n#{e.backtrace}"
84
23
  end
85
24
  end
86
25
  end
@@ -31,16 +31,22 @@ module Bosh::Agent
31
31
  raise Bosh::Agent::MessageHandlerError.new(e.inspect)
32
32
  end
33
33
 
34
- logger.info("Creating '#{install_path}'")
35
- FileUtils.mkdir_p(install_path)
34
+ partial_install_path = "#{install_path}-bosh-agent-unpack"
35
+ logger.info("Creating '#{partial_install_path}'")
36
+ FileUtils.rm_rf(partial_install_path)
37
+ FileUtils.mkdir_p(partial_install_path)
36
38
 
37
- logger.info("Installing to '#{install_path}'")
38
- Dir.chdir(install_path) do
39
+ logger.info("Installing to '#{partial_install_path}'")
40
+ Dir.chdir(partial_install_path) do
39
41
  output = `tar --no-same-owner -zxvf #{tf.path} 2>&1`
40
42
  unless $?.exitstatus == 0
41
- raise Bosh::Agent::MessageHandlerError.new("Failed to unpack blob", output)
43
+ raise Bosh::Agent::MessageHandlerError.new('Failed to unpack blob', output)
42
44
  end
43
45
  end
46
+
47
+ # Only move contents of the blob to install path at the end
48
+ # to avoid corrupted package directory
49
+ FileUtils.mv(partial_install_path, install_path)
44
50
  rescue Exception => e
45
51
  logger.info("Failure unpacking blob: #{e.inspect} #{e.backtrace}")
46
52
  raise e
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Bosh
4
4
  module Agent
5
- VERSION = '1.5.0.pre.1257'
5
+ VERSION = '1.5.0.pre.1259'
6
6
  BOSH_PROTOCOL = "1"
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bosh_agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0.pre.1257
4
+ version: 1.5.0.pre.1259
5
5
  prerelease: 6
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: 2013-11-05 00:00:00.000000000 Z
12
+ date: 2013-11-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: netaddr
@@ -162,7 +162,7 @@ dependencies:
162
162
  requirements:
163
163
  - - ~>
164
164
  - !ruby/object:Gem::Version
165
- version: 1.5.0.pre.1257
165
+ version: 1.5.0.pre.1259
166
166
  type: :runtime
167
167
  prerelease: false
168
168
  version_requirements: !ruby/object:Gem::Requirement
@@ -170,7 +170,7 @@ dependencies:
170
170
  requirements:
171
171
  - - ~>
172
172
  - !ruby/object:Gem::Version
173
- version: 1.5.0.pre.1257
173
+ version: 1.5.0.pre.1259
174
174
  - !ruby/object:Gem::Dependency
175
175
  name: bosh_common
176
176
  requirement: !ruby/object:Gem::Requirement
@@ -178,7 +178,7 @@ dependencies:
178
178
  requirements:
179
179
  - - ~>
180
180
  - !ruby/object:Gem::Version
181
- version: 1.5.0.pre.1257
181
+ version: 1.5.0.pre.1259
182
182
  type: :runtime
183
183
  prerelease: false
184
184
  version_requirements: !ruby/object:Gem::Requirement
@@ -186,7 +186,7 @@ dependencies:
186
186
  requirements:
187
187
  - - ~>
188
188
  - !ruby/object:Gem::Version
189
- version: 1.5.0.pre.1257
189
+ version: 1.5.0.pre.1259
190
190
  - !ruby/object:Gem::Dependency
191
191
  name: blobstore_client
192
192
  requirement: !ruby/object:Gem::Requirement
@@ -194,7 +194,7 @@ dependencies:
194
194
  requirements:
195
195
  - - ~>
196
196
  - !ruby/object:Gem::Version
197
- version: 1.5.0.pre.1257
197
+ version: 1.5.0.pre.1259
198
198
  type: :runtime
199
199
  prerelease: false
200
200
  version_requirements: !ruby/object:Gem::Requirement
@@ -202,7 +202,7 @@ dependencies:
202
202
  requirements:
203
203
  - - ~>
204
204
  - !ruby/object:Gem::Version
205
- version: 1.5.0.pre.1257
205
+ version: 1.5.0.pre.1259
206
206
  - !ruby/object:Gem::Dependency
207
207
  name: rspec-fire
208
208
  requirement: !ruby/object:Gem::Requirement
@@ -222,7 +222,7 @@ dependencies:
222
222
  description: ! 'This agent listens for instructions from the bosh director on each
223
223
  server that bosh manages.
224
224
 
225
- 11054b'
225
+ 65813d'
226
226
  email: support@cloudfoundry.com
227
227
  executables:
228
228
  - bosh_agent