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
@@ -4,7 +4,7 @@ module Bosh::Director
4
4
  module Api::Controllers
5
5
  class ReleasesController < BaseController
6
6
  post '/', :consumes => :json do
7
- payload = json_decode(request.body)
7
+ payload = json_decode(request.body.read)
8
8
  options = {
9
9
  rebase: params['rebase'] == 'true',
10
10
  fix: params['fix'] == 'true',
@@ -4,7 +4,7 @@ module Bosh::Director
4
4
  module Api::Controllers
5
5
  class ResurrectionController < BaseController
6
6
  put '/', consumes: :json do
7
- payload = json_decode(request.body)
7
+ payload = json_decode(request.body.read)
8
8
 
9
9
  @resurrector_manager.set_pause_for_all(payload['resurrection_paused'])
10
10
  status(200)
@@ -4,7 +4,7 @@ module Bosh::Director
4
4
  module Api::Controllers
5
5
  class StemcellsController < BaseController
6
6
  post '/', :consumes => :json do
7
- payload = json_decode(request.body)
7
+ payload = json_decode(request.body.read)
8
8
  options = {
9
9
  fix: params['fix'] == 'true',
10
10
  sha1: payload['sha1']
@@ -16,9 +16,9 @@ module Bosh::Director
16
16
  type = params[:type]
17
17
  task = @task_manager.find_task(params[:id])
18
18
  if type == 'debug' || type == 'cpi' || !type
19
- check_access_to_task(task, :admin)
19
+ @permission_authorizer.granted_or_raise(task, :admin, token_scopes)
20
20
  elsif type == 'event' || type == 'result' || type == 'none'
21
- check_access_to_task(task, :read)
21
+ @permission_authorizer.granted_or_raise(task, :read, token_scopes)
22
22
  else
23
23
  raise UnauthorizedToAccessDeployment, "Unknown type #{type}"
24
24
  end
@@ -28,12 +28,6 @@ module Bosh::Director
28
28
  get '/', scope: :list_tasks do
29
29
  dataset = Models::Task.dataset
30
30
 
31
- if limit = params['limit']
32
- limit = limit.to_i
33
- limit = 1 if limit < 1
34
- dataset = dataset.limit(limit)
35
- end
36
-
37
31
  states = params['state'].to_s.split(',')
38
32
  if states.size > 0
39
33
  dataset = dataset.filter(:state => states)
@@ -56,27 +50,21 @@ module Bosh::Director
56
50
  ])
57
51
  end
58
52
 
59
- deployment = params['deployment']
60
- if deployment
61
- dataset = dataset.filter(deployment_name: deployment)
62
- deployment = @deployment_manager.find_by_name(deployment)
63
- @permission_authorizer.granted_or_raise(deployment, :read, token_scopes)
53
+ if limit = params['limit']
54
+ limit = limit.to_i
55
+ limit = 1 if limit < 1
64
56
  end
65
57
 
66
- tasks = dataset.order_by(Sequel.desc(:timestamp)).map
67
-
68
- unless @permission_authorizer.is_granted?(:director, :read, token_scopes)
69
- permitted_deployments = @deployment_manager.all_by_name_asc.select { |deployment|
70
- @permission_authorizer.is_granted?(deployment, :read, token_scopes)
71
- }.map { |deployment| deployment.name }
72
-
73
- tasks = tasks.select do |task|
74
- next false unless task.deployment_name
75
- permitted_deployments.include?(task.deployment_name)
76
- end
58
+ if @permission_authorizer.is_granted?(:director, :read, token_scopes) ||
59
+ @permission_authorizer.is_granted?(:director, :admin, token_scopes)
60
+ tasks = filter_task_by_deployment_and_teams(dataset, params['deployment'], nil, limit)
61
+ permitted_tasks = Set.new(tasks)
62
+ else
63
+ tasks = filter_task_by_deployment_and_teams(dataset, params['deployment'], token_scopes, limit)
64
+ permitted_tasks = Set.new(tasks)
77
65
  end
78
66
 
79
- tasks = tasks.map do |task|
67
+ tasks = permitted_tasks.map do |task|
80
68
  if task_timeout?(task)
81
69
  task.state = :timeout
82
70
  task.save
@@ -84,15 +72,29 @@ module Bosh::Director
84
72
  @task_manager.task_to_hash(task)
85
73
  end
86
74
  content_type(:json)
75
+
76
+
87
77
  json_encode(tasks)
88
78
  end
89
79
 
80
+ def filter_task_by_deployment_and_teams(dataset, deployment, token_scopes, limit)
81
+ if deployment
82
+ dataset = dataset.where(deployment_name: deployment)
83
+ end
84
+ if token_scopes
85
+ teams = Models::Team.transform_admin_team_scope_to_teams(token_scopes)
86
+ dataset = dataset.where(teams: teams)
87
+ end
88
+ if limit
89
+ dataset = dataset.limit(limit)
90
+ end
91
+ dataset.order_by(Sequel.desc(:timestamp)).all
92
+ end
93
+
94
+
90
95
  get '/:id', scope: :list_tasks do
91
96
  task = @task_manager.find_task(params[:id])
92
- deployment_name = task.deployment_name
93
- if deployment_name
94
- check_access_to_deployment(deployment_name, :read)
95
- elsif !@permission_authorizer.is_granted?(:director, :read, token_scopes)
97
+ if !@permission_authorizer.is_granted?(task, :read, token_scopes)
96
98
  raise UnauthorizedToAccessDeployment,
97
99
  'One of the following scopes is required to access this task: ' +
98
100
  @permission_authorizer.list_expected_scope(:director, :read, token_scopes).join(', ')
@@ -134,23 +136,6 @@ module Bosh::Director
134
136
 
135
137
  private
136
138
 
137
- def check_access_to_task(task, scope)
138
- if task.deployment_name
139
- check_access_to_deployment(task.deployment_name, scope)
140
- else
141
- @permission_authorizer.granted_or_raise(:director, scope, token_scopes)
142
- end
143
- end
144
-
145
- def check_access_to_deployment(deployment_name, scope)
146
- begin
147
- deployment = @deployment_manager.find_by_name(deployment_name)
148
- @permission_authorizer.granted_or_raise(deployment, scope, token_scopes)
149
- rescue DeploymentNotFound
150
- @permission_authorizer.granted_or_raise(:director, :admin, token_scopes)
151
- end
152
- end
153
-
154
139
  def task_timeout?(task)
155
140
  # Some of the old task entries might not have the checkpoint_time
156
141
  unless task.checkpoint_time
@@ -11,7 +11,7 @@ module Bosh::Director
11
11
  post '/', :consumes => [:json] do
12
12
  validate_user_management_support
13
13
 
14
- user = @identity_provider.get_user_from_request(request)
14
+ user = @identity_provider.get_user_from_json(request.body.read)
15
15
  @identity_provider.create_user(user)
16
16
  status(204)
17
17
  nil
@@ -20,7 +20,7 @@ module Bosh::Director
20
20
  put '/:username', :consumes => [:json] do
21
21
  validate_user_management_support
22
22
 
23
- user = @identity_provider.get_user_from_request(request)
23
+ user = @identity_provider.get_user_from_json(request.body.read)
24
24
  if user.username != params[:username]
25
25
  raise UserImmutableUsername, 'The username is immutable'
26
26
  end
@@ -0,0 +1,18 @@
1
+ require 'bosh/director/api/controllers/base_controller'
2
+
3
+ module Bosh::Director
4
+ module Api::Controllers
5
+ class VmsController < BaseController
6
+ delete '/:vm_cid' do
7
+ vm_cid = params[:vm_cid]
8
+ task = JobQueue.new.enqueue(
9
+ current_user,
10
+ Jobs::DeleteVm,
11
+ "delete vm #{vm_cid}",
12
+ [vm_cid]
13
+ )
14
+ redirect "/tasks/#{task.id}"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -15,14 +15,14 @@ module Bosh::Director
15
15
  Bosh::Director::Models::Deployment.order_by(Sequel.asc(:name)).all
16
16
  end
17
17
 
18
- def create_deployment(username, deployment_manifest_file_path, cloud_config, runtime_config, deployment_name, options = {})
18
+ def create_deployment(username, deployment_manifest_file_path, cloud_config, runtime_config, deployment, options = {})
19
19
  cloud_config_id = cloud_config.nil? ? nil : cloud_config.id
20
20
  runtime_config_id = runtime_config.nil? ? nil : runtime_config.id
21
- JobQueue.new.enqueue(username, Jobs::UpdateDeployment, 'create deployment', [deployment_manifest_file_path, cloud_config_id, runtime_config_id, options], deployment_name)
21
+ JobQueue.new.enqueue(username, Jobs::UpdateDeployment, 'create deployment', [deployment_manifest_file_path, cloud_config_id, runtime_config_id, options], deployment)
22
22
  end
23
23
 
24
24
  def delete_deployment(username, deployment, options = {})
25
- JobQueue.new.enqueue(username, Jobs::DeleteDeployment, "delete deployment #{deployment.name}", [deployment.name, options], deployment.name)
25
+ JobQueue.new.enqueue(username, Jobs::DeleteDeployment, "delete deployment #{deployment.name}", [deployment.name, options], deployment)
26
26
  end
27
27
 
28
28
  def deployment_instances_with_vms(deployment)
@@ -0,0 +1,11 @@
1
+ module Bosh::Director
2
+ module Api
3
+ class InstanceIgnoreManager
4
+ def set_ignore_state_for_instance(deployment, instance_group_name, instance_group_id, state)
5
+ instance = InstanceLookup.new.by_uuid(deployment, instance_group_name, instance_group_id)
6
+ instance.ignore = state
7
+ instance.save
8
+ end
9
+ end
10
+ end
11
+ end
@@ -61,15 +61,15 @@ module Bosh::Director
61
61
  instance = filter_by(deployment, uuid: index_or_id).first
62
62
  end
63
63
 
64
- JobQueue.new.enqueue(username, Jobs::FetchLogs, 'fetch logs', [instance.id, options], deployment.name)
64
+ JobQueue.new.enqueue(username, Jobs::FetchLogs, 'fetch logs', [instance.id, options], deployment)
65
65
  end
66
66
 
67
67
  def fetch_instances(username, deployment, format)
68
- JobQueue.new.enqueue(username, Jobs::VmState, 'retrieve vm-stats', [deployment.id, format, true], deployment.name)
68
+ JobQueue.new.enqueue(username, Jobs::VmState, 'retrieve vm-stats', [deployment.id, format, true], deployment)
69
69
  end
70
70
 
71
71
  def fetch_instances_with_vm(username, deployment, format)
72
- JobQueue.new.enqueue(username, Jobs::VmState, 'retrieve vm-stats', [deployment.id, format], deployment.name)
72
+ JobQueue.new.enqueue(username, Jobs::VmState, 'retrieve vm-stats', [deployment.id, format], deployment)
73
73
  end
74
74
 
75
75
  def ssh(username, deployment, options)
@@ -12,7 +12,7 @@ module Bosh
12
12
  end
13
13
 
14
14
  # User management is supported for backwards compatibility
15
- def_delegators :@user_manager, :supports_api_update?, :create_user, :update_user, :delete_user, :get_user_from_request
15
+ def_delegators :@user_manager, :supports_api_update?, :create_user, :update_user, :delete_user, :get_user_from_json
16
16
 
17
17
  def client_info
18
18
  {'type' => 'basic', 'options' => {}}
@@ -2,7 +2,7 @@ module Bosh::Director
2
2
  module Api
3
3
  class ProblemManager
4
4
  def perform_scan(username, deployment)
5
- JobQueue.new.enqueue(username, Jobs::CloudCheck::Scan, 'scan cloud', [deployment.name], deployment.name)
5
+ JobQueue.new.enqueue(username, Jobs::CloudCheck::Scan, 'scan cloud', [deployment.name], deployment)
6
6
  end
7
7
 
8
8
  def get_problems(deployment)
@@ -15,11 +15,11 @@ module Bosh::Director
15
15
  end
16
16
 
17
17
  def apply_resolutions(username, deployment, resolutions)
18
- JobQueue.new.enqueue(username, Jobs::CloudCheck::ApplyResolutions, 'apply resolutions', [deployment.name, resolutions], deployment.name)
18
+ JobQueue.new.enqueue(username, Jobs::CloudCheck::ApplyResolutions, 'apply resolutions', [deployment.name, resolutions], deployment)
19
19
  end
20
20
 
21
21
  def scan_and_fix(username, deployment, jobs)
22
- JobQueue.new.enqueue(username, Jobs::CloudCheck::ScanAndFix, 'scan and fix', [deployment.name, jobs, Bosh::Director::Config.fix_stateful_nodes], deployment.name)
22
+ JobQueue.new.enqueue(username, Jobs::CloudCheck::ScanAndFix, 'scan and fix', [deployment.name, jobs, Bosh::Director::Config.fix_stateful_nodes], deployment)
23
23
  end
24
24
  end
25
25
  end
@@ -15,14 +15,21 @@ module Bosh::Director
15
15
  releases
16
16
  end
17
17
 
18
- def sorted_release_versions(release)
18
+ def sorted_release_versions(release, prefix = nil)
19
19
  sorted_version_tuples = release.versions_dataset.all.map do |version|
20
20
  {
21
21
  provided: version,
22
22
  parsed: Bosh::Common::Version::ReleaseVersion.parse(version.values[:version])
23
23
  }
24
24
  end.sort_by { |rv| rv[:parsed] }
25
- release_versions = sorted_version_tuples.map do |version|
25
+
26
+ unless prefix.nil?
27
+ sorted_version_tuples = sorted_version_tuples.select do |version_tuple|
28
+ /^#{prefix}([\.\-\+]|$)/.match(version_tuple[:provided].version.to_s)
29
+ end
30
+ end
31
+
32
+ sorted_version_tuples.map do |version|
26
33
  provided = version[:provided]
27
34
  {
28
35
  'version' => provided.version.to_s,
@@ -32,8 +39,6 @@ module Bosh::Director
32
39
  'job_names' => provided.templates.map(&:name),
33
40
  }
34
41
  end
35
-
36
- release_versions
37
42
  end
38
43
 
39
44
  def find_by_name(name)
@@ -15,7 +15,19 @@ module Bosh::Director
15
15
  end
16
16
 
17
17
  def set_pause_for_all(desired_state)
18
- Models::Instance.dataset.update(resurrection_paused: desired_state)
18
+ Models::DirectorAttribute.create(name: 'resurrection_paused', value: desired_state.to_s)
19
+ rescue Sequel::ValidationFailed, Sequel::DatabaseError => e
20
+ error_message = e.message.downcase
21
+ if error_message.include?('unique') || error_message.include?('duplicate')
22
+ Models::DirectorAttribute.where(name: 'resurrection_paused').update(value: desired_state.to_s)
23
+ else
24
+ raise e
25
+ end
26
+ end
27
+
28
+ def pause_for_all?
29
+ record = Models::DirectorAttribute.first(name: 'resurrection_paused')
30
+ record.nil? || record.value == "false" ? false : true
19
31
  end
20
32
  end
21
33
  end
@@ -31,6 +31,7 @@ module Bosh
31
31
  controllers['/tasks'] = Bosh::Director::Api::Controllers::TasksController.new(@config)
32
32
  controllers['/users'] = Bosh::Director::Api::Controllers::UsersController.new(@config)
33
33
  controllers['/events'] = Bosh::Director::Api::Controllers::EventsController.new(@config)
34
+ controllers['/vms'] = Bosh::Director::Api::Controllers::VmsController.new(@config)
34
35
  controllers
35
36
  end
36
37
  end
@@ -2,7 +2,7 @@ module Bosh::Director
2
2
  module Api
3
3
  class SnapshotManager
4
4
  def create_deployment_snapshot_task(username, deployment, options = {})
5
- JobQueue.new.enqueue(username, Jobs::SnapshotDeployment, 'snapshot deployment', [deployment.name, options], deployment.name)
5
+ JobQueue.new.enqueue(username, Jobs::SnapshotDeployment, 'snapshot deployment', [deployment.name, options], deployment)
6
6
  end
7
7
 
8
8
  def create_snapshot_task(username, instance, options)
@@ -10,7 +10,7 @@ module Bosh::Director
10
10
  end
11
11
 
12
12
  def delete_deployment_snapshots_task(username, deployment)
13
- JobQueue.new.enqueue(username, Jobs::DeleteDeploymentSnapshots, 'delete deployment snapshots', [deployment.name], deployment.name)
13
+ JobQueue.new.enqueue(username, Jobs::DeleteDeploymentSnapshots, 'delete deployment snapshots', [deployment.name], deployment)
14
14
  end
15
15
 
16
16
  def delete_snapshots_task(username, snapshot_cids)
@@ -27,26 +27,40 @@ module Bosh::Director
27
27
  end
28
28
  end
29
29
 
30
- def latest_by_os(os)
31
- stemcells = Bosh::Director::Models::Stemcell.where(:operating_system => os)
30
+ def latest_by_os(os, prefix = nil)
31
+ stemcells = Bosh::Director::Models::Stemcell.where(:operating_system => os).all
32
32
 
33
- if stemcells.nil? || stemcells.empty?
33
+ if stemcells.empty?
34
34
  raise StemcellNotFound,
35
35
  "Stemcell with Operating System '#{os}' doesn't exist"
36
36
  end
37
37
 
38
- find_latest(stemcells)
38
+ latest = find_latest(stemcells, prefix)
39
+
40
+ if latest.nil?
41
+ raise StemcellNotFound,
42
+ "Stemcell with Operating System '#{os}' exists, but version with prefix '#{prefix}' not found."
43
+ end
44
+
45
+ latest
39
46
  end
40
47
 
41
- def latest_by_name(name)
42
- stemcells = Bosh::Director::Models::Stemcell.where(:name => name)
48
+ def latest_by_name(name, prefix = nil)
49
+ stemcells = Bosh::Director::Models::Stemcell.where(:name => name).all
43
50
 
44
- if stemcells.nil? || stemcells.empty?
51
+ if stemcells.empty?
45
52
  raise StemcellNotFound,
46
53
  "Stemcell '#{name}' doesn't exist"
47
54
  end
48
55
 
49
- find_latest(stemcells)
56
+ latest = find_latest(stemcells, prefix)
57
+
58
+ if latest.nil?
59
+ raise StemcellNotFound,
60
+ "Stemcell '#{name}' exists, but version with prefix '#{prefix}' not found."
61
+ end
62
+
63
+ latest
50
64
  end
51
65
 
52
66
  def find_by_os_and_version(os, version)
@@ -87,7 +101,13 @@ module Bosh::Director
87
101
 
88
102
  private
89
103
 
90
- def find_latest(stemcells)
104
+ def find_latest(stemcells, prefix = nil)
105
+ unless prefix.nil?
106
+ stemcells = stemcells.select do |stemcell|
107
+ stemcell.version =~ /^#{prefix}([\.\-\+]|$)/
108
+ end
109
+ end
110
+
91
111
  versions = stemcells.map(&:version)
92
112
 
93
113
  latest_version = Bosh::Common::Version::StemcellVersionList.parse(versions).latest.to_s
@@ -3,13 +3,14 @@ require 'bosh/director/api/task_remover'
3
3
  module Bosh::Director
4
4
  module Api
5
5
  class TaskHelper
6
- def create_task(username, type, description, deployment_name)
7
- task = Models::Task.create(:username => username,
6
+ def create_task(username, type, description, deployment)
7
+ task = Models::Task.create_with_teams(:username => username,
8
8
  :type => type,
9
9
  :description => description,
10
10
  :state => :queued,
11
- :deployment_name => deployment_name,
11
+ :deployment_name => deployment ? deployment.name : nil,
12
12
  :timestamp => Time.now,
13
+ :teams => deployment ? deployment.teams : nil,
13
14
  :checkpoint_time => Time.now)
14
15
  log_dir = File.join(Config.base_dir, 'tasks', task.id.to_s)
15
16
  task_status_file = File.join(log_dir, 'debug')
@@ -7,8 +7,13 @@ module Bosh
7
7
  MAX_TOKEN_EXTENSION_TIME_IN_SECONDS = 3600
8
8
 
9
9
  def initialize(options)
10
- @url = options.fetch('url')
11
- Config.logger.debug "Initializing UAA Identity provider with url #{@url}"
10
+ raise ValidationExtraField if options.has_key?('url') && options.has_key?('urls')
11
+ if options.has_key?('url')
12
+ @urls = [options.fetch('url')]
13
+ else
14
+ @urls = options.fetch('urls')
15
+ end
16
+ Config.logger.debug "Initializing UAA Identity provider with urls #{@urls}"
12
17
  @token_coder = CF::UAA::TokenCoder.new(skey: options.fetch('symmetric_key', nil), pkey: options.fetch('public_key', nil), scope: [])
13
18
  end
14
19
 
@@ -20,7 +25,8 @@ module Bosh
20
25
  {
21
26
  'type' => 'uaa',
22
27
  'options' => {
23
- 'url' => @url
28
+ 'url' => @urls.first,
29
+ 'urls' => @urls
24
30
  }
25
31
  }
26
32
  end