bosh-director 1.3160.0 → 1.3163.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/bosh-director-worker +2 -14
- data/db/migrations/director/20150513225143_ip_addresses.rb +11 -0
- data/db/migrations/director/20150702004608_add_links.rb +8 -0
- data/db/migrations/director/20150708231924_add_link_spec.rb +7 -0
- data/db/migrations/director/20150724183256_add_debugging_to_ip_addresses.rb +8 -0
- data/db/migrations/director/20150730225029_add_uuid_to_instances.rb +16 -0
- data/db/migrations/director/20150803215805_add_availabililty_zone_and_cloud_properties_to_instances.rb +8 -0
- data/db/migrations/director/20150804211419_add_compilation_flag_to_instance.rb +7 -0
- data/db/migrations/director/20150918003455_add_bootstrap_node_to_instance.rb +7 -0
- data/db/migrations/director/20151008232214_add_dns_records.rb +7 -0
- data/db/migrations/director/20151015172551_add_orphan_disks_and_snapshots.rb +29 -0
- data/db/migrations/director/20151030222853_add_templates_to_instance.rb +10 -0
- data/db/migrations/director/20151031001039_add_spec_to_instance.rb +19 -0
- data/db/migrations/director/20151109190602_rename_orphan_columns.rb +13 -0
- data/lib/bosh/director.rb +19 -9
- data/lib/bosh/director/agent_client.rb +0 -17
- data/lib/bosh/director/api/cloud_config_manager.rb +7 -5
- data/lib/bosh/director/api/controllers/base_controller.rb +3 -2
- data/lib/bosh/director/api/controllers/cleanup_controller.rb +15 -0
- data/lib/bosh/director/api/controllers/deployments_controller.rb +38 -26
- data/lib/bosh/director/api/controllers/disks_controller.rb +20 -0
- data/lib/bosh/director/api/controllers/info_controller.rb +2 -2
- data/lib/bosh/director/api/controllers/releases_controller.rb +1 -16
- data/lib/bosh/director/api/controllers/stemcells_controller.rb +1 -9
- data/lib/bosh/director/api/deployment_manager.rb +2 -1
- data/lib/bosh/director/api/instance_lookup.rb +17 -0
- data/lib/bosh/director/api/instance_manager.rb +20 -10
- data/lib/bosh/director/api/release_manager.rb +28 -8
- data/lib/bosh/director/api/resurrector_manager.rb +9 -2
- data/lib/bosh/director/api/route_configuration.rb +2 -0
- data/lib/bosh/director/api/snapshot_manager.rb +9 -5
- data/lib/bosh/director/api/stemcell_manager.rb +50 -0
- data/lib/bosh/director/app.rb +1 -1
- data/lib/bosh/director/cloudcheck_helper.rb +119 -132
- data/lib/bosh/director/compile_task.rb +1 -1
- data/lib/bosh/director/compile_task_generator.rb +2 -2
- data/lib/bosh/director/config.rb +21 -12
- data/lib/bosh/director/deployment_deleter.rb +69 -0
- data/lib/bosh/director/deployment_plan.rb +35 -4
- data/lib/bosh/director/deployment_plan/agent_state_migrator.rb +47 -0
- data/lib/bosh/director/deployment_plan/assembler.rb +115 -241
- data/lib/bosh/director/deployment_plan/availability_zone.rb +27 -0
- data/lib/bosh/director/deployment_plan/cloud_manifest_parser.rb +144 -35
- data/lib/bosh/director/deployment_plan/compilation_config.rb +21 -19
- data/lib/bosh/director/deployment_plan/compilation_instance_pool.rb +169 -0
- data/lib/bosh/director/deployment_plan/deployment_repo.rb +4 -8
- data/lib/bosh/director/deployment_plan/deployment_spec_parser.rb +13 -1
- data/lib/bosh/director/deployment_plan/deployment_validator.rb +17 -0
- data/lib/bosh/director/deployment_plan/desired_instance.rb +15 -0
- data/lib/bosh/director/deployment_plan/{disk_pool.rb → disk_type.rb} +14 -19
- data/lib/bosh/director/deployment_plan/dynamic_network.rb +105 -53
- data/lib/bosh/director/deployment_plan/dynamic_network_subnet.rb +13 -0
- data/lib/bosh/director/deployment_plan/env.rb +18 -0
- data/lib/bosh/director/deployment_plan/global_network_resolver.rb +77 -0
- data/lib/bosh/director/deployment_plan/instance.rb +222 -390
- data/lib/bosh/director/deployment_plan/instance_network_reservations.rb +71 -0
- data/lib/bosh/director/deployment_plan/instance_plan.rb +336 -0
- data/lib/bosh/director/deployment_plan/instance_plan_factory.rb +54 -0
- data/lib/bosh/director/deployment_plan/instance_plan_sorter.rb +61 -0
- data/lib/bosh/director/deployment_plan/instance_planner.rb +101 -0
- data/lib/bosh/director/deployment_plan/instance_repository.rb +36 -0
- data/lib/bosh/director/deployment_plan/instance_spec.rb +154 -0
- data/lib/bosh/director/deployment_plan/ip_provider/database_ip_repo.rb +136 -0
- data/lib/bosh/director/deployment_plan/ip_provider/in_memory_ip_repo.rb +81 -0
- data/lib/bosh/director/deployment_plan/ip_provider/ip_provider.rb +153 -0
- data/lib/bosh/director/deployment_plan/ip_provider/ip_provider_factory.rb +22 -0
- data/lib/bosh/director/deployment_plan/job.rb +116 -53
- data/lib/bosh/director/deployment_plan/job_availability_zone_parser.rb +49 -0
- data/lib/bosh/director/deployment_plan/job_migrator.rb +90 -0
- data/lib/bosh/director/deployment_plan/job_network.rb +42 -0
- data/lib/bosh/director/deployment_plan/job_network_parser.rb +118 -0
- data/lib/bosh/director/deployment_plan/job_spec_parser.rb +123 -126
- data/lib/bosh/director/deployment_plan/links/link.rb +30 -0
- data/lib/bosh/director/deployment_plan/links/link_lookup.rb +66 -0
- data/lib/bosh/director/deployment_plan/links/link_path.rb +27 -0
- data/lib/bosh/director/deployment_plan/links/links_resolver.rb +70 -0
- data/lib/bosh/director/deployment_plan/links/template_link.rb +21 -0
- data/lib/bosh/director/deployment_plan/manifest_migrator.rb +3 -17
- data/lib/bosh/director/deployment_plan/manifest_validator.rb +46 -0
- data/lib/bosh/director/deployment_plan/manual_network.rb +70 -97
- data/lib/bosh/director/deployment_plan/manual_network_subnet.rb +148 -0
- data/lib/bosh/director/deployment_plan/network.rb +50 -39
- data/lib/bosh/director/deployment_plan/network_planner.rb +4 -0
- data/lib/bosh/director/deployment_plan/network_planner/plan.rb +26 -0
- data/lib/bosh/director/deployment_plan/network_planner/planner.rb +21 -0
- data/lib/bosh/director/deployment_plan/network_planner/reservation_reconciler.rb +81 -0
- data/lib/bosh/director/deployment_plan/network_planner/vip_static_ips_planner.rb +50 -0
- data/lib/bosh/director/deployment_plan/network_settings.rb +65 -0
- data/lib/bosh/director/deployment_plan/options/skip_drain.rb +7 -0
- data/lib/bosh/director/deployment_plan/package_validator.rb +79 -0
- data/lib/bosh/director/deployment_plan/placement_planner.rb +8 -0
- data/lib/bosh/director/deployment_plan/placement_planner/availability_zone_picker.rb +90 -0
- data/lib/bosh/director/deployment_plan/placement_planner/bruteforce_ip_allocation.rb +124 -0
- data/lib/bosh/director/deployment_plan/placement_planner/index_assigner.rb +32 -0
- data/lib/bosh/director/deployment_plan/placement_planner/networks_to_static_ips.rb +125 -0
- data/lib/bosh/director/deployment_plan/placement_planner/placed_desired_instances.rb +40 -0
- data/lib/bosh/director/deployment_plan/placement_planner/plan.rb +42 -0
- data/lib/bosh/director/deployment_plan/placement_planner/static_ips_availability_zone_picker.rb +237 -0
- data/lib/bosh/director/deployment_plan/placement_planner/unplaced_existing_instances.rb +53 -0
- data/lib/bosh/director/deployment_plan/planner.rb +186 -74
- data/lib/bosh/director/deployment_plan/planner_factory.rb +30 -147
- data/lib/bosh/director/deployment_plan/release_version.rb +3 -3
- data/lib/bosh/director/deployment_plan/resource_pool.rb +2 -174
- data/lib/bosh/director/deployment_plan/stemcell.rb +57 -14
- data/lib/bosh/director/deployment_plan/steps/package_compile_step.rb +28 -135
- data/lib/bosh/director/deployment_plan/steps/update_step.rb +23 -44
- data/lib/bosh/director/deployment_plan/template.rb +15 -4
- data/lib/bosh/director/deployment_plan/vip_network.rb +14 -42
- data/lib/bosh/director/deployment_plan/vm.rb +1 -99
- data/lib/bosh/director/deployment_plan/vm_type.rb +27 -0
- data/lib/bosh/director/disk_manager.rb +268 -0
- data/lib/bosh/director/dns/canonicalizer.rb +28 -0
- data/lib/bosh/director/dns/dns_manager.rb +163 -0
- data/lib/bosh/director/dns/local_dns_repo.rb +20 -0
- data/lib/bosh/director/dns/powerdns.rb +170 -0
- data/lib/bosh/director/errand/job_manager.rb +18 -29
- data/lib/bosh/director/error_ignorer.rb +16 -0
- data/lib/bosh/director/errors.rb +51 -20
- data/lib/bosh/director/event_log.rb +6 -0
- data/lib/bosh/director/instance_deleter.rb +53 -81
- data/lib/bosh/director/instance_reuser.rb +89 -0
- data/lib/bosh/director/instance_updater.rb +139 -281
- data/lib/bosh/director/instance_updater/preparer.rb +8 -5
- data/lib/bosh/director/instance_updater/state_applier.rb +21 -0
- data/lib/bosh/director/ip_util.rb +46 -26
- data/lib/bosh/director/job_renderer.rb +22 -10
- data/lib/bosh/director/job_runner.rb +1 -4
- data/lib/bosh/director/job_updater.rb +47 -35
- data/lib/bosh/director/job_updater_factory.rb +5 -4
- data/lib/bosh/director/jobs/base_job.rb +8 -0
- data/lib/bosh/director/jobs/cleanup_artifacts.rb +93 -0
- data/lib/bosh/director/jobs/delete_deployment.rb +10 -154
- data/lib/bosh/director/jobs/delete_deployment_snapshots.rb +1 -1
- data/lib/bosh/director/jobs/delete_orphan_disks.rb +44 -0
- data/lib/bosh/director/jobs/delete_release.rb +19 -196
- data/lib/bosh/director/jobs/delete_stemcell.rb +10 -76
- data/lib/bosh/director/jobs/export_release.rb +41 -121
- data/lib/bosh/director/jobs/fetch_logs.rb +0 -6
- data/lib/bosh/director/jobs/helpers.rb +10 -0
- data/lib/bosh/director/jobs/helpers/blob_deleter.rb +24 -0
- data/lib/bosh/director/jobs/helpers/compiled_package_deleter.rb +24 -0
- data/lib/bosh/director/jobs/helpers/name_version_release_deleter.rb +48 -0
- data/lib/bosh/director/jobs/helpers/package_deleter.rb +33 -0
- data/lib/bosh/director/jobs/helpers/release_deleter.rb +52 -0
- data/lib/bosh/director/jobs/helpers/release_version_deleter.rb +115 -0
- data/lib/bosh/director/jobs/helpers/releases_to_delete_picker.rb +31 -0
- data/lib/bosh/director/jobs/helpers/stemcell_deleter.rb +61 -0
- data/lib/bosh/director/jobs/helpers/stemcells_to_delete_picker.rb +30 -0
- data/lib/bosh/director/jobs/helpers/template_deleter.rb +20 -0
- data/lib/bosh/director/jobs/release/release_job.rb +18 -7
- data/lib/bosh/director/jobs/run_errand.rb +57 -36
- data/lib/bosh/director/jobs/scheduled_orphan_cleanup.rb +46 -0
- data/lib/bosh/director/jobs/ssh.rb +50 -17
- data/lib/bosh/director/jobs/update_deployment.rb +29 -11
- data/lib/bosh/director/jobs/update_release.rb +25 -4
- data/lib/bosh/director/jobs/vm_state.rb +23 -32
- data/lib/bosh/director/lock.rb +13 -8
- data/lib/bosh/director/logs_fetcher.rb +1 -1
- data/lib/bosh/director/models.rb +3 -0
- data/lib/bosh/director/models/compiled_package.rb +3 -3
- data/lib/bosh/director/models/deployment.rb +10 -0
- data/lib/bosh/director/models/instance.rb +77 -1
- data/lib/bosh/director/models/ip_address.rb +26 -0
- data/lib/bosh/director/models/orphan_disk.rb +23 -0
- data/lib/bosh/director/models/orphan_snapshot.rb +14 -0
- data/lib/bosh/director/models/template.rb +32 -9
- data/lib/bosh/director/models/vm.rb +5 -8
- data/lib/bosh/director/network_reservation.rb +69 -99
- data/lib/bosh/director/problem_handlers/inactive_disk.rb +5 -20
- data/lib/bosh/director/problem_handlers/missing_disk.rb +2 -13
- data/lib/bosh/director/problem_resolver.rb +2 -2
- data/lib/bosh/director/problem_scanner/vm_scan_stage.rb +2 -21
- data/lib/bosh/director/scheduler.rb +23 -6
- data/lib/bosh/director/{instance_updater/stopper.rb → stopper.rb} +24 -18
- data/lib/bosh/director/tagged_logger.rb +30 -0
- data/lib/bosh/director/transactor.rb +9 -0
- data/lib/bosh/director/version.rb +1 -1
- data/lib/bosh/director/vm_creator.rb +91 -19
- data/lib/bosh/director/vm_deleter.rb +25 -0
- data/lib/bosh/director/vm_recreator.rb +15 -0
- data/lib/cloud/dummy.rb +381 -94
- metadata +110 -30
- data/lib/bosh/director/deployment_plan/dns_binder.rb +0 -45
- data/lib/bosh/director/deployment_plan/instance_vm_binder.rb +0 -37
- data/lib/bosh/director/deployment_plan/network_subnet.rb +0 -166
- data/lib/bosh/director/deployment_plan/resource_pools.rb +0 -68
- data/lib/bosh/director/dns_helper.rb +0 -223
- data/lib/bosh/director/instance_updater/network_updater.rb +0 -110
- data/lib/bosh/director/instance_updater/vm_updater.rb +0 -189
- data/lib/bosh/director/problem_handlers/out_of_sync_vm.rb +0 -64
- data/lib/bosh/director/problem_handlers/unbound_instance_vm.rb +0 -85
- data/lib/bosh/director/resource_pool_updater.rb +0 -174
- data/lib/bosh/director/vm_data.rb +0 -63
- data/lib/bosh/director/vm_reuser.rb +0 -63
data/lib/bosh/director/models.rb
CHANGED
@@ -8,7 +8,10 @@ require 'bosh/director/models/deployment_problem'
|
|
8
8
|
require 'bosh/director/models/deployment_property'
|
9
9
|
require 'bosh/director/models/director_attribute'
|
10
10
|
require 'bosh/director/models/instance'
|
11
|
+
require 'bosh/director/models/ip_address'
|
11
12
|
require 'bosh/director/models/log_bundle'
|
13
|
+
require 'bosh/director/models/orphan_disk'
|
14
|
+
require 'bosh/director/models/orphan_snapshot'
|
12
15
|
require 'bosh/director/models/package'
|
13
16
|
require 'bosh/director/models/release'
|
14
17
|
require 'bosh/director/models/release_version'
|
@@ -37,10 +37,10 @@ module Bosh::Director::Models
|
|
37
37
|
package.version
|
38
38
|
end
|
39
39
|
|
40
|
-
def self.generate_build_number(
|
40
|
+
def self.generate_build_number(package_model, stemcell_model)
|
41
41
|
attrs = {
|
42
|
-
:package_id =>
|
43
|
-
:stemcell_id =>
|
42
|
+
:package_id => package_model.id,
|
43
|
+
:stemcell_id => stemcell_model.id
|
44
44
|
}
|
45
45
|
|
46
46
|
filter(attrs).max(:build).to_i + 1
|
@@ -6,6 +6,7 @@ module Bosh::Director::Models
|
|
6
6
|
many_to_many :release_versions
|
7
7
|
one_to_many :job_instances, :class => "Bosh::Director::Models::Instance"
|
8
8
|
one_to_many :vms
|
9
|
+
one_to_many :instances
|
9
10
|
one_to_many :properties, :class => "Bosh::Director::Models::DeploymentProperty"
|
10
11
|
one_to_many :problems, :class => "Bosh::Director::Models::DeploymentProblem"
|
11
12
|
many_to_one :cloud_config
|
@@ -15,6 +16,15 @@ module Bosh::Director::Models
|
|
15
16
|
validates_unique :name
|
16
17
|
validates_format VALID_ID, :name
|
17
18
|
end
|
19
|
+
|
20
|
+
def link_spec
|
21
|
+
result = self.link_spec_json
|
22
|
+
result ? Yajl::Parser.parse(result) : {}
|
23
|
+
end
|
24
|
+
|
25
|
+
def link_spec=(data)
|
26
|
+
self.link_spec_json = Yajl::Encoder.encode(data)
|
27
|
+
end
|
18
28
|
end
|
19
29
|
|
20
30
|
Deployment.plugin :association_dependencies
|
@@ -1,16 +1,20 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
|
1
3
|
module Bosh::Director::Models
|
2
4
|
class Instance < Sequel::Model(Bosh::Director::Config.db)
|
3
5
|
many_to_one :deployment
|
4
6
|
many_to_one :vm
|
5
7
|
one_to_many :persistent_disks
|
6
8
|
one_to_many :rendered_templates_archives
|
9
|
+
one_to_many :ip_addresses
|
10
|
+
many_to_many :templates
|
7
11
|
|
8
12
|
def validate
|
9
13
|
validates_presence [:deployment_id, :job, :index, :state]
|
10
14
|
validates_unique [:deployment_id, :job, :index]
|
11
15
|
validates_unique [:vm_id] if vm_id
|
12
16
|
validates_integer :index
|
13
|
-
validates_includes
|
17
|
+
validates_includes %w(started stopped detached), :state
|
14
18
|
end
|
15
19
|
|
16
20
|
def persistent_disk
|
@@ -36,5 +40,77 @@ module Bosh::Director::Models
|
|
36
40
|
stale_archives
|
37
41
|
end
|
38
42
|
end
|
43
|
+
|
44
|
+
def cloud_properties_hash
|
45
|
+
if cloud_properties.nil?
|
46
|
+
spec['vm_type']['cloud_properties']
|
47
|
+
else
|
48
|
+
JSON.parse(cloud_properties)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def cloud_properties_hash=(hash)
|
53
|
+
self.cloud_properties = JSON.dump(hash)
|
54
|
+
end
|
55
|
+
|
56
|
+
def dns_record_names
|
57
|
+
return nil if dns_records.nil?
|
58
|
+
|
59
|
+
JSON.parse(dns_records)
|
60
|
+
end
|
61
|
+
|
62
|
+
def dns_record_names=(list)
|
63
|
+
self.dns_records = JSON.dump(list)
|
64
|
+
end
|
65
|
+
|
66
|
+
def to_s
|
67
|
+
"#{self.job}/#{self.uuid} (#{self.index})"
|
68
|
+
end
|
69
|
+
|
70
|
+
def spec
|
71
|
+
return nil if spec_json.nil?
|
72
|
+
|
73
|
+
result = Yajl::Parser.parse(spec_json)
|
74
|
+
if result['resource_pool'].nil?
|
75
|
+
result
|
76
|
+
else
|
77
|
+
if result['vm_type'].nil?
|
78
|
+
result['vm_type'] = {
|
79
|
+
'name' => result['resource_pool']['name'],
|
80
|
+
'cloud_properties' => result['resource_pool']['cloud_properties']
|
81
|
+
}
|
82
|
+
end
|
83
|
+
|
84
|
+
if result['resource_pool']['stemcell'] && result['stemcell'].nil?
|
85
|
+
result['stemcell'] = result['resource_pool']['stemcell']
|
86
|
+
result['stemcell']['alias'] = result['resource_pool']['name']
|
87
|
+
end
|
88
|
+
|
89
|
+
result.delete('resource_pool')
|
90
|
+
|
91
|
+
result
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def spec=(spec)
|
96
|
+
self.spec_json = Yajl::Encoder.encode(spec)
|
97
|
+
end
|
98
|
+
|
99
|
+
def bind_to_vm_model(vm)
|
100
|
+
self.vm = vm
|
101
|
+
end
|
102
|
+
|
103
|
+
def env
|
104
|
+
if vm
|
105
|
+
@env = vm.env
|
106
|
+
else
|
107
|
+
@env = {}
|
108
|
+
end
|
109
|
+
@env
|
110
|
+
end
|
39
111
|
end
|
112
|
+
|
113
|
+
Instance.plugin :association_dependencies
|
114
|
+
Instance.add_association_dependencies :ip_addresses => :destroy
|
115
|
+
Instance.add_association_dependencies :templates => :nullify
|
40
116
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Bosh::Director::Models
|
2
|
+
class IpAddress < Sequel::Model(Bosh::Director::Config.db)
|
3
|
+
many_to_one :instance
|
4
|
+
|
5
|
+
def validate
|
6
|
+
validates_presence :instance_id
|
7
|
+
validates_presence :task_id
|
8
|
+
validates_presence :address
|
9
|
+
validates_unique :address
|
10
|
+
end
|
11
|
+
|
12
|
+
def before_create
|
13
|
+
self.created_at ||= Time.now
|
14
|
+
end
|
15
|
+
|
16
|
+
def info
|
17
|
+
instance_info = "#{self.instance.deployment.name}.#{self.instance.job}/#{self.instance.index}"
|
18
|
+
formatted_ip = NetAddr::CIDR.create(self.address).ip
|
19
|
+
"#{instance_info} - #{self.network_name} - #{formatted_ip} (#{type})"
|
20
|
+
end
|
21
|
+
|
22
|
+
def type
|
23
|
+
self.static ? 'static' : 'dynamic'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Bosh::Director::Models
|
2
|
+
class OrphanDisk < Sequel::Model(Bosh::Director::Config.db)
|
3
|
+
one_to_many :orphan_snapshots
|
4
|
+
|
5
|
+
def validate
|
6
|
+
validates_presence [:disk_cid, :deployment_name, :instance_name]
|
7
|
+
validates_unique [:disk_cid]
|
8
|
+
end
|
9
|
+
|
10
|
+
def before_create
|
11
|
+
self.created_at ||= Time.now
|
12
|
+
end
|
13
|
+
|
14
|
+
def cloud_properties
|
15
|
+
result = self.cloud_properties_json
|
16
|
+
result ? Yajl::Parser.parse(result) : {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def cloud_properties=(cloud_properties)
|
20
|
+
self.cloud_properties_json = Yajl::Encoder.encode(cloud_properties)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Bosh::Director::Models
|
2
|
+
class OrphanSnapshot < Sequel::Model(Bosh::Director::Config.db)
|
3
|
+
many_to_one :orphan_disk
|
4
|
+
|
5
|
+
def validate
|
6
|
+
validates_presence [:snapshot_cid, :snapshot_created_at]
|
7
|
+
validates_unique [:snapshot_cid]
|
8
|
+
end
|
9
|
+
|
10
|
+
def before_create
|
11
|
+
self.created_at ||= Time.now
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -10,33 +10,56 @@ module Bosh::Director::Models
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def package_names
|
13
|
-
|
14
|
-
result ? Yajl::Parser.parse(result) : nil
|
13
|
+
object_or_nil(self.package_names_json)
|
15
14
|
end
|
16
15
|
|
17
16
|
def package_names=(packages)
|
18
|
-
self.package_names_json =
|
17
|
+
self.package_names_json = json_encode(packages)
|
19
18
|
end
|
20
19
|
|
21
20
|
def logs=(logs_spec)
|
22
|
-
self.logs_json =
|
21
|
+
self.logs_json = json_encode(logs_spec)
|
23
22
|
end
|
24
23
|
|
25
24
|
def logs
|
26
|
-
|
27
|
-
result ? Yajl::Parser.parse(result) : nil
|
25
|
+
object_or_nil(self.logs_json)
|
28
26
|
end
|
29
27
|
|
30
28
|
# @param [Object] property_spec Property spec from job spec
|
31
29
|
def properties=(property_spec)
|
32
|
-
self.properties_json =
|
30
|
+
self.properties_json = json_encode(property_spec)
|
33
31
|
end
|
34
32
|
|
35
33
|
# @return [Hash] Template properties (as provided in job spec)
|
36
34
|
# @return [nil] if no properties have been defined in job spec
|
37
35
|
def properties
|
38
|
-
|
39
|
-
|
36
|
+
object_or_nil(self.properties_json)
|
37
|
+
end
|
38
|
+
|
39
|
+
def requires=(requires_spec)
|
40
|
+
self.requires_json = json_encode(requires_spec)
|
41
|
+
end
|
42
|
+
|
43
|
+
def requires
|
44
|
+
object_or_nil(self.requires_json)
|
45
|
+
end
|
46
|
+
|
47
|
+
def provides=(provides_spec)
|
48
|
+
self.provides_json = json_encode(provides_spec)
|
49
|
+
end
|
50
|
+
|
51
|
+
def provides
|
52
|
+
object_or_nil(self.provides_json)
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def object_or_nil(value)
|
58
|
+
value ? Yajl::Parser.parse(value) : nil
|
59
|
+
end
|
60
|
+
|
61
|
+
def json_encode(value)
|
62
|
+
Yajl::Encoder.encode(value)
|
40
63
|
end
|
41
64
|
end
|
42
65
|
end
|
@@ -6,16 +6,10 @@ module Bosh::Director::Models
|
|
6
6
|
def validate
|
7
7
|
validates_presence [:deployment_id, :agent_id]
|
8
8
|
validates_unique :agent_id
|
9
|
-
|
10
|
-
end
|
11
|
-
|
12
|
-
def apply_spec
|
13
|
-
return nil if apply_spec_json.nil?
|
14
|
-
Yajl::Parser.parse(apply_spec_json)
|
15
9
|
end
|
16
10
|
|
17
|
-
def
|
18
|
-
|
11
|
+
def vm_exists?
|
12
|
+
!(cid.nil? || cid.empty?)
|
19
13
|
end
|
20
14
|
|
21
15
|
# @param [Hash] env_hash Environment hash
|
@@ -38,4 +32,7 @@ module Bosh::Director::Models
|
|
38
32
|
self.credentials_json = Yajl::Encoder.encode(spec)
|
39
33
|
end
|
40
34
|
end
|
35
|
+
|
36
|
+
Vm.plugin :association_dependencies
|
37
|
+
Vm.add_association_dependencies :instance => :nullify
|
41
38
|
end
|
@@ -1,130 +1,100 @@
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
2
|
-
|
3
1
|
module Bosh::Director
|
4
|
-
##
|
5
|
-
# Network resolution, either existing or one to be fulfilled by {Network}
|
6
2
|
class NetworkReservation
|
7
3
|
include IpUtil
|
8
4
|
|
9
|
-
|
10
|
-
DYNAMIC = :dynamic
|
5
|
+
attr_reader :ip, :instance, :network, :type
|
11
6
|
|
12
|
-
|
13
|
-
|
14
|
-
|
7
|
+
def initialize(instance, network)
|
8
|
+
@instance = instance
|
9
|
+
@network = network
|
10
|
+
@ip = nil
|
11
|
+
@reserved = false
|
12
|
+
end
|
15
13
|
|
16
|
-
|
17
|
-
|
14
|
+
def resolve_network(network)
|
15
|
+
@network = network
|
16
|
+
end
|
18
17
|
|
19
|
-
|
20
|
-
|
18
|
+
def reserved?
|
19
|
+
@reserved
|
20
|
+
end
|
21
21
|
|
22
|
-
|
23
|
-
|
22
|
+
def mark_reserved
|
23
|
+
@reserved = true
|
24
|
+
end
|
24
25
|
|
25
|
-
|
26
|
-
|
26
|
+
def static?
|
27
|
+
type == :static
|
28
|
+
end
|
27
29
|
|
28
|
-
def
|
29
|
-
|
30
|
+
def dynamic?
|
31
|
+
type == :dynamic
|
30
32
|
end
|
31
33
|
|
32
|
-
|
33
|
-
|
34
|
+
private
|
35
|
+
|
36
|
+
def formatted_ip
|
37
|
+
@ip.nil? ? nil : ip_to_netaddr(@ip).ip
|
34
38
|
end
|
39
|
+
end
|
35
40
|
|
36
|
-
|
37
|
-
|
38
|
-
# @param [Hash] options the options to create the reservation from
|
39
|
-
# @option options [Integer, String, NetAddr::CIDR] :ip reservation ip
|
40
|
-
# @option options [Symbol] :type reservation type
|
41
|
-
def initialize(options = {})
|
42
|
-
@ip = options[:ip]
|
43
|
-
@type = options[:type]
|
44
|
-
@reserved = false
|
45
|
-
@error = nil
|
41
|
+
class ExistingNetworkReservation < NetworkReservation
|
42
|
+
attr_reader :network_type
|
46
43
|
|
47
|
-
|
44
|
+
def initialize(instance, network, ip, network_type)
|
45
|
+
super(instance, network)
|
46
|
+
@ip = ip_to_i(ip) if ip
|
47
|
+
@network_type = network_type
|
48
48
|
end
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
def static?
|
53
|
-
@type == STATIC
|
50
|
+
def resolve_type(type)
|
51
|
+
@type = type
|
54
52
|
end
|
55
53
|
|
56
|
-
|
57
|
-
|
58
|
-
def dynamic?
|
59
|
-
@type == DYNAMIC
|
54
|
+
def desc
|
55
|
+
"existing reservation#{@ip.nil? ? '' : " with IP '#{formatted_ip}' for instance #{@instance}"}"
|
60
56
|
end
|
61
57
|
|
62
|
-
|
63
|
-
|
64
|
-
def reserved?
|
65
|
-
!!@reserved
|
66
|
-
end
|
67
|
-
|
68
|
-
##
|
69
|
-
# Tries to take the provided reservation if it meets the requirements
|
70
|
-
# @return [void]
|
71
|
-
def take(other)
|
72
|
-
if other.reserved?
|
73
|
-
if @type == other.type
|
74
|
-
if dynamic? || (static? && @ip == other.ip)
|
75
|
-
@ip = other.ip
|
76
|
-
@reserved = true
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
58
|
+
def to_s
|
59
|
+
"{ip=#{formatted_ip}, network=#{@network.name}, instance=#{@instance}, reserved=#{reserved?}, type=#{type}}"
|
80
60
|
end
|
61
|
+
end
|
81
62
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
# @raise [NetworkReservationAlreadyInUse]
|
86
|
-
# @raise [NetworkReservationWrongType]
|
87
|
-
# @raise [NetworkReservationNotEnoughCapacity]
|
88
|
-
# @raise [NetworkReservationError]
|
89
|
-
# @return void
|
90
|
-
def handle_error(origin)
|
91
|
-
if static?
|
92
|
-
case @error
|
93
|
-
when NetworkReservation::USED
|
94
|
-
raise NetworkReservationAlreadyInUse,
|
95
|
-
"#{origin} asked for a static IP #{formatted_ip} " +
|
96
|
-
"but it's already reserved/in use"
|
97
|
-
when NetworkReservation::WRONG_TYPE
|
98
|
-
raise NetworkReservationWrongType,
|
99
|
-
"#{origin} asked for a static IP #{formatted_ip} " +
|
100
|
-
"but it's in the dynamic pool"
|
101
|
-
else
|
102
|
-
raise NetworkReservationError,
|
103
|
-
"#{origin} failed to reserve static IP " +
|
104
|
-
"#{formatted_ip}: #{@error}"
|
105
|
-
end
|
106
|
-
else
|
107
|
-
case @error
|
108
|
-
when NetworkReservation::CAPACITY
|
109
|
-
raise NetworkReservationNotEnoughCapacity,
|
110
|
-
"#{origin} asked for a dynamic IP " +
|
111
|
-
"but there were no more available"
|
112
|
-
else
|
113
|
-
raise NetworkReservationError,
|
114
|
-
"#{origin} failed to reserve dynamic IP " +
|
115
|
-
"#{formatted_ip}: #{@error}"
|
116
|
-
end
|
117
|
-
end
|
63
|
+
class DesiredNetworkReservation < NetworkReservation
|
64
|
+
def self.new_dynamic(instance, network)
|
65
|
+
new(instance, network, nil, :dynamic)
|
118
66
|
end
|
119
67
|
|
120
|
-
def
|
121
|
-
|
68
|
+
def self.new_static(instance, network, ip)
|
69
|
+
new(instance, network, ip, :static)
|
122
70
|
end
|
123
71
|
|
124
|
-
|
72
|
+
def initialize(instance, network, ip, type)
|
73
|
+
@instance = instance
|
74
|
+
@network = network
|
75
|
+
@ip = ip_to_i(ip) if ip
|
76
|
+
@type = type
|
77
|
+
end
|
125
78
|
|
126
|
-
def
|
127
|
-
@ip
|
79
|
+
def resolve_ip(ip)
|
80
|
+
@ip = ip_to_i(ip)
|
81
|
+
end
|
82
|
+
|
83
|
+
def resolve_type(type)
|
84
|
+
if @type != type
|
85
|
+
raise NetworkReservationWrongType,
|
86
|
+
"IP '#{formatted_ip}' on network '#{@network.name}' does not belong to #{@type} pool"
|
87
|
+
end
|
88
|
+
|
89
|
+
@type = type
|
90
|
+
end
|
91
|
+
|
92
|
+
def desc
|
93
|
+
"#{type} reservation with IP '#{formatted_ip}' for instance #{@instance}"
|
94
|
+
end
|
95
|
+
|
96
|
+
def to_s
|
97
|
+
"{type=#{type}, ip=#{formatted_ip}, network=#{@network.name}, instance=#{@instance}}"
|
128
98
|
end
|
129
99
|
end
|
130
100
|
end
|