bosh-director 1.5.0.pre.1113

Sign up to get free protection for your applications and to get access to all the features.
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