bosh-director 1.5.0.pre.1113

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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