bosh-director 1.2992.0 → 1.2999.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/db/migrations/director/20150619135210_add_os_name_and_version_to_stemcells.rb +7 -0
  3. data/lib/bosh/director.rb +1 -0
  4. data/lib/bosh/director/agent_client.rb +19 -11
  5. data/lib/bosh/director/api.rb +3 -1
  6. data/lib/bosh/director/api/controllers/base_controller.rb +0 -1
  7. data/lib/bosh/director/api/controllers/cloud_configs_controller.rb +1 -1
  8. data/lib/bosh/director/api/controllers/deployments_controller.rb +4 -4
  9. data/lib/bosh/director/api/controllers/info_controller.rb +1 -1
  10. data/lib/bosh/director/api/controllers/locks_controller.rb +1 -1
  11. data/lib/bosh/director/api/controllers/releases_controller.rb +2 -2
  12. data/lib/bosh/director/api/controllers/stemcells_controller.rb +2 -1
  13. data/lib/bosh/director/api/controllers/tasks_controller.rb +3 -3
  14. data/lib/bosh/director/api/controllers/users_controller.rb +22 -5
  15. data/lib/bosh/director/api/director_uuid_provider.rb +15 -0
  16. data/lib/bosh/director/api/extensions/scoping.rb +21 -3
  17. data/lib/bosh/director/api/local_identity_provider.rb +10 -2
  18. data/lib/bosh/director/api/uaa_identity_provider.rb +9 -5
  19. data/lib/bosh/director/api/user/config_user_manager.rb +60 -0
  20. data/lib/bosh/director/api/{user_manager.rb → user/database_user_manager.rb} +7 -3
  21. data/lib/bosh/director/api/user/user_manager_provider.rb +13 -0
  22. data/lib/bosh/director/config.rb +1 -1
  23. data/lib/bosh/director/errors.rb +1 -0
  24. data/lib/bosh/director/jobs/update_stemcell.rb +2 -0
  25. data/lib/bosh/director/jobs/vm_state.rb +2 -2
  26. data/lib/bosh/director/version.rb +1 -1
  27. metadata +26 -22
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 77b59d978580198275ba946df8f880fcaa6e28b0
4
- data.tar.gz: 51860050f654ff925193f6a37034a900cd58eb61
3
+ metadata.gz: 314dd17fbbb059aaaae50d56efba07c3b0893445
4
+ data.tar.gz: 89dd10046a5b22f8e1424878c432cfc69f6d51da
5
5
  SHA512:
6
- metadata.gz: e02624596050a9fc81ecb3dcbbf35f908b20446556967b564211d5f1cdebd0ca7d98372fdd0a1ea04d38a5b074e0adad8cdaebacffb218dfd0ec622c934b7b35
7
- data.tar.gz: bc13e1aeb80ea0f6cf1e3d4212891a8db9990c8618a65bcf2267c46eba5fb3a614a367a14bcd2818f5b0aa52bb5a46225466cbec39d617d8aefd796e79e64fb8
6
+ metadata.gz: 6477ca1a6659b9661203e54493c553fd1e4c61a18f28431b8ccb373273d136c8a967891f86437795bb94555af1d7c80eb9d7eb5faa9a5db52b1e9547c2c708fd
7
+ data.tar.gz: d492ee6cc46b18579cd1f0094e5b5f35e82b4a986badab2a5b5b7768011c3338c5c424cb60c849a179006087cea79b851dbf32d268f6840696a900870edbc246
@@ -0,0 +1,7 @@
1
+ Sequel.migration do
2
+ change do
3
+ alter_table(:stemcells) do
4
+ add_column :operating_system, String
5
+ end
6
+ end
7
+ end
data/lib/bosh/director.rb CHANGED
@@ -127,6 +127,7 @@ require 'bosh/director/models/helpers/model_helper'
127
127
 
128
128
  require 'bosh/director/db_backup'
129
129
  require 'bosh/director/blobstores'
130
+ require 'bosh/director/api/director_uuid_provider'
130
131
  require 'bosh/director/api/local_identity_provider'
131
132
  require 'bosh/director/api/uaa_identity_provider'
132
133
  require 'bosh/director/app'
@@ -4,27 +4,35 @@ module Bosh::Director
4
4
  class AgentClient
5
5
  DEFAULT_POLL_INTERVAL = 1.0
6
6
 
7
+ # in case of timeout errors
8
+ GET_TASK_MAX_RETRIES = 2
9
+
10
+ # get_task should retry at least once because some long running tasks
11
+ # (e.g. configure_networks) will restart the agent (current implementation)
12
+ # which most likely will result in first get_task message being lost
13
+ # because agent was not listening on NATS and second retry message
14
+ # will probably be received because agent came back up.
15
+ GET_STATE_MAX_RETRIES = 2
16
+
7
17
  attr_accessor :id
8
18
 
9
19
  def self.with_defaults(id, options = {})
20
+ vm = Bosh::Director::Models::Vm.find(:agent_id => id)
21
+ with_vm(vm, options)
22
+ end
23
+
24
+ def self.with_vm(vm, options = {})
10
25
  defaults = {
11
26
  retry_methods: {
12
- # in case of timeout errors
13
- get_state: 2,
14
-
15
- # get_task should retry at least once because some long running tasks
16
- # (e.g. configure_networks) will restart the agent (current implementation)
17
- # which most likely will result in first get_task message being lost
18
- # because agent was not listening on NATS and second retry message
19
- # will probably be received because agent came back up.
20
- get_task: 2,
27
+ get_state: GET_STATE_MAX_RETRIES,
28
+ get_task: GET_TASK_MAX_RETRIES,
21
29
  }
22
30
  }
23
31
 
24
- credentials = Bosh::Director::Models::Vm.find(:agent_id => id).credentials
32
+ credentials = vm.credentials
25
33
  defaults.merge!(credentials: credentials) if credentials
26
34
 
27
- self.new('agent', id, defaults.merge(options))
35
+ self.new('agent', vm.agent_id, defaults.merge(options))
28
36
  end
29
37
 
30
38
  def initialize(service_name, client_id, options = {})
@@ -21,7 +21,9 @@ require 'bosh/director/api/snapshot_manager'
21
21
  require 'bosh/director/api/stemcell_manager'
22
22
  require 'bosh/director/api/compiled_package_group_manager'
23
23
  require 'bosh/director/api/task_manager'
24
- require 'bosh/director/api/user_manager'
24
+ require 'bosh/director/api/user/config_user_manager'
25
+ require 'bosh/director/api/user/database_user_manager'
26
+ require 'bosh/director/api/user/user_manager_provider'
25
27
  require 'bosh/director/api/vm_state_manager'
26
28
  require 'bosh/director/api/backup_manager'
27
29
  require 'bosh/director/api/resurrector_manager'
@@ -20,7 +20,6 @@ module Bosh::Director
20
20
  @snapshot_manager = SnapshotManager.new
21
21
  @stemcell_manager = StemcellManager.new
22
22
  @task_manager = TaskManager.new
23
- @user_manager = UserManager.new
24
23
  @vm_state_manager = VmStateManager.new
25
24
  @logger = Config.logger
26
25
  end
@@ -10,7 +10,7 @@ module Bosh::Director
10
10
  status(201)
11
11
  end
12
12
 
13
- get '/', scope: [:read] do
13
+ get '/', scope: :read do
14
14
  if params['limit'].nil? || params['limit'].empty?
15
15
  status(400)
16
16
  body("limit is required")
@@ -137,7 +137,7 @@ module Bosh::Director
137
137
  redirect "/tasks/#{task.id}"
138
138
  end
139
139
 
140
- get '/', scope: [:read] do
140
+ get '/', scope: :read do
141
141
  latest_cloud_config = Api::CloudConfigManager.new.latest
142
142
  deployments = Models::Deployment.order_by(:name.asc).map do |deployment|
143
143
  cloud_config = if deployment.cloud_config.nil?
@@ -169,12 +169,12 @@ module Bosh::Director
169
169
  json_encode(deployments)
170
170
  end
171
171
 
172
- get '/:name', scope: [:read] do
172
+ get '/:name', scope: :read do
173
173
  deployment = @deployment_manager.find_by_name(params[:name])
174
174
  @deployment_manager.deployment_to_json(deployment)
175
175
  end
176
176
 
177
- get '/:name/vms', scope: [:read] do
177
+ get '/:name/vms', scope: :read do
178
178
  deployment = @deployment_manager.find_by_name(params[:name])
179
179
 
180
180
  format = params[:format]
@@ -290,7 +290,7 @@ module Bosh::Director
290
290
  redirect "/tasks/#{task.id}"
291
291
  end
292
292
 
293
- get '/:deployment_name/errands', scope: [:read] do
293
+ get '/:deployment_name/errands', scope: :read do
294
294
  deployment_plan = load_deployment_plan_without_binding
295
295
 
296
296
  errands = deployment_plan.jobs.select(&:can_run_as_errand?)
@@ -7,7 +7,7 @@ module Bosh::Director
7
7
  false
8
8
  end
9
9
 
10
- get '/', scope: [:read] do
10
+ get '/', scope: :read do
11
11
  status = {
12
12
  'name' => Config.name,
13
13
  'uuid' => Config.uuid,
@@ -1,7 +1,7 @@
1
1
  module Bosh::Director
2
2
  module Api::Controllers
3
3
  class LocksController < BaseController
4
- get '/', scope: [:read] do
4
+ get '/', scope: :read do
5
5
  redis = Config.redis
6
6
 
7
7
  locks = []
@@ -21,7 +21,7 @@ module Bosh::Director
21
21
  redirect "/tasks/#{task.id}"
22
22
  end
23
23
 
24
- get '/', scope: [:read] do
24
+ get '/', scope: :read do
25
25
  releases = Models::Release.order_by(:name.asc).map do |release|
26
26
  release_versions = release.versions_dataset.order_by(:version.asc).map do |rv|
27
27
  {
@@ -42,7 +42,7 @@ module Bosh::Director
42
42
  json_encode(releases)
43
43
  end
44
44
 
45
- get '/:name', scope: [:read] do
45
+ get '/:name', scope: :read do
46
46
  name = params[:name].to_s.strip
47
47
  release = @release_manager.find_by_name(name)
48
48
 
@@ -14,10 +14,11 @@ module Bosh::Director
14
14
  redirect "/tasks/#{task.id}"
15
15
  end
16
16
 
17
- get '/', scope: [:read] do
17
+ get '/', scope: :read do
18
18
  stemcells = Models::Stemcell.order_by(:name.asc).map do |stemcell|
19
19
  {
20
20
  'name' => stemcell.name,
21
+ 'operating_system' => stemcell.operating_system,
21
22
  'version' => stemcell.version,
22
23
  'cid' => stemcell.cid,
23
24
  'deployments' => stemcell.deployments.map { |d| { name: d.name } }
@@ -3,7 +3,7 @@ require 'bosh/director/api/controllers/base_controller'
3
3
  module Bosh::Director
4
4
  module Api::Controllers
5
5
  class TasksController < BaseController
6
- get '/' do
6
+ get '/', scope: :read do
7
7
  dataset = Models::Task.dataset
8
8
 
9
9
  if limit = params['limit']
@@ -45,7 +45,7 @@ module Bosh::Director
45
45
  json_encode(tasks)
46
46
  end
47
47
 
48
- get '/:id' do
48
+ get '/:id', scope: :read do
49
49
  task = @task_manager.find_task(params[:id])
50
50
  if task_timeout?(task)
51
51
  task.state = :timeout
@@ -59,7 +59,7 @@ module Bosh::Director
59
59
  # Sends back output of given task id and params[:type]
60
60
  # Example: `get /tasks/5/output?type=event` will send back the file
61
61
  # at /var/vcap/store/director/tasks/5/event
62
- get '/:id/output' do
62
+ get '/:id/output', scope: Api::Extensions::Scoping::ParamsScope.new(:type, {event: :read}) do
63
63
  log_type = params[:type] || 'debug'
64
64
  task = @task_manager.find_task(params[:id])
65
65
 
@@ -3,28 +3,45 @@ require 'bosh/director/api/controllers/base_controller'
3
3
  module Bosh::Director
4
4
  module Api::Controllers
5
5
  class UsersController < BaseController
6
+ def initialize(config)
7
+ super(config)
8
+ @identity_provider = config.identity_provider
9
+ end
10
+
6
11
  post '/', :consumes => [:json] do
7
- user = @user_manager.get_user_from_request(request)
8
- @user_manager.create_user(user)
12
+ validate_user_management_support
13
+
14
+ user = @identity_provider.get_user_from_request(request)
15
+ @identity_provider.create_user(user)
9
16
  status(204)
10
17
  nil
11
18
  end
12
19
 
13
20
  put '/:username', :consumes => [:json] do
14
- user = @user_manager.get_user_from_request(request)
21
+ validate_user_management_support
22
+
23
+ user = @identity_provider.get_user_from_request(request)
15
24
  if user.username != params[:username]
16
25
  raise UserImmutableUsername, 'The username is immutable'
17
26
  end
18
- @user_manager.update_user(user)
27
+ @identity_provider.update_user(user)
19
28
  status(204)
20
29
  nil
21
30
  end
22
31
 
23
32
  delete '/:username' do
24
- @user_manager.delete_user(params[:username])
33
+ validate_user_management_support
34
+
35
+ @identity_provider.delete_user(params[:username])
25
36
  status(204)
26
37
  nil
27
38
  end
39
+
40
+ def validate_user_management_support
41
+ unless @identity_provider.supports_api_update?
42
+ raise UserManagementNotSupported, 'User management is not supported via API'
43
+ end
44
+ end
28
45
  end
29
46
  end
30
47
  end
@@ -0,0 +1,15 @@
1
+ module Bosh
2
+ module Director
3
+ module Api
4
+ class DirectorUUIDProvider
5
+ def initialize(config)
6
+ @config = config
7
+ end
8
+
9
+ def uuid
10
+ @config.uuid
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -13,9 +13,15 @@ module Bosh::Director
13
13
  app.helpers(Helpers)
14
14
  end
15
15
 
16
- def scope(*roles)
16
+ def scope(allowed_scope)
17
17
  condition do
18
- roles = [settings.default_scope] if roles == [:default]
18
+ if allowed_scope == :default
19
+ scope = settings.default_scope
20
+ elsif allowed_scope.kind_of?(ParamsScope)
21
+ scope = allowed_scope.scope(params, settings.default_scope)
22
+ else
23
+ scope = allowed_scope
24
+ end
19
25
 
20
26
  auth_provided = %w(HTTP_AUTHORIZATION X-HTTP_AUTHORIZATION X_HTTP_AUTHORIZATION).detect do |key|
21
27
  request.env.has_key?(key)
@@ -23,7 +29,7 @@ module Bosh::Director
23
29
 
24
30
  if auth_provided
25
31
  begin
26
- @user = identity_provider.corroborate_user(request.env, roles)
32
+ @user = identity_provider.corroborate_user(request.env, scope)
27
33
  rescue AuthenticationError
28
34
  end
29
35
  end
@@ -39,6 +45,18 @@ module Bosh::Director
39
45
  options[:scope] ||= :default
40
46
  super(verb, path, options, &block)
41
47
  end
48
+
49
+ class ParamsScope
50
+ def initialize(name, scope)
51
+ @name = name.to_s
52
+ @scope = scope
53
+ end
54
+
55
+ def scope(params, default_scope)
56
+ scope_name = params.fetch(@name, :default).to_sym
57
+ @scope.fetch(scope_name, default_scope)
58
+ end
59
+ end
42
60
  end
43
61
  end
44
62
  end
@@ -1,11 +1,19 @@
1
+ require 'forwardable'
2
+
1
3
  module Bosh
2
4
  module Director
3
5
  module Api
4
6
  class LocalIdentityProvider
5
- def initialize(*_)
6
- @user_manager = Bosh::Director::Api::UserManager.new
7
+ extend Forwardable
8
+
9
+ def initialize(options, _)
10
+ users = options.fetch('users', [])
11
+ @user_manager = Bosh::Director::Api::UserManagerProvider.new.user_manager(users)
7
12
  end
8
13
 
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
16
+
9
17
  def client_info
10
18
  {'type' => 'basic', 'options' => {}}
11
19
  end
@@ -4,13 +4,17 @@ module Bosh
4
4
  module Director
5
5
  module Api
6
6
  class UAAIdentityProvider
7
- def initialize(options, director_uuid)
7
+ def initialize(options, director_uuid_provider)
8
8
  @url = options.fetch('url')
9
9
  Config.logger.debug "Initializing UAA Identity provider with url #{@url}"
10
- @director_uuid = director_uuid
10
+ @director_uuid_provider = director_uuid_provider
11
11
  @token_coder = CF::UAA::TokenCoder.new(skey: options.fetch('symmetric_key', nil), pkey: options.fetch('public_key', nil), scope: [])
12
12
  end
13
13
 
14
+ def supports_api_update?
15
+ false
16
+ end
17
+
14
18
  def client_info
15
19
  {
16
20
  'type' => 'uaa',
@@ -38,7 +42,7 @@ module Bosh
38
42
  return
39
43
  end
40
44
 
41
- if requested_access.include?(:read) && token_has_read_scope?(token['scope'])
45
+ if requested_access == :read && token_has_read_scope?(token['scope'])
42
46
  return
43
47
  end
44
48
  end
@@ -47,11 +51,11 @@ module Bosh
47
51
  end
48
52
 
49
53
  def token_has_read_scope?(token_scope)
50
- token_scope.include?('bosh.read') || token_scope.include?("bosh.#{@director_uuid}.read")
54
+ token_scope.include?('bosh.read') || token_scope.include?("bosh.#{@director_uuid_provider.uuid}.read")
51
55
  end
52
56
 
53
57
  def token_has_admin_scope?(token_scope)
54
- token_scope.include?('bosh.admin') || token_scope.include?("bosh.#{@director_uuid}.admin")
58
+ token_scope.include?('bosh.admin') || token_scope.include?("bosh.#{@director_uuid_provider.uuid}.admin")
55
59
  end
56
60
  end
57
61
  end
@@ -0,0 +1,60 @@
1
+ # Copyright (c) 2009-2012 VMware, Inc.
2
+
3
+ module Bosh::Director
4
+ module Api
5
+ class ConfigUserManager
6
+ def initialize(users)
7
+ @users = users
8
+ end
9
+
10
+ def supports_api_update?
11
+ false
12
+ end
13
+
14
+ # @param [String] name User name
15
+ def find_by_name(name)
16
+ user = @users.find { |u| u['name'] == name }
17
+ if user.nil?
18
+ raise UserNotFound, "User `#{name}' doesn't exist"
19
+ end
20
+ User.new(user)
21
+ end
22
+
23
+ def authenticate(username, password)
24
+ return false if username.empty? || password.empty?
25
+
26
+ user = find_by_name(username)
27
+ user.password == password
28
+ rescue UserNotFound
29
+ false
30
+ end
31
+
32
+ def delete_user(_)
33
+ raise NotSupported
34
+ end
35
+
36
+ def create_user(_)
37
+ raise NotSupported
38
+ end
39
+
40
+ def update_user(_)
41
+ raise NotSupported
42
+ end
43
+
44
+ def get_user_from_request(_)
45
+ raise NotSupported
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ class User
52
+ attr_reader :username, :password
53
+
54
+ def initialize(options)
55
+ @username = options.fetch('name')
56
+ @password = options.fetch('password')
57
+ end
58
+ end
59
+ end
60
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Bosh::Director
4
4
  module Api
5
- class UserManager
5
+ class DatabaseUserManager
6
6
 
7
7
  # @param [String] name User name
8
8
  # @return [Models::User] User
@@ -14,6 +14,10 @@ module Bosh::Director
14
14
  user
15
15
  end
16
16
 
17
+ def supports_api_update?
18
+ true
19
+ end
20
+
17
21
  def authenticate(username, password)
18
22
  # This is a dev-mode shortcut
19
23
  if Models::User.count == 0
@@ -50,7 +54,7 @@ module Bosh::Director
50
54
  def get_user_from_request(request)
51
55
  hash = Yajl::Parser.new.parse(request.body)
52
56
  Models::User.new(:username => hash["username"],
53
- :password => hash["password"])
57
+ :password => hash["password"])
54
58
  end
55
59
 
56
60
  private
@@ -69,4 +73,4 @@ module Bosh::Director
69
73
  end
70
74
  end
71
75
  end
72
- end
76
+ end
@@ -0,0 +1,13 @@
1
+ module Bosh::Director
2
+ module Api
3
+ class UserManagerProvider
4
+ def user_manager(config_users)
5
+ if config_users.nil? || config_users.empty?
6
+ DatabaseUserManager.new
7
+ else
8
+ ConfigUserManager.new(config_users)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -388,7 +388,7 @@ module Bosh::Director
388
388
  end
389
389
 
390
390
  Config.logger.debug("Director configured with '#{provider_name}' user management provider")
391
- provider_class.new(user_management['options'] || {}, @uuid)
391
+ provider_class.new(user_management[provider_name] || {}, Bosh::Director::Api::DirectorUUIDProvider.new(Config))
392
392
  end
393
393
  end
394
394
 
@@ -60,6 +60,7 @@ module Bosh::Director
60
60
  UserImmutableUsername = err(20001)
61
61
  UserInvalid = err(20002)
62
62
  UserNameTaken = err(20003)
63
+ UserManagementNotSupported = err(20004)
63
64
 
64
65
  ReleaseAlreadyExists = err(30000)
65
66
  ReleaseExistingPackageHashMismatch = err(30001)
@@ -54,6 +54,7 @@ module Bosh::Director
54
54
  stemcell_manifest = Psych.load_file(stemcell_manifest_file)
55
55
 
56
56
  @name = safe_property(stemcell_manifest, "name", :class => String)
57
+ @operating_system = safe_property(stemcell_manifest, "operating_system", :class => String, :optional => true)
57
58
  @version = safe_property(stemcell_manifest, "version", :class => String)
58
59
  @cloud_properties = safe_property(stemcell_manifest, "cloud_properties", :class => Hash, :optional => true)
59
60
  @sha1 = safe_property(stemcell_manifest, "sha1", :class => String)
@@ -77,6 +78,7 @@ module Bosh::Director
77
78
 
78
79
  stemcell = Models::Stemcell.new
79
80
  stemcell.name = @name
81
+ stemcell.operating_system = @operating_system
80
82
  stemcell.version = @version
81
83
  stemcell.sha1 = @sha1
82
84
 
@@ -19,7 +19,7 @@ module Bosh::Director
19
19
 
20
20
  def perform
21
21
  @domain = Models::Dns::Domain.find(name: Config.dns_domain_name, type: "NATIVE") if Config.dns_enabled?
22
-
22
+
23
23
  vms = Models::Vm.filter(:deployment_id => @deployment_id)
24
24
  ThreadPool.new(:max_threads => Config.max_threads).wrap do |pool|
25
25
  vms.each do |vm|
@@ -44,7 +44,7 @@ module Bosh::Director
44
44
  job_index = nil
45
45
 
46
46
  begin
47
- agent = AgentClient.with_defaults(vm.agent_id, :timeout => TIMEOUT)
47
+ agent = AgentClient.with_vm(vm, :timeout => TIMEOUT)
48
48
  agent_state = agent.get_state(@format)
49
49
  agent_state["networks"].each_value do |network|
50
50
  ips << network["ip"]
@@ -1,5 +1,5 @@
1
1
  module Bosh
2
2
  module Director
3
- VERSION = '1.2992.0'
3
+ VERSION = '1.2999.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bosh-director
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2992.0
4
+ version: 1.2999.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - VMware
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-18 00:00:00.000000000 Z
11
+ date: 2015-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bcrypt-ruby
@@ -30,126 +30,126 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.2992.0
33
+ version: 1.2999.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.2992.0
40
+ version: 1.2999.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bosh-core
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.2992.0
47
+ version: 1.2999.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.2992.0
54
+ version: 1.2999.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bosh-director-core
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 1.2992.0
61
+ version: 1.2999.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 1.2992.0
68
+ version: 1.2999.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bosh_common
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 1.2992.0
75
+ version: 1.2999.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 1.2992.0
82
+ version: 1.2999.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: bosh-template
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 1.2992.0
89
+ version: 1.2999.0
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 1.2992.0
96
+ version: 1.2999.0
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: bosh_cpi
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 1.2992.0
103
+ version: 1.2999.0
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 1.2992.0
110
+ version: 1.2999.0
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: bosh_openstack_cpi
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 1.2992.0
117
+ version: 1.2999.0
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 1.2992.0
124
+ version: 1.2999.0
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: bosh_aws_cpi
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 1.2992.0
131
+ version: 1.2999.0
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 1.2992.0
138
+ version: 1.2999.0
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: bosh_vsphere_cpi
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: 1.2992.0
145
+ version: 1.2999.0
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: 1.2992.0
152
+ version: 1.2999.0
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: bosh_vcloud_cpi
155
155
  requirement: !ruby/object:Gem::Requirement
@@ -572,7 +572,7 @@ dependencies:
572
572
  version: '0'
573
573
  description: |-
574
574
  BOSH Director
575
- 2996bb
575
+ 321dd5
576
576
  email: support@cloudfoundry.com
577
577
  executables:
578
578
  - bosh-director
@@ -628,6 +628,7 @@ files:
628
628
  - db/migrations/director/20150331002413_add_cloud_configs.rb
629
629
  - db/migrations/director/20150401184803_add_cloud_config_to_deployments.rb
630
630
  - db/migrations/director/20150611193110_add_trusted_certs_sha1_to_vms.rb
631
+ - db/migrations/director/20150619135210_add_os_name_and_version_to_stemcells.rb
631
632
  - db/migrations/dns/20120123234908_initial.rb
632
633
  - lib/bosh/director.rb
633
634
  - lib/bosh/director/agent_client.rb
@@ -654,6 +655,7 @@ files:
654
655
  - lib/bosh/director/api/controllers/users_controller.rb
655
656
  - lib/bosh/director/api/deployment_lookup.rb
656
657
  - lib/bosh/director/api/deployment_manager.rb
658
+ - lib/bosh/director/api/director_uuid_provider.rb
657
659
  - lib/bosh/director/api/extensions/scoping.rb
658
660
  - lib/bosh/director/api/http_constants.rb
659
661
  - lib/bosh/director/api/instance_lookup.rb
@@ -671,7 +673,9 @@ files:
671
673
  - lib/bosh/director/api/task_manager.rb
672
674
  - lib/bosh/director/api/task_remover.rb
673
675
  - lib/bosh/director/api/uaa_identity_provider.rb
674
- - lib/bosh/director/api/user_manager.rb
676
+ - lib/bosh/director/api/user/config_user_manager.rb
677
+ - lib/bosh/director/api/user/database_user_manager.rb
678
+ - lib/bosh/director/api/user/user_manager_provider.rb
675
679
  - lib/bosh/director/api/vm_state_manager.rb
676
680
  - lib/bosh/director/app.rb
677
681
  - lib/bosh/director/blob_util.rb