hammer_cli_katello 0.20.0 → 0.22.1
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 +4 -4
- data/lib/hammer_cli_katello.rb +13 -2
- data/lib/hammer_cli_katello/content_credential.rb +67 -0
- data/lib/hammer_cli_katello/content_view_version.rb +2 -6
- data/lib/hammer_cli_katello/exception_handler.rb +15 -8
- data/lib/hammer_cli_katello/foreman_search_options_creators.rb +8 -0
- data/lib/hammer_cli_katello/host.rb +5 -0
- data/lib/hammer_cli_katello/host_errata.rb +3 -0
- data/lib/hammer_cli_katello/host_extensions.rb +4 -0
- data/lib/hammer_cli_katello/host_traces.rb +19 -0
- data/lib/hammer_cli_katello/id_resolver.rb +1 -0
- data/lib/hammer_cli_katello/ping.rb +16 -0
- data/lib/hammer_cli_katello/product.rb +19 -1
- data/lib/hammer_cli_katello/repository.rb +37 -1
- data/lib/hammer_cli_katello/sync_plan.rb +1 -0
- data/lib/hammer_cli_katello/version.rb +1 -1
- data/test/data/3.15/foreman_api.json +1 -0
- data/test/data/3.16/foreman_api.json +1 -0
- data/test/data/3.17/foreman_api.json +1 -0
- data/test/functional/content_credentials/info_test.rb +50 -0
- data/test/functional/content_credentials/list_test.rb +68 -0
- data/test/functional/content_view/version/promote_test.rb +1 -1
- data/test/functional/gpg_test.rb +39 -0
- data/test/functional/host/errata/list_test.rb +49 -0
- data/test/functional/host/extensions/data/host.json +1 -0
- data/test/functional/host/extensions/data/host_list.json +2 -0
- data/test/functional/host/extensions/info_test.rb +2 -1
- data/test/functional/host/extensions/list_test.rb +2 -2
- data/test/functional/host/extensions/update_test.rb +2 -2
- data/test/functional/host/traces/list_test.rb +37 -0
- data/test/functional/organization/delete_test.rb +26 -0
- data/test/functional/package/list_test.rb +3 -2
- data/test/functional/ping_test.rb +2 -0
- data/test/functional/product/update_proxy.rb +48 -0
- data/test/functional/repository/create_test.rb +51 -0
- data/test/functional/repository/data/test_ca.json +43 -0
- data/test/functional/repository/data/test_cert.json +43 -0
- data/test/functional/repository/data/test_key.json +43 -0
- data/test/functional/srpm/list_test.rb +1 -0
- data/test/test_helper.rb +2 -2
- data/test/unit/search_options_creators_test.rb +6 -0
- metadata +37 -8
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../test_helper')
|
2
|
+
require File.join(File.dirname(__FILE__), '../lifecycle_environment/lifecycle_environment_helpers')
|
3
|
+
|
4
|
+
require 'hammer_cli_katello/content_view_puppet_module'
|
5
|
+
|
6
|
+
describe 'listing content credentials' do
|
7
|
+
include LifecycleEnvironmentHelpers
|
8
|
+
|
9
|
+
before do
|
10
|
+
@cmd = %w(content-credentials list)
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:org_id) { 1 }
|
14
|
+
let(:lifecycle_env_id) { 1 }
|
15
|
+
let(:empty_response) do
|
16
|
+
{
|
17
|
+
"total" => 0,
|
18
|
+
"subtotal" => 0,
|
19
|
+
"page" => "1",
|
20
|
+
"per_page" => "1000",
|
21
|
+
"error" => nil,
|
22
|
+
"search" => nil,
|
23
|
+
"sort" => {
|
24
|
+
"by" => nil,
|
25
|
+
"order" => nil
|
26
|
+
},
|
27
|
+
"results" => []
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
it "lists an organizations keys" do
|
32
|
+
params = ["--organization-id=#{org_id}"]
|
33
|
+
|
34
|
+
ex = api_expects(:content_credentials, :index, 'Organization content credentials list') do |par|
|
35
|
+
par['organization_id'] == org_id && par['page'] == 1 &&
|
36
|
+
par['per_page'] == 1000
|
37
|
+
end
|
38
|
+
|
39
|
+
ex.returns(empty_response)
|
40
|
+
|
41
|
+
expected_result = success_result("---|-----
|
42
|
+
ID | NAME
|
43
|
+
---|-----
|
44
|
+
")
|
45
|
+
|
46
|
+
result = run_cmd(@cmd + params)
|
47
|
+
assert_cmd(expected_result, result)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "lists the keys by content-type" do
|
51
|
+
params = ['--content-type=gpg', "--organization-id=#{org_id}"]
|
52
|
+
|
53
|
+
ex = api_expects(:content_credentials, :index, 'content-type') do |par|
|
54
|
+
par['organization_id'] == org_id && par['page'] == 1 &&
|
55
|
+
par['per_page'] == 1000
|
56
|
+
end
|
57
|
+
|
58
|
+
ex.returns(empty_response)
|
59
|
+
|
60
|
+
expected_result = CommandExpectation.new("---|-----
|
61
|
+
ID | NAME
|
62
|
+
---|-----
|
63
|
+
")
|
64
|
+
|
65
|
+
result = run_cmd(@cmd + params)
|
66
|
+
assert_cmd(expected_result, result)
|
67
|
+
end
|
68
|
+
end
|
@@ -25,7 +25,7 @@ module HammerCLIKatello
|
|
25
25
|
ex.returns(index_response([{'id' => 9}]))
|
26
26
|
|
27
27
|
api_expects(:content_view_versions, :promote) do |p|
|
28
|
-
p['id'] == 6 && p['
|
28
|
+
p['id'] == 6 && p['environment_ids'] == [9]
|
29
29
|
end
|
30
30
|
|
31
31
|
run_cmd(%w(content-view version promote --organization org1 --content-view cv
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
require 'hammer_cli_katello/gpg_key'
|
3
|
+
|
4
|
+
module HammerCLIKatello
|
5
|
+
describe GpgKeyCommand::ListCommand do
|
6
|
+
it 'warns of deprecation' do
|
7
|
+
result = run_cmd(%w(gpg list))
|
8
|
+
assert_match(/deprecated/, result.err)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe GpgKeyCommand::InfoCommand do
|
13
|
+
it 'warns of deprecation' do
|
14
|
+
result = run_cmd(%w(gpg info))
|
15
|
+
assert_match(/deprecated/, result.err)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe GpgKeyCommand::CreateCommand do
|
20
|
+
it 'warns of deprecation' do
|
21
|
+
result = run_cmd(%w(gpg create))
|
22
|
+
assert_match(/deprecated/, result.err)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe GpgKeyCommand::UpdateCommand do
|
27
|
+
it 'warns of deprecation' do
|
28
|
+
result = run_cmd(%w(gpg update))
|
29
|
+
assert_match(/deprecated/, result.err)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe GpgKeyCommand::DeleteCommand do
|
34
|
+
it 'warns of deprecation' do
|
35
|
+
result = run_cmd(%w(gpg delete))
|
36
|
+
assert_match(/deprecated/, result.err)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../../test_helper')
|
2
|
+
require_relative '../../lifecycle_environment/lifecycle_environment_helpers'
|
3
|
+
|
4
|
+
describe 'host errata listing' do
|
5
|
+
include LifecycleEnvironmentHelpers
|
6
|
+
|
7
|
+
before do
|
8
|
+
@cmd = %w(host errata list)
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:org_id) { 1 }
|
12
|
+
let(:host_id) { 2 }
|
13
|
+
let(:lifecycle_env_id) { 3 }
|
14
|
+
let(:empty_response) do
|
15
|
+
{
|
16
|
+
"total" => 0,
|
17
|
+
"subtotal" => 0,
|
18
|
+
"page" => "1",
|
19
|
+
"per_page" => "1000",
|
20
|
+
"error" => nil,
|
21
|
+
"search" => nil,
|
22
|
+
"sort" => {
|
23
|
+
"by" => nil,
|
24
|
+
"order" => nil
|
25
|
+
},
|
26
|
+
"results" => []
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
it "lists the host errata belonging to a lifecycle-environment by name" do
|
31
|
+
params = ["--host-id=#{host_id}", "--organization-id=#{org_id}", '--lifecycle-environment=test']
|
32
|
+
|
33
|
+
expect_lifecycle_environment_search(org_id.to_s, 'test', lifecycle_env_id)
|
34
|
+
|
35
|
+
ex = api_expects(:host_errata, :index, 'host errata list').
|
36
|
+
with_params('host_id': host_id,
|
37
|
+
'environment_id': lifecycle_env_id,
|
38
|
+
'page': 1,
|
39
|
+
'per_page': 1000)
|
40
|
+
|
41
|
+
ex.returns(empty_response)
|
42
|
+
expected_result = success_result("---|------------|------|-------|------------
|
43
|
+
ID | ERRATUM ID | TYPE | TITLE | INSTALLABLE
|
44
|
+
---|------------|------|-------|------------
|
45
|
+
")
|
46
|
+
result = run_cmd(@cmd + params)
|
47
|
+
assert_cmd(expected_result, result)
|
48
|
+
end
|
49
|
+
end
|
@@ -74,6 +74,8 @@
|
|
74
74
|
"errata_status_label":"Could not calculate errata status, ensure host is registered and katello-agent is installed",
|
75
75
|
"subscription_status":0,
|
76
76
|
"subscription_status_label":"Fully entitled",
|
77
|
+
"traces_status":0,
|
78
|
+
"traces_status_label":"updated",
|
77
79
|
"name":"robot.example.com",
|
78
80
|
"id":1,
|
79
81
|
"hostgroup_name":null,
|
@@ -27,7 +27,8 @@ describe 'host info' do
|
|
27
27
|
['Upgradable Packages', '4'],
|
28
28
|
['Purpose Usage', 'Production'],
|
29
29
|
['Purpose Role', 'Role'],
|
30
|
-
['Purpose Addons', 'Test Addon1, Test Addon2']
|
30
|
+
['Purpose Addons', 'Test Addon1, Test Addon2'],
|
31
|
+
['Trace Status', 'Updated']]
|
31
32
|
expected_results = expected_fields.map { |field| success_result(FieldMatcher.new(*field)) }
|
32
33
|
expected_results.each { |expected| assert_cmd(expected, result) }
|
33
34
|
end
|
@@ -13,8 +13,8 @@ describe 'host list' do
|
|
13
13
|
|
14
14
|
result = run_cmd(@cmd)
|
15
15
|
|
16
|
-
fields = ['CONTENT VIEW', 'LIFECYCLE ENVIRONMENT']
|
17
|
-
values = ['Default Organization View', 'Library']
|
16
|
+
fields = ['CONTENT VIEW', 'LIFECYCLE ENVIRONMENT', 'TRACE STATUS']
|
17
|
+
values = ['Default Organization View', 'Library', 'updated']
|
18
18
|
expected_result = success_result(IndexMatcher.new([fields, values]))
|
19
19
|
assert_cmd(expected_result, result)
|
20
20
|
end
|
@@ -29,13 +29,13 @@ module HammerCLIForeman
|
|
29
29
|
with_params('id' => host_id.to_s,
|
30
30
|
'organization_id' => organization_id,
|
31
31
|
'host' => {
|
32
|
-
'puppetclass_ids' => [],
|
33
32
|
'compute_attributes' => {},
|
34
33
|
'content_facet_attributes' => {
|
35
34
|
'content_view_id' => cv_id,
|
36
35
|
'lifecycle_environment_id' => env_id,
|
37
36
|
'kickstart_repository_id' => repo_id
|
38
|
-
}
|
37
|
+
},
|
38
|
+
'subscription_facet_attributes' => {}
|
39
39
|
})
|
40
40
|
|
41
41
|
cmd = "host update --id=#{host_id}"\
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../../test_helper')
|
2
|
+
|
3
|
+
describe 'host trace listing' do
|
4
|
+
before do
|
5
|
+
@cmd = %w(host traces list)
|
6
|
+
end
|
7
|
+
|
8
|
+
let(:host_id) { 2 }
|
9
|
+
let(:empty_response) do
|
10
|
+
{
|
11
|
+
"total" => 0,
|
12
|
+
"subtotal" => 0,
|
13
|
+
"page" => "1",
|
14
|
+
"per_page" => "1000",
|
15
|
+
"error" => nil,
|
16
|
+
"search" => nil,
|
17
|
+
"sort" => {
|
18
|
+
"by" => nil,
|
19
|
+
"order" => nil
|
20
|
+
},
|
21
|
+
"results" => []
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'allows listing by host' do
|
26
|
+
params = ["--host-id=#{host_id}"]
|
27
|
+
ex = api_expects(:host_tracer, :index, 'host traces list')
|
28
|
+
|
29
|
+
ex.returns(empty_response)
|
30
|
+
expected_result = success_result("---------|-------------|--------|-----
|
31
|
+
TRACE ID | APPLICATION | HELPER | TYPE
|
32
|
+
---------|-------------|--------|-----
|
33
|
+
")
|
34
|
+
result = run_cmd(@cmd + params)
|
35
|
+
assert_cmd(expected_result, result)
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
module HammerCLIKatello
|
4
|
+
describe 'Organization::DeleteCommand' do
|
5
|
+
it 'it requires the organization ID and must be resolved from name' do
|
6
|
+
api_expects(:organizations, :index).with_params(
|
7
|
+
:search => "name = \"my_org\"", :per_page => 1000, :page => 1
|
8
|
+
)
|
9
|
+
run_cmd(%w(organization delete --name my_org))
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'it requires the organization ID and must be resolved from name' do
|
13
|
+
api_expects(:organizations, :index).with_params(
|
14
|
+
:search => "label = \"my_org\"", :per_page => 1000, :page => 1
|
15
|
+
)
|
16
|
+
run_cmd(%w(organization delete --label my_org))
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'it requires the organization ID and must be resolved from name' do
|
20
|
+
api_expects(:organizations, :index).with_params(
|
21
|
+
:search => "title = \"my_org\"", :per_page => 1000, :page => 1
|
22
|
+
)
|
23
|
+
run_cmd(%w(organization delete --title my_org))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -86,8 +86,9 @@ module HammerCLIKatello
|
|
86
86
|
it 'may be specified environment name no org fails' do
|
87
87
|
api_expects_no_call
|
88
88
|
r = run_cmd(%w(package list --environment Library))
|
89
|
-
|
90
|
-
|
89
|
+
expec_err = "--organization, --organization-title, --organization-label, --organization-id"
|
90
|
+
puts r.err
|
91
|
+
assert(r.err.include?(expec_err), "Invalid error message")
|
91
92
|
end
|
92
93
|
end
|
93
94
|
|
@@ -8,7 +8,9 @@ describe 'ping' do
|
|
8
8
|
'foreman_tasks' => {'status' => 'ok', 'duration_ms' => '34'},
|
9
9
|
'foreman_auth' => {'status' => 'ok', 'duration_ms' => '34'},
|
10
10
|
'candlepin' => {'status' => 'ok', 'duration_ms' => '34'},
|
11
|
+
'candlepin_events' => {'status' => 'ok', 'message' => '0 messages', 'duration_ms' => '34'},
|
11
12
|
'candlepin_auth' => {'status' => 'ok', 'duration_ms' => '34'},
|
13
|
+
'katello_events' => {'status' => 'ok', 'message' => '0 messages', 'duration_ms' => '34'},
|
12
14
|
'pulp' => {'status' => 'ok', 'duration_ms' => '34'},
|
13
15
|
'pulp_auth' => {'status' => 'ok', 'duration_ms' => '34'}
|
14
16
|
}
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../test_helper')
|
2
|
+
|
3
|
+
describe 'update an http proxy on a product' do
|
4
|
+
include ForemanTaskHelpers
|
5
|
+
|
6
|
+
before do
|
7
|
+
@cmd = %w(product update-proxy)
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:sync_response) do
|
11
|
+
{
|
12
|
+
'id' => 1,
|
13
|
+
'state' => 'planned',
|
14
|
+
'action' => 'Update http proxy'
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'updates product proxy policy' do
|
19
|
+
params = [
|
20
|
+
'--ids=1',
|
21
|
+
'--http-proxy-policy=use_selected_http_proxy',
|
22
|
+
'--http-proxy-id=1'
|
23
|
+
]
|
24
|
+
|
25
|
+
ex = api_expects(:products_bulk_actions, :update_http_proxy, 'update an http-proxy')
|
26
|
+
.with_params('ids' => '1', 'http_proxy_policy' => 'use_selected_http_proxy',
|
27
|
+
'http_proxy_id' => '1')
|
28
|
+
ex.returns(sync_response)
|
29
|
+
|
30
|
+
expect_foreman_task('3')
|
31
|
+
|
32
|
+
result = run_cmd(@cmd + params)
|
33
|
+
assert_equal(HammerCLI::EX_OK, result.exit_code)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'fails with missing required params' do
|
37
|
+
params = ['--proxy-id=1']
|
38
|
+
|
39
|
+
ex = api_expects(:products_bulk_actions, :update_http_proxy, 'update an http-proxy')
|
40
|
+
.with_params('proxy_id' => '1')
|
41
|
+
ex.returns(
|
42
|
+
'proxy_id' => '1'
|
43
|
+
)
|
44
|
+
|
45
|
+
result = run_cmd(@cmd + params)
|
46
|
+
assert_equal(result.exit_code, 70)
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
describe "create repository" do
|
4
|
+
let(:org_id) { 1 }
|
5
|
+
let(:product_id) { 2 }
|
6
|
+
let(:name) { "repo1" }
|
7
|
+
let(:content_type) { "yum" }
|
8
|
+
|
9
|
+
it 'with basic options' do
|
10
|
+
api_expects(:repositories, :create)
|
11
|
+
.with_params(
|
12
|
+
name: name,
|
13
|
+
product_id: product_id,
|
14
|
+
content_type: content_type)
|
15
|
+
|
16
|
+
command = %W(repository create --organization-id #{org_id} --product-id #{product_id}
|
17
|
+
--content-type #{content_type} --name #{name})
|
18
|
+
|
19
|
+
assert_equal(0, run_cmd(command).exit_code)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'with ssl options by name' do
|
23
|
+
def stub_gpg_key(gpg_key_name)
|
24
|
+
gpg_key_index = api_expects(:gpg_keys, :index)
|
25
|
+
.with_params(
|
26
|
+
name: gpg_key_name.to_s,
|
27
|
+
organization_id: 1,
|
28
|
+
per_page: 1000,
|
29
|
+
page: 1)
|
30
|
+
gpg_response = File.join(File.dirname(__FILE__), 'data', "#{gpg_key_name}.json")
|
31
|
+
gpg_key_index.returns(JSON.parse(File.read(gpg_response)))
|
32
|
+
end
|
33
|
+
|
34
|
+
api_expects(:repositories, :create)
|
35
|
+
.with_params(
|
36
|
+
name: name,
|
37
|
+
product_id: product_id,
|
38
|
+
ssl_ca_cert_id: 1,
|
39
|
+
ssl_client_cert_id: 2,
|
40
|
+
ssl_client_key_id: 3,
|
41
|
+
content_type: content_type)
|
42
|
+
|
43
|
+
%w(test_cert test_key test_ca).each { |cred| stub_gpg_key(cred) }
|
44
|
+
|
45
|
+
command = %W(repository create --organization-id #{org_id} --product-id #{product_id}
|
46
|
+
--content-type #{content_type} --name #{name} --ssl-client-cert test_cert
|
47
|
+
--ssl-client-key test_key --ssl-ca-cert test_ca)
|
48
|
+
|
49
|
+
assert_equal(0, run_cmd(command).exit_code)
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
{
|
2
|
+
"name":"test_ca",
|
3
|
+
"content_type":"cert",
|
4
|
+
"content":"hi",
|
5
|
+
"id":1,
|
6
|
+
"organization_id":1,
|
7
|
+
"organization":{
|
8
|
+
"name":"org2",
|
9
|
+
"label":"org2",
|
10
|
+
"id":1
|
11
|
+
},
|
12
|
+
"created_at":"2020-01-28 09:30:54 -0500",
|
13
|
+
"updated_at":"2020-01-28 09:30:54 -0500",
|
14
|
+
"gpg_key_products":[
|
15
|
+
|
16
|
+
],
|
17
|
+
"gpg_key_repos":[
|
18
|
+
|
19
|
+
],
|
20
|
+
"ssl_ca_products":[
|
21
|
+
|
22
|
+
],
|
23
|
+
"ssl_ca_root_repos":[
|
24
|
+
|
25
|
+
],
|
26
|
+
"ssl_client_products":[
|
27
|
+
|
28
|
+
],
|
29
|
+
"ssl_client_root_repos":[
|
30
|
+
|
31
|
+
],
|
32
|
+
"ssl_key_products":[
|
33
|
+
|
34
|
+
],
|
35
|
+
"ssl_key_root_repos":[
|
36
|
+
|
37
|
+
],
|
38
|
+
"permissions":{
|
39
|
+
"view_content_credenials":true,
|
40
|
+
"edit_content_credenials":true,
|
41
|
+
"destroy_content_credenials":true
|
42
|
+
}
|
43
|
+
}
|