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,15 @@
1
+ module Bosh::Director
2
+ module Api
3
+ class ResurrectorManager
4
+ def set_pause_for_instance(deployment_name, job_name, job_index, desired_state)
5
+ instance = InstanceLookup.new.by_attributes(deployment_name, job_name, job_index)
6
+ instance.resurrection_paused = desired_state
7
+ instance.save
8
+ end
9
+
10
+ def set_pause_for_all(desired_state)
11
+ Models::Instance.update(resurrection_paused: desired_state)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,94 @@
1
+ module Bosh::Director
2
+ module Api
3
+ class SnapshotManager
4
+ def create_deployment_snapshot_task(user, deployment, options = {})
5
+ JobQueue.new.enqueue(user, Jobs::SnapshotDeployment, 'snapshot deployment', [deployment.name, options])
6
+ end
7
+
8
+ def create_snapshot_task(user, instance, options)
9
+ JobQueue.new.enqueue(user, Jobs::CreateSnapshot, 'create snapshot', [instance.id, options])
10
+ end
11
+
12
+ def delete_deployment_snapshots_task(user, deployment)
13
+ JobQueue.new.enqueue(user, Jobs::DeleteDeploymentSnapshots, 'delete deployment snapshots', [deployment.name])
14
+ end
15
+
16
+ def delete_snapshots_task(user, snapshot_cids)
17
+ JobQueue.new.enqueue(user, Jobs::DeleteSnapshots, 'delete snapshot', [snapshot_cids])
18
+ end
19
+
20
+ def find_by_cid(deployment, snapshot_cid)
21
+ snapshot = Models::Snapshot.find(snapshot_cid: snapshot_cid)
22
+ raise SnapshotNotFound, "snapshot #{snapshot_cid} not found" unless snapshot
23
+ unless deployment == snapshot.persistent_disk.instance.deployment
24
+ raise SnapshotNotFound, "snapshot #{snapshot_cid} not found in deployment #{deployment.name}"
25
+ end
26
+ snapshot
27
+ end
28
+
29
+ def snapshots(deployment, job=nil, index=nil)
30
+ filter = { deployment: deployment }
31
+ filter[:job] = job if job
32
+ filter[:index] = index if index
33
+
34
+ result = []
35
+ instances = Models::Instance.filter(filter).all
36
+
37
+ instances.each do |instance|
38
+ instance.persistent_disks.each do |disk|
39
+ disk.snapshots.each do |snapshot|
40
+ result << {
41
+ 'job' => instance.job,
42
+ 'index' => instance.index,
43
+ 'snapshot_cid' => snapshot.snapshot_cid,
44
+ 'created_at' => snapshot.created_at.to_s,
45
+ 'clean' => snapshot.clean
46
+ }
47
+ end
48
+ end
49
+ end
50
+
51
+ result
52
+ end
53
+
54
+ def self.delete_snapshots(snapshots)
55
+ snapshots.each do |snapshot|
56
+ Config.cloud.delete_snapshot(snapshot.snapshot_cid)
57
+ snapshot.delete
58
+ end
59
+ end
60
+
61
+ def self.take_snapshot(instance, options={})
62
+ unless Config.enable_snapshots
63
+ Config.logger.info('Snapshots are disabled; skipping')
64
+ return []
65
+ end
66
+
67
+ clean = options.fetch(:clean, false)
68
+ snapshot_cids = []
69
+ metadata = {
70
+ deployment: instance.deployment.name,
71
+ job: instance.job,
72
+ index: instance.index,
73
+ director_name: Config.name,
74
+ director_uuid: Config.uuid,
75
+ agent_id: instance.vm.agent_id,
76
+ instance_id: instance.vm_id
77
+ }
78
+
79
+ instance.persistent_disks.each do |disk|
80
+ cid = Config.cloud.snapshot_disk(disk.disk_cid, metadata)
81
+ snapshot = Models::Snapshot.new(persistent_disk: disk, snapshot_cid: cid, clean: clean)
82
+ snapshot.save
83
+ snapshot_cids << snapshot.snapshot_cid
84
+ end
85
+
86
+ snapshot_cids
87
+
88
+ rescue Bosh::Clouds::NotImplemented
89
+ Config.logger.info('CPI does not support disk snapshots; skipping')
90
+ []
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,50 @@
1
+ # Copyright (c) 2009-2012 VMware, Inc.
2
+
3
+ module Bosh::Director
4
+ module Api
5
+ class StemcellManager
6
+ include ApiHelper
7
+
8
+ def find_by_name_and_version(name, version)
9
+ stemcell = Models::Stemcell[:name => name, :version => version]
10
+ if stemcell.nil?
11
+ raise StemcellNotFound,
12
+ "Stemcell `#{name}/#{version}' doesn't exist"
13
+ end
14
+ stemcell
15
+ end
16
+
17
+ def stemcell_exists?(name, version)
18
+ find_by_name_and_version(name, version)
19
+ true
20
+ rescue StemcellNotFound
21
+ false
22
+ end
23
+
24
+ def create_stemcell(user, stemcell, options = {})
25
+ if options[:remote]
26
+ stemcell_file = stemcell
27
+ else
28
+ random_name = "stemcell-#{SecureRandom.uuid}"
29
+ stemcell_dir = Dir::tmpdir
30
+ stemcell_file = File.join(stemcell_dir, random_name)
31
+
32
+ unless check_available_disk_space(stemcell_dir, stemcell.size)
33
+ raise NotEnoughDiskSpace, "Uploading stemcell archive failed. " +
34
+ "Insufficient space on BOSH director in #{stemcell_dir}"
35
+ end
36
+
37
+ write_file(stemcell_file, stemcell)
38
+ end
39
+
40
+ JobQueue.new.enqueue(user, Jobs::UpdateStemcell, 'create stemcell', [stemcell_file, options])
41
+ end
42
+
43
+ def delete_stemcell(user, stemcell, options={})
44
+ description = "delete stemcell: #{stemcell.name}/#{stemcell.version}"
45
+
46
+ JobQueue.new.enqueue(user, Jobs::DeleteStemcell, description, [stemcell.name, stemcell.version, options])
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,46 @@
1
+ # Copyright (c) 2009-2012 VMware, Inc.
2
+
3
+ module Bosh::Director
4
+ module Api
5
+ module TaskHelper
6
+ def create_task(user, type, description)
7
+ user = Models::User[:username => user]
8
+ task = Models::Task.create(:user => user,
9
+ :type => type,
10
+ :description => description,
11
+ :state => :queued,
12
+ :timestamp => Time.now,
13
+ :checkpoint_time => Time.now)
14
+ log_dir = File.join(Config.base_dir, "tasks", task.id.to_s)
15
+ task_status_file = File.join(log_dir, "debug")
16
+ FileUtils.mkdir_p(log_dir)
17
+ logger = Logger.new(task_status_file)
18
+ logger.level= Config.logger.level
19
+ logger.info("Director Version : #{Bosh::Director::VERSION}")
20
+ logger.info("Enqueuing task: #{task.id}")
21
+
22
+ # remove old tasks
23
+ min_task_id = task.id - Config.max_tasks
24
+ task_files = Dir.glob(File.join(Config.base_dir, "tasks/*"))
25
+ task_files.each do |file_path|
26
+ begin
27
+ task_file = File.basename(file_path)
28
+ task_id = Integer(task_file)
29
+
30
+ if task_id <= min_task_id && task_id >= 0
31
+ logger.info("Delete #{task_file}")
32
+ FileUtils.rm_rf file_path
33
+ Models::Task[task_id].destroy
34
+ end
35
+ rescue
36
+ # skip over invalid task files
37
+ end
38
+ end
39
+
40
+ task.output = log_dir
41
+ task.save
42
+ task
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,64 @@
1
+ # Copyright (c) 2009-2012 VMware, Inc.
2
+
3
+ module Bosh::Director
4
+ module Api
5
+ class TaskManager
6
+ # Looks up director task in DB
7
+ # @param [Integer] task_id
8
+ # @return [Models::Task] Task
9
+ # @raise [TaskNotFound]
10
+ def find_task(task_id)
11
+ task = Models::Task[task_id]
12
+ if task.nil?
13
+ raise TaskNotFound, "Task #{task_id} not found"
14
+ end
15
+ task
16
+ end
17
+
18
+ # Returns hash representation of the task
19
+ # @param [Models::Task] task Director task
20
+ # @return [Hash] Hash task representation
21
+ def task_to_hash(task)
22
+ {
23
+ "id" => task.id,
24
+ "state" => task.state,
25
+ "description" => task.description,
26
+ "timestamp" => task.timestamp.to_i,
27
+ "result" => task.result,
28
+ "user" => task.user ? task.user.username : "admin"
29
+ }
30
+ end
31
+
32
+ def log_file(task, log_type)
33
+ # Backward compatibility
34
+ return task.output unless File.directory?(task.output)
35
+
36
+ # Backward compatbility from renaming `soap` log to `cpi` log.
37
+ # Old tasks might have been written to the file `soap` and we should
38
+ # still return them if log_type = cpi. Same goes for new task logs
39
+ # written to `cpi` but an old CLI has requested log_type = soap.
40
+ if %w(soap cpi).include?(log_type)
41
+ log_type = File.file?(File.join(task.output, "soap")) ? "soap" : "cpi"
42
+ end
43
+ file = File.join(task.output, log_type)
44
+ file_gz = [file, 'gz'].join('.')
45
+
46
+ decompress(file_gz, file)
47
+
48
+ file
49
+ end
50
+
51
+ def decompress(src, dst)
52
+ # only decompress if log_file is missing and we have a compressed file
53
+ return unless !File.file?(dst) && File.file?(src)
54
+
55
+ File.open(dst, 'w') do |file|
56
+ Zlib::GzipReader.open(src) do |gz|
57
+ file.write gz.read
58
+ end
59
+ end
60
+ FileUtils.rm(src)
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,72 @@
1
+ # Copyright (c) 2009-2012 VMware, Inc.
2
+
3
+ module Bosh::Director
4
+ module Api
5
+ class UserManager
6
+
7
+ # @param [String] name User name
8
+ # @return [Models::User] User
9
+ def find_by_name(name)
10
+ user = Models::User[:username => name]
11
+ if user.nil?
12
+ raise UserNotFound, "User `#{name}' doesn't exist"
13
+ end
14
+ user
15
+ end
16
+
17
+ def authenticate(username, password)
18
+ # This is a dev-mode shortcut
19
+ if Models::User.count == 0
20
+ return username == "admin" && password == "admin"
21
+ end
22
+
23
+ user = find_by_name(username)
24
+ BCrypt::Password.new(user.password) == password
25
+ rescue UserNotFound
26
+ false
27
+ end
28
+
29
+ def delete_user(username)
30
+ find_by_name(username).destroy
31
+ end
32
+
33
+ def create_user(new_user)
34
+ user = Models::User.new
35
+ user.username = new_user.username
36
+ if new_user.password
37
+ user.password = BCrypt::Password.create(new_user.password).to_s
38
+ end
39
+ save_user(user)
40
+ user
41
+ end
42
+
43
+ def update_user(updated_user)
44
+ user = find_by_name(updated_user.username)
45
+ user.password = BCrypt::Password.create(updated_user.password).to_s
46
+ save_user(user)
47
+ user
48
+ end
49
+
50
+ def get_user_from_request(request)
51
+ hash = Yajl::Parser.new.parse(request.body)
52
+ Models::User.new(:username => hash["username"],
53
+ :password => hash["password"])
54
+ end
55
+
56
+ private
57
+
58
+ # Saves user in DB and handles validation errors.
59
+ # @param [Models::User]
60
+ # @return [void]
61
+ def save_user(user)
62
+ user.save
63
+ rescue Sequel::ValidationFailed => e
64
+ username_errors = e.errors.on(:username)
65
+ if username_errors && username_errors.include?(:unique)
66
+ raise UserNameTaken, "The username #{user.username} is already taken"
67
+ end
68
+ raise UserInvalid, "The user is invalid: #{e.errors.full_messages}"
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,11 @@
1
+ # Copyright (c) 2009-2012 VMware, Inc.
2
+
3
+ module Bosh::Director
4
+ module Api
5
+ class VmStateManager
6
+ def fetch_vm_state(user, deployment, format)
7
+ JobQueue.new.enqueue(user, Jobs::VmState, 'retrieve vm-stats', [deployment.id, format])
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,35 @@
1
+ module Bosh::Director
2
+
3
+ # This is a work in progress.
4
+ #
5
+ # The App is the "top of the world"; it holds all the stateful components in the
6
+ # system. There should be only one instance, available as a class instance to the
7
+ # (hopefully few) components that require it.
8
+
9
+ class App
10
+
11
+ class << self
12
+ # Some places (ie, resque jobs) need to reference the authoriative app instance
13
+ # from class methods.
14
+ def instance
15
+ @@instance
16
+ end
17
+ end
18
+
19
+ attr_reader :blobstores
20
+
21
+ def initialize(config)
22
+ # You should only create one of these at a time, but when you create one
23
+ # it becomes the authoritative official version across the whole app.
24
+ @@instance = self
25
+
26
+ # This is the legacy config system that we are trying to get rid of by
27
+ # decomposing and moving all the dependent components into this App
28
+ Bosh::Director::Config.configure(config.hash)
29
+
30
+ @blobstores = Blobstores.new(config)
31
+ end
32
+
33
+
34
+ end
35
+ end
@@ -0,0 +1,87 @@
1
+ # Copyright (c) 2009-2012 VMware, Inc.
2
+
3
+ module Bosh::Director
4
+ class BlobUtil
5
+ # @param [String] path Path to a file to be uploaded
6
+ # @return [String] Created blob id
7
+ def self.create_blob(path)
8
+ File.open(path) { |f| blobstore.create(f) }
9
+ end
10
+
11
+ def self.copy_blob(blobstore_id)
12
+ # Create a copy of the given blob
13
+ Dir.mktmpdir do |path|
14
+ temp_path = File.join(path, "blob")
15
+ File.open(temp_path, 'w') do |file|
16
+ blobstore.get(blobstore_id, file)
17
+ end
18
+ File.open(temp_path, 'r') do |file|
19
+ blobstore_id = blobstore.create(file)
20
+ end
21
+ end
22
+ blobstore_id
23
+ end
24
+
25
+ def self.save_to_global_cache(compiled_package, cache_key)
26
+ global_cache_filename = [compiled_package.package.name, cache_key].join('-')
27
+ Dir.mktmpdir do |path|
28
+ temp_path = File.join(path, 'blob')
29
+ File.open(temp_path, 'wb') do |file|
30
+ blobstore.get(compiled_package.blobstore_id, file)
31
+ end
32
+
33
+ File.open(temp_path) do |file|
34
+ compiled_package_cache_blobstore.create(file, global_cache_filename)
35
+ end
36
+ end
37
+ end
38
+
39
+ def self.exists_in_global_cache?(package, cache_key)
40
+ global_cache_filename = [package.name, cache_key].join('-')
41
+ compiled_package_cache_blobstore.exists?(global_cache_filename)
42
+ end
43
+
44
+ def self.fetch_from_global_cache(package, stemcell, cache_key, dependency_key)
45
+ global_cache_filename = [package.name, cache_key].join('-')
46
+
47
+ blobstore_id = nil
48
+ compiled_package_sha1 = nil
49
+
50
+ Dir.mktmpdir do |path|
51
+ blob_path = File.join(path, 'blob')
52
+ begin
53
+ File.open(blob_path, 'wb') do |file|
54
+ compiled_package_cache_blobstore.get(global_cache_filename, file)
55
+ end
56
+ rescue Bosh::Blobstore::NotFound => e
57
+ # if the object is not found in the cache, we ignore it and return nil
58
+ return nil
59
+ end
60
+
61
+ File.open(blob_path) do |file|
62
+ blobstore_id = blobstore.create(file)
63
+ compiled_package_sha1 = Digest::SHA1.file(blob_path).hexdigest
64
+ end
65
+ end
66
+
67
+ Models::CompiledPackage.create do |p|
68
+ p.package = package
69
+ p.stemcell = stemcell
70
+ p.sha1 = compiled_package_sha1
71
+ p.build = Models::CompiledPackage.generate_build_number(package, stemcell)
72
+ p.blobstore_id = blobstore_id
73
+ p.dependency_key = dependency_key
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ def self.blobstore
80
+ App.instance.blobstores.blobstore
81
+ end
82
+
83
+ def self.compiled_package_cache_blobstore
84
+ Config.compiled_package_cache_blobstore
85
+ end
86
+ end
87
+ end