From ab95e0b2b6a8d1a988c5246cbe80e38b3c0766ea Mon Sep 17 00:00:00 2001 From: Matthew Kocher Date: Mon, 13 Jul 2026 17:00:31 -0700 Subject: [PATCH] make bpm optional When system-metrics-release is deployed as an add on requiring bpm is problematic as the version of bpm in the add on must exactly match the version in the deployment manifest. Making it optional for now, allowing for a transition period. --- jobs/loggr-system-metrics-agent/monit | 8 +++ jobs/loggr-system-metrics-agent/spec | 8 +++ .../templates/ctl.erb | 68 +++++++++++++++++++ spec/jobs/loggr_system_metrics_agent_spec.rb | 38 +++++++++++ 4 files changed, 122 insertions(+) create mode 100644 jobs/loggr-system-metrics-agent/templates/ctl.erb diff --git a/jobs/loggr-system-metrics-agent/monit b/jobs/loggr-system-metrics-agent/monit index 472a0d81..7487dc98 100644 --- a/jobs/loggr-system-metrics-agent/monit +++ b/jobs/loggr-system-metrics-agent/monit @@ -1,7 +1,15 @@ <% if p("enabled") %> +<% if p("use_bpm") %> check process loggr-system-metrics-agent with pidfile /var/vcap/sys/run/bpm/loggr-system-metrics-agent/loggr-system-metrics-agent.pid start program "/var/vcap/jobs/bpm/bin/bpm start loggr-system-metrics-agent" stop program "/var/vcap/jobs/bpm/bin/bpm stop loggr-system-metrics-agent" group vcap +<% else %> +check process system-metrics-agent + with pidfile /var/vcap/sys/run/system-metrics-agent/system-metrics-agent.pid + start program "/var/vcap/jobs/loggr-system-metrics-agent/bin/ctl start" + stop program "/var/vcap/jobs/loggr-system-metrics-agent/bin/ctl stop" + group vcap +<% end %> <% end %> diff --git a/jobs/loggr-system-metrics-agent/spec b/jobs/loggr-system-metrics-agent/spec index b23e64ab..47724832 100644 --- a/jobs/loggr-system-metrics-agent/spec +++ b/jobs/loggr-system-metrics-agent/spec @@ -3,6 +3,7 @@ name: loggr-system-metrics-agent templates: bpm.yml.erb: config/bpm.yml + ctl.erb: bin/ctl system_metrics_agent_ca.crt.erb: config/certs/system_metrics_agent_ca.crt system_metrics_agent.crt.erb: config/certs/system_metrics_agent.crt system_metrics_agent.key.erb: config/certs/system_metrics_agent.key @@ -40,3 +41,10 @@ properties: description: "TLS certificate for system metrics agent signed by the loggregator CA" key: description: "TLS private key for system metrics agent signed by the loggregator CA" + + use_bpm: + description: > + When true, run this job under BPM. BPM is required on Resolute Raccoon + stemcells; support for running without BPM will be removed in a future + version. + default: false diff --git a/jobs/loggr-system-metrics-agent/templates/ctl.erb b/jobs/loggr-system-metrics-agent/templates/ctl.erb new file mode 100644 index 00000000..6b231709 --- /dev/null +++ b/jobs/loggr-system-metrics-agent/templates/ctl.erb @@ -0,0 +1,68 @@ +#!/bin/bash -e +<% + deployment = spec.deployment + job = spec.job.name + index = spec.id || spec.index.to_s + ip = spec.ip +%> + +RUN_DIR=/var/vcap/sys/run/system-metrics-agent +LOG_DIR=/var/vcap/sys/log/system-metrics-agent +PIDFILE=$RUN_DIR/system-metrics-agent.pid + +mkdir -p $RUN_DIR +mkdir -p $LOG_DIR + +case $1 in + + start) + set +e + killall -15 system-metrics-agent + killall -9 system-metrics-agent + killall -2 system-metrics-agent + killall -3 system-metrics-agent + set -e + + exec >>$LOG_DIR/system-metrics-agent.stdout.log \ + 2>>$LOG_DIR/system-metrics-agent.stderr.log + + chown -R vcap:vcap $LOG_DIR + + SAMPLE_INTERVAL=<%= p('sample_interval') %> \ + METRIC_PORT=<%= p('metrics_port') %> \ + DEBUG_PORT=<%= p('debug_port') %> \ + DEPLOYMENT=<%= deployment %> \ + JOB=<%= job %> \ + INDEX=<%= index %> \ + IP=<%= ip %> \ + LIMITED_METRICS=<%= p('bosh_metrics_forwarder_metrics_only') %> \ + CA_CERT_PATH="/var/vcap/jobs/loggr-system-metrics-agent/config/certs/system_metrics_agent_ca.crt" \ + CERT_PATH="/var/vcap/jobs/loggr-system-metrics-agent/config/certs/system_metrics_agent.crt" \ + KEY_PATH="/var/vcap/jobs/loggr-system-metrics-agent/config/certs/system_metrics_agent.key" \ + chpst -u vcap:vcap /var/vcap/packages/system-metrics-agent/system-metrics-agent & + + echo $! > $PIDFILE + + ;; + + stop) + echo "$(date "+%Y/%m/%d %T") attempting to stop system-metrics-agent" >> $LOG_DIR/system-metrics-agent.stderr.log + exec 2>>$LOG_DIR/system-metrics-agent.stderr.log + + kill "$(cat $PIDFILE)" + set +e + echo "$(date "+%Y/%m/%d %T") additional killall for system-metrics-agent: errors expected" >> $LOG_DIR/system-metrics-agent.stderr.log + killall -15 system-metrics-agent + killall -9 system-metrics-agent + killall -2 system-metrics-agent + killall -3 system-metrics-agent + set -e + + ;; + + *) + echo "Usage: ctl {start|stop}" + + ;; + +esac diff --git a/spec/jobs/loggr_system_metrics_agent_spec.rb b/spec/jobs/loggr_system_metrics_agent_spec.rb index 8316bbce..1d29c31f 100644 --- a/spec/jobs/loggr_system_metrics_agent_spec.rb +++ b/spec/jobs/loggr_system_metrics_agent_spec.rb @@ -1,6 +1,12 @@ require 'bosh/template/test' require 'yaml' +def render_system_metrics_monit(properties = {}) + job_dir = File.join(File.dirname(__FILE__), '../../jobs/loggr-system-metrics-agent') + spec = YAML.safe_load(File.read(File.join(job_dir, 'spec'))) + Bosh::Template::Test::Template.new(spec, File.join(job_dir, 'monit')).render(properties) +end + describe 'loggr-system-metrics-agent' do let(:release) { Bosh::Template::Test::ReleaseDir.new(File.join(File.dirname(__FILE__), '../..')) } let(:job) { release.job('loggr-system-metrics-agent') } @@ -34,4 +40,36 @@ expect(process['env']['SAMPLE_INTERVAL']).to eq('15s') end end + + describe 'monit' do + context 'when enabled is true (default) and use_bpm is false (default)' do + let(:rendered) { render_system_metrics_monit({}) } + + it 'uses the ctl script pidfile and start/stop programs' do + expect(rendered).to include('with pidfile /var/vcap/sys/run/system-metrics-agent/system-metrics-agent.pid') + expect(rendered).to include('start program "/var/vcap/jobs/loggr-system-metrics-agent/bin/ctl start"') + expect(rendered).to include('stop program "/var/vcap/jobs/loggr-system-metrics-agent/bin/ctl stop"') + expect(rendered).not_to include('/var/vcap/jobs/bpm/bin/bpm') + end + end + + context 'when enabled is true and use_bpm is true' do + let(:rendered) { render_system_metrics_monit({'use_bpm' => true}) } + + it 'uses the bpm pidfile and start/stop programs' do + expect(rendered).to include('with pidfile /var/vcap/sys/run/bpm/loggr-system-metrics-agent/loggr-system-metrics-agent.pid') + expect(rendered).to include('start program "/var/vcap/jobs/bpm/bin/bpm start loggr-system-metrics-agent"') + expect(rendered).to include('stop program "/var/vcap/jobs/bpm/bin/bpm stop loggr-system-metrics-agent"') + expect(rendered).not_to include('/bin/ctl') + end + end + + context 'when enabled is false' do + let(:rendered) { render_system_metrics_monit({'enabled' => false}) } + + it 'renders an empty monit file' do + expect(rendered.strip).to be_empty + end + end + end end