bosh-director 1.3232.24.0 → 1.3262.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/db/migrations/director/20160414183654_set_teams_on_task.rb +7 -0
  3. data/db/migrations/director/20160427164345_add_teams.rb +48 -0
  4. data/db/migrations/director/20160511191928_ephemeral_blobs.rb +10 -0
  5. data/db/migrations/director/20160513102035_add_tracking_to_instance.rb +7 -0
  6. data/db/migrations/director/20160531164756_add_local_dns_blobs.rb +14 -0
  7. data/lib/bosh/director.rb +5 -1
  8. data/lib/bosh/director/api.rb +1 -0
  9. data/lib/bosh/director/api/api_helper.rb +2 -2
  10. data/lib/bosh/director/api/controllers/cleanup_controller.rb +1 -1
  11. data/lib/bosh/director/api/controllers/deployments_controller.rb +39 -25
  12. data/lib/bosh/director/api/controllers/disks_controller.rb +2 -1
  13. data/lib/bosh/director/api/controllers/events_controller.rb +34 -0
  14. data/lib/bosh/director/api/controllers/releases_controller.rb +1 -1
  15. data/lib/bosh/director/api/controllers/resurrection_controller.rb +1 -1
  16. data/lib/bosh/director/api/controllers/stemcells_controller.rb +1 -1
  17. data/lib/bosh/director/api/controllers/tasks_controller.rb +31 -46
  18. data/lib/bosh/director/api/controllers/users_controller.rb +2 -2
  19. data/lib/bosh/director/api/controllers/vms_controller.rb +18 -0
  20. data/lib/bosh/director/api/deployment_manager.rb +3 -3
  21. data/lib/bosh/director/api/instance_ignore_manager.rb +11 -0
  22. data/lib/bosh/director/api/instance_manager.rb +3 -3
  23. data/lib/bosh/director/api/local_identity_provider.rb +1 -1
  24. data/lib/bosh/director/api/problem_manager.rb +3 -3
  25. data/lib/bosh/director/api/release_manager.rb +9 -4
  26. data/lib/bosh/director/api/resurrector_manager.rb +13 -1
  27. data/lib/bosh/director/api/route_configuration.rb +1 -0
  28. data/lib/bosh/director/api/snapshot_manager.rb +2 -2
  29. data/lib/bosh/director/api/stemcell_manager.rb +29 -9
  30. data/lib/bosh/director/api/task_helper.rb +4 -3
  31. data/lib/bosh/director/api/uaa_identity_provider.rb +9 -3
  32. data/lib/bosh/director/api/user/config_user_manager.rb +1 -1
  33. data/lib/bosh/director/api/user/database_user_manager.rb +2 -2
  34. data/lib/bosh/director/cidr_range_combiner.rb +51 -0
  35. data/lib/bosh/director/cloudcheck_helper.rb +17 -6
  36. data/lib/bosh/director/config.rb +27 -1
  37. data/lib/bosh/director/db_backup/adapter/postgres.rb +0 -1
  38. data/lib/bosh/director/deployment_plan.rb +1 -1
  39. data/lib/bosh/director/deployment_plan/assembler.rb +8 -5
  40. data/lib/bosh/director/deployment_plan/deployment_repo.rb +10 -3
  41. data/lib/bosh/director/deployment_plan/deployment_spec_parser.rb +17 -6
  42. data/lib/bosh/director/deployment_plan/global_network_resolver.rb +44 -23
  43. data/lib/bosh/director/deployment_plan/instance.rb +2 -2
  44. data/lib/bosh/director/deployment_plan/{job.rb → instance_group.rb} +5 -5
  45. data/lib/bosh/director/deployment_plan/{job_spec_parser.rb → instance_group_spec_parser.rb} +17 -15
  46. data/lib/bosh/director/deployment_plan/instance_plan.rb +14 -10
  47. data/lib/bosh/director/deployment_plan/instance_planner.rb +22 -0
  48. data/lib/bosh/director/deployment_plan/job_migrator.rb +2 -2
  49. data/lib/bosh/director/deployment_plan/links/link_lookup.rb +3 -3
  50. data/lib/bosh/director/deployment_plan/links/link_path.rb +2 -2
  51. data/lib/bosh/director/deployment_plan/links/links_resolver.rb +1 -1
  52. data/lib/bosh/director/deployment_plan/manual_network.rb +1 -1
  53. data/lib/bosh/director/deployment_plan/manual_network_subnet.rb +1 -1
  54. data/lib/bosh/director/deployment_plan/placement_planner/availability_zone_picker.rb +53 -1
  55. data/lib/bosh/director/deployment_plan/placement_planner/static_ips_availability_zone_picker.rb +39 -1
  56. data/lib/bosh/director/deployment_plan/placement_planner/unplaced_existing_instances.rb +4 -0
  57. data/lib/bosh/director/deployment_plan/planner.rb +37 -31
  58. data/lib/bosh/director/deployment_plan/planner_factory.rb +26 -11
  59. data/lib/bosh/director/deployment_plan/runtime_manifest_parser.rb +15 -6
  60. data/lib/bosh/director/deployment_plan/steps/update_step.rb +1 -1
  61. data/lib/bosh/director/deployment_plan/template.rb +14 -1
  62. data/lib/bosh/director/dns/blobstore_dns_publisher.rb +35 -0
  63. data/lib/bosh/director/dns/dns_manager.rb +37 -74
  64. data/lib/bosh/director/errand/job_manager.rb +1 -1
  65. data/lib/bosh/director/error_ignorer.rb +1 -2
  66. data/lib/bosh/director/errors.rb +4 -0
  67. data/lib/bosh/director/event_log.rb +10 -2
  68. data/lib/bosh/director/instance_deleter.rb +11 -2
  69. data/lib/bosh/director/instance_updater.rb +21 -25
  70. data/lib/bosh/director/instance_updater/instance_state.rb +24 -2
  71. data/lib/bosh/director/instance_updater/state_applier.rb +4 -4
  72. data/lib/bosh/director/job_queue.rb +2 -2
  73. data/lib/bosh/director/job_updater.rb +3 -1
  74. data/lib/bosh/director/jobs/attach_disk.rb +7 -2
  75. data/lib/bosh/director/jobs/cleanup_artifacts.rb +15 -5
  76. data/lib/bosh/director/jobs/cloud_check/apply_resolutions.rb +2 -0
  77. data/lib/bosh/director/jobs/cloud_check/scan_and_fix.rb +5 -5
  78. data/lib/bosh/director/jobs/db_job.rb +10 -13
  79. data/lib/bosh/director/jobs/delete_deployment.rb +13 -1
  80. data/lib/bosh/director/jobs/delete_vm.rb +58 -0
  81. data/lib/bosh/director/jobs/export_release.rb +11 -4
  82. data/lib/bosh/director/jobs/helpers.rb +2 -0
  83. data/lib/bosh/director/jobs/helpers/config_parser.rb +66 -0
  84. data/lib/bosh/director/jobs/helpers/deep_hash_replacement.rb +38 -0
  85. data/lib/bosh/director/jobs/run_errand.rb +1 -1
  86. data/lib/bosh/director/jobs/ssh.rb +3 -2
  87. data/lib/bosh/director/jobs/update_deployment.rb +73 -14
  88. data/lib/bosh/director/jobs/update_release.rb +3 -1
  89. data/lib/bosh/director/jobs/update_stemcell.rb +1 -0
  90. data/lib/bosh/director/jobs/vm_state.rb +4 -3
  91. data/lib/bosh/director/legacy_deployment_helper.rb +7 -0
  92. data/lib/bosh/director/manifest/diff_lines.rb +4 -0
  93. data/lib/bosh/director/manifest/manifest.rb +18 -6
  94. data/lib/bosh/director/models.rb +3 -0
  95. data/lib/bosh/director/models/deployment.rb +17 -8
  96. data/lib/bosh/director/models/deployment_problem.rb +2 -2
  97. data/lib/bosh/director/models/ephemeral_blob.rb +11 -0
  98. data/lib/bosh/director/models/event.rb +2 -2
  99. data/lib/bosh/director/models/instance.rb +35 -5
  100. data/lib/bosh/director/models/local_dns_blob.rb +4 -0
  101. data/lib/bosh/director/models/orphan_disk.rb +2 -2
  102. data/lib/bosh/director/models/package.rb +2 -2
  103. data/lib/bosh/director/models/persistent_disk.rb +2 -2
  104. data/lib/bosh/director/models/task.rb +15 -0
  105. data/lib/bosh/director/models/team.rb +35 -0
  106. data/lib/bosh/director/models/template.rb +6 -2
  107. data/lib/bosh/director/nats_rpc.rb +3 -3
  108. data/lib/bosh/director/permission_authorizer.rb +14 -4
  109. data/lib/bosh/director/post_deployment_script_runner.rb +5 -4
  110. data/lib/bosh/director/problem_handlers/missing_vm.rb +7 -2
  111. data/lib/bosh/director/problem_handlers/unresponsive_agent.rb +11 -1
  112. data/lib/bosh/director/problem_resolver.rb +1 -1
  113. data/lib/bosh/director/problem_scanner/disk_scan_stage.rb +1 -1
  114. data/lib/bosh/director/problem_scanner/vm_scan_stage.rb +5 -1
  115. data/lib/bosh/director/version.rb +1 -1
  116. data/lib/bosh/director/vm_deleter.rb +8 -7
  117. data/lib/bosh/director/worker.rb +1 -0
  118. metadata +36 -34
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 16c44a4ba321cd6f42757087c868401728f78195
4
- data.tar.gz: 39c92fd8253fa376bee4ac3dead05a58d93dde2c
3
+ metadata.gz: 576adc0d9f6febe9f333d2f9323ae9d8c7a31f87
4
+ data.tar.gz: 01311d5a771cd111a100a5866d7cd38007dde982
5
5
  SHA512:
6
- metadata.gz: 4104f9bfd037b661b69a8a379368978fa023b7a1356bfbe6dac4aac82d87e335801dca5eda2d45a632ab9b1c6e688bf89c7b7bb2752756c7f87b145fb5ac80a2
7
- data.tar.gz: 136679263e45817087f19658bc5093583c726b4163ea881b0c8cafd8b209fc12c91a4e0a7a12ceaaaa4e3fcd60dad5de9fbd0445b0119877da95bbdb1829b0b8
6
+ metadata.gz: addb243b3fe331ae2783f7799af05991645e5529b205bf968756f2bc4dd1e7d41d797c0130657706d8f98b86366d344f874156d0fdf25e38e88fb3d2f65f93b9
7
+ data.tar.gz: 0f4ca4cd3d286d8a904202380647faa9e5f4e62de7b1abab550a615a69311a14ae38ca2eaa957874b794357d6b862c080140471300d55d461078a219b15ce5d3
@@ -0,0 +1,7 @@
1
+ Sequel.migration do
2
+ change do
3
+ alter_table(:tasks) do
4
+ add_column(:teams, String)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,48 @@
1
+ Sequel.migration do
2
+ up do
3
+ create_table :teams do
4
+ primary_key :id
5
+ String :name, :unique => true, :null => false
6
+ end
7
+
8
+ create_table :deployments_teams do
9
+ foreign_key :deployment_id, :deployments, :null => false, :on_delete => :cascade
10
+ foreign_key :team_id, :teams, :null => false, :on_delete => :cascade
11
+ unique [:deployment_id, :team_id]
12
+ end
13
+
14
+ deployments_with_teams = self[:deployments].reject { |d| d[:teams].nil? }
15
+ team_names = deployments_with_teams
16
+ .map { |d| d[:teams].split(',') }
17
+ .flatten
18
+ .uniq
19
+ .map { |team| [team] }
20
+
21
+ self[:teams].import([:name], team_names)
22
+
23
+ deployments_with_teams.each do |d|
24
+ deployment_teams = d[:teams]
25
+ .split(',')
26
+ .map do |team_name|
27
+ team = self[:teams].filter({name: team_name}).first
28
+ [d[:id], team[:id]]
29
+ end
30
+
31
+ self[:deployments_teams].import([:deployment_id, :team_id], deployment_teams)
32
+ end
33
+
34
+ alter_table(:deployments) do
35
+ drop_column :teams
36
+ end
37
+
38
+ create_table :tasks_teams do
39
+ foreign_key :task_id, :tasks, :null => false, :on_delete => :cascade
40
+ foreign_key :team_id, :teams, :null => false, :on_delete => :cascade
41
+ unique [:task_id, :team_id]
42
+ end
43
+
44
+ alter_table(:tasks) do
45
+ drop_column :teams
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,10 @@
1
+ Sequel.migration do
2
+ change do
3
+ create_table :ephemeral_blobs do
4
+ primary_key :id
5
+ String :blobstore_id, :null => false
6
+ String :sha1, :null => false
7
+ Time :created_at, null: false
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ Sequel.migration do
2
+ change do
3
+ alter_table(:instances) do
4
+ add_column(:ignore, TrueClass, :default => false)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,14 @@
1
+ Sequel.migration do
2
+ up do
3
+ create_table :local_dns_blobs do
4
+ primary_key :id
5
+ String :blobstore_id, :null => false
6
+ String :sha1, :null => false
7
+ Time :created_at, null: false
8
+ end
9
+ end
10
+
11
+ down do
12
+ drop_table :local_dns_blobs
13
+ end
14
+ end
@@ -32,7 +32,6 @@ require 'delayed_job'
32
32
  require 'sequel'
33
33
  require 'sinatra/base'
34
34
  require 'securerandom'
35
- require 'yajl'
36
35
  require 'nats/client'
37
36
  require 'securerandom'
38
37
  require 'delayed_job_sequel'
@@ -40,16 +39,19 @@ require 'delayed_job_sequel'
40
39
  require 'common/thread_formatter'
41
40
  require 'bosh/core/encryption_handler'
42
41
  require 'bosh/director/api'
42
+ require 'bosh/director/dns/blobstore_dns_publisher'
43
43
  require 'bosh/director/dns/canonicalizer'
44
44
  require 'bosh/director/dns/dns_manager'
45
45
  require 'bosh/director/dns/local_dns_repo'
46
46
  require 'bosh/director/errors'
47
47
  require 'bosh/director/ext'
48
48
  require 'bosh/director/ip_util'
49
+ require 'bosh/director/cidr_range_combiner'
49
50
  require 'bosh/director/lock_helper'
50
51
  require 'bosh/director/validation_helper'
51
52
  require 'bosh/director/download_helper'
52
53
  require 'bosh/director/tagged_logger'
54
+ require 'bosh/director/legacy_deployment_helper'
53
55
 
54
56
  require 'bosh/director/version'
55
57
  require 'bosh/director/config'
@@ -148,6 +150,7 @@ require 'bosh/director/jobs/cloud_check/apply_resolutions'
148
150
  require 'bosh/director/jobs/release/release_job'
149
151
  require 'bosh/director/jobs/ssh'
150
152
  require 'bosh/director/jobs/attach_disk'
153
+ require 'bosh/director/jobs/delete_vm'
151
154
  require 'bosh/director/jobs/helpers'
152
155
  require 'bosh/director/jobs/db_job'
153
156
 
@@ -186,4 +189,5 @@ require 'bosh/director/api/controllers/runtime_configs_controller'
186
189
  require 'bosh/director/api/controllers/locks_controller'
187
190
  require 'bosh/director/api/controllers/restore_controller'
188
191
  require 'bosh/director/api/controllers/events_controller'
192
+ require 'bosh/director/api/controllers/vms_controller'
189
193
  require 'bosh/director/api/route_configuration'
@@ -27,6 +27,7 @@ require 'bosh/director/api/resurrector_manager'
27
27
  require 'bosh/director/api/restore_manager'
28
28
  require 'bosh/director/api/cloud_config_manager'
29
29
  require 'bosh/director/api/runtime_config_manager'
30
+ require 'bosh/director/api/instance_ignore_manager'
30
31
 
31
32
  require 'bosh/director/api/instance_lookup'
32
33
  require 'bosh/director/api/deployment_lookup'
@@ -43,11 +43,11 @@ module Bosh::Director
43
43
  end
44
44
 
45
45
  def json_encode(payload)
46
- Yajl::Encoder.encode(payload)
46
+ JSON.generate(payload)
47
47
  end
48
48
 
49
49
  def json_decode(payload)
50
- Yajl::Parser.parse(payload)
50
+ JSON.parse(payload)
51
51
  end
52
52
 
53
53
  def start_task
@@ -5,7 +5,7 @@ module Bosh::Director
5
5
  class CleanupController < BaseController
6
6
  post '/', :consumes => :json do
7
7
  job_queue = JobQueue.new
8
- payload = json_decode(request.body)
8
+ payload = json_decode(request.body.read)
9
9
  task = Bosh::Director::Jobs::CleanupArtifacts.enqueue(current_user, payload['config'], job_queue)
10
10
 
11
11
  redirect "/tasks/#{task.id}"
@@ -38,6 +38,7 @@ module Bosh::Director
38
38
 
39
39
  class DeploymentsController < BaseController
40
40
  register DeploymentsSecurity
41
+ include LegacyDeploymentHelper
41
42
 
42
43
  def initialize(config)
43
44
  super(config)
@@ -46,6 +47,7 @@ module Bosh::Director
46
47
  @property_manager = Api::PropertyManager.new
47
48
  @instance_manager = Api::InstanceManager.new
48
49
  @deployments_repo = DeploymentPlan::DeploymentRepo.new
50
+ @instance_ignore_manager = Api::InstanceIgnoreManager.new
49
51
  end
50
52
 
51
53
  get '/:deployment/jobs/:job/:index_or_id' do
@@ -73,7 +75,10 @@ module Bosh::Director
73
75
  }
74
76
  }
75
77
  }
78
+
76
79
  options['skip_drain'] = params[:job] if params['skip_drain'] == 'true'
80
+ options['canaries'] = params[:canaries] if !!params['canaries']
81
+ options['max_in_flight'] = params[:max_in_flight] if !!params['max_in_flight']
77
82
 
78
83
  if (request.content_length.nil? || request.content_length.to_i == 0) && (params['state'])
79
84
  manifest_file_path = prepare_yml_file(StringIO.new(deployment.manifest), 'deployment', true)
@@ -83,7 +88,7 @@ module Bosh::Director
83
88
 
84
89
  latest_cloud_config = Bosh::Director::Api::CloudConfigManager.new.latest
85
90
  latest_runtime_config = Bosh::Director::Api::RuntimeConfigManager.new.latest
86
- task = @deployment_manager.create_deployment(current_user, manifest_file_path, latest_cloud_config, latest_runtime_config, deployment.name, options)
91
+ task = @deployment_manager.create_deployment(current_user, manifest_file_path, latest_cloud_config, latest_runtime_config, deployment, options)
87
92
  redirect "/tasks/#{task.id}"
88
93
  end
89
94
 
@@ -113,7 +118,7 @@ module Bosh::Director
113
118
 
114
119
  latest_cloud_config = Bosh::Director::Api::CloudConfigManager.new.latest
115
120
  latest_runtime_config = Bosh::Director::Api::RuntimeConfigManager.new.latest
116
- task = @deployment_manager.create_deployment(current_user, manifest_file_path, latest_cloud_config, latest_runtime_config, deployment.name, options)
121
+ task = @deployment_manager.create_deployment(current_user, manifest_file_path, latest_cloud_config, latest_runtime_config, deployment, options)
117
122
  redirect "/tasks/#{task.id}"
118
123
  end
119
124
 
@@ -149,10 +154,15 @@ module Bosh::Director
149
154
 
150
155
  put '/:deployment/jobs/:job/:index_or_id/resurrection', consumes: :json do
151
156
 
152
- payload = json_decode(request.body)
157
+ payload = json_decode(request.body.read)
153
158
  @resurrector_manager.set_pause_for_instance(deployment, params[:job], params[:index_or_id], payload['resurrection_paused'])
154
159
  end
155
160
 
161
+ put '/:deployment/instance_groups/:instancegroup/:id/ignore', consumes: :json do
162
+ payload = json_decode(request.body.read)
163
+ @instance_ignore_manager.set_ignore_state_for_instance(deployment, params[:instancegroup], params[:id], payload['ignore'])
164
+ end
165
+
156
166
  post '/:deployment/jobs/:job/:index_or_id/snapshots' do
157
167
  if params[:index_or_id].to_s =~ /^\d+$/
158
168
  instance = @instance_manager.find_by_name(deployment, params[:job], params[:index_or_id])
@@ -213,7 +223,7 @@ module Bosh::Director
213
223
  end
214
224
 
215
225
  get '/:deployment', authorization: :read do
216
- Yajl::Encoder.encode({'manifest' => deployment.manifest})
226
+ JSON.generate({'manifest' => deployment.manifest})
217
227
  end
218
228
 
219
229
  get '/:deployment/vms', authorization: :read do
@@ -223,7 +233,7 @@ module Bosh::Director
223
233
  redirect "/tasks/#{task.id}"
224
234
  else
225
235
  instances = @deployment_manager.deployment_instances_with_vms(deployment)
226
- Yajl::Encoder.encode(create_instances_response(instances))
236
+ JSON.generate(create_instances_response(instances))
227
237
  end
228
238
  end
229
239
 
@@ -234,7 +244,7 @@ module Bosh::Director
234
244
  redirect "/tasks/#{task.id}"
235
245
  else
236
246
  instances = @instance_manager.find_instances_by_deployment(deployment)
237
- Yajl::Encoder.encode(create_instances_response(instances))
247
+ JSON.generate(create_instances_response(instances))
238
248
  end
239
249
  end
240
250
 
@@ -247,7 +257,7 @@ module Bosh::Director
247
257
  end
248
258
 
249
259
  post '/:deployment/ssh', :consumes => [:json] do
250
- payload = json_decode(request.body)
260
+ payload = json_decode(request.body.read)
251
261
  task = @instance_manager.ssh(current_user, deployment, payload)
252
262
  redirect "/tasks/#{task.id}"
253
263
  end
@@ -266,13 +276,13 @@ module Bosh::Director
266
276
  end
267
277
 
268
278
  post '/:deployment/properties', :consumes => [:json] do
269
- payload = json_decode(request.body)
279
+ payload = json_decode(request.body.read)
270
280
  @property_manager.create_property(deployment, payload['name'], payload['value'])
271
281
  status(204)
272
282
  end
273
283
 
274
284
  put '/:deployment/properties/:property', :consumes => [:json] do
275
- payload = json_decode(request.body)
285
+ payload = json_decode(request.body.read)
276
286
  @property_manager.update_property(deployment, params[:property], payload['value'])
277
287
  status(204)
278
288
  end
@@ -305,12 +315,12 @@ module Bosh::Director
305
315
  end
306
316
 
307
317
  put '/:deployment/problems', :consumes => [:json] do
308
- payload = json_decode(request.body)
318
+ payload = json_decode(request.body.read)
309
319
  start_task { @problem_manager.apply_resolutions(current_user, deployment, payload['resolutions']) }
310
320
  end
311
321
 
312
322
  put '/:deployment/scan_and_fix', :consumes => :json do
313
- jobs_json = json_decode(request.body)['jobs']
323
+ jobs_json = json_decode(request.body.read)['jobs']
314
324
  payload = convert_job_instance_hash(jobs_json)
315
325
  if deployment_has_instance_to_resurrect?(deployment)
316
326
  start_task { @problem_manager.scan_and_fix(current_user, deployment, payload) }
@@ -340,33 +350,36 @@ module Bosh::Director
340
350
  if deployment
341
351
  deployment_name = deployment['name']
342
352
  if deployment_name
343
- @deployments_repo.find_or_create_by_name(deployment_name, options)
353
+ options['new'] = Models::Deployment[name: deployment_name].nil? ? true : false
354
+ deployment_model = @deployments_repo.find_or_create_by_name(deployment_name, options)
344
355
  end
345
356
  end
346
357
 
347
- task = @deployment_manager.create_deployment(current_user, manifest_file_path, cloud_config, runtime_config, deployment_name, options)
358
+ task = @deployment_manager.create_deployment(current_user, manifest_file_path, cloud_config, runtime_config, deployment_model, options)
348
359
 
349
360
  redirect "/tasks/#{task.id}"
350
361
  end
351
362
 
352
363
  post '/:deployment/diff', authorization: :diff, :consumes => :yaml do
364
+
353
365
  manifest_text = request.body.read
354
366
  validate_manifest_yml(manifest_text)
355
367
 
368
+ manifest_hash = Psych.load(manifest_text)
369
+
370
+ ignore_cc = ignore_cloud_config?(manifest_hash)
371
+
356
372
  if deployment
357
- before_manifest = Manifest.load_from_text(deployment.manifest, deployment.cloud_config, deployment.runtime_config)
373
+ before_manifest = Manifest.load_from_text(deployment.manifest, ignore_cc ? nil : deployment.cloud_config, deployment.runtime_config)
358
374
  before_manifest.resolve_aliases
359
375
  else
360
376
  before_manifest = Manifest.load_from_text(nil, nil, nil)
361
377
  end
362
378
 
363
- after_cloud_config = Bosh::Director::Api::CloudConfigManager.new.latest
379
+ after_cloud_config = ignore_cc ? nil : Bosh::Director::Api::CloudConfigManager.new.latest
364
380
  after_runtime_config = Bosh::Director::Api::RuntimeConfigManager.new.latest
365
- after_manifest = Manifest.load_from_text(
366
- manifest_text,
367
- after_cloud_config,
368
- after_runtime_config
369
- )
381
+
382
+ after_manifest = Manifest.load_from_hash(manifest_hash, after_cloud_config, after_runtime_config)
370
383
  after_manifest.resolve_aliases
371
384
 
372
385
  redact = params['redact'] != 'false'
@@ -391,14 +404,14 @@ module Bosh::Director
391
404
 
392
405
  post '/:deployment/errands/:errand_name/runs' do
393
406
  errand_name = params[:errand_name]
394
- keep_alive = json_decode(request.body)['keep-alive'] || FALSE
407
+ keep_alive = json_decode(request.body.read)['keep-alive'] || FALSE
395
408
 
396
409
  task = JobQueue.new.enqueue(
397
410
  current_user,
398
411
  Jobs::RunErrand,
399
412
  "run errand #{errand_name} from deployment #{deployment.name}",
400
413
  [deployment.name, errand_name, keep_alive],
401
- deployment.name
414
+ deployment
402
415
  )
403
416
 
404
417
  redirect "/tasks/#{task.id}"
@@ -407,7 +420,7 @@ module Bosh::Director
407
420
  get '/:deployment/errands', authorization: :read do
408
421
  deployment_plan = load_deployment_plan
409
422
 
410
- errands = deployment_plan.jobs.select(&:is_errand?)
423
+ errands = deployment_plan.instance_groups.select(&:is_errand?)
411
424
 
412
425
  errand_data = errands.map do |errand|
413
426
  {"name" => errand.name}
@@ -433,8 +446,9 @@ module Bosh::Director
433
446
  end
434
447
 
435
448
  def deployment_has_instance_to_resurrect?(deployment)
436
- false if deployment.nil?
437
- instances = @instance_manager.filter_by(deployment, resurrection_paused: false)
449
+ return false if deployment.nil?
450
+ return false if @resurrector_manager.pause_for_all?
451
+ instances = @instance_manager.filter_by(deployment, resurrection_paused: false, ignore: false)
438
452
  instances.any?
439
453
  end
440
454
 
@@ -11,8 +11,9 @@ module Bosh::Director
11
11
 
12
12
  # PUT /disks/disk_cid/attachments?deployment=foo&job=dea&instance_id=17f01a35-bf9c-4949-bcf2-c07a95e4df33
13
13
  put '/:disk_cid/attachments' do
14
+ deployment = Api::DeploymentManager.new.find_by_name(params[:deployment])
14
15
  job_queue = JobQueue.new
15
- task = Bosh::Director::Jobs::AttachDisk.enqueue(current_user, params[:deployment], params[:job], params[:instance_id], params[:disk_cid], job_queue)
16
+ task = Bosh::Director::Jobs::AttachDisk.enqueue(current_user, deployment, params[:job], params[:instance_id], params[:disk_cid], job_queue)
16
17
 
17
18
  redirect "/tasks/#{task.id}"
18
19
  end
@@ -1,4 +1,5 @@
1
1
  require 'bosh/director/api/controllers/base_controller'
2
+ require 'time'
2
3
 
3
4
  module Bosh::Director
4
5
  module Api::Controllers
@@ -15,6 +16,28 @@ module Bosh::Director
15
16
  events = events.filter("id < ?", before_id)
16
17
  end
17
18
 
19
+ if params['before_time']
20
+ begin
21
+ before_datetime = timestamp_filter_value(params['before_time'])
22
+ rescue ArgumentError
23
+ status(400)
24
+ body("Invalid before parameter: '#{params['before_time']}' ")
25
+ return
26
+ end
27
+ events = events.filter("timestamp < ?", before_datetime)
28
+ end
29
+
30
+ if params['after_time']
31
+ begin
32
+ after_datetime = timestamp_filter_value(params['after_time']) + 1
33
+ rescue ArgumentError
34
+ status(400)
35
+ body("Invalid after parameter: '#{params['after_time']}' ")
36
+ return
37
+ end
38
+ events = events.filter("timestamp >= ?", after_datetime)
39
+ end
40
+
18
41
  if params['task']
19
42
  events = events.where(task: params['task'])
20
43
  end
@@ -32,6 +55,17 @@ module Bosh::Director
32
55
  end
33
56
  json_encode(events)
34
57
  end
58
+
59
+ private
60
+
61
+ def timestamp_filter_value(value)
62
+ return Time.at(value.to_i).utc if integer?(value)
63
+ Time.parse(value)
64
+ end
65
+
66
+ def integer?(string)
67
+ string =~ /\A[-+]?\d+\z/
68
+ end
35
69
  end
36
70
  end
37
71
  end