Skip to content

Commit 3423777

Browse files
committed
Refactor and modularize run_cd4pe_job task
Moved helper classes (Logger, GZipHelper, CD4PEClient, CD4PEJobRunner) into separate files under tasks/run_cd4pe_job/. Updated specs to use new module/class structure and file paths. Improved code organisation, encapsulation, and test maintainability. Updated run_cd4pe_job.json to include the new files directory. Fixed UTF-8 handling in `RunCD4PEJob::CD4PEJobRunner.run_system_cmd`.
1 parent 67b4410 commit 3423777

File tree

9 files changed

+847
-744
lines changed

9 files changed

+847
-744
lines changed
Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,32 @@
22
require 'base64'
33
require 'json'
44
require 'fileutils'
5-
require_relative '../tasks/run_cd4pe_job.rb'
5+
require_relative '../../tasks/run_cd4pe_job.rb'
66

77
describe 'run_cd4pe_job' do
88
before(:all) do
9-
@logger = Logger.new
9+
@logger = RunCD4PEJob::Logger.new
1010
end
1111

1212
before(:each) do
13-
@working_dir = File.join(Dir.getwd, "test_working_dir")
13+
@working_dir = File.join(Dir.getwd, 'test_working_dir')
1414
Dir.mkdir(@working_dir)
1515

1616
# Ensure tests don't write to /etc/containers/certs.d
17-
@certs_dir = File.join(@working_dir, "certs.d")
18-
CD4PEJobRunner.send(:remove_const, :DOCKER_CERTS)
19-
CD4PEJobRunner.const_set(:DOCKER_CERTS, @certs_dir)
17+
@certs_dir = File.join(@working_dir, 'certs.d')
18+
RunCD4PEJob::CD4PEJobRunner.send(:remove_const, :DOCKER_CERTS)
19+
RunCD4PEJob::CD4PEJobRunner.const_set(:DOCKER_CERTS, @certs_dir)
2020

2121
@web_ui_endpoint = 'https://testtest.com'
2222
@job_token = 'alksjdbhfnadhsbf'
2323
@job_owner = 'carls cool carl'
2424
@job_instance_id = '17'
2525
@secrets = {
26-
secret1: "hello",
27-
secret2: "friend",
26+
secret1: 'hello',
27+
secret2: 'friend',
2828
}
2929
@windows_job = ENV['RUN_WINDOWS_UNIT_TESTS']
30+
@cd4pe_client = nil
3031
end
3132

3233
after(:each) do
@@ -37,59 +38,56 @@
3738
describe 'cd4pe_job_helper::get_runtime' do
3839
it 'Detects docker as the available runtime.' do
3940
test_container_image = 'puppetlabs/test:10.0.1'
40-
job_helper = CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, job_token: @job_token, web_ui_endpoint: @web_ui_endpoint, job_owner: @job_owner, job_instance_id: @job_instance_id, logger: @logger, secrets: @secrets)
41-
expect(job_helper.get_runtime).to eq('docker')
41+
job_helper = RunCD4PEJob::CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, job_owner: @job_owner, job_instance_id: @job_instance_id,
42+
logger: @logger, secrets: @secrets, cd4pe_client: @cd4pe_client)
43+
expect(job_helper.send(:get_runtime)).to eq('docker')
4244
end
4345
end
4446

4547
describe 'cd4pe_job_helper::update_container_image' do
4648
let(:test_container_image) { 'puppetlabs/test:10.0.1' }
49+
4750
it 'Generates a docker pull command.' do
48-
job_helper = CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, job_token: @job_token, web_ui_endpoint: @web_ui_endpoint, job_owner: @job_owner, job_instance_id: @job_instance_id, logger: @logger, secrets: @secrets)
49-
docker_pull_command = job_helper.get_image_pull_cmd
51+
job_helper = RunCD4PEJob::CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, job_owner: @job_owner, job_instance_id: @job_instance_id,
52+
logger: @logger, secrets: @secrets, cd4pe_client: @cd4pe_client)
53+
docker_pull_command = job_helper.send(:get_image_pull_cmd)
5054
expect(docker_pull_command).to eq("docker pull #{test_container_image}")
5155
end
5256

5357
context 'with config' do
5458
let(:hostname) { 'host1' }
55-
let(:creds_json) { {auths: {hostname => {}}}.to_json }
59+
let(:creds_json) { { auths: { hostname => {} } }.to_json }
5660
let(:creds_b64) { Base64.encode64(creds_json) }
5761
let(:cert_txt) { 'junk' }
5862
let(:cert_b64) { Base64.encode64(cert_txt) }
5963

6064
it 'Uses config when present for docker.' do
61-
job_helper = CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, image_pull_creds: creds_b64, job_token: @job_token, web_ui_endpoint: @web_ui_endpoint, job_owner: @job_owner, job_instance_id: @job_instance_id, logger: @logger, secrets: @secrets)
65+
job_helper = RunCD4PEJob::CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, image_pull_creds: creds_b64, job_owner: @job_owner,
66+
job_instance_id: @job_instance_id, logger: @logger, secrets: @secrets, cd4pe_client: @cd4pe_client)
6267
config_json = File.join(@working_dir, '.docker', 'config.json')
6368
expect(File.exist?(config_json)).to be(true)
6469
expect(File.read(config_json)).to eq(creds_json)
6570

66-
docker_pull_command = job_helper.get_image_pull_cmd
71+
docker_pull_command = job_helper.send(:get_image_pull_cmd)
6772
expect(docker_pull_command).to eq("docker --config #{File.join(@working_dir, '.docker')} pull #{test_container_image}")
6873
end
69-
70-
it 'Registers the CA cert when provided.' do
71-
job_helper = CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, image_pull_creds: creds_b64, base_64_ca_cert: cert_b64, job_token: @job_token, web_ui_endpoint: @web_ui_endpoint, job_owner: @job_owner, job_instance_id: @job_instance_id, logger: @logger, secrets: @secrets)
72-
73-
cert_file = File.join(@certs_dir, hostname, 'ca.crt')
74-
expect(File.exist?(cert_file)).to be(true)
75-
expect(File.read(cert_file)).to eq(cert_txt)
76-
end
7774
end
7875
end
7976

8077
describe 'cd4pe_job_helper::get_container_run_cmd' do
8178
it 'Generates the correct docker run command.' do
82-
test_manifest_type = "AFTER_JOB_SUCCESS"
79+
test_manifest_type = 'AFTER_JOB_SUCCESS'
8380
test_container_image = 'puppetlabs/test:10.0.1'
8481
arg1 = '--testarg=woot'
8582
arg2 = '--otherarg=hello'
8683
arg3 = '--whatever=doesntmatter'
8784
user_specified_container_run_args = [arg1, arg2, arg3]
8885
job_type = 'unix'
8986

90-
job_helper = CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, container_run_args: user_specified_container_run_args, job_token: @job_token, web_ui_endpoint: @web_ui_endpoint, job_owner: @job_owner, job_instance_id: @job_instance_id, logger: @logger, secrets: @secrets)
87+
job_helper = RunCD4PEJob::CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, container_run_args: user_specified_container_run_args,
88+
job_owner: @job_owner, job_instance_id: @job_instance_id, logger: @logger, secrets: @secrets, cd4pe_client: @cd4pe_client)
9189

92-
docker_run_command = job_helper.get_container_run_cmd(test_manifest_type)
90+
docker_run_command = job_helper.send(:get_container_run_cmd, test_manifest_type)
9391
cmd_parts = docker_run_command.split(' ')
9492

9593
expect(cmd_parts[0]).to eq('docker')
@@ -110,4 +108,4 @@
110108
expect(cmd_parts[15]).to eq('"/cd4pe_job/AFTER_JOB_SUCCESS"')
111109
end
112110
end
113-
end
111+
end
Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,32 @@
22
require 'base64'
33
require 'json'
44
require 'fileutils'
5-
require_relative '../tasks/run_cd4pe_job.rb'
5+
require_relative '../../tasks/run_cd4pe_job.rb'
66

77
describe 'run_cd4pe_job' do
88
before(:all) do
9-
@logger = Logger.new
9+
@logger = RunCD4PEJob::Logger.new
1010
end
1111

1212
before(:each) do
13-
@working_dir = File.join(Dir.getwd, "test_working_dir")
13+
@working_dir = File.join(Dir.getwd, 'test_working_dir')
1414
Dir.mkdir(@working_dir)
1515

1616
# Ensure tests don't write to /etc/containers/certs.d
17-
@certs_dir = File.join(@working_dir, "certs.d")
18-
CD4PEJobRunner.send(:remove_const, :PODMAN_CERTS)
19-
CD4PEJobRunner.const_set(:PODMAN_CERTS, @certs_dir)
17+
@certs_dir = File.join(@working_dir, 'certs.d')
18+
RunCD4PEJob::CD4PEJobRunner.send(:remove_const, :PODMAN_CERTS)
19+
RunCD4PEJob::CD4PEJobRunner.const_set(:PODMAN_CERTS, @certs_dir)
2020

2121
@web_ui_endpoint = 'https://testtest.com'
2222
@job_token = 'alksjdbhfnadhsbf'
2323
@job_owner = 'carls cool carl'
2424
@job_instance_id = '17'
2525
@secrets = {
26-
secret1: "hello",
27-
secret2: "friend",
26+
secret1: 'hello',
27+
secret2: 'friend',
2828
}
2929
@windows_job = ENV['RUN_WINDOWS_UNIT_TESTS']
30+
@cd4pe_client = nil
3031
end
3132

3233
after(:each) do
@@ -37,59 +38,56 @@
3738
describe 'cd4pe_job_helper::get_runtime' do
3839
it 'Detects podman as the available runtime.' do
3940
test_container_image = 'puppetlabs/test:10.0.1'
40-
job_helper = CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, job_token: @job_token, web_ui_endpoint: @web_ui_endpoint, job_owner: @job_owner, job_instance_id: @job_instance_id, logger: @logger, secrets: @secrets)
41-
expect(job_helper.get_runtime).to eq('podman')
41+
job_helper = RunCD4PEJob::CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, job_owner: @job_owner, job_instance_id: @job_instance_id,
42+
logger: @logger, secrets: @secrets, cd4pe_client: @cd4pe_client)
43+
expect(job_helper.send(:get_runtime)).to eq('podman')
4244
end
4345
end
4446

4547
describe 'cd4pe_job_helper::update_container_image' do
4648
let(:test_container_image) { 'puppetlabs/test:10.0.1' }
49+
4750
it 'Generates a podman pull command.' do
48-
job_helper = CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, job_token: @job_token, web_ui_endpoint: @web_ui_endpoint, job_owner: @job_owner, job_instance_id: @job_instance_id, logger: @logger, secrets: @secrets)
49-
podman_pull_command = job_helper.get_image_pull_cmd
51+
job_helper = RunCD4PEJob::CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, job_owner: @job_owner, job_instance_id: @job_instance_id,
52+
logger: @logger, secrets: @secrets, cd4pe_client: @cd4pe_client)
53+
podman_pull_command = job_helper.send(:get_image_pull_cmd)
5054
expect(podman_pull_command).to eq("podman pull #{test_container_image}")
5155
end
5256

5357
context 'with config' do
5458
let(:hostname) { 'host1' }
55-
let(:creds_json) { {auths: {hostname => {}}}.to_json }
59+
let(:creds_json) { { auths: { hostname => {} } }.to_json }
5660
let(:creds_b64) { Base64.encode64(creds_json) }
5761
let(:cert_txt) { 'junk' }
5862
let(:cert_b64) { Base64.encode64(cert_txt) }
5963

6064
it 'Uses config when present for podman.' do
61-
job_helper = CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, image_pull_creds: creds_b64, job_token: @job_token, web_ui_endpoint: @web_ui_endpoint, job_owner: @job_owner, job_instance_id: @job_instance_id, logger: @logger, secrets: @secrets)
65+
job_helper = RunCD4PEJob::CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, image_pull_creds: creds_b64, job_owner: @job_owner,
66+
job_instance_id: @job_instance_id, logger: @logger, secrets: @secrets, cd4pe_client: @cd4pe_client)
6267
config_json = File.join(@working_dir, '.docker', 'config.json')
6368
expect(File.exist?(config_json)).to be(true)
6469
expect(File.read(config_json)).to eq(creds_json)
6570

66-
podman_pull_command = job_helper.get_image_pull_cmd
71+
podman_pull_command = job_helper.send(:get_image_pull_cmd)
6772
expect(podman_pull_command).to eq("podman --config #{File.join(@working_dir, '.docker')} pull #{test_container_image}")
6873
end
69-
70-
it 'Registers the CA cert when provided.' do
71-
job_helper = CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, image_pull_creds: creds_b64, base_64_ca_cert: cert_b64, job_token: @job_token, web_ui_endpoint: @web_ui_endpoint, job_owner: @job_owner, job_instance_id: @job_instance_id, logger: @logger, secrets: @secrets)
72-
73-
cert_file = File.join(@certs_dir, hostname, 'ca.crt')
74-
expect(File.exist?(cert_file)).to be(true)
75-
expect(File.read(cert_file)).to eq(cert_txt)
76-
end
7774
end
7875
end
7976

8077
describe 'cd4pe_job_helper::get_container_run_cmd' do
8178
it 'Generates the correct podman run command.' do
82-
test_manifest_type = "AFTER_JOB_SUCCESS"
79+
test_manifest_type = 'AFTER_JOB_SUCCESS'
8380
test_container_image = 'puppetlabs/test:10.0.1'
8481
arg1 = '--testarg=woot'
8582
arg2 = '--otherarg=hello'
8683
arg3 = '--whatever=doesntmatter'
8784
user_specified_container_run_args = [arg1, arg2, arg3]
8885
job_type = 'unix'
8986

90-
job_helper = CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, container_run_args: user_specified_container_run_args, job_token: @job_token, web_ui_endpoint: @web_ui_endpoint, job_owner: @job_owner, job_instance_id: @job_instance_id, logger: @logger, secrets: @secrets)
87+
job_helper = RunCD4PEJob::CD4PEJobRunner.new(windows_job: @windows_job, working_dir: @working_dir, container_image: test_container_image, container_run_args: user_specified_container_run_args,
88+
job_owner: @job_owner, job_instance_id: @job_instance_id, logger: @logger, secrets: @secrets, cd4pe_client: @cd4pe_client)
9189

92-
podman_run_command = job_helper.get_container_run_cmd(test_manifest_type)
90+
podman_run_command = job_helper.send(:get_container_run_cmd, test_manifest_type)
9391
cmd_parts = podman_run_command.split(' ')
9492

9593
expect(cmd_parts[0]).to eq('podman')
@@ -110,4 +108,4 @@
110108
expect(cmd_parts[15]).to eq('"/cd4pe_job/AFTER_JOB_SUCCESS"')
111109
end
112110
end
113-
end
111+
end

0 commit comments

Comments
 (0)