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.
- checksums.yaml +4 -4
- data/bin/bosh-director-console +1 -1
- data/bin/bosh-director-drain-workers +8 -2
- data/bin/bosh-director-worker +34 -53
- data/db/migrations/director/20110617211923_add_deployments_release_versions.rb +2 -2
- data/db/migrations/director/20120524175805_add_task_type.rb +23 -23
- data/db/migrations/director/20130531172604_add_director_attributes.rb +1 -2
- data/db/migrations/director/20140116002324_pivot_director_attributes.rb +1 -2
- data/db/migrations/director/20160210201838_denormalize_compiled_package_stemcell_id_to_stemcell_name_and_version.rb +7 -9
- data/db/migrations/director/20160211174110_add_events.rb +22 -0
- data/db/migrations/director/20160324181932_create_delayed_jobs.rb +22 -0
- data/db/migrations/director/20160324182211_add_locks.rb +15 -0
- data/db/migrations/director/20160329201256_set_instances_with_nil_serial_to_false.rb +15 -0
- data/db/migrations/director/20160331225404_backfill_stemcell_os.rb +9 -0
- data/db/migrations/director/20160411104407_add_task_started_at.rb +9 -0
- data/lib/bosh/director.rb +9 -2
- data/lib/bosh/director/agent_client.rb +22 -9
- data/lib/bosh/director/api.rb +0 -1
- data/lib/bosh/director/api/api_helper.rb +1 -1
- data/lib/bosh/director/api/controllers/base_controller.rb +5 -1
- data/lib/bosh/director/api/controllers/cloud_configs_controller.rb +18 -2
- data/lib/bosh/director/api/controllers/deployments_controller.rb +16 -9
- data/lib/bosh/director/api/controllers/events_controller.rb +37 -0
- data/lib/bosh/director/api/controllers/locks_controller.rb +7 -11
- data/lib/bosh/director/api/controllers/packages_controller.rb +1 -1
- data/lib/bosh/director/api/controllers/runtime_configs_controller.rb +18 -2
- data/lib/bosh/director/api/controllers/tasks_controller.rb +7 -2
- data/lib/bosh/director/api/deployment_lookup.rb +1 -1
- data/lib/bosh/director/api/deployment_manager.rb +1 -1
- data/lib/bosh/director/api/event_manager.rb +68 -0
- data/lib/bosh/director/api/extensions/scoping.rb +2 -2
- data/lib/bosh/director/api/extensions/syslog_request_logger.rb +75 -0
- data/lib/bosh/director/api/instance_lookup.rb +2 -2
- data/lib/bosh/director/api/instance_manager.rb +2 -2
- data/lib/bosh/director/api/local_identity_provider.rb +8 -0
- data/lib/bosh/director/api/property_manager.rb +6 -5
- data/lib/bosh/director/api/release_manager.rb +3 -3
- data/lib/bosh/director/api/resource_manager.rb +2 -2
- data/lib/bosh/director/api/resurrector_manager.rb +1 -1
- data/lib/bosh/director/api/route_configuration.rb +1 -0
- data/lib/bosh/director/api/stemcell_manager.rb +5 -5
- data/lib/bosh/director/api/task_manager.rb +1 -0
- data/lib/bosh/director/api/task_remover.rb +1 -1
- data/lib/bosh/director/api/uaa_identity_provider.rb +9 -1
- data/lib/bosh/director/api/user/database_user_manager.rb +1 -1
- data/lib/bosh/director/app.rb +1 -1
- data/lib/bosh/director/arp_flusher.rb +23 -0
- data/lib/bosh/director/cloudcheck_helper.rb +4 -3
- data/lib/bosh/director/compile_task.rb +6 -6
- data/lib/bosh/director/compile_task_generator.rb +6 -6
- data/lib/bosh/director/compiled_release_downloader.rb +4 -4
- data/lib/bosh/director/config.rb +29 -87
- data/lib/bosh/director/deployment_deleter.rb +6 -6
- data/lib/bosh/director/deployment_plan/agent_state_migrator.rb +2 -2
- data/lib/bosh/director/deployment_plan/assembler.rb +1 -1
- data/lib/bosh/director/deployment_plan/compilation_instance_pool.rb +26 -1
- data/lib/bosh/director/deployment_plan/deployment_repo.rb +1 -1
- data/lib/bosh/director/deployment_plan/disk_type.rb +1 -1
- data/lib/bosh/director/deployment_plan/instance.rb +2 -2
- data/lib/bosh/director/deployment_plan/instance_plan.rb +2 -2
- data/lib/bosh/director/deployment_plan/instance_spec.rb +2 -0
- data/lib/bosh/director/deployment_plan/ip_provider/ip_provider.rb +7 -3
- data/lib/bosh/director/deployment_plan/job.rb +12 -10
- data/lib/bosh/director/deployment_plan/job_spec_parser.rb +4 -4
- data/lib/bosh/director/deployment_plan/links/link.rb +1 -0
- data/lib/bosh/director/deployment_plan/links/link_path.rb +18 -19
- data/lib/bosh/director/deployment_plan/links/links_resolver.rb +2 -0
- data/lib/bosh/director/deployment_plan/links/template_link.rb +1 -1
- data/lib/bosh/director/deployment_plan/manual_network.rb +1 -1
- data/lib/bosh/director/deployment_plan/manual_network_subnet.rb +6 -6
- data/lib/bosh/director/deployment_plan/planner.rb +3 -3
- data/lib/bosh/director/deployment_plan/planner_factory.rb +38 -40
- data/lib/bosh/director/deployment_plan/release_version.rb +5 -5
- data/lib/bosh/director/deployment_plan/runtime_manifest_parser.rb +22 -18
- data/lib/bosh/director/deployment_plan/steps/package_compile_step.rb +14 -16
- data/lib/bosh/director/deployment_plan/steps/update_step.rb +5 -5
- data/lib/bosh/director/deployment_plan/template.rb +61 -1
- data/lib/bosh/director/deployment_plan/update_config.rb +1 -1
- data/lib/bosh/director/disk_manager.rb +49 -40
- data/lib/bosh/director/dns/canonicalizer.rb +2 -2
- data/lib/bosh/director/dns/dns_manager.rb +2 -2
- data/lib/bosh/director/dns/powerdns.rb +2 -2
- data/lib/bosh/director/download_helper.rb +5 -5
- data/lib/bosh/director/errand/job_manager.rb +5 -6
- data/lib/bosh/director/errand/result.rb +1 -1
- data/lib/bosh/director/errand/runner.rb +2 -3
- data/lib/bosh/director/event_log.rb +1 -7
- data/lib/bosh/director/ext.rb +0 -6
- data/lib/bosh/director/instance_deleter.rb +23 -2
- data/lib/bosh/director/instance_updater.rb +62 -6
- data/lib/bosh/director/instance_updater/state_applier.rb +2 -2
- data/lib/bosh/director/job_queue.rb +4 -2
- data/lib/bosh/director/job_runner.rb +3 -8
- data/lib/bosh/director/jobs/backup.rb +1 -1
- data/lib/bosh/director/jobs/base_job.rb +10 -6
- data/lib/bosh/director/jobs/cleanup_artifacts.rb +6 -6
- data/lib/bosh/director/jobs/db_job.rb +87 -0
- data/lib/bosh/director/jobs/delete_deployment.rb +23 -2
- data/lib/bosh/director/jobs/delete_deployment_snapshots.rb +1 -1
- data/lib/bosh/director/jobs/delete_orphan_disks.rb +2 -2
- data/lib/bosh/director/jobs/delete_release.rb +2 -2
- data/lib/bosh/director/jobs/delete_stemcell.rb +1 -1
- data/lib/bosh/director/jobs/export_release.rb +4 -2
- data/lib/bosh/director/jobs/fetch_logs.rb +1 -1
- data/lib/bosh/director/jobs/helpers/blob_deleter.rb +1 -1
- data/lib/bosh/director/jobs/helpers/name_version_release_deleter.rb +3 -3
- data/lib/bosh/director/jobs/helpers/release_version_deleter.rb +1 -1
- data/lib/bosh/director/jobs/helpers/stemcell_deleter.rb +2 -12
- data/lib/bosh/director/jobs/release/release_job.rb +13 -28
- data/lib/bosh/director/jobs/run_errand.rb +6 -6
- data/lib/bosh/director/jobs/scheduled_backup.rb +1 -1
- data/lib/bosh/director/jobs/scheduled_events_cleanup.rb +31 -0
- data/lib/bosh/director/jobs/scheduled_orphan_cleanup.rb +1 -1
- data/lib/bosh/director/jobs/snapshot_deployment.rb +4 -1
- data/lib/bosh/director/jobs/ssh.rb +36 -14
- data/lib/bosh/director/jobs/update_deployment.rb +28 -6
- data/lib/bosh/director/jobs/update_release.rb +31 -41
- data/lib/bosh/director/jobs/update_stemcell.rb +4 -4
- data/lib/bosh/director/jobs/vm_state.rb +1 -2
- data/lib/bosh/director/lock.rb +30 -55
- data/lib/bosh/director/logs_fetcher.rb +2 -3
- data/lib/bosh/director/manifest/changeset.rb +88 -42
- data/lib/bosh/director/manifest/manifest.rb +1 -1
- data/lib/bosh/director/models.rb +3 -0
- data/lib/bosh/director/models/event.rb +18 -0
- data/lib/bosh/director/models/lock.rb +9 -0
- data/lib/bosh/director/models/release_version.rb +3 -1
- data/lib/bosh/director/problem_handlers/base.rb +3 -3
- data/lib/bosh/director/problem_handlers/inactive_disk.rb +4 -4
- data/lib/bosh/director/problem_handlers/missing_disk.rb +3 -3
- data/lib/bosh/director/problem_handlers/missing_vm.rb +1 -1
- data/lib/bosh/director/problem_handlers/mount_info_mismatch.rb +3 -3
- data/lib/bosh/director/problem_handlers/unresponsive_agent.rb +2 -2
- data/lib/bosh/director/problem_resolver.rb +5 -5
- data/lib/bosh/director/problem_scanner/problem_register.rb +1 -1
- data/lib/bosh/director/problem_scanner/scanner.rb +3 -2
- data/lib/bosh/director/scheduler.rb +3 -3
- data/lib/bosh/director/sequel.rb +1 -3
- data/lib/bosh/director/stopper.rb +1 -1
- data/lib/bosh/director/validation_helper.rb +60 -37
- data/lib/bosh/director/version.rb +1 -1
- data/lib/bosh/director/vm_creator.rb +39 -7
- data/lib/bosh/director/vm_deleter.rb +29 -2
- data/lib/bosh/director/vm_metadata_updater.rb +4 -0
- data/lib/bosh/director/worker.rb +52 -0
- metadata +47 -61
- 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
|
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
|
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
|
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
|
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
|
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
|
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 = "
|
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
|
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
|
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 = "
|
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
|
|
@@ -12,12 +12,12 @@ module Bosh::Director
|
|
12
12
|
@data = data
|
13
13
|
|
14
14
|
if @disk.nil?
|
15
|
-
handler_error("Disk
|
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
|
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
|
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
|
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 :
|
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
|
-
@
|
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
|
-
|
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
|
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
|
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
|
-
@
|
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
|
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
|
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
|
70
|
+
logger.info("added scheduled job '#{director_job_class}' with interval '#{scheduled_job['schedule']}'")
|
71
71
|
end
|
72
72
|
end
|
73
73
|
end
|
data/lib/bosh/director/sequel.rb
CHANGED
@@ -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, :
|
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("
|
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
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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
|
-
|
34
|
-
|
35
|
-
|
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
|
-
|
39
|
-
|
38
|
+
if options[:min] && result < options[:min]
|
39
|
+
raise ValidationViolatedMin, validation_message.invalid_min(options, property, result)
|
40
|
+
end
|
40
41
|
|
41
|
-
|
42
|
-
raise
|
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
|
-
|
51
|
-
|
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
|
@@ -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
|
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
|
-
|
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 = {
|
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
|
-
|
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
|