bosh-director 1.5.0.pre.1113
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +34 -0
- data/bin/bosh-director +36 -0
- data/bin/bosh-director-console +84 -0
- data/bin/bosh-director-drain-workers +42 -0
- data/bin/bosh-director-migrate +58 -0
- data/bin/bosh-director-scheduler +27 -0
- data/bin/bosh-director-worker +76 -0
- data/db/migrations/README +1 -0
- data/db/migrations/director/20110209010747_initial.rb +118 -0
- data/db/migrations/director/20110406055800_add_task_user.rb +9 -0
- data/db/migrations/director/20110518225809_remove_cid_constrain.rb +13 -0
- data/db/migrations/director/20110617211923_add_deployments_release_versions.rb +32 -0
- data/db/migrations/director/20110622212607_add_task_checkpoint_timestamp.rb +9 -0
- data/db/migrations/director/20110628023039_add_state_to_instances.rb +21 -0
- data/db/migrations/director/20110709012332_add_disk_size_to_instances.rb +9 -0
- data/db/migrations/director/20110906183441_add_log_bundles.rb +11 -0
- data/db/migrations/director/20110907194830_add_logs_json_to_templates.rb +9 -0
- data/db/migrations/director/20110915205610_add_persistent_disks.rb +51 -0
- data/db/migrations/director/20111005180929_add_properties.rb +14 -0
- data/db/migrations/director/20111110024617_add_deployment_problems.rb +24 -0
- data/db/migrations/director/20111216214145_recreate_support_for_vms.rb +9 -0
- data/db/migrations/director/20120102084027_add_credentials_to_vms.rb +7 -0
- data/db/migrations/director/20120427235217_allow_multiple_releases_per_deployment.rb +36 -0
- data/db/migrations/director/20120524175805_add_task_type.rb +44 -0
- data/db/migrations/director/20120614001930_delete_redundant_deployment_release_relation.rb +34 -0
- data/db/migrations/director/20120822004528_add_fingerprint_to_templates_and_packages.rb +17 -0
- data/db/migrations/director/20120830191244_add_properties_to_templates.rb +9 -0
- data/db/migrations/director/20121106190739_persist_vm_env.rb +9 -0
- data/db/migrations/director/20130222232131_add_sha1_to_stemcells.rb +9 -0
- data/db/migrations/director/20130312211407_add_commit_hash_to_release_versions.rb +19 -0
- data/db/migrations/director/20130409235338_snapshot.rb +15 -0
- data/db/migrations/director/20130530164918_add_paused_flag_to_instance.rb +14 -0
- data/db/migrations/director/20130531172604_add_director_attributes.rb +13 -0
- data/db/migrations/dns/20120123234908_initial.rb +27 -0
- data/lib/bosh/director.rb +133 -0
- data/lib/bosh/director/agent_client.rb +78 -0
- data/lib/bosh/director/api.rb +29 -0
- data/lib/bosh/director/api/api_helper.rb +81 -0
- data/lib/bosh/director/api/backup_manager.rb +15 -0
- data/lib/bosh/director/api/controller.rb +639 -0
- data/lib/bosh/director/api/controller_helpers.rb +34 -0
- data/lib/bosh/director/api/deployment_lookup.rb +13 -0
- data/lib/bosh/director/api/deployment_manager.rb +60 -0
- data/lib/bosh/director/api/http_constants.rb +16 -0
- data/lib/bosh/director/api/instance_lookup.rb +44 -0
- data/lib/bosh/director/api/instance_manager.rb +63 -0
- data/lib/bosh/director/api/problem_manager.rb +40 -0
- data/lib/bosh/director/api/property_manager.rb +69 -0
- data/lib/bosh/director/api/release_manager.rb +59 -0
- data/lib/bosh/director/api/resource_manager.rb +69 -0
- data/lib/bosh/director/api/resurrector_manager.rb +15 -0
- data/lib/bosh/director/api/snapshot_manager.rb +94 -0
- data/lib/bosh/director/api/stemcell_manager.rb +50 -0
- data/lib/bosh/director/api/task_helper.rb +46 -0
- data/lib/bosh/director/api/task_manager.rb +64 -0
- data/lib/bosh/director/api/user_manager.rb +72 -0
- data/lib/bosh/director/api/vm_state_manager.rb +11 -0
- data/lib/bosh/director/app.rb +35 -0
- data/lib/bosh/director/blob_util.rb +87 -0
- data/lib/bosh/director/blobstores.rb +29 -0
- data/lib/bosh/director/client.rb +156 -0
- data/lib/bosh/director/cloudcheck_helper.rb +204 -0
- data/lib/bosh/director/compile_task.rb +157 -0
- data/lib/bosh/director/config.rb +370 -0
- data/lib/bosh/director/configuration_hasher.rb +114 -0
- data/lib/bosh/director/cycle_helper.rb +36 -0
- data/lib/bosh/director/db_backup.rb +22 -0
- data/lib/bosh/director/db_backup/adapter.rb +3 -0
- data/lib/bosh/director/db_backup/adapter/mysql2.rb +27 -0
- data/lib/bosh/director/db_backup/adapter/postgres.rb +36 -0
- data/lib/bosh/director/db_backup/adapter/sqlite.rb +17 -0
- data/lib/bosh/director/db_backup/error.rb +10 -0
- data/lib/bosh/director/deployment_plan.rb +26 -0
- data/lib/bosh/director/deployment_plan/assembler.rb +430 -0
- data/lib/bosh/director/deployment_plan/compilation_config.rb +54 -0
- data/lib/bosh/director/deployment_plan/compiled_package.rb +35 -0
- data/lib/bosh/director/deployment_plan/dynamic_network.rb +91 -0
- data/lib/bosh/director/deployment_plan/idle_vm.rb +109 -0
- data/lib/bosh/director/deployment_plan/instance.rb +413 -0
- data/lib/bosh/director/deployment_plan/job.rb +470 -0
- data/lib/bosh/director/deployment_plan/manual_network.rb +137 -0
- data/lib/bosh/director/deployment_plan/network.rb +74 -0
- data/lib/bosh/director/deployment_plan/network_subnet.rb +167 -0
- data/lib/bosh/director/deployment_plan/planner.rb +288 -0
- data/lib/bosh/director/deployment_plan/preparer.rb +52 -0
- data/lib/bosh/director/deployment_plan/release.rb +126 -0
- data/lib/bosh/director/deployment_plan/resource_pool.rb +143 -0
- data/lib/bosh/director/deployment_plan/resource_pools.rb +68 -0
- data/lib/bosh/director/deployment_plan/stemcell.rb +56 -0
- data/lib/bosh/director/deployment_plan/template.rb +94 -0
- data/lib/bosh/director/deployment_plan/update_config.rb +80 -0
- data/lib/bosh/director/deployment_plan/updater.rb +55 -0
- data/lib/bosh/director/deployment_plan/vip_network.rb +79 -0
- data/lib/bosh/director/dns_helper.rb +204 -0
- data/lib/bosh/director/download_helper.rb +44 -0
- data/lib/bosh/director/duration.rb +36 -0
- data/lib/bosh/director/encryption_helper.rb +10 -0
- data/lib/bosh/director/errors.rb +198 -0
- data/lib/bosh/director/event_log.rb +136 -0
- data/lib/bosh/director/ext.rb +64 -0
- data/lib/bosh/director/hash_string_vals.rb +13 -0
- data/lib/bosh/director/instance_deleter.rb +109 -0
- data/lib/bosh/director/instance_updater.rb +506 -0
- data/lib/bosh/director/ip_util.rb +67 -0
- data/lib/bosh/director/job_queue.rb +16 -0
- data/lib/bosh/director/job_runner.rb +162 -0
- data/lib/bosh/director/job_updater.rb +121 -0
- data/lib/bosh/director/jobs/backup.rb +86 -0
- data/lib/bosh/director/jobs/base_job.rb +66 -0
- data/lib/bosh/director/jobs/cloud_check/apply_resolutions.rb +46 -0
- data/lib/bosh/director/jobs/cloud_check/scan.rb +38 -0
- data/lib/bosh/director/jobs/cloud_check/scan_and_fix.rb +73 -0
- data/lib/bosh/director/jobs/create_snapshot.rb +23 -0
- data/lib/bosh/director/jobs/delete_deployment.rb +183 -0
- data/lib/bosh/director/jobs/delete_deployment_snapshots.rb +34 -0
- data/lib/bosh/director/jobs/delete_release.rb +219 -0
- data/lib/bosh/director/jobs/delete_snapshots.rb +23 -0
- data/lib/bosh/director/jobs/delete_stemcell.rb +102 -0
- data/lib/bosh/director/jobs/fetch_logs.rb +99 -0
- data/lib/bosh/director/jobs/scheduled_backup.rb +38 -0
- data/lib/bosh/director/jobs/snapshot_deployment.rb +61 -0
- data/lib/bosh/director/jobs/snapshot_deployments.rb +23 -0
- data/lib/bosh/director/jobs/snapshot_self.rb +43 -0
- data/lib/bosh/director/jobs/ssh.rb +59 -0
- data/lib/bosh/director/jobs/update_deployment.rb +110 -0
- data/lib/bosh/director/jobs/update_release.rb +672 -0
- data/lib/bosh/director/jobs/update_stemcell.rb +109 -0
- data/lib/bosh/director/jobs/vm_state.rb +89 -0
- data/lib/bosh/director/lock.rb +133 -0
- data/lib/bosh/director/lock_helper.rb +92 -0
- data/lib/bosh/director/models.rb +29 -0
- data/lib/bosh/director/models/compiled_package.rb +33 -0
- data/lib/bosh/director/models/deployment.rb +22 -0
- data/lib/bosh/director/models/deployment_problem.rb +49 -0
- data/lib/bosh/director/models/deployment_property.rb +21 -0
- data/lib/bosh/director/models/director_attribute.rb +9 -0
- data/lib/bosh/director/models/dns.rb +9 -0
- data/lib/bosh/director/models/dns/domain.rb +9 -0
- data/lib/bosh/director/models/dns/record.rb +7 -0
- data/lib/bosh/director/models/helpers/model_helper.rb +7 -0
- data/lib/bosh/director/models/instance.rb +28 -0
- data/lib/bosh/director/models/log_bundle.rb +10 -0
- data/lib/bosh/director/models/package.rb +30 -0
- data/lib/bosh/director/models/persistent_disk.rb +13 -0
- data/lib/bosh/director/models/release.rb +17 -0
- data/lib/bosh/director/models/release_version.rb +16 -0
- data/lib/bosh/director/models/snapshot.rb +13 -0
- data/lib/bosh/director/models/stemcell.rb +18 -0
- data/lib/bosh/director/models/task.rb +10 -0
- data/lib/bosh/director/models/template.rb +44 -0
- data/lib/bosh/director/models/user.rb +11 -0
- data/lib/bosh/director/models/vm.rb +42 -0
- data/lib/bosh/director/nats_rpc.rb +54 -0
- data/lib/bosh/director/network_reservation.rb +121 -0
- data/lib/bosh/director/next_rebase_version.rb +20 -0
- data/lib/bosh/director/package_compiler.rb +423 -0
- data/lib/bosh/director/problem_handlers/base.rb +153 -0
- data/lib/bosh/director/problem_handlers/inactive_disk.rb +112 -0
- data/lib/bosh/director/problem_handlers/invalid_problem.rb +28 -0
- data/lib/bosh/director/problem_handlers/missing_vm.rb +34 -0
- data/lib/bosh/director/problem_handlers/mount_info_mismatch.rb +62 -0
- data/lib/bosh/director/problem_handlers/out_of_sync_vm.rb +64 -0
- data/lib/bosh/director/problem_handlers/unbound_instance_vm.rb +85 -0
- data/lib/bosh/director/problem_handlers/unresponsive_agent.rb +78 -0
- data/lib/bosh/director/problem_resolver.rb +103 -0
- data/lib/bosh/director/problem_scanner.rb +268 -0
- data/lib/bosh/director/resource_pool_updater.rb +216 -0
- data/lib/bosh/director/scheduler.rb +57 -0
- data/lib/bosh/director/sequel.rb +13 -0
- data/lib/bosh/director/tar_gzipper.rb +47 -0
- data/lib/bosh/director/task_result_file.rb +19 -0
- data/lib/bosh/director/thread_pool.rb +8 -0
- data/lib/bosh/director/validation_helper.rb +55 -0
- data/lib/bosh/director/version.rb +7 -0
- data/lib/bosh/director/vm_creator.rb +80 -0
- data/lib/bosh/director/vm_data.rb +63 -0
- data/lib/bosh/director/vm_metadata_updater.rb +29 -0
- data/lib/bosh/director/vm_reuser.rb +63 -0
- data/lib/cloud/dummy.rb +149 -0
- metadata +664 -0
@@ -0,0 +1,44 @@
|
|
1
|
+
module Bosh::Director
|
2
|
+
module DownloadHelper
|
3
|
+
require 'net/http'
|
4
|
+
require 'timeout'
|
5
|
+
require 'uri'
|
6
|
+
|
7
|
+
##
|
8
|
+
# Downloads a remote file
|
9
|
+
#
|
10
|
+
# @param [String] resource Resource name to be logged
|
11
|
+
# @param [String] remote_file Remote file to download
|
12
|
+
# @param [String] local_file Local file to store the downloaded file
|
13
|
+
# @raise [Bosh::Director::ResourceNotFound] If remote file is not found
|
14
|
+
# @raise [Bosh::Director::ResourceError] If there's a network problem
|
15
|
+
def download_remote_file(resource, remote_file, local_file)
|
16
|
+
@logger.info("Downloading remote #{resource} from #{remote_file}") if @logger
|
17
|
+
uri = URI.parse(remote_file)
|
18
|
+
Net::HTTP.start(uri.host, uri.port,
|
19
|
+
:use_ssl => uri.scheme == 'https',
|
20
|
+
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
|
21
|
+
http.request_get(uri.request_uri) do |response|
|
22
|
+
unless response.kind_of? Net::HTTPSuccess
|
23
|
+
@logger.error("Downloading remote #{resource} from #{remote_file} failed: #{response.message}") if @logger
|
24
|
+
if response.kind_of? Net::HTTPNotFound
|
25
|
+
raise ResourceNotFound, "No #{resource} found at `#{remote_file}'."
|
26
|
+
else
|
27
|
+
raise ResourceError, "Downloading remote #{resource} failed. Check task debug log for details."
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
File.open(local_file, 'wb') do |file|
|
32
|
+
response.read_body do |chunk|
|
33
|
+
file.write(chunk)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
rescue URI::Error, SocketError, Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, Errno::ECONNREFUSED, EOFError,
|
39
|
+
Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
|
40
|
+
@logger.error("Downloading remote #{resource} from #{remote_file} failed: #{e.inspect}") if @logger
|
41
|
+
raise ResourceError, "Downloading remote #{resource} failed. Check task debug log for details."
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# Copyright (c) 2009-2012 VMware, Inc.
|
2
|
+
|
3
|
+
module Bosh::Director
|
4
|
+
module Duration
|
5
|
+
|
6
|
+
def duration(delta)
|
7
|
+
seconds = delta % 60
|
8
|
+
delta = (delta / 60).floor
|
9
|
+
minutes = delta % 60
|
10
|
+
delta = (delta / 60).floor
|
11
|
+
hours = delta % 24
|
12
|
+
delta = (delta / 24).floor
|
13
|
+
days = delta
|
14
|
+
|
15
|
+
result = []
|
16
|
+
|
17
|
+
duration_helper(days, result, "day")
|
18
|
+
duration_helper(hours, result, "hour")
|
19
|
+
duration_helper(minutes, result, "minute")
|
20
|
+
duration_helper(seconds, result, "second")
|
21
|
+
|
22
|
+
result << "0 seconds" if result.empty?
|
23
|
+
|
24
|
+
result.join(" ")
|
25
|
+
end
|
26
|
+
|
27
|
+
def duration_helper(value, result, unit)
|
28
|
+
if value > 0
|
29
|
+
result << "#{value} #{value == 1 ? unit : "#{unit}s"}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
module_function :duration, :duration_helper
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,198 @@
|
|
1
|
+
# Copyright (c) 2009-2012 VMware, Inc.
|
2
|
+
|
3
|
+
module Bosh::Director
|
4
|
+
include Api::Http
|
5
|
+
|
6
|
+
class ProblemHandlerError < StandardError; end
|
7
|
+
|
8
|
+
# DirectorError is a generic exception for most of the errors originated
|
9
|
+
# in BOSH Director.
|
10
|
+
class DirectorError < StandardError
|
11
|
+
# Wraps an exception to DirectorError, so it can be assigned a generic
|
12
|
+
# error code and properly logged.
|
13
|
+
# @param [Exception] exception
|
14
|
+
# @return [DirectorError] Director error
|
15
|
+
def self.create_from_exception(exception)
|
16
|
+
if exception.kind_of?(DirectorError)
|
17
|
+
exception
|
18
|
+
else
|
19
|
+
DirectorError.new(exception.message)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Creates a new subclass of DirectorError with
|
24
|
+
# given name, error code and response code
|
25
|
+
# @param [Fixnum] error_code Error code
|
26
|
+
# @param [Fixnum] response_code HTTP response code
|
27
|
+
# @return [Class]
|
28
|
+
def self.define_error(error_code, response_code)
|
29
|
+
Class.new(DirectorError) do
|
30
|
+
define_method(:initialize) do |*args|
|
31
|
+
message = args[0]
|
32
|
+
super(message)
|
33
|
+
@error_code = error_code
|
34
|
+
@response_code = response_code
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
attr_reader :response_code
|
40
|
+
attr_reader :error_code
|
41
|
+
|
42
|
+
def initialize(message = nil)
|
43
|
+
super
|
44
|
+
@response_code = 500
|
45
|
+
@error_code = 100
|
46
|
+
@format = "Director error: %s"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.err(error_code, response_code = BAD_REQUEST)
|
51
|
+
DirectorError.define_error(error_code, response_code)
|
52
|
+
end
|
53
|
+
|
54
|
+
TaskNotFound = err(10000, NOT_FOUND)
|
55
|
+
TaskCancelled = err(10001, OK)
|
56
|
+
|
57
|
+
UserNotFound = err(20000, NOT_FOUND)
|
58
|
+
UserImmutableUsername = err(20001)
|
59
|
+
UserInvalid = err(20002)
|
60
|
+
UserNameTaken = err(20003)
|
61
|
+
|
62
|
+
ReleaseAlreadyExists = err(30000)
|
63
|
+
ReleaseExistingPackageHashMismatch = err(30001)
|
64
|
+
ReleaseInvalidArchive = err(30002)
|
65
|
+
ReleaseManifestNotFound = err(30003)
|
66
|
+
ReleaseExistingJobHashMismatch = err(30004)
|
67
|
+
ReleaseNotFound = err(30005, NOT_FOUND)
|
68
|
+
ReleaseVersionNotFound = err(30006, NOT_FOUND)
|
69
|
+
ReleaseInUse = err(30007)
|
70
|
+
ReleaseVersionInUse = err(30008)
|
71
|
+
ReleaseDeleteFailed = err(30009)
|
72
|
+
|
73
|
+
ValidationInvalidType = err(40000)
|
74
|
+
ValidationMissingField = err(40001)
|
75
|
+
ValidationViolatedMin = err(40002)
|
76
|
+
ValidationViolatedMax = err(40003)
|
77
|
+
|
78
|
+
StemcellInvalidArchive = err(50000)
|
79
|
+
StemcellImageNotFound = err(50001)
|
80
|
+
StemcellAlreadyExists = err(50002)
|
81
|
+
StemcellNotFound = err(50003, NOT_FOUND)
|
82
|
+
StemcellInUse = err(50004)
|
83
|
+
|
84
|
+
PackageInvalidArchive = err(60000)
|
85
|
+
|
86
|
+
DeploymentNotFound = err(70000, NOT_FOUND)
|
87
|
+
InstanceNotFound = err(70001, NOT_FOUND)
|
88
|
+
InstanceInvalidIndex = err(70002)
|
89
|
+
InstanceDeploymentMissing = err(70003)
|
90
|
+
InstanceVmMissing = err(70004)
|
91
|
+
VmAgentIdMissing = err(70005)
|
92
|
+
VmCloudIdMissing = err(70006)
|
93
|
+
VmInstanceOutOfSync = err(70006)
|
94
|
+
InstanceTargetStateUndefined = err(70007)
|
95
|
+
SnapshotNotFound = err(70008)
|
96
|
+
|
97
|
+
JobInvalidArchive = err(80000)
|
98
|
+
JobMissingManifest = err(80001)
|
99
|
+
JobMissingTemplateFile = err(80002)
|
100
|
+
JobMissingPackage = err(80003)
|
101
|
+
JobMissingMonit = err(80004)
|
102
|
+
JobInvalidLogSpec = err(80005)
|
103
|
+
JobTemplateBindingFailed = err(80006)
|
104
|
+
JobTemplateUnpackFailed = err(80007)
|
105
|
+
JobInvalidPropertySpec = err(80008)
|
106
|
+
JobInvalidPropertyMapping = err(80009)
|
107
|
+
JobIncompatibleSpecs = err(80010)
|
108
|
+
|
109
|
+
ResourceError = err(100001)
|
110
|
+
ResourceNotFound = err(100002, NOT_FOUND)
|
111
|
+
|
112
|
+
PropertyAlreadyExists = err(110001)
|
113
|
+
PropertyInvalid = err(110002)
|
114
|
+
PropertyNotFound = err(110003, NOT_FOUND)
|
115
|
+
|
116
|
+
CompilationConfigUnknownNetwork = err(120001)
|
117
|
+
|
118
|
+
NetworkReservationInvalidIp = err(130001)
|
119
|
+
NetworkReservationMissing = err(130002)
|
120
|
+
NetworkReservationAlreadyExists = err(130003)
|
121
|
+
NetworkReservationInvalidType = err(130004)
|
122
|
+
NetworkReservationIpMissing = err(130005)
|
123
|
+
NetworkReservationIpNotOwned = err(130006)
|
124
|
+
NetworkReservationVipDefaultProvided = err(130007)
|
125
|
+
NetworkReservationAlreadyInUse = err(130008)
|
126
|
+
NetworkReservationWrongType = err(130009)
|
127
|
+
NetworkReservationError = err(130010)
|
128
|
+
NetworkReservationNotEnoughCapacity = err(130010)
|
129
|
+
|
130
|
+
JobMissingRelease = err(140001)
|
131
|
+
JobUnknownRelease = err(140002)
|
132
|
+
JobUnknownResourcePool = err(140003)
|
133
|
+
JobInvalidInstanceIndex = err(140004)
|
134
|
+
JobInvalidInstanceState = err(140005)
|
135
|
+
JobInvalidJobState = err(140006)
|
136
|
+
JobMissingNetwork = err(140007)
|
137
|
+
|
138
|
+
JobUnknownNetwork = err(150001)
|
139
|
+
JobNetworkInstanceIpMismatch = err(150002)
|
140
|
+
JobNetworkInvalidDefault = err(150003)
|
141
|
+
JobNetworkMultipleDefaults = err(150004)
|
142
|
+
JobNetworkMissingDefault = err(150005)
|
143
|
+
|
144
|
+
NetworkOverlappingSubnets = err(160001)
|
145
|
+
NetworkInvalidRange = err(160002)
|
146
|
+
NetworkInvalidGateway = err(160003)
|
147
|
+
NetworkInvalidDns = err(160004)
|
148
|
+
NetworkReservedIpOutOfRange = err(160005)
|
149
|
+
NetworkStaticIpOutOfRange = err(160006)
|
150
|
+
|
151
|
+
ResourcePoolUnknownNetwork = err(170001)
|
152
|
+
ResourcePoolNotEnoughCapacity = err(170002)
|
153
|
+
|
154
|
+
UpdateConfigInvalidWatchTime = err(180001)
|
155
|
+
|
156
|
+
DeploymentAmbiguousReleaseSpec = err(190001)
|
157
|
+
DeploymentDuplicateReleaseName = err(190002)
|
158
|
+
DeploymentDuplicateResourcePoolName = err(190003)
|
159
|
+
DeploymentRenamedJobNameStillUsed = err(190004)
|
160
|
+
DeploymentCanonicalJobNameTaken = err(190005)
|
161
|
+
DeploymentCanonicalNetworkNameTaken = err(190006)
|
162
|
+
DeploymentNoNetworks = err(190007)
|
163
|
+
DeploymentCanonicalNameTaken = err(190008)
|
164
|
+
DeploymentInvalidNetworkType = err(190009)
|
165
|
+
DeploymentUnknownTemplate = err(190012)
|
166
|
+
|
167
|
+
CloudDiskNotAttached = err(390001)
|
168
|
+
CloudDiskMissing = err(390002)
|
169
|
+
CloudNotEnoughDiskSpace = err(390003)
|
170
|
+
|
171
|
+
AgentTaskNoBlobstoreId = err(400001)
|
172
|
+
AgentInvalidStateFormat = err(400002)
|
173
|
+
AgentWrongDeployment = err(400003)
|
174
|
+
AgentUnexpectedJob = err(400004)
|
175
|
+
AgentRenameInProgress = err(400005)
|
176
|
+
AgentJobMismatch = err(400006)
|
177
|
+
AgentJobNotRunning = err(400007)
|
178
|
+
AgentJobNotStopped = err(400008)
|
179
|
+
AgentUnexpectedDisk = err(400009)
|
180
|
+
AgentDiskOutOfSync = err(400010)
|
181
|
+
|
182
|
+
CloudcheckTooManySimilarProblems = err(410001)
|
183
|
+
CloudcheckResolutionNotProvided = err(410002)
|
184
|
+
CloudcheckInvalidResolutionFormat = err(410003)
|
185
|
+
|
186
|
+
DnsInvalidCanonicalName = err(420001)
|
187
|
+
|
188
|
+
PackageCompilationNetworkNotReserved = err(430001)
|
189
|
+
PackageCompilationNotEnoughWorkersForReuse = err(430002)
|
190
|
+
|
191
|
+
BadManifest = err(440001)
|
192
|
+
|
193
|
+
RpcRemoteException = err(450001)
|
194
|
+
RpcTimeout = err(450002)
|
195
|
+
|
196
|
+
SystemError = err(500000, INTERNAL_SERVER_ERROR)
|
197
|
+
NotEnoughDiskSpace = err(500001, INTERNAL_SERVER_ERROR)
|
198
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
# Copyright (c) 2009-2012 VMware, Inc.
|
2
|
+
|
3
|
+
module Bosh::Director
|
4
|
+
class EventLog
|
5
|
+
|
6
|
+
# Event log conventions:
|
7
|
+
# All event log entries having same "stage" logically belong to the same
|
8
|
+
# event group. "tags" is an array of strings that supposed to act as hint
|
9
|
+
# of what is being tracked.
|
10
|
+
# Each "<stage name> <tags>" combination represents a number of steps that
|
11
|
+
# is tracked separately. "task" is just a description of current step that
|
12
|
+
# acts as a hint for event log renderer, i.e. it can be displayed next to
|
13
|
+
# progress bar.
|
14
|
+
# Example: "job_update" stage might have two tasks: "canary update" and
|
15
|
+
# "update" and a separate tag for each job name, so each job will have
|
16
|
+
# a separate progress bar in CLI.
|
17
|
+
|
18
|
+
# Sample rendering for event log entry:
|
19
|
+
# {
|
20
|
+
# "time":1312233461,"stage":"job_update","task":"update",
|
21
|
+
# "tags":["mysql_node"], "index":2,"total":4,"state":"finished",
|
22
|
+
# "progress":50,"data":{"key1" => "value1"}
|
23
|
+
# }
|
24
|
+
|
25
|
+
# Job update (mysql_node):
|
26
|
+
# update |-------- | (2/4) 50%
|
27
|
+
|
28
|
+
attr_reader :stage
|
29
|
+
attr_reader :total
|
30
|
+
attr_reader :counter
|
31
|
+
|
32
|
+
def initialize(io = nil)
|
33
|
+
@logger = EventLogger.new(io || StringIO.new)
|
34
|
+
@lock = Mutex.new
|
35
|
+
@counter = 0
|
36
|
+
end
|
37
|
+
|
38
|
+
def begin_stage(stage, total = nil, tags = [])
|
39
|
+
@lock.synchronize do
|
40
|
+
@stage = stage
|
41
|
+
@tags = tags
|
42
|
+
@counter = 0
|
43
|
+
@total = total
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def track(task = nil)
|
48
|
+
index = nil
|
49
|
+
@lock.synchronize do
|
50
|
+
@counter += 1
|
51
|
+
index = @counter
|
52
|
+
end
|
53
|
+
|
54
|
+
ticker = EventTicker.new(self, task, index)
|
55
|
+
|
56
|
+
start_task(task, index)
|
57
|
+
begin
|
58
|
+
yield ticker if block_given?
|
59
|
+
rescue => e
|
60
|
+
task_failed(task, index, 100, e.to_s)
|
61
|
+
raise
|
62
|
+
end
|
63
|
+
finish_task(task, index)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Adds an error entry to the event log.
|
67
|
+
# @param [DirectorError] error Director error
|
68
|
+
# @return [void]
|
69
|
+
def log_error(error)
|
70
|
+
entry = {
|
71
|
+
:time => Time.now.to_i,
|
72
|
+
:error => {
|
73
|
+
:code => error.error_code,
|
74
|
+
:message => error.message
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
@logger.info(Yajl::Encoder.encode(entry))
|
79
|
+
end
|
80
|
+
|
81
|
+
def start_task(task, index, progress = 0)
|
82
|
+
log_task(task, "started", index, progress)
|
83
|
+
end
|
84
|
+
|
85
|
+
def finish_task(task, index, progress = 100)
|
86
|
+
log_task(task, "finished", index, progress)
|
87
|
+
end
|
88
|
+
|
89
|
+
def task_failed(task, index, progress = 100, error = nil)
|
90
|
+
log_task(task, "failed", index, progress, {"error" => error})
|
91
|
+
end
|
92
|
+
|
93
|
+
def log_task(task, state, index, progress = 0, data = {})
|
94
|
+
entry = {
|
95
|
+
:time => Time.now.to_i,
|
96
|
+
:stage => @stage,
|
97
|
+
:task => task,
|
98
|
+
:tags => @tags,
|
99
|
+
:index => index,
|
100
|
+
:total => @total,
|
101
|
+
:state => state,
|
102
|
+
:progress => progress,
|
103
|
+
}
|
104
|
+
|
105
|
+
if data.size > 0
|
106
|
+
entry[:data] = data
|
107
|
+
end
|
108
|
+
|
109
|
+
@logger.info(Yajl::Encoder.encode(entry))
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
class EventLogger < Logger
|
115
|
+
def format_message(level, time, progname, msg)
|
116
|
+
msg + "\n"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# Sometimes task needs to be split into subtasks so we can track its progress
|
121
|
+
# with more granularity. In that case we can use EventTicker helper class
|
122
|
+
# to advance progress between N and N+1 by small increments.
|
123
|
+
class EventTicker
|
124
|
+
def initialize(event_log, task, index)
|
125
|
+
@event_log = event_log
|
126
|
+
@task = task
|
127
|
+
@index = index
|
128
|
+
@progress = 0
|
129
|
+
end
|
130
|
+
|
131
|
+
def advance(delta, data = {})
|
132
|
+
@progress = [@progress + delta, 100].min
|
133
|
+
@event_log.log_task(@task, "in_progress", @index, @progress.to_i, data)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# Copyright (c) 2009-2012 VMware, Inc.
|
2
|
+
|
3
|
+
module Resque
|
4
|
+
def redis
|
5
|
+
Bosh::Director::Config.redis
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class Object
|
10
|
+
def to_openstruct
|
11
|
+
self
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class Array
|
16
|
+
def to_openstruct
|
17
|
+
map { |el| el.to_openstruct }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Hash
|
22
|
+
def recursive_merge!(other)
|
23
|
+
self.merge!(other) do |_, old_value, new_value|
|
24
|
+
if old_value.class == Hash && new_value.class == Hash
|
25
|
+
old_value.recursive_merge!(new_value)
|
26
|
+
else
|
27
|
+
new_value
|
28
|
+
end
|
29
|
+
end
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_openstruct
|
34
|
+
mapped = {}
|
35
|
+
each { |key, value| mapped[key] = value.to_openstruct }
|
36
|
+
OpenStruct.new(mapped)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
require "sequel/connection_pool/threaded"
|
41
|
+
|
42
|
+
class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
43
|
+
|
44
|
+
alias_method :acquire_original, :acquire
|
45
|
+
alias_method :release_original, :release
|
46
|
+
|
47
|
+
def acquire(thread)
|
48
|
+
logger = Bosh::Director::Config.logger
|
49
|
+
result = acquire_original(thread)
|
50
|
+
if logger
|
51
|
+
logger.debug("Acquired connection: #{@allocated[thread].object_id}")
|
52
|
+
end
|
53
|
+
result
|
54
|
+
end
|
55
|
+
|
56
|
+
def release(thread)
|
57
|
+
logger = Bosh::Director::Config.logger
|
58
|
+
if logger
|
59
|
+
logger.debug("Released connection: #{@allocated[thread].object_id}")
|
60
|
+
end
|
61
|
+
release_original(thread)
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|