bosh-director 1.5.0.pre.1113

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. data/CHANGELOG +34 -0
  2. data/bin/bosh-director +36 -0
  3. data/bin/bosh-director-console +84 -0
  4. data/bin/bosh-director-drain-workers +42 -0
  5. data/bin/bosh-director-migrate +58 -0
  6. data/bin/bosh-director-scheduler +27 -0
  7. data/bin/bosh-director-worker +76 -0
  8. data/db/migrations/README +1 -0
  9. data/db/migrations/director/20110209010747_initial.rb +118 -0
  10. data/db/migrations/director/20110406055800_add_task_user.rb +9 -0
  11. data/db/migrations/director/20110518225809_remove_cid_constrain.rb +13 -0
  12. data/db/migrations/director/20110617211923_add_deployments_release_versions.rb +32 -0
  13. data/db/migrations/director/20110622212607_add_task_checkpoint_timestamp.rb +9 -0
  14. data/db/migrations/director/20110628023039_add_state_to_instances.rb +21 -0
  15. data/db/migrations/director/20110709012332_add_disk_size_to_instances.rb +9 -0
  16. data/db/migrations/director/20110906183441_add_log_bundles.rb +11 -0
  17. data/db/migrations/director/20110907194830_add_logs_json_to_templates.rb +9 -0
  18. data/db/migrations/director/20110915205610_add_persistent_disks.rb +51 -0
  19. data/db/migrations/director/20111005180929_add_properties.rb +14 -0
  20. data/db/migrations/director/20111110024617_add_deployment_problems.rb +24 -0
  21. data/db/migrations/director/20111216214145_recreate_support_for_vms.rb +9 -0
  22. data/db/migrations/director/20120102084027_add_credentials_to_vms.rb +7 -0
  23. data/db/migrations/director/20120427235217_allow_multiple_releases_per_deployment.rb +36 -0
  24. data/db/migrations/director/20120524175805_add_task_type.rb +44 -0
  25. data/db/migrations/director/20120614001930_delete_redundant_deployment_release_relation.rb +34 -0
  26. data/db/migrations/director/20120822004528_add_fingerprint_to_templates_and_packages.rb +17 -0
  27. data/db/migrations/director/20120830191244_add_properties_to_templates.rb +9 -0
  28. data/db/migrations/director/20121106190739_persist_vm_env.rb +9 -0
  29. data/db/migrations/director/20130222232131_add_sha1_to_stemcells.rb +9 -0
  30. data/db/migrations/director/20130312211407_add_commit_hash_to_release_versions.rb +19 -0
  31. data/db/migrations/director/20130409235338_snapshot.rb +15 -0
  32. data/db/migrations/director/20130530164918_add_paused_flag_to_instance.rb +14 -0
  33. data/db/migrations/director/20130531172604_add_director_attributes.rb +13 -0
  34. data/db/migrations/dns/20120123234908_initial.rb +27 -0
  35. data/lib/bosh/director.rb +133 -0
  36. data/lib/bosh/director/agent_client.rb +78 -0
  37. data/lib/bosh/director/api.rb +29 -0
  38. data/lib/bosh/director/api/api_helper.rb +81 -0
  39. data/lib/bosh/director/api/backup_manager.rb +15 -0
  40. data/lib/bosh/director/api/controller.rb +639 -0
  41. data/lib/bosh/director/api/controller_helpers.rb +34 -0
  42. data/lib/bosh/director/api/deployment_lookup.rb +13 -0
  43. data/lib/bosh/director/api/deployment_manager.rb +60 -0
  44. data/lib/bosh/director/api/http_constants.rb +16 -0
  45. data/lib/bosh/director/api/instance_lookup.rb +44 -0
  46. data/lib/bosh/director/api/instance_manager.rb +63 -0
  47. data/lib/bosh/director/api/problem_manager.rb +40 -0
  48. data/lib/bosh/director/api/property_manager.rb +69 -0
  49. data/lib/bosh/director/api/release_manager.rb +59 -0
  50. data/lib/bosh/director/api/resource_manager.rb +69 -0
  51. data/lib/bosh/director/api/resurrector_manager.rb +15 -0
  52. data/lib/bosh/director/api/snapshot_manager.rb +94 -0
  53. data/lib/bosh/director/api/stemcell_manager.rb +50 -0
  54. data/lib/bosh/director/api/task_helper.rb +46 -0
  55. data/lib/bosh/director/api/task_manager.rb +64 -0
  56. data/lib/bosh/director/api/user_manager.rb +72 -0
  57. data/lib/bosh/director/api/vm_state_manager.rb +11 -0
  58. data/lib/bosh/director/app.rb +35 -0
  59. data/lib/bosh/director/blob_util.rb +87 -0
  60. data/lib/bosh/director/blobstores.rb +29 -0
  61. data/lib/bosh/director/client.rb +156 -0
  62. data/lib/bosh/director/cloudcheck_helper.rb +204 -0
  63. data/lib/bosh/director/compile_task.rb +157 -0
  64. data/lib/bosh/director/config.rb +370 -0
  65. data/lib/bosh/director/configuration_hasher.rb +114 -0
  66. data/lib/bosh/director/cycle_helper.rb +36 -0
  67. data/lib/bosh/director/db_backup.rb +22 -0
  68. data/lib/bosh/director/db_backup/adapter.rb +3 -0
  69. data/lib/bosh/director/db_backup/adapter/mysql2.rb +27 -0
  70. data/lib/bosh/director/db_backup/adapter/postgres.rb +36 -0
  71. data/lib/bosh/director/db_backup/adapter/sqlite.rb +17 -0
  72. data/lib/bosh/director/db_backup/error.rb +10 -0
  73. data/lib/bosh/director/deployment_plan.rb +26 -0
  74. data/lib/bosh/director/deployment_plan/assembler.rb +430 -0
  75. data/lib/bosh/director/deployment_plan/compilation_config.rb +54 -0
  76. data/lib/bosh/director/deployment_plan/compiled_package.rb +35 -0
  77. data/lib/bosh/director/deployment_plan/dynamic_network.rb +91 -0
  78. data/lib/bosh/director/deployment_plan/idle_vm.rb +109 -0
  79. data/lib/bosh/director/deployment_plan/instance.rb +413 -0
  80. data/lib/bosh/director/deployment_plan/job.rb +470 -0
  81. data/lib/bosh/director/deployment_plan/manual_network.rb +137 -0
  82. data/lib/bosh/director/deployment_plan/network.rb +74 -0
  83. data/lib/bosh/director/deployment_plan/network_subnet.rb +167 -0
  84. data/lib/bosh/director/deployment_plan/planner.rb +288 -0
  85. data/lib/bosh/director/deployment_plan/preparer.rb +52 -0
  86. data/lib/bosh/director/deployment_plan/release.rb +126 -0
  87. data/lib/bosh/director/deployment_plan/resource_pool.rb +143 -0
  88. data/lib/bosh/director/deployment_plan/resource_pools.rb +68 -0
  89. data/lib/bosh/director/deployment_plan/stemcell.rb +56 -0
  90. data/lib/bosh/director/deployment_plan/template.rb +94 -0
  91. data/lib/bosh/director/deployment_plan/update_config.rb +80 -0
  92. data/lib/bosh/director/deployment_plan/updater.rb +55 -0
  93. data/lib/bosh/director/deployment_plan/vip_network.rb +79 -0
  94. data/lib/bosh/director/dns_helper.rb +204 -0
  95. data/lib/bosh/director/download_helper.rb +44 -0
  96. data/lib/bosh/director/duration.rb +36 -0
  97. data/lib/bosh/director/encryption_helper.rb +10 -0
  98. data/lib/bosh/director/errors.rb +198 -0
  99. data/lib/bosh/director/event_log.rb +136 -0
  100. data/lib/bosh/director/ext.rb +64 -0
  101. data/lib/bosh/director/hash_string_vals.rb +13 -0
  102. data/lib/bosh/director/instance_deleter.rb +109 -0
  103. data/lib/bosh/director/instance_updater.rb +506 -0
  104. data/lib/bosh/director/ip_util.rb +67 -0
  105. data/lib/bosh/director/job_queue.rb +16 -0
  106. data/lib/bosh/director/job_runner.rb +162 -0
  107. data/lib/bosh/director/job_updater.rb +121 -0
  108. data/lib/bosh/director/jobs/backup.rb +86 -0
  109. data/lib/bosh/director/jobs/base_job.rb +66 -0
  110. data/lib/bosh/director/jobs/cloud_check/apply_resolutions.rb +46 -0
  111. data/lib/bosh/director/jobs/cloud_check/scan.rb +38 -0
  112. data/lib/bosh/director/jobs/cloud_check/scan_and_fix.rb +73 -0
  113. data/lib/bosh/director/jobs/create_snapshot.rb +23 -0
  114. data/lib/bosh/director/jobs/delete_deployment.rb +183 -0
  115. data/lib/bosh/director/jobs/delete_deployment_snapshots.rb +34 -0
  116. data/lib/bosh/director/jobs/delete_release.rb +219 -0
  117. data/lib/bosh/director/jobs/delete_snapshots.rb +23 -0
  118. data/lib/bosh/director/jobs/delete_stemcell.rb +102 -0
  119. data/lib/bosh/director/jobs/fetch_logs.rb +99 -0
  120. data/lib/bosh/director/jobs/scheduled_backup.rb +38 -0
  121. data/lib/bosh/director/jobs/snapshot_deployment.rb +61 -0
  122. data/lib/bosh/director/jobs/snapshot_deployments.rb +23 -0
  123. data/lib/bosh/director/jobs/snapshot_self.rb +43 -0
  124. data/lib/bosh/director/jobs/ssh.rb +59 -0
  125. data/lib/bosh/director/jobs/update_deployment.rb +110 -0
  126. data/lib/bosh/director/jobs/update_release.rb +672 -0
  127. data/lib/bosh/director/jobs/update_stemcell.rb +109 -0
  128. data/lib/bosh/director/jobs/vm_state.rb +89 -0
  129. data/lib/bosh/director/lock.rb +133 -0
  130. data/lib/bosh/director/lock_helper.rb +92 -0
  131. data/lib/bosh/director/models.rb +29 -0
  132. data/lib/bosh/director/models/compiled_package.rb +33 -0
  133. data/lib/bosh/director/models/deployment.rb +22 -0
  134. data/lib/bosh/director/models/deployment_problem.rb +49 -0
  135. data/lib/bosh/director/models/deployment_property.rb +21 -0
  136. data/lib/bosh/director/models/director_attribute.rb +9 -0
  137. data/lib/bosh/director/models/dns.rb +9 -0
  138. data/lib/bosh/director/models/dns/domain.rb +9 -0
  139. data/lib/bosh/director/models/dns/record.rb +7 -0
  140. data/lib/bosh/director/models/helpers/model_helper.rb +7 -0
  141. data/lib/bosh/director/models/instance.rb +28 -0
  142. data/lib/bosh/director/models/log_bundle.rb +10 -0
  143. data/lib/bosh/director/models/package.rb +30 -0
  144. data/lib/bosh/director/models/persistent_disk.rb +13 -0
  145. data/lib/bosh/director/models/release.rb +17 -0
  146. data/lib/bosh/director/models/release_version.rb +16 -0
  147. data/lib/bosh/director/models/snapshot.rb +13 -0
  148. data/lib/bosh/director/models/stemcell.rb +18 -0
  149. data/lib/bosh/director/models/task.rb +10 -0
  150. data/lib/bosh/director/models/template.rb +44 -0
  151. data/lib/bosh/director/models/user.rb +11 -0
  152. data/lib/bosh/director/models/vm.rb +42 -0
  153. data/lib/bosh/director/nats_rpc.rb +54 -0
  154. data/lib/bosh/director/network_reservation.rb +121 -0
  155. data/lib/bosh/director/next_rebase_version.rb +20 -0
  156. data/lib/bosh/director/package_compiler.rb +423 -0
  157. data/lib/bosh/director/problem_handlers/base.rb +153 -0
  158. data/lib/bosh/director/problem_handlers/inactive_disk.rb +112 -0
  159. data/lib/bosh/director/problem_handlers/invalid_problem.rb +28 -0
  160. data/lib/bosh/director/problem_handlers/missing_vm.rb +34 -0
  161. data/lib/bosh/director/problem_handlers/mount_info_mismatch.rb +62 -0
  162. data/lib/bosh/director/problem_handlers/out_of_sync_vm.rb +64 -0
  163. data/lib/bosh/director/problem_handlers/unbound_instance_vm.rb +85 -0
  164. data/lib/bosh/director/problem_handlers/unresponsive_agent.rb +78 -0
  165. data/lib/bosh/director/problem_resolver.rb +103 -0
  166. data/lib/bosh/director/problem_scanner.rb +268 -0
  167. data/lib/bosh/director/resource_pool_updater.rb +216 -0
  168. data/lib/bosh/director/scheduler.rb +57 -0
  169. data/lib/bosh/director/sequel.rb +13 -0
  170. data/lib/bosh/director/tar_gzipper.rb +47 -0
  171. data/lib/bosh/director/task_result_file.rb +19 -0
  172. data/lib/bosh/director/thread_pool.rb +8 -0
  173. data/lib/bosh/director/validation_helper.rb +55 -0
  174. data/lib/bosh/director/version.rb +7 -0
  175. data/lib/bosh/director/vm_creator.rb +80 -0
  176. data/lib/bosh/director/vm_data.rb +63 -0
  177. data/lib/bosh/director/vm_metadata_updater.rb +29 -0
  178. data/lib/bosh/director/vm_reuser.rb +63 -0
  179. data/lib/cloud/dummy.rb +149 -0
  180. 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,10 @@
1
+ module Bosh::Director
2
+ module EncryptionHelper
3
+ def generate_agent_credentials
4
+ ["crypt_key", "sign_key"].inject({}) do |credentials, key|
5
+ credentials[key] = SecureRandom.base64(48)
6
+ credentials
7
+ end
8
+ end
9
+ end
10
+ 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