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.
- data/CHANGELOG +34 -0
- data/bin/bosh-director +36 -0
- data/bin/bosh-director-console +84 -0
- data/bin/bosh-director-drain-workers +42 -0
- data/bin/bosh-director-migrate +58 -0
- data/bin/bosh-director-scheduler +27 -0
- data/bin/bosh-director-worker +76 -0
- data/db/migrations/README +1 -0
- data/db/migrations/director/20110209010747_initial.rb +118 -0
- data/db/migrations/director/20110406055800_add_task_user.rb +9 -0
- data/db/migrations/director/20110518225809_remove_cid_constrain.rb +13 -0
- data/db/migrations/director/20110617211923_add_deployments_release_versions.rb +32 -0
- data/db/migrations/director/20110622212607_add_task_checkpoint_timestamp.rb +9 -0
- data/db/migrations/director/20110628023039_add_state_to_instances.rb +21 -0
- data/db/migrations/director/20110709012332_add_disk_size_to_instances.rb +9 -0
- data/db/migrations/director/20110906183441_add_log_bundles.rb +11 -0
- data/db/migrations/director/20110907194830_add_logs_json_to_templates.rb +9 -0
- data/db/migrations/director/20110915205610_add_persistent_disks.rb +51 -0
- data/db/migrations/director/20111005180929_add_properties.rb +14 -0
- data/db/migrations/director/20111110024617_add_deployment_problems.rb +24 -0
- data/db/migrations/director/20111216214145_recreate_support_for_vms.rb +9 -0
- data/db/migrations/director/20120102084027_add_credentials_to_vms.rb +7 -0
- data/db/migrations/director/20120427235217_allow_multiple_releases_per_deployment.rb +36 -0
- data/db/migrations/director/20120524175805_add_task_type.rb +44 -0
- data/db/migrations/director/20120614001930_delete_redundant_deployment_release_relation.rb +34 -0
- data/db/migrations/director/20120822004528_add_fingerprint_to_templates_and_packages.rb +17 -0
- data/db/migrations/director/20120830191244_add_properties_to_templates.rb +9 -0
- data/db/migrations/director/20121106190739_persist_vm_env.rb +9 -0
- data/db/migrations/director/20130222232131_add_sha1_to_stemcells.rb +9 -0
- data/db/migrations/director/20130312211407_add_commit_hash_to_release_versions.rb +19 -0
- data/db/migrations/director/20130409235338_snapshot.rb +15 -0
- data/db/migrations/director/20130530164918_add_paused_flag_to_instance.rb +14 -0
- data/db/migrations/director/20130531172604_add_director_attributes.rb +13 -0
- data/db/migrations/dns/20120123234908_initial.rb +27 -0
- data/lib/bosh/director.rb +133 -0
- data/lib/bosh/director/agent_client.rb +78 -0
- data/lib/bosh/director/api.rb +29 -0
- data/lib/bosh/director/api/api_helper.rb +81 -0
- data/lib/bosh/director/api/backup_manager.rb +15 -0
- data/lib/bosh/director/api/controller.rb +639 -0
- data/lib/bosh/director/api/controller_helpers.rb +34 -0
- data/lib/bosh/director/api/deployment_lookup.rb +13 -0
- data/lib/bosh/director/api/deployment_manager.rb +60 -0
- data/lib/bosh/director/api/http_constants.rb +16 -0
- data/lib/bosh/director/api/instance_lookup.rb +44 -0
- data/lib/bosh/director/api/instance_manager.rb +63 -0
- data/lib/bosh/director/api/problem_manager.rb +40 -0
- data/lib/bosh/director/api/property_manager.rb +69 -0
- data/lib/bosh/director/api/release_manager.rb +59 -0
- data/lib/bosh/director/api/resource_manager.rb +69 -0
- data/lib/bosh/director/api/resurrector_manager.rb +15 -0
- data/lib/bosh/director/api/snapshot_manager.rb +94 -0
- data/lib/bosh/director/api/stemcell_manager.rb +50 -0
- data/lib/bosh/director/api/task_helper.rb +46 -0
- data/lib/bosh/director/api/task_manager.rb +64 -0
- data/lib/bosh/director/api/user_manager.rb +72 -0
- data/lib/bosh/director/api/vm_state_manager.rb +11 -0
- data/lib/bosh/director/app.rb +35 -0
- data/lib/bosh/director/blob_util.rb +87 -0
- data/lib/bosh/director/blobstores.rb +29 -0
- data/lib/bosh/director/client.rb +156 -0
- data/lib/bosh/director/cloudcheck_helper.rb +204 -0
- data/lib/bosh/director/compile_task.rb +157 -0
- data/lib/bosh/director/config.rb +370 -0
- data/lib/bosh/director/configuration_hasher.rb +114 -0
- data/lib/bosh/director/cycle_helper.rb +36 -0
- data/lib/bosh/director/db_backup.rb +22 -0
- data/lib/bosh/director/db_backup/adapter.rb +3 -0
- data/lib/bosh/director/db_backup/adapter/mysql2.rb +27 -0
- data/lib/bosh/director/db_backup/adapter/postgres.rb +36 -0
- data/lib/bosh/director/db_backup/adapter/sqlite.rb +17 -0
- data/lib/bosh/director/db_backup/error.rb +10 -0
- data/lib/bosh/director/deployment_plan.rb +26 -0
- data/lib/bosh/director/deployment_plan/assembler.rb +430 -0
- data/lib/bosh/director/deployment_plan/compilation_config.rb +54 -0
- data/lib/bosh/director/deployment_plan/compiled_package.rb +35 -0
- data/lib/bosh/director/deployment_plan/dynamic_network.rb +91 -0
- data/lib/bosh/director/deployment_plan/idle_vm.rb +109 -0
- data/lib/bosh/director/deployment_plan/instance.rb +413 -0
- data/lib/bosh/director/deployment_plan/job.rb +470 -0
- data/lib/bosh/director/deployment_plan/manual_network.rb +137 -0
- data/lib/bosh/director/deployment_plan/network.rb +74 -0
- data/lib/bosh/director/deployment_plan/network_subnet.rb +167 -0
- data/lib/bosh/director/deployment_plan/planner.rb +288 -0
- data/lib/bosh/director/deployment_plan/preparer.rb +52 -0
- data/lib/bosh/director/deployment_plan/release.rb +126 -0
- data/lib/bosh/director/deployment_plan/resource_pool.rb +143 -0
- data/lib/bosh/director/deployment_plan/resource_pools.rb +68 -0
- data/lib/bosh/director/deployment_plan/stemcell.rb +56 -0
- data/lib/bosh/director/deployment_plan/template.rb +94 -0
- data/lib/bosh/director/deployment_plan/update_config.rb +80 -0
- data/lib/bosh/director/deployment_plan/updater.rb +55 -0
- data/lib/bosh/director/deployment_plan/vip_network.rb +79 -0
- data/lib/bosh/director/dns_helper.rb +204 -0
- data/lib/bosh/director/download_helper.rb +44 -0
- data/lib/bosh/director/duration.rb +36 -0
- data/lib/bosh/director/encryption_helper.rb +10 -0
- data/lib/bosh/director/errors.rb +198 -0
- data/lib/bosh/director/event_log.rb +136 -0
- data/lib/bosh/director/ext.rb +64 -0
- data/lib/bosh/director/hash_string_vals.rb +13 -0
- data/lib/bosh/director/instance_deleter.rb +109 -0
- data/lib/bosh/director/instance_updater.rb +506 -0
- data/lib/bosh/director/ip_util.rb +67 -0
- data/lib/bosh/director/job_queue.rb +16 -0
- data/lib/bosh/director/job_runner.rb +162 -0
- data/lib/bosh/director/job_updater.rb +121 -0
- data/lib/bosh/director/jobs/backup.rb +86 -0
- data/lib/bosh/director/jobs/base_job.rb +66 -0
- data/lib/bosh/director/jobs/cloud_check/apply_resolutions.rb +46 -0
- data/lib/bosh/director/jobs/cloud_check/scan.rb +38 -0
- data/lib/bosh/director/jobs/cloud_check/scan_and_fix.rb +73 -0
- data/lib/bosh/director/jobs/create_snapshot.rb +23 -0
- data/lib/bosh/director/jobs/delete_deployment.rb +183 -0
- data/lib/bosh/director/jobs/delete_deployment_snapshots.rb +34 -0
- data/lib/bosh/director/jobs/delete_release.rb +219 -0
- data/lib/bosh/director/jobs/delete_snapshots.rb +23 -0
- data/lib/bosh/director/jobs/delete_stemcell.rb +102 -0
- data/lib/bosh/director/jobs/fetch_logs.rb +99 -0
- data/lib/bosh/director/jobs/scheduled_backup.rb +38 -0
- data/lib/bosh/director/jobs/snapshot_deployment.rb +61 -0
- data/lib/bosh/director/jobs/snapshot_deployments.rb +23 -0
- data/lib/bosh/director/jobs/snapshot_self.rb +43 -0
- data/lib/bosh/director/jobs/ssh.rb +59 -0
- data/lib/bosh/director/jobs/update_deployment.rb +110 -0
- data/lib/bosh/director/jobs/update_release.rb +672 -0
- data/lib/bosh/director/jobs/update_stemcell.rb +109 -0
- data/lib/bosh/director/jobs/vm_state.rb +89 -0
- data/lib/bosh/director/lock.rb +133 -0
- data/lib/bosh/director/lock_helper.rb +92 -0
- data/lib/bosh/director/models.rb +29 -0
- data/lib/bosh/director/models/compiled_package.rb +33 -0
- data/lib/bosh/director/models/deployment.rb +22 -0
- data/lib/bosh/director/models/deployment_problem.rb +49 -0
- data/lib/bosh/director/models/deployment_property.rb +21 -0
- data/lib/bosh/director/models/director_attribute.rb +9 -0
- data/lib/bosh/director/models/dns.rb +9 -0
- data/lib/bosh/director/models/dns/domain.rb +9 -0
- data/lib/bosh/director/models/dns/record.rb +7 -0
- data/lib/bosh/director/models/helpers/model_helper.rb +7 -0
- data/lib/bosh/director/models/instance.rb +28 -0
- data/lib/bosh/director/models/log_bundle.rb +10 -0
- data/lib/bosh/director/models/package.rb +30 -0
- data/lib/bosh/director/models/persistent_disk.rb +13 -0
- data/lib/bosh/director/models/release.rb +17 -0
- data/lib/bosh/director/models/release_version.rb +16 -0
- data/lib/bosh/director/models/snapshot.rb +13 -0
- data/lib/bosh/director/models/stemcell.rb +18 -0
- data/lib/bosh/director/models/task.rb +10 -0
- data/lib/bosh/director/models/template.rb +44 -0
- data/lib/bosh/director/models/user.rb +11 -0
- data/lib/bosh/director/models/vm.rb +42 -0
- data/lib/bosh/director/nats_rpc.rb +54 -0
- data/lib/bosh/director/network_reservation.rb +121 -0
- data/lib/bosh/director/next_rebase_version.rb +20 -0
- data/lib/bosh/director/package_compiler.rb +423 -0
- data/lib/bosh/director/problem_handlers/base.rb +153 -0
- data/lib/bosh/director/problem_handlers/inactive_disk.rb +112 -0
- data/lib/bosh/director/problem_handlers/invalid_problem.rb +28 -0
- data/lib/bosh/director/problem_handlers/missing_vm.rb +34 -0
- data/lib/bosh/director/problem_handlers/mount_info_mismatch.rb +62 -0
- data/lib/bosh/director/problem_handlers/out_of_sync_vm.rb +64 -0
- data/lib/bosh/director/problem_handlers/unbound_instance_vm.rb +85 -0
- data/lib/bosh/director/problem_handlers/unresponsive_agent.rb +78 -0
- data/lib/bosh/director/problem_resolver.rb +103 -0
- data/lib/bosh/director/problem_scanner.rb +268 -0
- data/lib/bosh/director/resource_pool_updater.rb +216 -0
- data/lib/bosh/director/scheduler.rb +57 -0
- data/lib/bosh/director/sequel.rb +13 -0
- data/lib/bosh/director/tar_gzipper.rb +47 -0
- data/lib/bosh/director/task_result_file.rb +19 -0
- data/lib/bosh/director/thread_pool.rb +8 -0
- data/lib/bosh/director/validation_helper.rb +55 -0
- data/lib/bosh/director/version.rb +7 -0
- data/lib/bosh/director/vm_creator.rb +80 -0
- data/lib/bosh/director/vm_data.rb +63 -0
- data/lib/bosh/director/vm_metadata_updater.rb +29 -0
- data/lib/bosh/director/vm_reuser.rb +63 -0
- data/lib/cloud/dummy.rb +149 -0
- metadata +664 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Bosh::Director
|
|
2
|
+
module Api::ControllerHelpers
|
|
3
|
+
def task_timeout?(task)
|
|
4
|
+
# Some of the old task entries might not have the checkpoint_time
|
|
5
|
+
unless task.checkpoint_time
|
|
6
|
+
task.checkpoint_time = Time.now
|
|
7
|
+
task.save
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# If no checkpoint update in 3 cycles --> timeout
|
|
11
|
+
(task.state == 'processing' || task.state == 'cancelling') &&
|
|
12
|
+
(Time.now - task.checkpoint_time > Config.task_checkpoint_interval * 3)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def protected!
|
|
16
|
+
unless authorized?
|
|
17
|
+
response['WWW-Authenticate'] = 'Basic realm="BOSH Director"'
|
|
18
|
+
throw(:halt, [401, "Not authorized\n"])
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def authorized?
|
|
23
|
+
@auth ||= Rack::Auth::Basic::Request.new(request.env)
|
|
24
|
+
@auth.provided? && @auth.basic? && @auth.credentials && authenticate(*@auth.credentials)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def convert_job_instance_hash(hash)
|
|
28
|
+
hash.reduce([]) do |jobs, kv|
|
|
29
|
+
job, indicies = kv
|
|
30
|
+
jobs + indicies.map { |index| [job, index] }
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Bosh::Director
|
|
2
|
+
module Api
|
|
3
|
+
class DeploymentLookup
|
|
4
|
+
def by_name(name)
|
|
5
|
+
deployment = Models::Deployment[name: name]
|
|
6
|
+
if deployment.nil?
|
|
7
|
+
raise DeploymentNotFound, "Deployment `#{name}' doesn't exist"
|
|
8
|
+
end
|
|
9
|
+
deployment
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
+
|
|
3
|
+
module Bosh::Director
|
|
4
|
+
module Api
|
|
5
|
+
class DeploymentManager
|
|
6
|
+
include ApiHelper
|
|
7
|
+
|
|
8
|
+
# Finds deployment by name
|
|
9
|
+
# @param [String] name
|
|
10
|
+
# @return [Models::Deployment] Deployment model
|
|
11
|
+
# @raise [DeploymentNotFound]
|
|
12
|
+
def find_by_name(name)
|
|
13
|
+
DeploymentLookup.new.by_name(name)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def create_deployment(user, deployment_manifest, options = {})
|
|
17
|
+
random_name = "deployment-#{SecureRandom.uuid}"
|
|
18
|
+
deployment_manifest_dir = Dir::tmpdir
|
|
19
|
+
deployment_manifest_file = File.join(deployment_manifest_dir, random_name)
|
|
20
|
+
unless check_available_disk_space(deployment_manifest_dir, deployment_manifest.size)
|
|
21
|
+
raise NotEnoughDiskSpace, "Uploading deployment manifest failed. " +
|
|
22
|
+
"Insufficient space on BOSH director in #{deployment_manifest_dir}"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
write_file(deployment_manifest_file, deployment_manifest)
|
|
26
|
+
|
|
27
|
+
JobQueue.new.enqueue(user, Jobs::UpdateDeployment, 'create deployment', [deployment_manifest_file, options])
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def delete_deployment(user, deployment, options = {})
|
|
31
|
+
JobQueue.new.enqueue(user, Jobs::DeleteDeployment, "delete deployment #{deployment.name}", [deployment.name, options])
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def deployment_to_json(deployment)
|
|
35
|
+
result = {
|
|
36
|
+
"manifest" => deployment.manifest,
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
Yajl::Encoder.encode(result)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def deployment_vms_to_json(deployment)
|
|
43
|
+
vms = []
|
|
44
|
+
filters = {:deployment_id => deployment.id}
|
|
45
|
+
Models::Vm.eager(:instance).filter(filters).all.each do |vm|
|
|
46
|
+
instance = vm.instance
|
|
47
|
+
|
|
48
|
+
vms << {
|
|
49
|
+
"agent_id" => vm.agent_id,
|
|
50
|
+
"cid" => vm.cid,
|
|
51
|
+
"job" => instance ? instance.job : nil,
|
|
52
|
+
"index" => instance ? instance.index : nil
|
|
53
|
+
}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
Yajl::Encoder.encode(vms)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
+
|
|
3
|
+
module Bosh::Director::Api
|
|
4
|
+
module Http
|
|
5
|
+
OK = 200
|
|
6
|
+
CREATED = 201
|
|
7
|
+
NO_CONTENT = 204
|
|
8
|
+
|
|
9
|
+
BAD_REQUEST = 400
|
|
10
|
+
UNAUTHORIZED = 401
|
|
11
|
+
FORBIDDEN = 403
|
|
12
|
+
NOT_FOUND = 404
|
|
13
|
+
|
|
14
|
+
INTERNAL_SERVER_ERROR = 500
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require 'bosh/director/api/deployment_lookup'
|
|
2
|
+
|
|
3
|
+
module Bosh::Director
|
|
4
|
+
module Api
|
|
5
|
+
class InstanceLookup
|
|
6
|
+
def by_id(instance_id)
|
|
7
|
+
instance = Models::Instance[instance_id]
|
|
8
|
+
if instance.nil?
|
|
9
|
+
raise InstanceNotFound, "Instance #{instance_id} doesn't exist"
|
|
10
|
+
end
|
|
11
|
+
instance
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def by_attributes(deployment_name, job_name, job_index)
|
|
15
|
+
deployment = DeploymentLookup.new.by_name(deployment_name)
|
|
16
|
+
|
|
17
|
+
filter = {
|
|
18
|
+
deployment_id: deployment.id,
|
|
19
|
+
job: job_name,
|
|
20
|
+
index: job_index
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
instance = Models::Instance.find(filter)
|
|
24
|
+
if instance.nil?
|
|
25
|
+
raise InstanceNotFound,
|
|
26
|
+
"`#{deployment_name}/#{job_name}/#{job_index}' doesn't exist"
|
|
27
|
+
end
|
|
28
|
+
instance
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def by_filter(filter)
|
|
32
|
+
instances = Models::Instance.filter(filter).all
|
|
33
|
+
if instances.empty?
|
|
34
|
+
raise InstanceNotFound, "No instances matched #{filter.inspect}"
|
|
35
|
+
end
|
|
36
|
+
instances
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def find_all
|
|
40
|
+
Models::Instance.all
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
+
|
|
3
|
+
module Bosh::Director
|
|
4
|
+
module Api
|
|
5
|
+
class InstanceManager
|
|
6
|
+
# @param [Integer] instance_id Instance id
|
|
7
|
+
# @return [Models::Instance] Instance
|
|
8
|
+
# @raise [InstanceNotFound]
|
|
9
|
+
def find_instance(instance_id)
|
|
10
|
+
InstanceLookup.new.by_id(instance_id)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# @param [String] deployment_name Deployment name
|
|
14
|
+
# @param [String] job Job name
|
|
15
|
+
# @param [String] index Job index
|
|
16
|
+
# @return [Models::Instance]
|
|
17
|
+
def find_by_name(deployment_name, job, index)
|
|
18
|
+
InstanceLookup.new.by_attributes(deployment_name, job, index)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @param [Hash] filter Sequel-style DB record filter
|
|
22
|
+
# @return [Array] List of instances that matched the filter
|
|
23
|
+
# @raise [InstanceNotFound]
|
|
24
|
+
def filter_by(filter)
|
|
25
|
+
InstanceLookup.new.by_filter(filter)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @param [Models::Instance] instance Instance
|
|
29
|
+
# @return [AgentClient] Agent client to talk to instance
|
|
30
|
+
def agent_client_for(instance)
|
|
31
|
+
vm = instance.vm
|
|
32
|
+
if vm.nil?
|
|
33
|
+
raise InstanceVmMissing,
|
|
34
|
+
"`#{instance.job}/#{instance.index}' doesn't reference a VM"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
if vm.agent_id.nil?
|
|
38
|
+
raise VmAgentIdMissing, "VM `#{vm.cid}' doesn't have an agent id"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
AgentClient.new(vm.agent_id)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def fetch_logs(user, deployment_name, job, index, options = {})
|
|
45
|
+
if deployment_name.nil? || job.nil? || index.nil?
|
|
46
|
+
raise DirectorError,
|
|
47
|
+
"deployment, job and index parameters are required"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
instance = find_by_name(deployment_name, job, index)
|
|
51
|
+
|
|
52
|
+
JobQueue.new.enqueue(user, Jobs::FetchLogs, 'fetch logs', [instance.id, options])
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def ssh(user, options)
|
|
56
|
+
description = "ssh: #{options['command']}:#{options['target']}"
|
|
57
|
+
deployment = DeploymentLookup.new.by_name(options['deployment_name'])
|
|
58
|
+
|
|
59
|
+
JobQueue.new.enqueue(user, Jobs::Ssh, description, [deployment.id, options])
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
+
|
|
3
|
+
module Bosh::Director
|
|
4
|
+
module Api
|
|
5
|
+
class ProblemManager
|
|
6
|
+
|
|
7
|
+
def initialize(deployment_manager = DeploymentManager.new)
|
|
8
|
+
@deployment_manager = deployment_manager
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def perform_scan(user, deployment_name)
|
|
12
|
+
deployment = @deployment_manager.find_by_name(deployment_name)
|
|
13
|
+
|
|
14
|
+
JobQueue.new.enqueue(user, Jobs::CloudCheck::Scan, 'scan cloud', [deployment.name])
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def get_problems(deployment_name)
|
|
18
|
+
deployment = @deployment_manager.find_by_name(deployment_name)
|
|
19
|
+
|
|
20
|
+
filters = {
|
|
21
|
+
:deployment_id => deployment.id,
|
|
22
|
+
:state => 'open'
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
Models::DeploymentProblem.filter(filters).order(:created_at).all
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def apply_resolutions(user, deployment_name, resolutions)
|
|
29
|
+
deployment = @deployment_manager.find_by_name(deployment_name)
|
|
30
|
+
JobQueue.new.enqueue(user, Jobs::CloudCheck::ApplyResolutions, 'apply resolutions', [deployment.name, resolutions])
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def scan_and_fix(user, deployment_name, jobs)
|
|
34
|
+
deployment = @deployment_manager.find_by_name(deployment_name)
|
|
35
|
+
|
|
36
|
+
JobQueue.new.enqueue(user, Jobs::CloudCheck::ScanAndFix, 'scan and fix', [deployment.name, jobs, Bosh::Director::Config.fix_stateful_nodes])
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
+
|
|
3
|
+
module Bosh::Director
|
|
4
|
+
module Api
|
|
5
|
+
class PropertyManager
|
|
6
|
+
|
|
7
|
+
def initialize
|
|
8
|
+
@deployment_manager = DeploymentManager.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def create_property(deployment_name, property_name, value)
|
|
12
|
+
property = Models::DeploymentProperty.new
|
|
13
|
+
property.deployment = find_deployment(deployment_name)
|
|
14
|
+
property.name = property_name
|
|
15
|
+
property.value = value
|
|
16
|
+
property.save
|
|
17
|
+
|
|
18
|
+
rescue Sequel::ValidationFailed => e
|
|
19
|
+
if e.errors[[:name, :deployment_id]].include?(:unique)
|
|
20
|
+
raise PropertyAlreadyExists,
|
|
21
|
+
"Property `#{property_name}' already exists " +
|
|
22
|
+
"for deployment `#{deployment_name}'"
|
|
23
|
+
end
|
|
24
|
+
invalid_property(e.errors)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def update_property(deployment_name, property_name, value)
|
|
28
|
+
property = get_property(deployment_name, property_name)
|
|
29
|
+
property.value = value
|
|
30
|
+
property.save
|
|
31
|
+
|
|
32
|
+
rescue Sequel::ValidationFailed => e
|
|
33
|
+
invalid_property(e.errors)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def delete_property(deployment_name, property_name)
|
|
37
|
+
get_property(deployment_name, property_name).destroy
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def get_property(deployment_name, property_name)
|
|
41
|
+
deployment = find_deployment(deployment_name)
|
|
42
|
+
filters = {:deployment_id => deployment.id, :name => property_name}
|
|
43
|
+
property = Models::DeploymentProperty.find(filters)
|
|
44
|
+
if property.nil?
|
|
45
|
+
raise PropertyNotFound,
|
|
46
|
+
"Property `#{property_name}' not found " +
|
|
47
|
+
"for deployment `#{deployment_name}'"
|
|
48
|
+
end
|
|
49
|
+
property
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def get_properties(deployment_name)
|
|
53
|
+
filters = {:deployment_id => find_deployment(deployment_name).id}
|
|
54
|
+
Models::DeploymentProperty.filter(filters).all
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
def invalid_property(errors)
|
|
60
|
+
raise PropertyInvalid,
|
|
61
|
+
"Property is invalid: #{errors.full_messages.sort.join(", ")}"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def find_deployment(name)
|
|
65
|
+
@deployment_manager.find_by_name(name)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
+
|
|
3
|
+
module Bosh::Director
|
|
4
|
+
module Api
|
|
5
|
+
class ReleaseManager
|
|
6
|
+
include ApiHelper
|
|
7
|
+
|
|
8
|
+
RELEASE_TGZ = "release.tgz"
|
|
9
|
+
|
|
10
|
+
# Finds release by name
|
|
11
|
+
# @param [String] name Release name
|
|
12
|
+
# @return [Models::Release]
|
|
13
|
+
# @raise [ReleaseNotFound]
|
|
14
|
+
def find_by_name(name)
|
|
15
|
+
release = Models::Release[:name => name]
|
|
16
|
+
if release.nil?
|
|
17
|
+
raise ReleaseNotFound, "Release `#{name}' doesn't exist"
|
|
18
|
+
end
|
|
19
|
+
release
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @param [Models::Release] release Release model
|
|
23
|
+
# @param [String] version Release version
|
|
24
|
+
# @return [Models::ReleaseVersion] Release version model
|
|
25
|
+
# @raise [ReleaseVersionNotFound]
|
|
26
|
+
def find_version(release, version)
|
|
27
|
+
dataset = release.versions_dataset
|
|
28
|
+
release_version = dataset.filter(:version => version).first
|
|
29
|
+
if release_version.nil?
|
|
30
|
+
raise ReleaseVersionNotFound,
|
|
31
|
+
"Release version `#{release.name}/#{version}' doesn't exist"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
release_version
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def create_release(user, release_bundle, options = {})
|
|
38
|
+
release_dir = Dir.mktmpdir("release")
|
|
39
|
+
|
|
40
|
+
if options['remote']
|
|
41
|
+
options['location'] = release_bundle
|
|
42
|
+
else
|
|
43
|
+
unless check_available_disk_space(release_dir, release_bundle.size)
|
|
44
|
+
raise NotEnoughDiskSpace, "Uploading release archive failed. " +
|
|
45
|
+
"Insufficient space on BOSH director in #{release_dir}"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
write_file(File.join(release_dir, RELEASE_TGZ), release_bundle)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
JobQueue.new.enqueue(user, Jobs::UpdateRelease, 'create release', [release_dir, options])
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def delete_release(user, release, options = {})
|
|
55
|
+
JobQueue.new.enqueue(user, Jobs::DeleteRelease, "delete release: #{release.name}", [release.name, options])
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
+
|
|
3
|
+
module Bosh::Director
|
|
4
|
+
module Api
|
|
5
|
+
class ResourceManager
|
|
6
|
+
|
|
7
|
+
def initialize(blobstore_client=App.instance.blobstores.blobstore)
|
|
8
|
+
@logger = Config.logger
|
|
9
|
+
@blobstore_client = blobstore_client
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Retrieves the resource `id` from the blobstore and stores it
|
|
13
|
+
# locally, and returns the path to the file
|
|
14
|
+
#
|
|
15
|
+
# @param [String] id
|
|
16
|
+
# @return [String] path to the contents of the blobstore id
|
|
17
|
+
def get_resource_path(id)
|
|
18
|
+
blobstore_resource(id) do |blobstore|
|
|
19
|
+
random_name = "resource-#{SecureRandom.uuid}"
|
|
20
|
+
path = File.join(Dir.tmpdir, random_name)
|
|
21
|
+
|
|
22
|
+
File.open(path, "w") do |f|
|
|
23
|
+
blobstore.get(id, f)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
path
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Retrieves the resource `id` from the blobstore and returns the
|
|
31
|
+
# contents of it.
|
|
32
|
+
# @param [String] id
|
|
33
|
+
# @return [String] contents of the blobstore id
|
|
34
|
+
def get_resource(id)
|
|
35
|
+
@logger.debug("Downloading #{id} from blobstore...")
|
|
36
|
+
|
|
37
|
+
blob = nil
|
|
38
|
+
blobstore_resource(id) do |blobstore|
|
|
39
|
+
blob = blobstore.get(id)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
@logger.debug("Downloaded #{id} from blobstore")
|
|
43
|
+
blob
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Deletes the resource `id` from the blobstore
|
|
47
|
+
# @param [String] id
|
|
48
|
+
def delete_resource(id)
|
|
49
|
+
@logger.debug("Deleting #{id} from blobstore...")
|
|
50
|
+
|
|
51
|
+
blobstore_resource(id) do |blobstore|
|
|
52
|
+
blobstore.delete(id)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
@logger.debug("Deleted #{id} from blobstore")
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
|
|
60
|
+
def blobstore_resource(id)
|
|
61
|
+
yield @blobstore_client
|
|
62
|
+
rescue Bosh::Blobstore::NotFound
|
|
63
|
+
raise ResourceNotFound, "Resource `#{id}' not found in the blobstore"
|
|
64
|
+
rescue Bosh::Blobstore::BlobstoreError => e
|
|
65
|
+
raise ResourceError, "Blobstore error accessing resource `#{id}': #{e}"
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|