bosh-director 1.3215.4.0 → 1.3232.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/bin/bosh-director-console +1 -1
  3. data/bin/bosh-director-drain-workers +8 -2
  4. data/bin/bosh-director-worker +34 -53
  5. data/db/migrations/director/20110617211923_add_deployments_release_versions.rb +2 -2
  6. data/db/migrations/director/20120524175805_add_task_type.rb +23 -23
  7. data/db/migrations/director/20130531172604_add_director_attributes.rb +1 -2
  8. data/db/migrations/director/20140116002324_pivot_director_attributes.rb +1 -2
  9. data/db/migrations/director/20160210201838_denormalize_compiled_package_stemcell_id_to_stemcell_name_and_version.rb +7 -9
  10. data/db/migrations/director/20160211174110_add_events.rb +22 -0
  11. data/db/migrations/director/20160324181932_create_delayed_jobs.rb +22 -0
  12. data/db/migrations/director/20160324182211_add_locks.rb +15 -0
  13. data/db/migrations/director/20160329201256_set_instances_with_nil_serial_to_false.rb +15 -0
  14. data/db/migrations/director/20160331225404_backfill_stemcell_os.rb +9 -0
  15. data/db/migrations/director/20160411104407_add_task_started_at.rb +9 -0
  16. data/lib/bosh/director.rb +9 -2
  17. data/lib/bosh/director/agent_client.rb +22 -9
  18. data/lib/bosh/director/api.rb +0 -1
  19. data/lib/bosh/director/api/api_helper.rb +1 -1
  20. data/lib/bosh/director/api/controllers/base_controller.rb +5 -1
  21. data/lib/bosh/director/api/controllers/cloud_configs_controller.rb +18 -2
  22. data/lib/bosh/director/api/controllers/deployments_controller.rb +16 -9
  23. data/lib/bosh/director/api/controllers/events_controller.rb +37 -0
  24. data/lib/bosh/director/api/controllers/locks_controller.rb +7 -11
  25. data/lib/bosh/director/api/controllers/packages_controller.rb +1 -1
  26. data/lib/bosh/director/api/controllers/runtime_configs_controller.rb +18 -2
  27. data/lib/bosh/director/api/controllers/tasks_controller.rb +7 -2
  28. data/lib/bosh/director/api/deployment_lookup.rb +1 -1
  29. data/lib/bosh/director/api/deployment_manager.rb +1 -1
  30. data/lib/bosh/director/api/event_manager.rb +68 -0
  31. data/lib/bosh/director/api/extensions/scoping.rb +2 -2
  32. data/lib/bosh/director/api/extensions/syslog_request_logger.rb +75 -0
  33. data/lib/bosh/director/api/instance_lookup.rb +2 -2
  34. data/lib/bosh/director/api/instance_manager.rb +2 -2
  35. data/lib/bosh/director/api/local_identity_provider.rb +8 -0
  36. data/lib/bosh/director/api/property_manager.rb +6 -5
  37. data/lib/bosh/director/api/release_manager.rb +3 -3
  38. data/lib/bosh/director/api/resource_manager.rb +2 -2
  39. data/lib/bosh/director/api/resurrector_manager.rb +1 -1
  40. data/lib/bosh/director/api/route_configuration.rb +1 -0
  41. data/lib/bosh/director/api/stemcell_manager.rb +5 -5
  42. data/lib/bosh/director/api/task_manager.rb +1 -0
  43. data/lib/bosh/director/api/task_remover.rb +1 -1
  44. data/lib/bosh/director/api/uaa_identity_provider.rb +9 -1
  45. data/lib/bosh/director/api/user/database_user_manager.rb +1 -1
  46. data/lib/bosh/director/app.rb +1 -1
  47. data/lib/bosh/director/arp_flusher.rb +23 -0
  48. data/lib/bosh/director/cloudcheck_helper.rb +4 -3
  49. data/lib/bosh/director/compile_task.rb +6 -6
  50. data/lib/bosh/director/compile_task_generator.rb +6 -6
  51. data/lib/bosh/director/compiled_release_downloader.rb +4 -4
  52. data/lib/bosh/director/config.rb +29 -87
  53. data/lib/bosh/director/deployment_deleter.rb +6 -6
  54. data/lib/bosh/director/deployment_plan/agent_state_migrator.rb +2 -2
  55. data/lib/bosh/director/deployment_plan/assembler.rb +1 -1
  56. data/lib/bosh/director/deployment_plan/compilation_instance_pool.rb +26 -1
  57. data/lib/bosh/director/deployment_plan/deployment_repo.rb +1 -1
  58. data/lib/bosh/director/deployment_plan/disk_type.rb +1 -1
  59. data/lib/bosh/director/deployment_plan/instance.rb +2 -2
  60. data/lib/bosh/director/deployment_plan/instance_plan.rb +2 -2
  61. data/lib/bosh/director/deployment_plan/instance_spec.rb +2 -0
  62. data/lib/bosh/director/deployment_plan/ip_provider/ip_provider.rb +7 -3
  63. data/lib/bosh/director/deployment_plan/job.rb +12 -10
  64. data/lib/bosh/director/deployment_plan/job_spec_parser.rb +4 -4
  65. data/lib/bosh/director/deployment_plan/links/link.rb +1 -0
  66. data/lib/bosh/director/deployment_plan/links/link_path.rb +18 -19
  67. data/lib/bosh/director/deployment_plan/links/links_resolver.rb +2 -0
  68. data/lib/bosh/director/deployment_plan/links/template_link.rb +1 -1
  69. data/lib/bosh/director/deployment_plan/manual_network.rb +1 -1
  70. data/lib/bosh/director/deployment_plan/manual_network_subnet.rb +6 -6
  71. data/lib/bosh/director/deployment_plan/planner.rb +3 -3
  72. data/lib/bosh/director/deployment_plan/planner_factory.rb +38 -40
  73. data/lib/bosh/director/deployment_plan/release_version.rb +5 -5
  74. data/lib/bosh/director/deployment_plan/runtime_manifest_parser.rb +22 -18
  75. data/lib/bosh/director/deployment_plan/steps/package_compile_step.rb +14 -16
  76. data/lib/bosh/director/deployment_plan/steps/update_step.rb +5 -5
  77. data/lib/bosh/director/deployment_plan/template.rb +61 -1
  78. data/lib/bosh/director/deployment_plan/update_config.rb +1 -1
  79. data/lib/bosh/director/disk_manager.rb +49 -40
  80. data/lib/bosh/director/dns/canonicalizer.rb +2 -2
  81. data/lib/bosh/director/dns/dns_manager.rb +2 -2
  82. data/lib/bosh/director/dns/powerdns.rb +2 -2
  83. data/lib/bosh/director/download_helper.rb +5 -5
  84. data/lib/bosh/director/errand/job_manager.rb +5 -6
  85. data/lib/bosh/director/errand/result.rb +1 -1
  86. data/lib/bosh/director/errand/runner.rb +2 -3
  87. data/lib/bosh/director/event_log.rb +1 -7
  88. data/lib/bosh/director/ext.rb +0 -6
  89. data/lib/bosh/director/instance_deleter.rb +23 -2
  90. data/lib/bosh/director/instance_updater.rb +62 -6
  91. data/lib/bosh/director/instance_updater/state_applier.rb +2 -2
  92. data/lib/bosh/director/job_queue.rb +4 -2
  93. data/lib/bosh/director/job_runner.rb +3 -8
  94. data/lib/bosh/director/jobs/backup.rb +1 -1
  95. data/lib/bosh/director/jobs/base_job.rb +10 -6
  96. data/lib/bosh/director/jobs/cleanup_artifacts.rb +6 -6
  97. data/lib/bosh/director/jobs/db_job.rb +87 -0
  98. data/lib/bosh/director/jobs/delete_deployment.rb +23 -2
  99. data/lib/bosh/director/jobs/delete_deployment_snapshots.rb +1 -1
  100. data/lib/bosh/director/jobs/delete_orphan_disks.rb +2 -2
  101. data/lib/bosh/director/jobs/delete_release.rb +2 -2
  102. data/lib/bosh/director/jobs/delete_stemcell.rb +1 -1
  103. data/lib/bosh/director/jobs/export_release.rb +4 -2
  104. data/lib/bosh/director/jobs/fetch_logs.rb +1 -1
  105. data/lib/bosh/director/jobs/helpers/blob_deleter.rb +1 -1
  106. data/lib/bosh/director/jobs/helpers/name_version_release_deleter.rb +3 -3
  107. data/lib/bosh/director/jobs/helpers/release_version_deleter.rb +1 -1
  108. data/lib/bosh/director/jobs/helpers/stemcell_deleter.rb +2 -12
  109. data/lib/bosh/director/jobs/release/release_job.rb +13 -28
  110. data/lib/bosh/director/jobs/run_errand.rb +6 -6
  111. data/lib/bosh/director/jobs/scheduled_backup.rb +1 -1
  112. data/lib/bosh/director/jobs/scheduled_events_cleanup.rb +31 -0
  113. data/lib/bosh/director/jobs/scheduled_orphan_cleanup.rb +1 -1
  114. data/lib/bosh/director/jobs/snapshot_deployment.rb +4 -1
  115. data/lib/bosh/director/jobs/ssh.rb +36 -14
  116. data/lib/bosh/director/jobs/update_deployment.rb +28 -6
  117. data/lib/bosh/director/jobs/update_release.rb +31 -41
  118. data/lib/bosh/director/jobs/update_stemcell.rb +4 -4
  119. data/lib/bosh/director/jobs/vm_state.rb +1 -2
  120. data/lib/bosh/director/lock.rb +30 -55
  121. data/lib/bosh/director/logs_fetcher.rb +2 -3
  122. data/lib/bosh/director/manifest/changeset.rb +88 -42
  123. data/lib/bosh/director/manifest/manifest.rb +1 -1
  124. data/lib/bosh/director/models.rb +3 -0
  125. data/lib/bosh/director/models/event.rb +18 -0
  126. data/lib/bosh/director/models/lock.rb +9 -0
  127. data/lib/bosh/director/models/release_version.rb +3 -1
  128. data/lib/bosh/director/problem_handlers/base.rb +3 -3
  129. data/lib/bosh/director/problem_handlers/inactive_disk.rb +4 -4
  130. data/lib/bosh/director/problem_handlers/missing_disk.rb +3 -3
  131. data/lib/bosh/director/problem_handlers/missing_vm.rb +1 -1
  132. data/lib/bosh/director/problem_handlers/mount_info_mismatch.rb +3 -3
  133. data/lib/bosh/director/problem_handlers/unresponsive_agent.rb +2 -2
  134. data/lib/bosh/director/problem_resolver.rb +5 -5
  135. data/lib/bosh/director/problem_scanner/problem_register.rb +1 -1
  136. data/lib/bosh/director/problem_scanner/scanner.rb +3 -2
  137. data/lib/bosh/director/scheduler.rb +3 -3
  138. data/lib/bosh/director/sequel.rb +1 -3
  139. data/lib/bosh/director/stopper.rb +1 -1
  140. data/lib/bosh/director/validation_helper.rb +60 -37
  141. data/lib/bosh/director/version.rb +1 -1
  142. data/lib/bosh/director/vm_creator.rb +39 -7
  143. data/lib/bosh/director/vm_deleter.rb +29 -2
  144. data/lib/bosh/director/vm_metadata_updater.rb +4 -0
  145. data/lib/bosh/director/worker.rb +52 -0
  146. metadata +47 -61
  147. data/lib/bosh/director/manifest/redactor.rb +0 -44
@@ -23,7 +23,7 @@ module Bosh::Director
23
23
  def self.create_by_type(type, resource_id, data)
24
24
  handler_class = Base.handlers[type.to_s]
25
25
  if handler_class.nil?
26
- raise "Cannot find handler for `#{type}' problem"
26
+ raise "Cannot find handler for '#{type}' problem"
27
27
  end
28
28
 
29
29
  handler_class.new(resource_id, data)
@@ -47,7 +47,7 @@ module Bosh::Director
47
47
  end
48
48
 
49
49
  # Talking to cloud should only be possible
50
- # in the context of Resque job
50
+ # in the context of DJ job
51
51
  def cloud
52
52
  if @job.nil?
53
53
  handler_error("Cannot talk to cloud outside of job context")
@@ -78,7 +78,7 @@ module Bosh::Director
78
78
  def apply_resolution(resolution)
79
79
  action = self.class.action_for(resolution)
80
80
  if action.nil?
81
- handler_error("Cannot find `#{resolution}' resolution for `#{self.class}'")
81
+ handler_error("Cannot find '#{resolution}' resolution for '#{self.class}'")
82
82
  end
83
83
  instance_eval(&action)
84
84
  end
@@ -14,16 +14,16 @@ module Bosh::Director
14
14
  @disk = Models::PersistentDisk[@disk_id]
15
15
 
16
16
  if @disk.nil?
17
- handler_error("Disk `#{@disk_id}' is no longer in the database")
17
+ handler_error("Disk '#{@disk_id}' is no longer in the database")
18
18
  end
19
19
 
20
20
  if @disk.active
21
- handler_error("Disk `#{@disk.disk_cid}' is no longer inactive")
21
+ handler_error("Disk '#{@disk.disk_cid}' is no longer inactive")
22
22
  end
23
23
 
24
24
  @instance = @disk.instance
25
25
  if @instance.nil?
26
- handler_error("Cannot find instance for disk `#{@disk.disk_cid}'")
26
+ handler_error("Cannot find instance for disk '#{@disk.disk_cid}'")
27
27
  end
28
28
  end
29
29
 
@@ -31,7 +31,7 @@ module Bosh::Director
31
31
  job = @instance.job || "unknown job"
32
32
  uuid = @instance.uuid || "unknown id"
33
33
  index = @instance.index || "unknown index"
34
- disk_label = "`#{@disk.disk_cid}' (#{@disk.size.to_i}M) for instance `#{job}/#{uuid} (#{index})'"
34
+ disk_label = "'#{@disk.disk_cid}' (#{@disk.size.to_i}M) for instance '#{job}/#{uuid} (#{index})'"
35
35
  "Disk #{disk_label} is inactive"
36
36
  end
37
37
 
@@ -12,19 +12,19 @@ module Bosh::Director
12
12
  @disk = Models::PersistentDisk[@disk_id]
13
13
 
14
14
  if @disk.nil?
15
- handler_error("Disk `#{@disk_id}' is no longer in the database")
15
+ handler_error("Disk '#{@disk_id}' is no longer in the database")
16
16
  end
17
17
 
18
18
  @instance = @disk.instance
19
19
  if @instance.nil?
20
- handler_error("Cannot find instance for disk `#{@disk.disk_cid}'")
20
+ handler_error("Cannot find instance for disk '#{@disk.disk_cid}'")
21
21
  end
22
22
  end
23
23
 
24
24
  def description
25
25
  job = @instance.job || "unknown job"
26
26
  uuid = @instance.uuid || "unknown id"
27
- disk_label = "`#{@disk.disk_cid}' (#{job}/#{uuid}, #{@disk.size.to_i}M)"
27
+ disk_label = "'#{@disk.disk_cid}' (#{job}/#{uuid}, #{@disk.size.to_i}M)"
28
28
  "Disk #{disk_label} is missing"
29
29
  end
30
30
 
@@ -26,7 +26,7 @@ module Bosh::Director
26
26
  end
27
27
 
28
28
  def description
29
- "VM with cloud ID `#{@instance.vm_cid}' missing."
29
+ "VM with cloud ID '#{@instance.vm_cid}' missing."
30
30
  end
31
31
  end
32
32
  end
@@ -12,12 +12,12 @@ module Bosh::Director
12
12
  @data = data
13
13
 
14
14
  if @disk.nil?
15
- handler_error("Disk `#{disk_id}' is no longer in the database")
15
+ handler_error("Disk '#{disk_id}' is no longer in the database")
16
16
  end
17
17
 
18
18
  @disk_cid = @disk.disk_cid
19
19
  @vm_cid = @disk.instance.vm_cid if @disk.instance
20
- handler_error("Can't find corresponding vm-cid for disk `#{@disk_cid}'") if @vm_cid.nil?
20
+ handler_error("Can't find corresponding vm-cid for disk '#{@disk_cid}'") if @vm_cid.nil?
21
21
 
22
22
  @instance = @disk.instance
23
23
 
@@ -51,7 +51,7 @@ module Bosh::Director
51
51
  plan { "Reattach disk and reboot instance" }
52
52
  action { reattach_disk(true) }
53
53
  end
54
-
54
+
55
55
  def reattach_disk(reboot = false)
56
56
  cloud.attach_disk(@vm_cid, @disk_cid)
57
57
  if reboot
@@ -10,11 +10,11 @@ module Bosh::Director
10
10
  @instance = Models::Instance.find(id: instance_id)
11
11
 
12
12
  unless @instance.vm_cid
13
- handler_error("VM `#{@instance.vm_cid}' is no longer in the database")
13
+ handler_error("VM '#{@instance.vm_cid}' is no longer in the database")
14
14
  end
15
15
 
16
16
  unless @instance.agent_id
17
- handler_error("VM `#{@instance.agent_id}' doesn't have an agent id")
17
+ handler_error("VM '#{@instance.agent_id}' doesn't have an agent id")
18
18
  end
19
19
  end
20
20
 
@@ -1,7 +1,7 @@
1
1
  module Bosh::Director
2
2
  class ProblemResolver
3
3
 
4
- attr_reader :event_log, :logger
4
+ attr_reader :logger
5
5
 
6
6
  def initialize(deployment)
7
7
  @deployment = deployment
@@ -9,17 +9,17 @@ module Bosh::Director
9
9
  @resolution_error_logs = StringIO.new
10
10
 
11
11
  #temp
12
- @event_log = Config.event_log
12
+ @event_log_stage = nil
13
13
  @logger = Config.logger
14
14
  end
15
15
 
16
16
  def begin_stage(stage_name, n_steps)
17
- event_log.begin_stage(stage_name, n_steps)
17
+ @event_log_stage = Config.event_log.begin_stage(stage_name, n_steps)
18
18
  logger.info(stage_name)
19
19
  end
20
20
 
21
21
  def track_and_log(task, log = true)
22
- event_log.track(task) do |ticker|
22
+ @event_log_stage.advance_and_track(task) do |ticker|
23
23
  logger.info(task) if log
24
24
  yield ticker if block_given?
25
25
  end
@@ -79,7 +79,7 @@ module Bosh::Director
79
79
  private
80
80
 
81
81
  def log_resolution_error(problem, error)
82
- error_message = "Error resolving problem `#{problem.id}': #{error}"
82
+ error_message = "Error resolving problem '#{problem.id}': #{error}"
83
83
  logger.error(error_message)
84
84
  logger.error(error.backtrace.join("\n"))
85
85
  @resolution_error_logs.puts(error_message)
@@ -15,7 +15,7 @@ module Bosh::Director::ProblemScanner
15
15
 
16
16
  if similar_open_problems.size > 1
17
17
  raise Bosh::Director::CloudcheckTooManySimilarProblems,
18
- "More than one problem of type `#{type}' " +
18
+ "More than one problem of type '#{type}' " +
19
19
  "exists for resource #{type} #{resource.id}"
20
20
  end
21
21
 
@@ -68,15 +68,16 @@ module Bosh::Director
68
68
  def initialize(event_log, logger)
69
69
  @event_log = event_log
70
70
  @logger = logger
71
+ @event_log_stage = nil
71
72
  end
72
73
 
73
74
  def begin_stage(stage_name, n_steps)
74
- @event_log.begin_stage(stage_name, n_steps)
75
+ @event_log_stage = @event_log.begin_stage(stage_name, n_steps)
75
76
  @logger.info(stage_name)
76
77
  end
77
78
 
78
79
  def track_and_log(task, log = true)
79
- @event_log.track(task) do |ticker|
80
+ @event_log_stage.advance_and_track(task) do |ticker|
80
81
  @logger.info(task) if log
81
82
  yield ticker if block_given?
82
83
  end
@@ -38,7 +38,7 @@ module Bosh::Director
38
38
  begin
39
39
  director_job_class = Bosh::Director::Jobs.const_get(scheduled_job['command'].to_s)
40
40
  rescue NameError
41
- raise "unknown job `Bosh::Director::Jobs::#{scheduled_job['command']}'"
41
+ raise "unknown job 'Bosh::Director::Jobs::#{scheduled_job['command']}'"
42
42
  end
43
43
 
44
44
  @scheduler.cron(scheduled_job['schedule']) do |_|
@@ -53,7 +53,7 @@ with params #{scheduled_job['params']}")
53
53
  end
54
54
 
55
55
  if should_enqueue
56
- logger.info("enqueueing `#{scheduled_job['command']}'")
56
+ logger.info("enqueueing '#{scheduled_job['command']}'")
57
57
 
58
58
  schedule_message = "scheduled #{scheduled_job['command']}"
59
59
  if director_job_class.respond_to?(:schedule_message)
@@ -67,7 +67,7 @@ with params #{scheduled_job['params']}")
67
67
  end
68
68
  end
69
69
 
70
- logger.info("added scheduled job `#{director_job_class}' with interval '#{scheduled_job['schedule']}'")
70
+ logger.info("added scheduled job '#{director_job_class}' with interval '#{scheduled_job['schedule']}'")
71
71
  end
72
72
  end
73
73
  end
@@ -1,12 +1,10 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
2
-
3
1
  Sequel.extension :blank
4
2
 
5
3
  Sequel::Model.plugin :validation_helpers
6
4
  Sequel::Model.raise_on_typecast_failure = false
7
5
 
8
6
  [:exact_length, :format, :includes, :integer, :length_range, :max_length,
9
- :min_length, :not_string, :numeric, :type, :presence, :unique].each do |validation|
7
+ :min_length, :not_null, :numeric, :type, :presence, :unique].each do |validation|
10
8
  Sequel::Plugins::ValidationHelpers::DEFAULT_OPTIONS[validation][:message] = validation
11
9
  end
12
10
 
@@ -56,7 +56,7 @@ module Bosh::Director
56
56
  loop do
57
57
  wait_time = drain_time.abs
58
58
  if wait_time > 0
59
- @logger.info("`#{@instance_model}' is draining: checking back in #{wait_time}s")
59
+ @logger.info("'#{@instance_model}' is draining: checking back in #{wait_time}s")
60
60
  sleep(wait_time)
61
61
  end
62
62
 
@@ -1,54 +1,77 @@
1
1
  module Bosh::Director
2
2
  module ValidationHelper
3
3
  def safe_property(hash, property, options = {})
4
- result = nil
5
-
6
- if hash && !hash.kind_of?(Hash)
7
- raise Bosh::Director::ValidationInvalidType,
8
- "Object (#{hash.inspect}) did not match the required type 'Hash'"
9
-
10
- elsif hash && hash.has_key?(property)
11
- result = hash[property]
12
-
13
- if options[:class]
14
- if options[:class] == :boolean
15
- unless result.kind_of?(TrueClass) || result.kind_of?(FalseClass)
16
- invalid_type(property, options[:class], result)
17
- end
18
-
19
- elsif !result.kind_of?(options[:class])
20
- if options[:class] == String && result.kind_of?(Numeric)
21
- result = result.to_s
22
- else
23
- invalid_type(property, options[:class], result)
24
- end
25
- end
26
- end
27
4
 
28
- if options[:min] && result < options[:min]
29
- raise ValidationViolatedMin,
30
- "'#{property}' value (#{result.inspect}) should be greater than #{options[:min].inspect}"
31
- end
5
+ if options.has_key?(:default) && !options[:default].nil?
6
+ validate_property(property, options, options[:default], DefaultPropertyValidationMessage.new)
7
+ end
8
+
9
+ if !hash.nil? && !hash.kind_of?(Hash)
10
+ raise Bosh::Director::ValidationInvalidType, "Object (#{hash.inspect}) did not match the required type 'Hash'"
11
+ elsif !hash.nil? && hash.has_key?(property)
12
+ return validate_property(property, options, hash[property], PropertyValidationMessage.new)
13
+ elsif options.has_key?(:default)
14
+ return options[:default]
15
+ elsif !options[:optional]
16
+ raise ValidationMissingField, "Required property '#{property}' was not specified in object (#{hash.inspect})"
17
+ end
18
+ end
19
+
20
+ private
32
21
 
33
- if options[:max] && result > options[:max]
34
- raise ValidationViolatedMax,
35
- "'#{property}' value (#{result.inspect}) should be less than #{options[:max].inspect}"
22
+ def validate_property(property, options, result, validation_message)
23
+ if options.has_key?(:class)
24
+ required_type = options[:class]
25
+ if required_type == :boolean
26
+ unless result.kind_of?(TrueClass) || result.kind_of?(FalseClass)
27
+ raise ValidationInvalidType, validation_message.invalid_type(property, required_type, result)
28
+ end
29
+ elsif !result.kind_of?(required_type)
30
+ if required_type == String && result.kind_of?(Numeric)
31
+ result = result.to_s
32
+ else
33
+ raise ValidationInvalidType, validation_message.invalid_type(property, required_type, result)
34
+ end
36
35
  end
36
+ end
37
37
 
38
- elsif options[:default]
39
- result = options[:default]
38
+ if options[:min] && result < options[:min]
39
+ raise ValidationViolatedMin, validation_message.invalid_min(options, property, result)
40
+ end
40
41
 
41
- elsif !options[:optional]
42
- raise ValidationMissingField,
43
- "Required property '#{property}' was not specified in object (#{hash.inspect})"
42
+ if options[:max] && result > options[:max]
43
+ raise ValidationViolatedMax, validation_message.invalid_max(options, property, result)
44
44
  end
45
45
 
46
46
  result
47
47
  end
48
+ end
48
49
 
50
+ class PropertyValidationMessage
49
51
  def invalid_type(property, klass, value)
50
- raise ValidationInvalidType,
51
- "Property '#{property}' (value #{value.inspect}) did not match the required type '#{klass}'"
52
+ "Property '#{property}' value (#{value.inspect}) did not match the required type '#{klass}'"
53
+ end
54
+
55
+ def invalid_max(options, property, result)
56
+ "'#{property}' value (#{result.inspect}) should be less than #{options[:max].inspect}"
57
+ end
58
+
59
+ def invalid_min(options, property, result)
60
+ "'#{property}' value (#{result.inspect}) should be greater than #{options[:min].inspect}"
61
+ end
62
+ end
63
+
64
+ class DefaultPropertyValidationMessage
65
+ def invalid_type(property, klass, value)
66
+ "Default value for property '#{property}' value (#{value.inspect}) did not match the required type '#{klass}'"
67
+ end
68
+
69
+ def invalid_max(options, property, result)
70
+ "Default value for property '#{property}' value (#{result.inspect}) should be less than #{options[:max].inspect}"
71
+ end
72
+
73
+ def invalid_min(options, property, result)
74
+ "Default value for property '#{property}' value (#{result.inspect}) should be greater than #{options[:min].inspect}"
52
75
  end
53
76
  end
54
77
  end
@@ -1,5 +1,5 @@
1
1
  module Bosh
2
2
  module Director
3
- VERSION = '1.3215.4.0'
3
+ VERSION = '1.3232.0'
4
4
  end
5
5
  end
@@ -7,26 +7,27 @@ module Bosh::Director
7
7
  include EncryptionHelper
8
8
  include PasswordHelper
9
9
 
10
- def initialize(cloud, logger, vm_deleter, disk_manager, job_renderer)
10
+ def initialize(cloud, logger, vm_deleter, disk_manager, job_renderer, arp_flusher)
11
11
  @cloud = cloud
12
12
  @logger = logger
13
13
  @vm_deleter = vm_deleter
14
14
  @disk_manager = disk_manager
15
15
  @job_renderer = job_renderer
16
+ @arp_flusher = arp_flusher
16
17
  end
17
18
 
18
- def create_for_instance_plans(instance_plans, ip_provider, event_log)
19
+ def create_for_instance_plans(instance_plans, ip_provider)
19
20
  return @logger.info('No missing vms to create') if instance_plans.empty?
20
21
 
21
22
  total = instance_plans.size
22
- event_log.begin_stage('Creating missing vms', total)
23
+ event_log_stage = Config.event_log.begin_stage('Creating missing vms', total)
23
24
  ThreadPool.new(max_threads: Config.max_threads, logger: @logger).wrap do |pool|
24
25
  instance_plans.each do |instance_plan|
25
26
  instance = instance_plan.instance
26
27
 
27
28
  pool.process do
28
29
  with_thread_name("create_missing_vm(#{instance.model}/#{total})") do
29
- event_log.track(instance.model.to_s) do
30
+ event_log_stage.advance_and_track(instance.model.to_s) do
30
31
  @logger.info('Creating missing VM')
31
32
  disks = [instance.model.persistent_disk_cid].compact
32
33
  create_for_instance_plan(instance_plan, disks)
@@ -61,9 +62,17 @@ module Bosh::Director
61
62
 
62
63
  begin
63
64
  VmMetadataUpdater.build.update(instance_model, {})
64
-
65
65
  agent_client = AgentClient.with_vm_credentials_and_agent_id(instance_model.credentials, instance_model.agent_id)
66
66
  agent_client.wait_until_ready
67
+
68
+ if Config.flush_arp
69
+ ip_addresses = instance_plan.network_settings_hash.map do |index,network|
70
+ network['ip']
71
+ end.compact
72
+
73
+ @arp_flusher.delete_arp_entries(instance_model.vm_cid, ip_addresses)
74
+ end
75
+
67
76
  instance.update_trusted_certs
68
77
  instance.update_cloud_properties!
69
78
  rescue Exception => e
@@ -85,6 +94,22 @@ module Bosh::Director
85
94
 
86
95
  private
87
96
 
97
+ def add_event(deployment_name, instance_name, action, object_name = nil, parent_id = nil, error = nil)
98
+ event = Config.current_job.event_manager.create_event(
99
+ {
100
+ parent_id: parent_id,
101
+ user: Config.current_job.username,
102
+ action: action,
103
+ object_type: 'vm',
104
+ object_name: object_name,
105
+ task: Config.current_job.task_id,
106
+ deployment: deployment_name,
107
+ instance: instance_name,
108
+ error: error
109
+ })
110
+ event.id
111
+ end
112
+
88
113
  def apply_initial_vm_state(instance_plan)
89
114
  instance_plan.instance.apply_initial_vm_state(instance_plan.spec)
90
115
 
@@ -96,9 +121,10 @@ module Bosh::Director
96
121
  end
97
122
 
98
123
  def create(instance_model, stemcell, cloud_properties, network_settings, disks, env)
124
+ parent_id = add_event(instance_model.deployment.name, instance_model.name, 'create')
99
125
  agent_id = self.class.generate_agent_id
100
126
  env = Bosh::Common::DeepCopy.copy(env)
101
- options = { :agent_id => agent_id }
127
+ options = {:agent_id => agent_id}
102
128
 
103
129
  if Config.encryption?
104
130
  credentials = generate_agent_credentials
@@ -128,8 +154,14 @@ module Bosh::Director
128
154
  instance_model.update(options)
129
155
  rescue => e
130
156
  @logger.error("error creating vm: #{e.message}")
131
- @vm_deleter.delete_vm(vm_cid) if vm_cid
157
+ if vm_cid
158
+ parent_id = add_event(instance_model.deployment.name, instance_model.name, 'delete', vm_cid)
159
+ @vm_deleter.delete_vm(vm_cid)
160
+ add_event(instance_model.deployment.name, instance_model.name, 'delete', vm_cid, parent_id)
161
+ end
132
162
  raise e
163
+ ensure
164
+ add_event(instance_model.deployment.name, instance_model.name, 'create', vm_cid, parent_id, e)
133
165
  end
134
166
 
135
167
  def self.generate_agent_id