packaging 0.88.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +17 -0
- data/README-Solaris.md +117 -0
- data/README.md +977 -0
- data/lib/packaging.rb +32 -0
- data/lib/packaging/archive.rb +126 -0
- data/lib/packaging/artifactory.rb +651 -0
- data/lib/packaging/artifactory/extensions.rb +94 -0
- data/lib/packaging/config.rb +492 -0
- data/lib/packaging/config/params.rb +387 -0
- data/lib/packaging/config/validations.rb +13 -0
- data/lib/packaging/deb.rb +28 -0
- data/lib/packaging/deb/repo.rb +264 -0
- data/lib/packaging/gem.rb +70 -0
- data/lib/packaging/metrics.rb +15 -0
- data/lib/packaging/nuget.rb +39 -0
- data/lib/packaging/paths.rb +376 -0
- data/lib/packaging/platforms.rb +507 -0
- data/lib/packaging/repo.rb +155 -0
- data/lib/packaging/retrieve.rb +75 -0
- data/lib/packaging/rpm.rb +5 -0
- data/lib/packaging/rpm/repo.rb +254 -0
- data/lib/packaging/sign.rb +8 -0
- data/lib/packaging/sign/deb.rb +9 -0
- data/lib/packaging/sign/dmg.rb +41 -0
- data/lib/packaging/sign/ips.rb +57 -0
- data/lib/packaging/sign/msi.rb +124 -0
- data/lib/packaging/sign/rpm.rb +115 -0
- data/lib/packaging/tar.rb +163 -0
- data/lib/packaging/util.rb +146 -0
- data/lib/packaging/util/date.rb +20 -0
- data/lib/packaging/util/execution.rb +85 -0
- data/lib/packaging/util/file.rb +125 -0
- data/lib/packaging/util/git.rb +174 -0
- data/lib/packaging/util/git_tags.rb +73 -0
- data/lib/packaging/util/gpg.rb +66 -0
- data/lib/packaging/util/jenkins.rb +95 -0
- data/lib/packaging/util/misc.rb +69 -0
- data/lib/packaging/util/net.rb +410 -0
- data/lib/packaging/util/os.rb +17 -0
- data/lib/packaging/util/platform.rb +40 -0
- data/lib/packaging/util/rake_utils.rb +112 -0
- data/lib/packaging/util/serialization.rb +19 -0
- data/lib/packaging/util/ship.rb +300 -0
- data/lib/packaging/util/tool.rb +41 -0
- data/lib/packaging/util/version.rb +334 -0
- data/spec/fixtures/config/ext/build_defaults.yaml +2 -0
- data/spec/fixtures/config/ext/project_data.yaml +2 -0
- data/spec/fixtures/configs/components/test_file.json +1 -0
- data/spec/fixtures/configs/components/test_file_2.json +0 -0
- data/spec/fixtures/configs/components/test_file_not_tagged.json +1 -0
- data/spec/fixtures/configs/components/test_file_wrong_ext.txt +0 -0
- data/spec/fixtures/configs/components/test_file_wrong_ext.wrong +0 -0
- data/spec/fixtures/util/pre_tasks.yaml +4 -0
- data/spec/lib/packaging/artifactory_spec.rb +221 -0
- data/spec/lib/packaging/config_spec.rb +576 -0
- data/spec/lib/packaging/deb/repo_spec.rb +157 -0
- data/spec/lib/packaging/deb_spec.rb +52 -0
- data/spec/lib/packaging/gem_spec.rb +86 -0
- data/spec/lib/packaging/paths_spec.rb +418 -0
- data/spec/lib/packaging/platforms_spec.rb +178 -0
- data/spec/lib/packaging/repo_spec.rb +135 -0
- data/spec/lib/packaging/retrieve_spec.rb +100 -0
- data/spec/lib/packaging/rpm/repo_spec.rb +133 -0
- data/spec/lib/packaging/sign_spec.rb +133 -0
- data/spec/lib/packaging/tar_spec.rb +116 -0
- data/spec/lib/packaging/util/execution_spec.rb +56 -0
- data/spec/lib/packaging/util/file_spec.rb +139 -0
- data/spec/lib/packaging/util/git_spec.rb +160 -0
- data/spec/lib/packaging/util/git_tag_spec.rb +36 -0
- data/spec/lib/packaging/util/gpg_spec.rb +64 -0
- data/spec/lib/packaging/util/jenkins_spec.rb +112 -0
- data/spec/lib/packaging/util/misc_spec.rb +31 -0
- data/spec/lib/packaging/util/net_spec.rb +259 -0
- data/spec/lib/packaging/util/os_spec.rb +31 -0
- data/spec/lib/packaging/util/rake_utils_spec.rb +70 -0
- data/spec/lib/packaging/util/ship_spec.rb +199 -0
- data/spec/lib/packaging/util/version_spec.rb +123 -0
- data/spec/lib/packaging_spec.rb +19 -0
- data/spec/spec_helper.rb +22 -0
- data/static_artifacts/PackageInfo.plist +3 -0
- data/tasks/00_utils.rake +214 -0
- data/tasks/30_metrics.rake +33 -0
- data/tasks/apple.rake +268 -0
- data/tasks/archive.rake +69 -0
- data/tasks/build.rake +12 -0
- data/tasks/clean.rake +5 -0
- data/tasks/config.rake +35 -0
- data/tasks/deb.rake +129 -0
- data/tasks/deb_repos.rake +28 -0
- data/tasks/deprecated.rake +130 -0
- data/tasks/doc.rake +20 -0
- data/tasks/education.rake +57 -0
- data/tasks/fetch.rake +60 -0
- data/tasks/gem.rake +159 -0
- data/tasks/jenkins.rake +538 -0
- data/tasks/jenkins_dynamic.rake +202 -0
- data/tasks/load_extras.rake +21 -0
- data/tasks/mock.rake +348 -0
- data/tasks/nightly_repos.rake +286 -0
- data/tasks/pe_deb.rake +12 -0
- data/tasks/pe_rpm.rake +13 -0
- data/tasks/pe_ship.rake +226 -0
- data/tasks/pe_sign.rake +13 -0
- data/tasks/pe_tar.rake +5 -0
- data/tasks/retrieve.rake +52 -0
- data/tasks/rpm.rake +66 -0
- data/tasks/rpm_repos.rake +29 -0
- data/tasks/ship.rake +692 -0
- data/tasks/sign.rake +154 -0
- data/tasks/tag.rake +8 -0
- data/tasks/tar.rake +28 -0
- data/tasks/update.rake +16 -0
- data/tasks/vanagon.rake +35 -0
- data/tasks/vendor_gems.rake +117 -0
- data/tasks/version.rake +33 -0
- data/tasks/z_data_dump.rake +65 -0
- data/templates/README +1 -0
- data/templates/downstream.xml.erb +47 -0
- data/templates/msi.xml.erb +197 -0
- data/templates/packaging.xml.erb +346 -0
- data/templates/repo.xml.erb +117 -0
- metadata +287 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# -*- ruby -*-
|
|
2
|
+
require 'spec_helper'
|
|
3
|
+
|
|
4
|
+
describe "Pkg::Util::Git_tag" do
|
|
5
|
+
context "parse_ref!" do
|
|
6
|
+
it "fails for a ref that doesn't exist'" do
|
|
7
|
+
expect { Pkg::Util::Git_tag.new("git://github.com/puppetlabs/leatherman.git", "garbagegarbage") }.to raise_error(RuntimeError, /ERROR : Not a ref or sha!/)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
context "sha?" do
|
|
12
|
+
it "sets ref type as a sha when passed a sha" do
|
|
13
|
+
git_tag = Pkg::Util::Git_tag.new("git://github.com/puppetlabs/leatherman.git", "4eef05389ebf418b62af17406c7f9f13fa51f975")
|
|
14
|
+
expect(git_tag.sha?).to eq(true)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
context "branch?" do
|
|
19
|
+
it "sets ref type as a branch when passed a branch" do
|
|
20
|
+
git_tag = Pkg::Util::Git_tag.new("git://github.com/puppetlabs/leatherman.git", "main")
|
|
21
|
+
expect(git_tag.branch?).to eq(true)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
context "tag?" do
|
|
26
|
+
it "sets ref type as a tag when passed a tag" do
|
|
27
|
+
git_tag = Pkg::Util::Git_tag.new("git://github.com/puppetlabs/leatherman.git", "tags/0.6.2")
|
|
28
|
+
expect(git_tag.tag?).to eq(true)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "sets ref type as a tag when passed a fully qualified tag" do
|
|
32
|
+
git_tag = Pkg::Util::Git_tag.new("git://github.com/puppetlabs/leatherman.git", "refs/tags/0.6.2")
|
|
33
|
+
expect(git_tag.tag?).to eq(true)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "Pkg::Util::Gpg" do
|
|
4
|
+
let(:gpg) { "/local/bin/gpg" }
|
|
5
|
+
let(:keychain) { "/usr/local/bin/keychain" }
|
|
6
|
+
let(:gpg_key) { "abcd1234" }
|
|
7
|
+
let(:target_file) { "/tmp/file" }
|
|
8
|
+
|
|
9
|
+
before(:each) do
|
|
10
|
+
reset_env(['RPM_GPG_AGENT'])
|
|
11
|
+
Pkg::Config.gpg_key = gpg_key
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe '#key' do
|
|
15
|
+
it "fails if Pkg::Config.gpg_key isn't set" do
|
|
16
|
+
allow(Pkg::Config).to receive(:gpg_key).and_return(nil)
|
|
17
|
+
expect { Pkg::Util::Gpg.key }.to raise_error(RuntimeError)
|
|
18
|
+
end
|
|
19
|
+
it "fails if Pkg::Config.gpg_key is an empty string" do
|
|
20
|
+
allow(Pkg::Config).to receive(:gpg_key).and_return('')
|
|
21
|
+
expect { Pkg::Util::Gpg.key }.to raise_error(RuntimeError)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe '#kill_keychain' do
|
|
26
|
+
it "doesn't reload the keychain if already loaded" do
|
|
27
|
+
Pkg::Util::Gpg.instance_variable_set("@keychain_loaded", true)
|
|
28
|
+
Pkg::Util::Gpg.should_receive(:kill_keychain).never
|
|
29
|
+
Pkg::Util::Gpg.should_receive(:start_keychain).never
|
|
30
|
+
Pkg::Util::Gpg.load_keychain
|
|
31
|
+
Pkg::Util::Gpg.instance_variable_set("@keychain_loaded", nil)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "doesn't reload the keychain if ENV['RPM_GPG_AGENT'] is set" do
|
|
35
|
+
ENV['RPM_GPG_AGENT'] = 'blerg'
|
|
36
|
+
Pkg::Util::Gpg.should_receive(:kill_keychain).never
|
|
37
|
+
Pkg::Util::Gpg.should_receive(:start_keychain).never
|
|
38
|
+
Pkg::Util::Gpg.load_keychain
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it 'kills and starts the keychain if not loaded already' do
|
|
42
|
+
Pkg::Util::Gpg.instance_variable_set("@keychain_loaded", nil)
|
|
43
|
+
Pkg::Util::Gpg.should_receive(:kill_keychain).once
|
|
44
|
+
Pkg::Util::Gpg.should_receive(:start_keychain).once
|
|
45
|
+
Pkg::Util::Gpg.load_keychain
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe '#sign_file' do
|
|
50
|
+
it 'adds special flags if RPM_GPG_AGENT is set' do
|
|
51
|
+
ENV['RPM_GPG_AGENT'] = 'blerg'
|
|
52
|
+
additional_flags = "--no-tty --use-agent"
|
|
53
|
+
Pkg::Util::Tool.should_receive(:find_tool).with('gpg').and_return(gpg)
|
|
54
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{gpg}\s#{additional_flags}\s--armor --detach-sign -u #{gpg_key} #{target_file}")
|
|
55
|
+
Pkg::Util::Gpg.sign_file(target_file)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it 'signs without extra flags when RPM_GPG_AGENT is not set' do
|
|
59
|
+
Pkg::Util::Tool.should_receive(:find_tool).with('gpg').and_return(gpg)
|
|
60
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{gpg}\s\s--armor --detach-sign -u #{gpg_key} #{target_file}")
|
|
61
|
+
Pkg::Util::Gpg.sign_file(target_file)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# -*- ruby -*-
|
|
2
|
+
require 'spec_helper'
|
|
3
|
+
|
|
4
|
+
describe Pkg::Util::Jenkins do
|
|
5
|
+
let(:build_host) {"Jenkins-foo"}
|
|
6
|
+
let(:name) {"job-foo"}
|
|
7
|
+
around do |example|
|
|
8
|
+
old_build_host = Pkg::Config.jenkins_build_host
|
|
9
|
+
Pkg::Config.jenkins_build_host = build_host
|
|
10
|
+
example.run
|
|
11
|
+
Pkg::Config.jenkins_build_host = old_build_host
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe "#create_jenkins_job" do
|
|
15
|
+
let(:xml_file) {"bar.xml"}
|
|
16
|
+
|
|
17
|
+
it "should call curl_form_data with the correct arguments" do
|
|
18
|
+
Pkg::Util::Net.should_receive(:curl_form_data).with("http://#{build_host}/createItem?name=#{name}", ["-H", '"Content-Type: application/xml"', "--data-binary", "@#{xml_file}"])
|
|
19
|
+
Pkg::Util::Jenkins.create_jenkins_job(name, xml_file)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe "#jenkins_job_exists?" do
|
|
24
|
+
|
|
25
|
+
it "should call curl_form_data with correct arguments" do
|
|
26
|
+
Pkg::Util::Net.should_receive(:curl_form_data).with("http://#{build_host}/job/#{name}/config.xml", ["--silent", "--fail"], :quiet => true).and_return(['output', 0])
|
|
27
|
+
Pkg::Util::Execution.should_receive(:success?).and_return(true)
|
|
28
|
+
Pkg::Util::Jenkins.jenkins_job_exists?(name)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "should return false on job not existing" do
|
|
32
|
+
Pkg::Util::Net.should_receive(:curl_form_data).with("http://#{build_host}/job/#{name}/config.xml", ["--silent", "--fail"], :quiet => true).and_return(['output', 1])
|
|
33
|
+
Pkg::Util::Execution.should_receive(:success?).and_return(false)
|
|
34
|
+
Pkg::Util::Jenkins.jenkins_job_exists?(name).should be_false
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should return false if curl_form_data raised a runtime error" do
|
|
38
|
+
Pkg::Util::Net.should_receive(:curl_form_data).with("http://#{build_host}/job/#{name}/config.xml", ["--silent", "--fail"], :quiet => true).and_return(false)
|
|
39
|
+
Pkg::Util::Jenkins.jenkins_job_exists?(name).should be_false
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "should return true when job exists" do
|
|
43
|
+
Pkg::Util::Net.should_receive(:curl_form_data).with("http://#{build_host}/job/#{name}/config.xml", ["--silent", "--fail"], :quiet => true).and_return(['output', 0])
|
|
44
|
+
Pkg::Util::Execution.should_receive(:success?).and_return(true)
|
|
45
|
+
Pkg::Util::Jenkins.jenkins_job_exists?(name).should be_true
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe '#poll_jenkins_job' do
|
|
50
|
+
let(:job_url) { "http://cat.meow/" }
|
|
51
|
+
let(:build_url) { "#{job_url}/1" }
|
|
52
|
+
let(:result) { "SUCCESS" }
|
|
53
|
+
let(:job_hash) { {'lastBuild' => { 'url' => build_url } }}
|
|
54
|
+
let(:build_hash) { {'result' => result, 'building' => false } }
|
|
55
|
+
|
|
56
|
+
before :each do
|
|
57
|
+
subject.stub(:get_jenkins_info).with(job_url).and_return(job_hash)
|
|
58
|
+
subject.stub(:wait_for_build).with(build_url).and_return(build_hash)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
context "when polling the given url" do
|
|
62
|
+
it "return the resulting build_hash when build completes successfully" do
|
|
63
|
+
subject.poll_jenkins_job(job_url)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
describe '#wait_for_build' do
|
|
69
|
+
let(:job_url) { "http://cat.meow/" }
|
|
70
|
+
let(:build_url) { "#{job_url}/1" }
|
|
71
|
+
let(:build_hash) { {'building' => false } }
|
|
72
|
+
|
|
73
|
+
context "when waiting for the given build to finish" do
|
|
74
|
+
it "return the resulting build_hash when build completes successfully" do
|
|
75
|
+
subject.should_receive(:get_jenkins_info).with(job_url).and_return(build_hash)
|
|
76
|
+
subject.wait_for_build(job_url)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
describe '#get_jenkins_info' do
|
|
82
|
+
let(:url) { "http://cat.meow/" }
|
|
83
|
+
let(:uri) { URI(url) }
|
|
84
|
+
let(:response) { double }
|
|
85
|
+
let(:valid_json) { "{\"employees\":[
|
|
86
|
+
{\"firstName\":\"John\", \"lastName\":\"Doe\"},
|
|
87
|
+
{\"firstName\":\"Anna\", \"lastName\":\"Smith\"},
|
|
88
|
+
{\"firstName\":\"Peter\", \"lastName\":\"Jones\"} ]}" }
|
|
89
|
+
|
|
90
|
+
before :each do
|
|
91
|
+
response.stub(:body).and_return( valid_json )
|
|
92
|
+
response.stub(:code).and_return( '200' )
|
|
93
|
+
Pkg::Util::Jenkins.should_receive(:URI).and_return(uri)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
context "when making HTTP GET request to given url" do
|
|
97
|
+
it "should return Hash of JSON contents when response is non-error" do
|
|
98
|
+
Net::HTTP.should_receive(:get_response).with(uri).and_return(response)
|
|
99
|
+
subject.get_jenkins_info(url)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "should raise Runtime error when response is error" do
|
|
103
|
+
response.stub(:code).and_return( '400' )
|
|
104
|
+
Net::HTTP.should_receive(:get_response).with(uri).and_return(response)
|
|
105
|
+
expect{
|
|
106
|
+
subject.get_jenkins_info(url)
|
|
107
|
+
}.to raise_error(Exception, /Unable to query .*, please check that it is valid./)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# -*- ruby -*-
|
|
2
|
+
require 'spec_helper'
|
|
3
|
+
|
|
4
|
+
describe 'Pkg::Util::Misc' do
|
|
5
|
+
context "#search_and_replace" do
|
|
6
|
+
let(:orig_string) { "#!/bin/bash\necho '__REPO_NAME__'" }
|
|
7
|
+
let(:updated_string) { "#!/bin/bash\necho 'abcdefg'" }
|
|
8
|
+
let(:good_replacements) do
|
|
9
|
+
{ __REPO_NAME__: Pkg::Paths.repo_name }
|
|
10
|
+
end
|
|
11
|
+
let(:warn_replacements) do
|
|
12
|
+
{ __REPO_NAME__: nil }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'replaces the token with the Pkg::Config variable' do
|
|
16
|
+
Pkg::Config.config_from_hash({:project => "foo", :repo_name => 'abcdefg'})
|
|
17
|
+
Pkg::Util::Misc.search_and_replace(orig_string, good_replacements).should eq(updated_string)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'does no replacement if the Pkg::Config variable is not set' do
|
|
21
|
+
Pkg::Config.config_from_hash({:project => 'foo',})
|
|
22
|
+
Pkg::Util::Misc.search_and_replace(orig_string, good_replacements).should eq(orig_string)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'warns and continues if the Pkg::Config variable is unknown to packaging' do
|
|
26
|
+
Pkg::Config.config_from_hash({:project => 'foo',})
|
|
27
|
+
Pkg::Util::Misc.should_receive(:warn).with("replacement value for '#{warn_replacements.keys.first}' probably shouldn't be nil")
|
|
28
|
+
Pkg::Util::Misc.search_and_replace(orig_string, warn_replacements).should eq(orig_string)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'socket'
|
|
3
|
+
require 'open3'
|
|
4
|
+
|
|
5
|
+
describe "Pkg::Util::Net" do
|
|
6
|
+
let(:target) { "/tmp/placething" }
|
|
7
|
+
let(:target_uri) { "http://google.com" }
|
|
8
|
+
let(:content) { "stuff" }
|
|
9
|
+
let(:rsync) { "/bin/rsync" }
|
|
10
|
+
let(:ssh) { "/usr/local/bin/ssh" }
|
|
11
|
+
let(:s3cmd) { "/usr/local/bin/s3cmd" }
|
|
12
|
+
|
|
13
|
+
describe "#fetch_uri" do
|
|
14
|
+
context "given a target directory" do
|
|
15
|
+
it "does nothing if the directory isn't writable" do
|
|
16
|
+
File.stub(:writable?).with(File.dirname(target)) { false }
|
|
17
|
+
File.should_receive(:open).never
|
|
18
|
+
Pkg::Util::Net.fetch_uri(target_uri, target)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "writes the content of the uri to a file if directory is writable" do
|
|
22
|
+
File.should_receive(:writable?).once.with(File.dirname(target)) { true }
|
|
23
|
+
File.should_receive(:open).once.with(target, 'w')
|
|
24
|
+
Pkg::Util::Net.fetch_uri(target_uri, target)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "hostname utils" do
|
|
30
|
+
|
|
31
|
+
describe "hostname" do
|
|
32
|
+
it "should return the hostname of the current host" do
|
|
33
|
+
Socket.stub(:gethostname) { "foo" }
|
|
34
|
+
Pkg::Util::Net.hostname.should eq("foo")
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe "check_host" do
|
|
39
|
+
context "with required :true" do
|
|
40
|
+
it "should raise an exception if the passed host does not match the current host" do
|
|
41
|
+
Socket.stub(:gethostname) { "foo" }
|
|
42
|
+
Pkg::Util::Net.should_receive(:check_host).and_raise(RuntimeError)
|
|
43
|
+
expect{ Pkg::Util::Net.check_host("bar", :required => true) }.to raise_error(RuntimeError)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context "with required :false" do
|
|
48
|
+
it "should return nil if the passed host does not match the current host" do
|
|
49
|
+
Socket.stub(:gethostname) { "foo" }
|
|
50
|
+
Pkg::Util::Net.check_host("bar", :required => false).should be_nil
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
describe "remote_ssh_cmd" do
|
|
57
|
+
it "should be able to call via deprecated shim" do
|
|
58
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("ssh").and_return(ssh)
|
|
59
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{ssh} -t foo 'set -e;bar'")
|
|
60
|
+
Pkg::Util::Execution.should_receive(:success?).and_return(true)
|
|
61
|
+
Pkg::Util::Net.remote_ssh_cmd("foo", "bar", true)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
describe "remote_execute" do
|
|
66
|
+
it "should fail if ssh is not present" do
|
|
67
|
+
Pkg::Util::Tool.stub(:find_tool).with("ssh") { fail }
|
|
68
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("ssh").and_raise(RuntimeError)
|
|
69
|
+
expect{ Pkg::Util::Net.remote_execute("foo", "bar") }.to raise_error(RuntimeError)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "should be able to not fail fast" do
|
|
73
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("ssh").and_return(ssh)
|
|
74
|
+
Kernel.should_receive(:system).with("#{ssh} -t foo 'bar'")
|
|
75
|
+
Pkg::Util::Execution.should_receive(:success?).and_return(true)
|
|
76
|
+
Pkg::Util::Net.remote_execute(
|
|
77
|
+
"foo", "bar", capture_output: false, extra_options: '', fail_fast: false)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "should be able to trace output" do
|
|
81
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("ssh").and_return(ssh)
|
|
82
|
+
Kernel.should_receive(:system).with("#{ssh} -t foo 'set -x;bar'")
|
|
83
|
+
Pkg::Util::Execution.should_receive(:success?).and_return(true)
|
|
84
|
+
Pkg::Util::Net.remote_execute(
|
|
85
|
+
"foo", "bar", capture_output: false, fail_fast: false, trace: true)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
context "without output captured" do
|
|
89
|
+
it "should execute a command :foo on a host :bar using Kernel" do
|
|
90
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("ssh").and_return(ssh)
|
|
91
|
+
Kernel.should_receive(:system).with("#{ssh} -t foo 'set -e;bar'")
|
|
92
|
+
Pkg::Util::Execution.should_receive(:success?).and_return(true)
|
|
93
|
+
Pkg::Util::Net.remote_execute("foo", "bar")
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it "should escape single quotes in the command" do
|
|
97
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("ssh").and_return(ssh)
|
|
98
|
+
Kernel.should_receive(:system).with("#{ssh} -t foo 'set -e;b'\\''ar'")
|
|
99
|
+
Pkg::Util::Execution.should_receive(:success?).and_return(true)
|
|
100
|
+
Pkg::Util::Net.remote_execute("foo", "b'ar")
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "should raise an error if ssh fails" do
|
|
104
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("ssh").and_return(ssh)
|
|
105
|
+
Kernel.should_receive(:system).with("#{ssh} -t foo 'set -e;bar'")
|
|
106
|
+
Pkg::Util::Execution.should_receive(:success?).and_return(false)
|
|
107
|
+
expect{ Pkg::Util::Net.remote_execute("foo", "bar") }
|
|
108
|
+
.to raise_error(RuntimeError, /failed./)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
context "with output captured" do
|
|
113
|
+
it "should execute a command :foo on a host :bar using Pkg::Util::Execution.capture3" do
|
|
114
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("ssh").and_return(ssh)
|
|
115
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{ssh} -t foo 'set -e;bar'")
|
|
116
|
+
Pkg::Util::Execution.should_receive(:success?).and_return(true)
|
|
117
|
+
Pkg::Util::Net.remote_execute("foo", "bar", capture_output: true)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it "should escape single quotes in the command" do
|
|
121
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("ssh").and_return(ssh)
|
|
122
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{ssh} -t foo 'set -e;b'\\''ar'")
|
|
123
|
+
Pkg::Util::Execution.should_receive(:success?).and_return(true)
|
|
124
|
+
Pkg::Util::Net.remote_execute("foo", "b'ar", capture_output: true)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it "should raise an error if ssh fails" do
|
|
128
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("ssh").and_return(ssh)
|
|
129
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{ssh} -t foo 'set -e;bar'")
|
|
130
|
+
Pkg::Util::Execution.should_receive(:success?).and_return(false)
|
|
131
|
+
expect{ Pkg::Util::Net.remote_execute("foo", "bar", capture_output: true) }
|
|
132
|
+
.to raise_error(RuntimeError, /failed./)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
describe "#rsync_to" do
|
|
138
|
+
defaults = "--recursive --hard-links --links --verbose --omit-dir-times --no-perms --no-owner --no-group"
|
|
139
|
+
it "should fail if rsync is not present" do
|
|
140
|
+
Pkg::Util::Tool.stub(:find_tool).with("rsync") { fail }
|
|
141
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("rsync").and_raise(RuntimeError)
|
|
142
|
+
expect{ Pkg::Util::Net.rsync_to("foo", "bar", "boo") }.to raise_error(RuntimeError)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it "should rsync 'thing' to 'foo@bar:/home/foo' with flags '#{defaults} --ignore-existing'" do
|
|
146
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("rsync").and_return(rsync)
|
|
147
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{rsync} #{defaults} --ignore-existing thing foo@bar:/home/foo", true)
|
|
148
|
+
Pkg::Util::Net.rsync_to("thing", "foo@bar", "/home/foo")
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it "rsyncs 'thing' to 'foo@bar:/home/foo' with flags that don't include --ignore-existing" do
|
|
152
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("rsync").and_return(rsync)
|
|
153
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{rsync} #{defaults} thing foo@bar:/home/foo", true)
|
|
154
|
+
Pkg::Util::Net.rsync_to("thing", "foo@bar", "/home/foo", extra_flags: [])
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
it "rsyncs 'thing' to 'foo@bar:/home/foo' with flags that don't include arbitrary flags" do
|
|
158
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("rsync").and_return(rsync)
|
|
159
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{rsync} #{defaults} --foo-bar --and-another-flag thing foo@bar:/home/foo", true)
|
|
160
|
+
Pkg::Util::Net.rsync_to("thing", "foo@bar", "/home/foo", extra_flags: ["--foo-bar", "--and-another-flag"])
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
describe "#s3sync_to" do
|
|
165
|
+
it "should fail if s3cmd is not present" do
|
|
166
|
+
Pkg::Util::Tool.should_receive(:find_tool).with('s3cmd', :required => true).and_raise(RuntimeError)
|
|
167
|
+
Pkg::Util::Execution.should_not_receive(:capture3).with("#{s3cmd} sync 'foo' s3://bar/boo/")
|
|
168
|
+
expect{ Pkg::Util::Net.s3sync_to("foo", "bar", "boo") }.to raise_error(RuntimeError)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it "should fail if ~/.s3cfg is not present" do
|
|
172
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("s3cmd").and_return(s3cmd)
|
|
173
|
+
Pkg::Util::File.should_receive(:file_exists?).with(File.join(ENV['HOME'], '.s3cfg')).and_return(false)
|
|
174
|
+
expect{ Pkg::Util::Net.s3sync_to("foo", "bar", "boo") }.to raise_error(RuntimeError, /does not exist/)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it "should s3 sync 'thing' to 's3://foo@bar/home/foo/' with no flags" do
|
|
178
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("s3cmd").and_return(s3cmd)
|
|
179
|
+
Pkg::Util::File.should_receive(:file_exists?).with(File.join(ENV['HOME'], '.s3cfg')).and_return(true)
|
|
180
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{s3cmd} sync 'thing' s3://foo@bar/home/foo/")
|
|
181
|
+
Pkg::Util::Net.s3sync_to("thing", "foo@bar", "home/foo")
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
it "should s3 sync 'thing' to 's3://foo@bar/home/foo/' with --delete-removed and --acl-public" do
|
|
185
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("s3cmd").and_return(s3cmd)
|
|
186
|
+
Pkg::Util::File.should_receive(:file_exists?).with(File.join(ENV['HOME'], '.s3cfg')).and_return(true)
|
|
187
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{s3cmd} sync --delete-removed --acl-public 'thing' s3://foo@bar/home/foo/")
|
|
188
|
+
Pkg::Util::Net.s3sync_to("thing", "foo@bar", "home/foo", ["--delete-removed", "--acl-public"])
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
describe "#rsync_from" do
|
|
193
|
+
defaults = "--recursive --hard-links --links --verbose --omit-dir-times --no-perms --no-owner --no-group"
|
|
194
|
+
it "should fail if rsync is not present" do
|
|
195
|
+
Pkg::Util::Tool.stub(:find_tool).with("rsync") { fail }
|
|
196
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("rsync").and_raise(RuntimeError)
|
|
197
|
+
expect{ Pkg::Util::Net.rsync_from("foo", "bar", "boo") }.to raise_error(RuntimeError)
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
it "should not include the flags '--ignore-existing' by default" do
|
|
201
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("rsync").and_return(rsync)
|
|
202
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{rsync} #{defaults} foo@bar:thing /home/foo", true)
|
|
203
|
+
Pkg::Util::Net.rsync_from("thing", "foo@bar", "/home/foo")
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
it "should rsync 'thing' from 'foo@bar' to '/home/foo' with flags '#{defaults}'" do
|
|
207
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("rsync").and_return(rsync)
|
|
208
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{rsync} #{defaults} foo@bar:thing /home/foo", true)
|
|
209
|
+
Pkg::Util::Net.rsync_from("thing", "foo@bar", "/home/foo")
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
it "rsyncs 'thing' from 'foo@bar:/home/foo' with flags that don't include arbitrary flags" do
|
|
213
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("rsync").and_return(rsync)
|
|
214
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{rsync} #{defaults} --foo-bar --and-another-flag foo@bar:thing /home/foo", true)
|
|
215
|
+
Pkg::Util::Net.rsync_from("thing", "foo@bar", "/home/foo", extra_flags: ["--foo-bar", "--and-another-flag"])
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
describe "#curl_form_data" do
|
|
220
|
+
let(:curl) {"/bin/curl"}
|
|
221
|
+
let(:form_data) {["name=FOO"]}
|
|
222
|
+
let(:options) { {:quiet => true} }
|
|
223
|
+
|
|
224
|
+
it "should return false on failure" do
|
|
225
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("curl").and_return(curl)
|
|
226
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{curl} -i '#{target_uri}'").and_return(['stdout', 'stderr', 1])
|
|
227
|
+
Pkg::Util::Net.curl_form_data(target_uri).should eq(['stdout', 1])
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
it "should curl with just the uri" do
|
|
232
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("curl").and_return(curl)
|
|
233
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{curl} -i '#{target_uri}'")
|
|
234
|
+
Pkg::Util::Net.curl_form_data(target_uri)
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
it "should curl with the form data and uri" do
|
|
238
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("curl").and_return(curl)
|
|
239
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{curl} -i #{form_data[0]} '#{target_uri}'")
|
|
240
|
+
Pkg::Util::Net.curl_form_data(target_uri, form_data)
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
it "should curl with form data, uri, and be quiet" do
|
|
244
|
+
Pkg::Util::Tool.should_receive(:check_tool).with("curl").and_return(curl)
|
|
245
|
+
Pkg::Util::Execution.should_receive(:capture3).with("#{curl} -i #{form_data[0]} '#{target_uri}'").and_return(['stdout', 'stderr', 0])
|
|
246
|
+
Pkg::Util::Net.curl_form_data(target_uri, form_data, options).should eq(['', 0])
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
describe "#print_url_info" do
|
|
252
|
+
it "should output correct formatting" do
|
|
253
|
+
Pkg::Util::Net.should_receive(:puts).with("\n////////////////////////////////////////////////////////////////////////////////\n\n
|
|
254
|
+
Build submitted. To view your build progress, go to\n#{target_uri}\n\n
|
|
255
|
+
////////////////////////////////////////////////////////////////////////////////\n\n")
|
|
256
|
+
Pkg::Util::Net.print_url_info(target_uri)
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|