bosh-director 1.2682.1.0 → 1.2685.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/bin/bosh-director +55 -2
  3. data/lib/bosh/director.rb +15 -2
  4. data/lib/bosh/director/api/controllers/backups_controller.rb +2 -2
  5. data/lib/bosh/director/api/controllers/base_controller.rb +1 -1
  6. data/lib/bosh/director/api/controllers/compiled_packages_controller.rb +2 -2
  7. data/lib/bosh/director/api/controllers/deployments_controller.rb +40 -26
  8. data/lib/bosh/director/api/controllers/info_controller.rb +1 -1
  9. data/lib/bosh/director/api/controllers/locks_controller.rb +1 -1
  10. data/lib/bosh/director/api/controllers/packages_controller.rb +1 -1
  11. data/lib/bosh/director/api/controllers/releases_controller.rb +5 -5
  12. data/lib/bosh/director/api/controllers/resources_controller.rb +1 -1
  13. data/lib/bosh/director/api/controllers/resurrection_controller.rb +1 -1
  14. data/lib/bosh/director/api/controllers/stemcells_controller.rb +4 -4
  15. data/lib/bosh/director/api/controllers/task_controller.rb +20 -0
  16. data/lib/bosh/director/api/controllers/tasks_controller.rb +3 -18
  17. data/lib/bosh/director/api/controllers/users_controller.rb +3 -3
  18. data/lib/bosh/director/api/deployment_lookup.rb +1 -1
  19. data/lib/bosh/director/api/resource_manager.rb +1 -1
  20. data/lib/bosh/director/instance_updater/vm_updater.rb +2 -1
  21. data/lib/bosh/director/jobs/cloud_check/scan.rb +1 -1
  22. data/lib/bosh/director/jobs/cloud_check/scan_and_fix.rb +1 -1
  23. data/lib/bosh/director/problem_handlers/missing_disk.rb +74 -0
  24. data/lib/bosh/director/problem_scanner/disk_scan_stage.rb +80 -0
  25. data/lib/bosh/director/problem_scanner/problem_register.rb +55 -0
  26. data/lib/bosh/director/problem_scanner/scanner.rb +86 -0
  27. data/lib/bosh/director/problem_scanner/vm_scan_stage.rb +134 -0
  28. data/lib/bosh/director/version.rb +1 -1
  29. data/lib/cloud/dummy.rb +9 -0
  30. metadata +29 -26
  31. data/lib/bosh/director/api/controller.rb +0 -33
  32. data/lib/bosh/director/api/controllers/errands_controller.rb +0 -26
  33. data/lib/bosh/director/problem_scanner.rb +0 -268
@@ -0,0 +1,134 @@
1
+ module Bosh::Director
2
+ class ProblemScanner::VmScanStage
3
+
4
+ AGENT_TIMEOUT_IN_SECONDS = 10
5
+
6
+ attr_reader :agent_disks
7
+
8
+ def initialize(instance_manager, problem_register, cloud, deployment, event_logger, logger)
9
+ @instance_manager = instance_manager
10
+ @problem_register = problem_register
11
+ @cloud = cloud
12
+ @deployment = deployment
13
+ @event_logger = event_logger
14
+ @logger = logger
15
+ @agent_disks = {}
16
+ end
17
+
18
+ def scan(vms=nil)
19
+ if vms
20
+ vm_list = []
21
+ vms.each do |job, index|
22
+ instance = @instance_manager.find_by_name(@deployment.name, job, index)
23
+ vm_list << instance.vm
24
+ end
25
+ vms = vm_list
26
+ else
27
+ vms = Models::Vm.eager(:instance).filter(deployment: @deployment).all
28
+ end
29
+
30
+ @event_logger.begin_stage("Scanning #{vms.size} VMs", 2)
31
+ results = Hash.new(0)
32
+ lock = Mutex.new
33
+
34
+ @event_logger.track_and_log('Checking VM states') do
35
+ ThreadPool.new(max_threads: Config.max_threads).wrap do |pool|
36
+ vms.each do |vm|
37
+ pool.process do
38
+ scan_result = scan_vm(vm)
39
+ lock.synchronize { results[scan_result] += 1 }
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ @event_logger.track_and_log("#{results[:ok]} OK, " +
46
+ "#{results[:unresponsive]} unresponsive, " +
47
+ "#{results[:missing]} missing, " +
48
+ "#{results[:unbound]} unbound, " +
49
+ "#{results[:out_of_sync]} out of sync")
50
+ end
51
+
52
+ private
53
+
54
+ def scan_vm(vm)
55
+ agent_options = {
56
+ timeout: AGENT_TIMEOUT_IN_SECONDS,
57
+ retry_methods: {get_state: 0}
58
+ }
59
+
60
+ instance, mounted_disk_cid = @problem_register.get_vm_instance_and_disk(vm)
61
+
62
+ agent = AgentClient.with_defaults(vm.agent_id, agent_options)
63
+ begin
64
+ state = agent.get_state
65
+
66
+ # gather mounted disk info. (used by scan_disk)
67
+ begin
68
+ disk_list = agent.list_disk
69
+ mounted_disk_cid = disk_list.first
70
+ rescue Bosh::Director::RpcTimeout
71
+ mounted_disk_cid = nil
72
+ rescue RuntimeError
73
+ # For old agents that doesn't implement list_disk we assume the disk is mounted
74
+ @logger.info("agent.list_disk failed on agent #{vm.agent_id}")
75
+ end
76
+ add_disk_owner(mounted_disk_cid, vm.cid) if mounted_disk_cid
77
+
78
+ return :out_of_sync if is_out_of_sync_vm?(vm, instance, state)
79
+ return :unbound if is_unbound_instance_vm?(vm, instance, state)
80
+ :ok
81
+ rescue Bosh::Director::RpcTimeout
82
+ # We add the disk to avoid a duplicate problem when timeouts fetching agent status (unresponsive_agent and
83
+ # mount_info_mismatch)
84
+ add_disk_owner(mounted_disk_cid, vm.cid) if mounted_disk_cid
85
+
86
+ begin
87
+ unless @cloud.has_vm?(vm.cid)
88
+ @logger.info("Missing VM #{vm.cid}")
89
+ @problem_register.problem_found(:missing_vm, vm)
90
+ return :missing
91
+ end
92
+ rescue Bosh::Clouds::NotImplemented
93
+ end
94
+
95
+ @logger.info("Found unresponsive agent #{vm.agent_id}")
96
+ @problem_register.problem_found(:unresponsive_agent, vm)
97
+ :unresponsive
98
+ end
99
+ end
100
+
101
+ def add_disk_owner(disk_cid, vm_cid)
102
+ @agent_disks[disk_cid] ||= []
103
+ @agent_disks[disk_cid] << vm_cid
104
+ end
105
+
106
+ def is_out_of_sync_vm?(vm, instance, state)
107
+ job = state['job'] ? state['job']['name'] : nil
108
+ index = state['index']
109
+ if state['deployment'] != @deployment.name ||
110
+ (instance && (instance.job != job || instance.index != index))
111
+ @problem_register.problem_found(:out_of_sync_vm, vm,
112
+ deployment: state['deployment'],
113
+ job: job, index: index)
114
+ true
115
+ else
116
+ false
117
+ end
118
+ end
119
+
120
+ def is_unbound_instance_vm?(vm, instance, state)
121
+ job = state['job'] ? state['job']['name'] : nil
122
+ index = state['index']
123
+ if job && !instance
124
+ @logger.info("Found unbound VM #{vm.agent_id}")
125
+
126
+ @problem_register.problem_found(:unbound_instance_vm, vm,
127
+ job: job, index: index)
128
+ true
129
+ else
130
+ false
131
+ end
132
+ end
133
+ end
134
+ end
@@ -1,5 +1,5 @@
1
1
  module Bosh
2
2
  module Director
3
- VERSION = '1.2682.1.0'
3
+ VERSION = '1.2685.0'
4
4
  end
5
5
  end
data/lib/cloud/dummy.rb CHANGED
@@ -84,6 +84,10 @@ module Bosh
84
84
  File.exists?(vm_file(vm_id))
85
85
  end
86
86
 
87
+ def has_disk?(disk_id)
88
+ File.exists?(disk_file(disk_id))
89
+ end
90
+
87
91
  def configure_networks(vm_id, networks)
88
92
  cmd = commands.next_configure_networks_cmd(vm_id)
89
93
 
@@ -146,6 +150,11 @@ module Bosh
146
150
  Dir.glob(File.join(@running_vms_dir, '*')).map { |vm| File.basename(vm) }.shuffle
147
151
  end
148
152
 
153
+ def disk_cids
154
+ # Shuffle so that no one relies on the order of disks
155
+ Dir.glob(disk_file('*')).map { |disk| File.basename(disk) }.shuffle
156
+ end
157
+
149
158
  def kill_agents
150
159
  vm_cids.each do |agent_pid|
151
160
  begin
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bosh-director
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2682.1.0
4
+ version: 1.2685.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - VMware
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-25 00:00:00.000000000 Z
11
+ date: 2014-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bcrypt-ruby
@@ -30,140 +30,140 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.2682.1.0
33
+ version: 1.2685.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.2682.1.0
40
+ version: 1.2685.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bosh-core
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.2682.1.0
47
+ version: 1.2685.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.2682.1.0
54
+ version: 1.2685.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bosh-director-core
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 1.2682.1.0
61
+ version: 1.2685.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 1.2682.1.0
68
+ version: 1.2685.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bosh_common
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 1.2682.1.0
75
+ version: 1.2685.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 1.2682.1.0
82
+ version: 1.2685.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: bosh-template
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 1.2682.1.0
89
+ version: 1.2685.0
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 1.2682.1.0
96
+ version: 1.2685.0
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: bosh_cpi
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 1.2682.1.0
103
+ version: 1.2685.0
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 1.2682.1.0
110
+ version: 1.2685.0
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: bosh_openstack_cpi
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 1.2682.1.0
117
+ version: 1.2685.0
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 1.2682.1.0
124
+ version: 1.2685.0
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: bosh_aws_cpi
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 1.2682.1.0
131
+ version: 1.2685.0
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 1.2682.1.0
138
+ version: 1.2685.0
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: bosh_vsphere_cpi
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: 1.2682.1.0
145
+ version: 1.2685.0
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: 1.2682.1.0
152
+ version: 1.2685.0
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: bosh_warden_cpi
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: 1.2682.1.0
159
+ version: 1.2685.0
160
160
  type: :runtime
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: 1.2682.1.0
166
+ version: 1.2685.0
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: bosh_vcloud_cpi
169
169
  requirement: !ruby/object:Gem::Requirement
@@ -460,7 +460,7 @@ dependencies:
460
460
  version: '0'
461
461
  description: |-
462
462
  BOSH Director
463
- 93a782
463
+ 989d8b
464
464
  email: support@cloudfoundry.com
465
465
  executables:
466
466
  - bosh-director
@@ -518,13 +518,11 @@ files:
518
518
  - lib/bosh/director/api/api_helper.rb
519
519
  - lib/bosh/director/api/backup_manager.rb
520
520
  - lib/bosh/director/api/compiled_package_group_manager.rb
521
- - lib/bosh/director/api/controller.rb
522
521
  - lib/bosh/director/api/controller_helpers.rb
523
522
  - lib/bosh/director/api/controllers/backups_controller.rb
524
523
  - lib/bosh/director/api/controllers/base_controller.rb
525
524
  - lib/bosh/director/api/controllers/compiled_packages_controller.rb
526
525
  - lib/bosh/director/api/controllers/deployments_controller.rb
527
- - lib/bosh/director/api/controllers/errands_controller.rb
528
526
  - lib/bosh/director/api/controllers/info_controller.rb
529
527
  - lib/bosh/director/api/controllers/locks_controller.rb
530
528
  - lib/bosh/director/api/controllers/packages_controller.rb
@@ -532,6 +530,7 @@ files:
532
530
  - lib/bosh/director/api/controllers/resources_controller.rb
533
531
  - lib/bosh/director/api/controllers/resurrection_controller.rb
534
532
  - lib/bosh/director/api/controllers/stemcells_controller.rb
533
+ - lib/bosh/director/api/controllers/task_controller.rb
535
534
  - lib/bosh/director/api/controllers/tasks_controller.rb
536
535
  - lib/bosh/director/api/controllers/users_controller.rb
537
536
  - lib/bosh/director/api/deployment_lookup.rb
@@ -681,13 +680,17 @@ files:
681
680
  - lib/bosh/director/problem_handlers/base.rb
682
681
  - lib/bosh/director/problem_handlers/inactive_disk.rb
683
682
  - lib/bosh/director/problem_handlers/invalid_problem.rb
683
+ - lib/bosh/director/problem_handlers/missing_disk.rb
684
684
  - lib/bosh/director/problem_handlers/missing_vm.rb
685
685
  - lib/bosh/director/problem_handlers/mount_info_mismatch.rb
686
686
  - lib/bosh/director/problem_handlers/out_of_sync_vm.rb
687
687
  - lib/bosh/director/problem_handlers/unbound_instance_vm.rb
688
688
  - lib/bosh/director/problem_handlers/unresponsive_agent.rb
689
689
  - lib/bosh/director/problem_resolver.rb
690
- - lib/bosh/director/problem_scanner.rb
690
+ - lib/bosh/director/problem_scanner/disk_scan_stage.rb
691
+ - lib/bosh/director/problem_scanner/problem_register.rb
692
+ - lib/bosh/director/problem_scanner/scanner.rb
693
+ - lib/bosh/director/problem_scanner/vm_scan_stage.rb
691
694
  - lib/bosh/director/rendered_job_templates_cleaner.rb
692
695
  - lib/bosh/director/resource_pool_updater.rb
693
696
  - lib/bosh/director/scheduler.rb
@@ -1,33 +0,0 @@
1
- require 'bosh/director/api/controllers/backups_controller'
2
- require 'bosh/director/api/controllers/deployments_controller'
3
- require 'bosh/director/api/controllers/packages_controller'
4
- require 'bosh/director/api/controllers/info_controller'
5
- require 'bosh/director/api/controllers/releases_controller'
6
- require 'bosh/director/api/controllers/resources_controller'
7
- require 'bosh/director/api/controllers/resurrection_controller'
8
- require 'bosh/director/api/controllers/stemcells_controller'
9
- require 'bosh/director/api/controllers/tasks_controller'
10
- require 'bosh/director/api/controllers/users_controller'
11
- require 'bosh/director/api/controllers/compiled_packages_controller'
12
- require 'bosh/director/api/controllers/errands_controller'
13
- require 'bosh/director/api/controllers/locks_controller'
14
-
15
- module Bosh::Director
16
- module Api
17
- class Controller < Sinatra::Base
18
- use Controllers::BackupsController
19
- use Controllers::DeploymentsController
20
- use Controllers::InfoController
21
- use Controllers::PackagesController
22
- use Controllers::ReleasesController
23
- use Controllers::ResourcesController
24
- use Controllers::ResurrectionController
25
- use Controllers::StemcellsController
26
- use Controllers::TasksController
27
- use Controllers::UsersController
28
- use Controllers::CompiledPackagesController
29
- use Controllers::ErrandsController
30
- use Controllers::LocksController
31
- end
32
- end
33
- end
@@ -1,26 +0,0 @@
1
- require 'json'
2
- require 'bosh/director/api/controllers/base_controller'
3
-
4
- module Bosh::Director
5
- module Api::Controllers
6
- class ErrandsController < BaseController
7
- post '/deployments/:deployment_name/errands/:errand_name/runs' do
8
- deployment_name = params[:deployment_name]
9
- errand_name = params[:errand_name]
10
-
11
- task = JobQueue.new.enqueue(
12
- @user,
13
- Jobs::RunErrand,
14
- "run errand #{errand_name} from deployment #{deployment_name}",
15
- [deployment_name, errand_name],
16
- )
17
-
18
- redirect "/tasks/#{task.id}"
19
- end
20
-
21
- def body_params
22
- @body_params ||= JSON.load(request.body)
23
- end
24
- end
25
- end
26
- end