Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions jobs/director/monit
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,17 @@ check process director
<% (1..(p('director.workers'))).each do |index| %>
check process worker_<%= index %>
with pidfile /var/vcap/sys/run/director/worker_<%= index %>.pid
start program "/var/vcap/jobs/director/bin/worker_ctl start <%= index %>"
stop program "/var/vcap/jobs/director/bin/worker_ctl stop <%= index %>"
start program "/var/vcap/jobs/director/bin/worker_ctl start worker_<%= index %>"
stop program "/var/vcap/jobs/director/bin/worker_ctl stop worker_<%= index %>"
group vcap
depends on director
<% end %>

<% (1..(p('director.dynamic_disks_workers'))).each do |index| %>
check process dynamic_disks_worker_<%= index %>
with pidfile /var/vcap/sys/run/director/dynamic_disks_worker_<%= index %>.pid
start program "/var/vcap/jobs/director/bin/worker_ctl start dynamic_disks_worker_<%= index %> dynamic_disks"
stop program "/var/vcap/jobs/director/bin/worker_ctl stop dynamic_disks_worker_<%= index %> dynamic_disks"
group vcap
depends on director
<% end %>
Expand Down
3 changes: 3 additions & 0 deletions jobs/director/spec
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ properties:
director.workers:
description: Number of director workers
default: 3
director.dynamic_disks_workers:
description: Number of director workers dedicated for dynamic disks jobs
default: 0
director.enable_dedicated_status_worker:
description: "Separate worker for 'bosh vms' and 'bosh ssh'"
default: false
Expand Down
15 changes: 12 additions & 3 deletions jobs/director/templates/drain
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ mkdir -p $LOG_DIR
export BOSH_DIRECTOR_LOG_FILE=$LOG_DIR/drain.workers.stdout.log

stop_worker() {
pidfile=/var/vcap/sys/run/director/worker_$1.pid
pidfile=/var/vcap/sys/run/director/$1.pid

if [ -f "$pidfile" ] ; then
pid="$( cat "$pidfile" )"
Expand All @@ -33,16 +33,25 @@ stop_dedicated_worker () { stop_worker "$@"; }

<% (1..p('director.workers')).each do |index| %>
<% if index > dedicated_workers %>
stop_worker <%= index %>
stop_worker worker_<%= index %>
<% end %>
<% end %>

<% (1..p('director.dynamic_disks_workers')).each do |index| %>
stop_worker dynamic_disks_worker_<%= index %>
<% end %>

<% if dedicated_workers > 0 %>
/var/vcap/packages/director/bin/bosh-director-drain-workers -c /var/vcap/jobs/director/config/director.yml --queue normal \
2>>$LOG_DIR/drain.stderr.log

<% if p('director.dynamic_disks_workers') > 0 %>
/var/vcap/packages/director/bin/bosh-director-drain-workers -c /var/vcap/jobs/director/config/director.yml --queue dynamic_disks \
2>>$LOG_DIR/drain.stderr.log
<% end %>

<% (1..dedicated_workers).each do |index| %>
stop_dedicated_worker <%= index %>
stop_dedicated_worker worker_<%= index %>
<% end %>
<% end %>

Expand Down
2 changes: 1 addition & 1 deletion jobs/director/templates/ps_utils.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ function kill_process {
function list_child_processes {
ps -eo pid,command |
grep bosh-director-worker |
grep -- "-i $1" |
grep -- "-n $1" |
awk '{print $1}' |
grep -v ^$1$
}
16 changes: 8 additions & 8 deletions jobs/director/templates/worker_ctl.erb
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
#!/bin/bash

INDEX=$2
NAME=$2

RUN_DIR=/var/vcap/sys/run/director
LOG_DIR=/var/vcap/sys/log/director
PIDFILE=$RUN_DIR/worker_$INDEX.pid
PIDFILE=${RUN_DIR}/${NAME}.pid
RUNAS=vcap

# Postgres
Expand All @@ -25,9 +25,9 @@ export LANG=en_US.UTF-8

export TMPDIR=/var/vcap/data/director/tmp

export QUEUE="normal,urgent"
export QUEUE="${3:-normal,urgent}"
<% if (p('director.enable_dedicated_status_worker')) && (p('director.workers') > 1) %>
if [ $INDEX -eq 1 ]; then
if [ "${NAME}" = "worker_1" ]; then
export QUEUE="urgent"
fi
<% end %>
Expand All @@ -49,15 +49,15 @@ case $1 in

exec chpst -u $RUNAS:$RUNAS \
/var/vcap/packages/director/bin/bosh-director-worker \
-c /var/vcap/jobs/director/config/director.yml -i $INDEX \
>>$LOG_DIR/worker_$INDEX.stdout.log \
2>>$LOG_DIR/worker_$INDEX.stderr.log
-c /var/vcap/jobs/director/config/director.yml -n $NAME \
>>$LOG_DIR/${NAME}.stdout.log \
2>>$LOG_DIR/${NAME}.stderr.log
;;

stop)
PID=$(head -1 $PIDFILE)
kill_process $PID # prevent the parent from fork()ing new children
for CHILD in $(list_child_processes $INDEX); do
for CHILD in $(list_child_processes $NAME); do
kill_process $CHILD
done
rm -f $PIDFILE
Expand Down
65 changes: 58 additions & 7 deletions spec/director_templates_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -271,25 +271,52 @@
let(:rendered_template) { template.render(properties) }

let(:enable_dedicated_status_worker) { false }
let(:dynamic_disks_workers) { 0 }
let(:properties) do
properties = default_properties.dup
properties['director']['enable_dedicated_status_worker'] = enable_dedicated_status_worker
properties['director']['dynamic_disks_workers'] = dynamic_disks_workers
properties
end

it 'renders' do
expect(rendered_template).to match(/.+stop_worker 1.+stop_worker 2.+stop_worker 3/m)
expect(rendered_template).to include('bosh-director-drain-workers')
it 'renders to drain all jobs' do
expect(rendered_template).to match(/.+stop_worker worker_1.+stop_worker worker_2.+stop_worker worker_3/m)
expect(rendered_template).to include('bosh-director-drain-workers -c /var/vcap/jobs/director/config/director.yml')
expect(rendered_template).to_not include('--queue normal')
expect(rendered_template).to_not include('--queue dynamic_disks')
end

context 'dynamic disks workers' do
let(:dynamic_disks_workers) { 2 }

it 'renders to drain all jobs' do
expect(rendered_template).to match(/.+stop_worker worker_2.+stop_worker worker_3.+.+stop_worker dynamic_disks_worker_1.+stop_worker dynamic_disks_worker_2/m)

expect(rendered_template).to include('bosh-director-drain-workers -c /var/vcap/jobs/director/config/director.yml')
expect(rendered_template).to_not include('--queue normal')
expect(rendered_template).to_not include('--queue dynamic_disks')
end
end

context 'dedicated status workers' do
let(:enable_dedicated_status_worker) { true }

it 'renders' do
expect(rendered_template).to match(/.+stop_worker 2.+stop_worker 3.+stop_dedicated_worker 1/m)
it 'renders to drain normal jobs and then the rest' do
expect(rendered_template).to match(/.+stop_worker worker_2.+stop_worker worker_3.+stop_dedicated_worker worker_1/m)

expect(rendered_template).to include('bosh-director-drain-workers -c /var/vcap/jobs/director/config/director.yml --queue normal')
expect(rendered_template).to_not include('bosh-director-drain-workers -c /var/vcap/jobs/director/config/director.yml --queue dynamic_disks')
end

context 'dynamic disks workers' do
let(:dynamic_disks_workers) { 2 }

expect(rendered_template).to include('--queue normal')
expect(rendered_template).to include('bosh-director-drain-workers')
it 'renders to drain normal jobs, then dynamic_disks jobs and then the rest' do
expect(rendered_template).to match(/.+stop_worker worker_2.+stop_worker worker_3.+.+stop_worker dynamic_disks_worker_1.+stop_worker dynamic_disks_worker_2.+stop_dedicated_worker worker_1/m)

expect(rendered_template).to include('bosh-director-drain-workers -c /var/vcap/jobs/director/config/director.yml --queue normal')
expect(rendered_template).to include('bosh-director-drain-workers -c /var/vcap/jobs/director/config/director.yml --queue dynamic_disks')
end
end
end
end
Expand Down Expand Up @@ -438,6 +465,30 @@
end
end
end

describe 'worker_ctl' do
let(:template) { job.template('bin/worker_ctl') }
let(:rendered_template) { template.render(properties) }

let(:enable_dedicated_status_worker) { false }
let(:properties) do
properties = default_properties.dup
properties['director']['enable_dedicated_status_worker'] = enable_dedicated_status_worker
properties
end

it 'renders' do
expect(rendered_template).to include('export QUEUE="${3:-normal,urgent}"')
end

context 'dedicated status workers' do
let(:enable_dedicated_status_worker) { true }

it 'renders' do
expect(rendered_template).to include('export QUEUE="urgent"')
end
end
end
end
end

Expand Down
8 changes: 4 additions & 4 deletions spec/support/ps_utils_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ function test_kill_process {
function test_list_child_processes {
function ps {
cat <<EOF
21 ruby /var/vcap/packages/director/bin/bosh-director-worker -c /var/vcap/jobs/director/config/director.yml -i 1
22 ruby /var/vcap/packages/director/bin/bosh-director-worker -c /var/vcap/jobs/director/config/director.yml -i 2
23 ruby /var/vcap/packages/director/bin/bosh-director-worker -c /var/vcap/jobs/director/config/director.yml -i 2
21 ruby /var/vcap/packages/director/bin/bosh-director-worker -c /var/vcap/jobs/director/config/director.yml -n worker-1
22 ruby /var/vcap/packages/director/bin/bosh-director-worker -c /var/vcap/jobs/director/config/director.yml -n worker-2
23 ruby /var/vcap/packages/director/bin/bosh-director-worker -c /var/vcap/jobs/director/config/director.yml -n worker-2
1 init
EOF
}

CHILD_PID=$(list_child_processes 2)
CHILD_PID=$(list_child_processes worker-2)

if [ "$CHILD_PID" = "22
23" ]; then
Expand Down
10 changes: 5 additions & 5 deletions src/bosh-director/bin/bosh-director-worker
Original file line number Diff line number Diff line change
Expand Up @@ -6,32 +6,32 @@ require 'bosh/director/worker'
require 'bosh/director/config'

config_file = nil
index = nil
name = nil

begin
opts = OptionParser.new do |op|
op.on('-c', '--config [ARG]', 'Configuration File') do |opt|
config_file = opt
end

op.on('-i', '--index [ARG]', Integer, 'Worker Index') do |opt|
index = opt
op.on('-n', '--name [ARG]', 'Worker Name') do |opt|
name = opt
end
end

opts.parse!(ARGV.dup)

config_file ||= ::File.expand_path('../../config/bosh-director.yml', __FILE__)

Bosh::Director::Config.audit_filename = "audit_worker_#{index}.log"
Bosh::Director::Config.audit_filename = "audit_#{name}.log"

config = Bosh::Director::Config.load_file(config_file)

require 'ruby_shims/kernel_equals_tilde' if config.enable_pre_ruby_3_2_equal_tilde_behavior

config.db

worker = Bosh::Director::Worker.new(config, index)
worker = Bosh::Director::Worker.new(config, name)
worker.prep
worker.start
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
Sequel.migration do
up do
case adapter_scheme
when :postgres
create_table(:dynamic_disks) do
primary_key :id
foreign_key :deployment_id, :deployments, :null => false, :key => [:id]
foreign_key :vm_id, :vms, :key => [:id], :on_delete => :set_null
column :disk_cid, 'varchar(255)', :null => false
column :disk_hint_json, 'varchar(255)'
column :name, 'varchar(255)', :null => false
column :disk_pool_name, 'varchar(255)', :null => false
column :cpi, 'varchar(255)', :default => ''
column :size, 'integer', :null => false
column :metadata_json, 'text'
column :availability_zone, 'varchar(255)'
index [:name], :unique => true
end
when :mysql2
create_table(:dynamic_disks) do
primary_key :id
foreign_key :deployment_id, :deployments, :null => false, :key => [:id]
foreign_key :vm_id, :vms, :key => [:id], :on_delete => :set_null
column :disk_cid, 'varchar(255)', :null => false
column :disk_hint_json, 'varchar(255)'
column :name, 'varchar(255)', :null => false
column :disk_pool_name, 'varchar(255)', :null => false
column :cpi, 'varchar(255)', :default => ''
column :size, 'integer', :null => false
column :metadata_json, 'longtext'
column :availability_zone, 'varchar(255)'
index [:name], :unique => true
end
when :sqlite
create_table(:dynamic_disks) do
primary_key :id
foreign_key :deployment_id, :deployments, :null => false, :key => [:id]
foreign_key :vm_id, :vms, :key => [:id], :on_delete => :set_null
column :disk_cid, 'varchar(255)', :null => false
column :disk_hint_json, 'varchar(255)'
column :name, 'varchar(255)', :null => false
column :disk_pool_name, 'varchar(255)', :null => false
column :cpi, 'varchar(255)', :default => ''
column :size, 'integer', :null => false
column :metadata_json, 'TEXT'
column :availability_zone, 'varchar(255)'
index [:name], :unique => true
end
else
raise "Unknown adapter_scheme: #{adapter_scheme}"
end
end

down do
delete_table(:dynamic_disks)
end
end
5 changes: 5 additions & 0 deletions src/bosh-director/lib/bosh/director.rb
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ module Director
require 'bosh/director/instance_updater/state_applier'
require 'bosh/director/instance_updater/update_procedure'
require 'bosh/director/disk_manager'
require 'bosh/director/disk_deleter'
require 'bosh/director/orphan_disk_manager'
require 'bosh/director/orphan_network_manager'
require 'bosh/director/stopper'
Expand Down Expand Up @@ -229,6 +230,9 @@ module Director
require 'bosh/director/jobs/helpers'
require 'bosh/director/jobs/db_job'
require 'bosh/director/jobs/orphan_disk'
require 'bosh/director/jobs/dynamic_disks/provide_dynamic_disk'
require 'bosh/director/jobs/dynamic_disks/detach_dynamic_disk'
require 'bosh/director/jobs/dynamic_disks/delete_dynamic_disk'

require 'bosh/director/models/helpers/model_helper'

Expand All @@ -251,6 +255,7 @@ module Bosh::Director
require 'bosh/director/api/controllers/deployments_controller'
require 'bosh/director/api/controllers/disks_controller'
require 'bosh/director/api/controllers/director_controller'
require 'bosh/director/api/controllers/dynamic_disks_controller'
require 'bosh/director/api/controllers/networks_controller'
require 'bosh/director/api/controllers/orphan_disks_controller'
require 'bosh/director/api/controllers/orphaned_vms_controller'
Expand Down
8 changes: 8 additions & 0 deletions src/bosh-director/lib/bosh/director/agent_client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,14 @@ def remove_persistent_disk(*args)
safe_send_message(:remove_persistent_disk, *args)
end

def add_dynamic_disk(*args)
safe_send_message(:add_dynamic_disk, *args)
end

def remove_dynamic_disk(*args)
safe_send_message(:remove_dynamic_disk, *args)
end

def shutdown
fire_and_forget(:shutdown)
end
Expand Down
Loading
Loading