hammer_cli_katello 1.4.0 → 1.5.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/acs.rb +79 -0
- data/lib/hammer_cli_katello/content_export_complete.rb +8 -0
- data/lib/hammer_cli_katello/content_export_helper.rb +55 -3
- data/lib/hammer_cli_katello/content_export_incremental.rb +8 -0
- data/lib/hammer_cli_katello/content_import.rb +9 -0
- data/lib/hammer_cli_katello/host_collection.rb +2 -0
- data/lib/hammer_cli_katello/id_resolver.rb +3 -2
- data/lib/hammer_cli_katello/organization.rb +11 -0
- data/lib/hammer_cli_katello/repository.rb +65 -3
- data/lib/hammer_cli_katello/version.rb +1 -1
- data/lib/hammer_cli_katello.rb +5 -0
- data/test/data/4.4/foreman_api.json +1 -0
- data/test/data/4.5/foreman_api.json +1 -0
- data/test/data/4.6/foreman_api.json +1 -0
- data/test/functional/acs/create_test.rb +27 -0
- data/test/functional/acs/delete_test.rb +13 -0
- data/test/functional/acs/info_test.rb +55 -0
- data/test/functional/acs/list_test.rb +62 -0
- data/test/functional/acs/update_test.rb +23 -0
- data/test/functional/content_export/complete/repository_test.rb +226 -0
- data/test/functional/content_export/content_export_helpers.rb +7 -0
- data/test/functional/content_export/incremental/repository_test.rb +212 -0
- data/test/functional/module_stream/info_test.rb +2 -2
- data/test/functional/organization/cdn_configuration_test.rb +5 -2
- data/test/functional/organization/info_test.rb +8 -2
- data/test/functional/repository/info_test.rb +4 -4
- data/test/functional/repository/reclaim_space_test.rb +105 -0
- data/test/functional/repository/republish_test.rb +37 -0
- data/test/functional/repository/update_test.rb +1 -0
- data/test/functional/repository_set/disable_test.rb +7 -1
- data/test/test_helper.rb +1 -1
- metadata +27 -2
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../test_helper')
|
2
|
+
|
3
|
+
describe 'create content-credentials' do
|
4
|
+
before do
|
5
|
+
@cmd = %w(alternate-content-sources create)
|
6
|
+
end
|
7
|
+
|
8
|
+
let(:name) { 'pizza' }
|
9
|
+
let(:url) { 'http://proxy.example.com' }
|
10
|
+
let(:acs_type) { 'custom' }
|
11
|
+
let(:acs_content) { 'yum' }
|
12
|
+
let(:verify_ssl) { false }
|
13
|
+
let(:proxy_id) { 1 }
|
14
|
+
let(:subpaths) { ['test/repo1/'] }
|
15
|
+
|
16
|
+
it 'Creates an ACS' do
|
17
|
+
params = ["--name=#{name}", "--alternate-content-source-type=#{acs_type}",
|
18
|
+
"--base-url=#{url}", "--content-type=#{acs_content}", "--verify-ssl=#{verify_ssl}",
|
19
|
+
"--smart-proxy-ids=#{proxy_id}", "--subpaths=#{subpaths}"]
|
20
|
+
|
21
|
+
api_expects(:alternate_content_sources, :create, 'Create an ACS')
|
22
|
+
|
23
|
+
expected_result = success_result("Alternate Content Source created.\n")
|
24
|
+
result = run_cmd(@cmd + params)
|
25
|
+
assert_cmd(expected_result, result)
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../test_helper')
|
2
|
+
|
3
|
+
describe 'delete an acs' do
|
4
|
+
let(:id) { 1 }
|
5
|
+
|
6
|
+
it 'by id' do
|
7
|
+
api_expects(:alternate_content_sources, :destroy, 'delete acs').
|
8
|
+
with_params('id' => id)
|
9
|
+
|
10
|
+
command = %W(alternate-content-sources delete --id #{id})
|
11
|
+
assert_equal(0, run_cmd(command).exit_code)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../test_helper')
|
2
|
+
require 'hammer_cli_katello/associating_commands'
|
3
|
+
|
4
|
+
describe 'get acs info' do
|
5
|
+
before do
|
6
|
+
@cmd = %w(alternate-content-sources info)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'shows acs info by id' do
|
10
|
+
params = ['--id=1']
|
11
|
+
ex = api_expects(:alternate_content_sources, :show, 'Get info')
|
12
|
+
ex.returns(
|
13
|
+
'id' => 1,
|
14
|
+
'name' => 'Pizza ACS',
|
15
|
+
'label' => 'Pizza ACS',
|
16
|
+
'base_url' => 'https://proxy.example.com',
|
17
|
+
'alternate_content_source_type' => 'custom',
|
18
|
+
'content_type' => 'yum',
|
19
|
+
'smart_proxies' => {
|
20
|
+
'id' => 1,
|
21
|
+
'name' => 'centos7.example.com',
|
22
|
+
'url' => 'https://centos7.example.com:9090',
|
23
|
+
'created_at' => '2022-05-09T17:40:21.007Z',
|
24
|
+
'updated_at' => '2022-05-09T17:40:21.007Z',
|
25
|
+
'expired_logs' => 0,
|
26
|
+
'download_policy' => 'on_demand'
|
27
|
+
},
|
28
|
+
'subpaths' => [
|
29
|
+
'test/repo1'
|
30
|
+
]
|
31
|
+
)
|
32
|
+
result = run_cmd(@cmd + params)
|
33
|
+
# rubocop:disable Style/WordArray
|
34
|
+
expected_fields = [['ID', '1'],
|
35
|
+
['Name', 'Pizza ACS'],
|
36
|
+
['Label', 'Pizza ACS'],
|
37
|
+
['Base URL', 'https://proxy.example.com'],
|
38
|
+
['Alternate content source type', 'custom'],
|
39
|
+
['Content type', 'yum'],
|
40
|
+
['Smart proxies', ''],
|
41
|
+
['Id', '1'],
|
42
|
+
['Name', 'centos7.example.com'],
|
43
|
+
['URL', 'https://centos7.example.com:9090'],
|
44
|
+
['Created at', '2022-05-09T17:40:21.007Z'],
|
45
|
+
['Updated at', '2022-05-09T17:40:21.007Z'],
|
46
|
+
['Expired logs', '0'],
|
47
|
+
['Download policy', 'on_demand'],
|
48
|
+
['Subpaths', ''],
|
49
|
+
['', 'test/repo1']]
|
50
|
+
|
51
|
+
# rubocop:enable Style/WordArray
|
52
|
+
expected_results = expected_fields.map { |field| success_result(FieldMatcher.new(*field)) }
|
53
|
+
expected_results.each { |expected| assert_cmd(expected, result) }
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../test_helper')
|
2
|
+
|
3
|
+
describe 'listing acs' do
|
4
|
+
before do
|
5
|
+
@cmd = %w(alternate-content-sources list)
|
6
|
+
end
|
7
|
+
|
8
|
+
let(:empty_response) do
|
9
|
+
{
|
10
|
+
"total" => 0,
|
11
|
+
"subtotal" => 0,
|
12
|
+
"page" => "1",
|
13
|
+
"per_page" => "1000",
|
14
|
+
"error" => nil,
|
15
|
+
"search" => nil,
|
16
|
+
"sort" => {
|
17
|
+
"by" => nil,
|
18
|
+
"order" => nil
|
19
|
+
},
|
20
|
+
"results" => []
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:acs_response) do
|
25
|
+
{
|
26
|
+
'id' => 1,
|
27
|
+
'name' => 'pizza',
|
28
|
+
'alternate_content_source_type' => 'custom'
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
it "lists acs and returns empty response" do
|
33
|
+
ex = api_expects(:alternate_content_sources, :index, 'acs list') do |par|
|
34
|
+
par['page'] == 1 && par['per_page'] == 1000
|
35
|
+
end
|
36
|
+
|
37
|
+
ex.returns(empty_response)
|
38
|
+
|
39
|
+
expected_result = success_result("---|------|-----
|
40
|
+
ID | NAME | TYPE
|
41
|
+
---|------|-----
|
42
|
+
")
|
43
|
+
|
44
|
+
result = run_cmd(@cmd)
|
45
|
+
assert_cmd(expected_result, result)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "lists acs and returns response" do
|
49
|
+
ex = api_expects(:alternate_content_sources, :index, 'acs list') do |par|
|
50
|
+
par['page'] == 1 && par['per_page'] == 1000
|
51
|
+
end
|
52
|
+
|
53
|
+
ex.returns(acs_response)
|
54
|
+
|
55
|
+
expected_result = success_result("1 | pizza | custom
|
56
|
+
---|-------|-------
|
57
|
+
")
|
58
|
+
|
59
|
+
result = run_cmd(@cmd)
|
60
|
+
assert_cmd(expected_result, result)
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../test_helper')
|
2
|
+
|
3
|
+
describe 'listing acs' do
|
4
|
+
before do
|
5
|
+
@cmd = %w(alternate-content-sources update)
|
6
|
+
end
|
7
|
+
|
8
|
+
let(:id) { 1 }
|
9
|
+
let(:desc) { 'pizza' }
|
10
|
+
|
11
|
+
it 'update acs' do
|
12
|
+
params = ["--id=#{id}", "--description=#{desc}"]
|
13
|
+
|
14
|
+
ex = api_expects(:alternate_content_sources, :update, 'acs update') do |par|
|
15
|
+
par['id'] == 1 && par['description'] == 'pizza'
|
16
|
+
end
|
17
|
+
|
18
|
+
ex.returns({})
|
19
|
+
|
20
|
+
result = run_cmd(@cmd + params)
|
21
|
+
assert_equal(result.exit_code, 0)
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,226 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../../../test_helper')
|
2
|
+
require 'hammer_cli_katello/content_export_complete'
|
3
|
+
require_relative '../../product/product_helpers'
|
4
|
+
require_relative '../../repository/repository_helpers'
|
5
|
+
require_relative '../content_export_helpers'
|
6
|
+
|
7
|
+
describe 'content-export complete repository' do
|
8
|
+
include ForemanTaskHelpers
|
9
|
+
include ContentExportHelpers
|
10
|
+
include ProductHelpers
|
11
|
+
include RepositoryHelpers
|
12
|
+
|
13
|
+
before do
|
14
|
+
@cmd = %w(content-export complete repository)
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:task_id) { '5' }
|
18
|
+
let(:response) do
|
19
|
+
{
|
20
|
+
'id' => task_id,
|
21
|
+
'state' => 'planned',
|
22
|
+
'output' => {
|
23
|
+
'export_history_id' => 2
|
24
|
+
}
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
let(:export_history) do
|
29
|
+
{
|
30
|
+
"id": 1000,
|
31
|
+
"path": "/tmp",
|
32
|
+
"metadata": {}
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
let(:default_repository_options) do
|
37
|
+
{"download_policy" => "immediate", "id" => repository_id}
|
38
|
+
end
|
39
|
+
|
40
|
+
let(:product_id) { '77' }
|
41
|
+
let(:repository_id) { '1001' }
|
42
|
+
|
43
|
+
let(:name) { 'repo' }
|
44
|
+
|
45
|
+
it "performs export with required options and async" do
|
46
|
+
params = [
|
47
|
+
"--id=#{repository_id}",
|
48
|
+
'--async'
|
49
|
+
]
|
50
|
+
expects_repository(repository_id, default_repository_options)
|
51
|
+
ex = api_expects(:content_exports, :repository)
|
52
|
+
ex.returns(response)
|
53
|
+
|
54
|
+
result = run_cmd(@cmd + params)
|
55
|
+
|
56
|
+
assert_equal("Repository is being exported in task #{task_id}.\n"\
|
57
|
+
+ "Once the task completes the export metadata must be generated with the "\
|
58
|
+
+ "command:\n hammer content-export generate-metadata --task-id #{task_id}\n", result.out)
|
59
|
+
assert_equal(HammerCLI::EX_OK, result.exit_code)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "performs export with required options" do
|
63
|
+
params = [
|
64
|
+
"--id=#{repository_id}"
|
65
|
+
]
|
66
|
+
expects_repository(repository_id, default_repository_options)
|
67
|
+
ex = api_expects(:content_exports, :repository)
|
68
|
+
ex.returns(response)
|
69
|
+
|
70
|
+
expect_foreman_task(task_id).at_least_once
|
71
|
+
|
72
|
+
HammerCLIKatello::ContentExportComplete::RepositoryCommand.
|
73
|
+
any_instance.
|
74
|
+
expects(:fetch_export_history).
|
75
|
+
returns(export_history)
|
76
|
+
|
77
|
+
result = run_cmd(@cmd + params)
|
78
|
+
assert_match(/Generated .*metadata.*json/, result.out)
|
79
|
+
assert_equal(HammerCLI::EX_OK, result.exit_code)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'fails on missing required params' do
|
83
|
+
params = [
|
84
|
+
'--boo-id=2'
|
85
|
+
]
|
86
|
+
|
87
|
+
result = run_cmd(@cmd + params)
|
88
|
+
expected_error = "Could not export the repository:\n"
|
89
|
+
|
90
|
+
assert_equal(result.exit_code, HammerCLI::EX_USAGE)
|
91
|
+
assert_equal(result.err[/#{expected_error}/], expected_error)
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'fails on missing product name/id' do
|
95
|
+
params = ["--name=foo"]
|
96
|
+
|
97
|
+
result = run_cmd(@cmd + params)
|
98
|
+
expected_error = "At least one of options --product-id, --product is required"
|
99
|
+
|
100
|
+
assert_equal(result.exit_code, HammerCLI::EX_USAGE)
|
101
|
+
assert_match(/#{expected_error}/, result.err)
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'fails on missing repository' do
|
105
|
+
params = ["--product-id=2"]
|
106
|
+
result = run_cmd(@cmd + params)
|
107
|
+
expected_error = "--name is required."
|
108
|
+
|
109
|
+
assert_equal(result.exit_code, HammerCLI::EX_USAGE)
|
110
|
+
assert_match(/#{expected_error}/, result.err)
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'fails on missing product missing org' do
|
114
|
+
params = ["--product=lol", "--name=#{name}"]
|
115
|
+
result = run_cmd(@cmd + params)
|
116
|
+
expected_error = "At least one of options --organization-id,"\
|
117
|
+
" --organization, --organization-label is required"
|
118
|
+
|
119
|
+
assert_equal(result.exit_code, HammerCLI::EX_USAGE)
|
120
|
+
assert_match(/#{expected_error}/, result.err)
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'correctly resolves product_id and repository name' do
|
124
|
+
params = ["--product-id=#{product_id}",
|
125
|
+
"--name=#{name}",
|
126
|
+
"--async"]
|
127
|
+
expects_repository(repository_id, default_repository_options)
|
128
|
+
|
129
|
+
cvv_expect = api_expects(:repositories, :index) do |p|
|
130
|
+
assert_equal p['product_id'].to_s, product_id.to_s
|
131
|
+
assert_equal p["name"], name
|
132
|
+
end
|
133
|
+
|
134
|
+
cvv_expect.at_least_once.
|
135
|
+
returns(index_response([{'id' => repository_id}]))
|
136
|
+
|
137
|
+
ex = api_expects(:content_exports, :repository) do |p|
|
138
|
+
assert_equal p['id'], repository_id
|
139
|
+
end
|
140
|
+
ex.returns(response)
|
141
|
+
run_cmd(@cmd + params)
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'correctly resolves chunk-size-gb' do
|
145
|
+
chunk_size = 1000
|
146
|
+
params = ["--id=#{repository_id}",
|
147
|
+
"--chunk-size-gb=#{chunk_size}",
|
148
|
+
"--organization-id=99"]
|
149
|
+
|
150
|
+
expects_repository(repository_id, default_repository_options)
|
151
|
+
|
152
|
+
ex = api_expects(:content_exports, :repository) do |p|
|
153
|
+
assert_equal p["chunk_size_gb"], chunk_size
|
154
|
+
end
|
155
|
+
ex.returns(response)
|
156
|
+
|
157
|
+
expect_foreman_task(task_id).at_least_once
|
158
|
+
|
159
|
+
HammerCLIKatello::ContentExportComplete::RepositoryCommand.
|
160
|
+
any_instance.
|
161
|
+
expects(:fetch_export_history).
|
162
|
+
returns(export_history)
|
163
|
+
|
164
|
+
result = run_cmd(@cmd + params)
|
165
|
+
assert_match(/Generated .*metadata.*json/, result.out)
|
166
|
+
assert_equal(HammerCLI::EX_OK, result.exit_code)
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'fails on invalid chunk-size-gb value' do
|
170
|
+
params = ["--id=#{repository_id}",
|
171
|
+
"--chunk-size-gb=0.5",
|
172
|
+
"--organization-id=99"]
|
173
|
+
|
174
|
+
result = run_cmd(@cmd + params)
|
175
|
+
assert_match(/Error: Option '--chunk-size-gb': Numeric value is required/, result.err)
|
176
|
+
assert_equal(HammerCLI::EX_USAGE, result.exit_code)
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'Errors out on lazy repositories' do
|
180
|
+
params = ["--id=#{repository_id}"]
|
181
|
+
expects_repository(repository_id, "download_policy" => "on_demand", "id" => repository_id)
|
182
|
+
|
183
|
+
ex = api_expects(:content_exports, :repository)
|
184
|
+
ex.returns(response)
|
185
|
+
|
186
|
+
expect_foreman_task(task_id).at_least_once
|
187
|
+
|
188
|
+
HammerCLIKatello::ContentExportComplete::RepositoryCommand.
|
189
|
+
any_instance.
|
190
|
+
expects(:fetch_export_history).
|
191
|
+
returns(export_history)
|
192
|
+
|
193
|
+
HammerCLIKatello::ContentExportComplete::RepositoryCommand.
|
194
|
+
any_instance.
|
195
|
+
expects(:exit).with(HammerCLI::EX_SOFTWARE)
|
196
|
+
|
197
|
+
result = run_cmd(@cmd + params)
|
198
|
+
assert_match(/Unable to fully export this repository because/, result.out)
|
199
|
+
assert_match(/#{repository_id}/, result.out)
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'should accept product and get the right repository' do
|
203
|
+
params = ["--product-id=#{product_id}",
|
204
|
+
"--name=#{name}"]
|
205
|
+
expect_repository_search(product_id.to_i, name, repository_id).at_least_once
|
206
|
+
repo_search = api_expects(:repositories, :index, 'Find a repository') do |p|
|
207
|
+
assert_equal p["product_id"].to_s, product_id.to_s
|
208
|
+
assert_equal p["name"], name
|
209
|
+
end
|
210
|
+
repo_search.returns(index_response([{'id' => repository_id}]))
|
211
|
+
|
212
|
+
expects_repository(repository_id, default_repository_options)
|
213
|
+
ex = api_expects(:content_exports, :repository)
|
214
|
+
ex.returns(response)
|
215
|
+
|
216
|
+
expect_foreman_task(task_id).at_least_once
|
217
|
+
|
218
|
+
HammerCLIKatello::ContentExportComplete::RepositoryCommand.
|
219
|
+
any_instance.
|
220
|
+
expects(:fetch_export_history).
|
221
|
+
returns(export_history)
|
222
|
+
result = run_cmd(@cmd + params)
|
223
|
+
assert_match(/Generated .*metadata.*json/, result.out)
|
224
|
+
assert_equal(HammerCLI::EX_OK, result.exit_code)
|
225
|
+
end
|
226
|
+
end
|
@@ -2,6 +2,13 @@ require_relative '../search_helpers'
|
|
2
2
|
|
3
3
|
module ContentExportHelpers
|
4
4
|
include SearchHelpers
|
5
|
+
def expects_repository(repository_id, returns = {})
|
6
|
+
ex = api_expects(:repositories, :show, "Find Repo #{repository_id}") do |p|
|
7
|
+
assert_equal p[:id].to_s, repository_id.to_s
|
8
|
+
end
|
9
|
+
ex.returns(returns)
|
10
|
+
end
|
11
|
+
|
5
12
|
def expects_repositories_in_library(organization_id, returns = [])
|
6
13
|
expect_lenient_search(:repositories,
|
7
14
|
params: {
|
@@ -0,0 +1,212 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
require 'hammer_cli_katello/content_export'
|
3
|
+
require_relative '../../product/product_helpers'
|
4
|
+
require_relative '../../repository/repository_helpers'
|
5
|
+
require_relative '../content_export_helpers'
|
6
|
+
|
7
|
+
describe 'content-export incremental version' do
|
8
|
+
include ForemanTaskHelpers
|
9
|
+
include ContentExportHelpers
|
10
|
+
include ProductHelpers
|
11
|
+
include RepositoryHelpers
|
12
|
+
|
13
|
+
before do
|
14
|
+
@cmd = %w(content-export incremental repository)
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:task_id) { '5' }
|
18
|
+
let(:response) do
|
19
|
+
{
|
20
|
+
'id' => task_id,
|
21
|
+
'state' => 'planned',
|
22
|
+
'output' => {
|
23
|
+
'export_history_id' => 2
|
24
|
+
}
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
let(:export_history_id) { 1000 }
|
29
|
+
|
30
|
+
let(:export_history) do
|
31
|
+
{
|
32
|
+
"id": export_history_id,
|
33
|
+
"path": "/tmp",
|
34
|
+
"metadata": {}
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
let(:default_repository_options) do
|
39
|
+
{"download_policy" => "immediate", "id" => repository_id}
|
40
|
+
end
|
41
|
+
|
42
|
+
let(:product_id) { '77' }
|
43
|
+
let(:repository_id) { 100 }
|
44
|
+
|
45
|
+
let(:name) { 'great' }
|
46
|
+
|
47
|
+
it "performs export with required options and async" do
|
48
|
+
params = [
|
49
|
+
"--id=#{repository_id}",
|
50
|
+
'--async'
|
51
|
+
]
|
52
|
+
expects_repository(repository_id, default_repository_options)
|
53
|
+
|
54
|
+
ex = api_expects(:content_export_incrementals, :repository)
|
55
|
+
ex.returns(response)
|
56
|
+
|
57
|
+
result = run_cmd(@cmd + params)
|
58
|
+
|
59
|
+
assert_equal("Repository is being exported in task #{task_id}.\n"\
|
60
|
+
+ "Once the task completes the export metadata must be generated with the "\
|
61
|
+
+ "command:\n hammer content-export generate-metadata --task-id #{task_id}\n", result.out)
|
62
|
+
assert_equal(HammerCLI::EX_OK, result.exit_code)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "performs export with required options" do
|
66
|
+
params = [
|
67
|
+
"--id=#{repository_id}"
|
68
|
+
]
|
69
|
+
|
70
|
+
expects_repository(repository_id, default_repository_options)
|
71
|
+
ex = api_expects(:content_export_incrementals, :repository)
|
72
|
+
ex.returns(response)
|
73
|
+
|
74
|
+
expect_foreman_task(task_id).at_least_once
|
75
|
+
|
76
|
+
HammerCLIKatello::ContentExportIncremental::RepositoryCommand.
|
77
|
+
any_instance.
|
78
|
+
expects(:fetch_export_history).
|
79
|
+
returns(export_history)
|
80
|
+
|
81
|
+
result = run_cmd(@cmd + params)
|
82
|
+
assert_match(/Generated .*metadata.*json/, result.out)
|
83
|
+
assert_equal(HammerCLI::EX_OK, result.exit_code)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "performs export with history id" do
|
87
|
+
params = [
|
88
|
+
"--id=#{repository_id}",
|
89
|
+
"--from-history-id=#{export_history_id}"
|
90
|
+
]
|
91
|
+
expects_repository(repository_id, default_repository_options)
|
92
|
+
api_expects(:content_export_incrementals, :repository)
|
93
|
+
.with_params('id' => repository_id,
|
94
|
+
'from_history_id' => export_history_id)
|
95
|
+
.returns(response)
|
96
|
+
|
97
|
+
expect_foreman_task(task_id).at_least_once
|
98
|
+
|
99
|
+
HammerCLIKatello::ContentExportIncremental::RepositoryCommand.
|
100
|
+
any_instance.
|
101
|
+
expects(:fetch_export_history).
|
102
|
+
returns(export_history)
|
103
|
+
|
104
|
+
result = run_cmd(@cmd + params)
|
105
|
+
assert_match(/Generated .*metadata.*json/, result.out)
|
106
|
+
assert_equal(HammerCLI::EX_OK, result.exit_code)
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'fails on missing required params' do
|
110
|
+
params = [
|
111
|
+
'--boo-id=2'
|
112
|
+
]
|
113
|
+
|
114
|
+
result = run_cmd(@cmd + params)
|
115
|
+
expected_error = "Could not export the repository:\n"
|
116
|
+
|
117
|
+
assert_equal(result.exit_code, HammerCLI::EX_USAGE)
|
118
|
+
assert_equal(result.err[/#{expected_error}/], expected_error)
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'correctly resolves product_id and repository name' do
|
122
|
+
params = ["--product-id=#{product_id}",
|
123
|
+
"--name=#{name}",
|
124
|
+
"--async"]
|
125
|
+
expects_repository(repository_id, default_repository_options)
|
126
|
+
|
127
|
+
cvv_expect = api_expects(:repositories, :index) do |p|
|
128
|
+
assert_equal p['product_id'].to_s, product_id.to_s
|
129
|
+
assert_equal p["name"], name
|
130
|
+
end
|
131
|
+
|
132
|
+
cvv_expect.at_least_once.
|
133
|
+
returns(index_response([{'id' => repository_id}]))
|
134
|
+
|
135
|
+
ex = api_expects(:content_export_incrementals, :repository) do |p|
|
136
|
+
assert_equal p['id'], repository_id
|
137
|
+
end
|
138
|
+
ex.returns(response)
|
139
|
+
run_cmd(@cmd + params)
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'fails on missing product name/id' do
|
143
|
+
params = ["--name=foo"]
|
144
|
+
result = run_cmd(@cmd + params)
|
145
|
+
expected_error = "At least one of options --product-id, --product is required"
|
146
|
+
assert_equal(result.exit_code, HammerCLI::EX_USAGE)
|
147
|
+
assert_match(/#{expected_error}/, result.err)
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'fails on missing repository' do
|
151
|
+
params = ["--product-id=2"]
|
152
|
+
result = run_cmd(@cmd + params)
|
153
|
+
expected_error = "--name is required."
|
154
|
+
|
155
|
+
assert_equal(result.exit_code, HammerCLI::EX_USAGE)
|
156
|
+
assert_match(/#{expected_error}/, result.err)
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'fails on missing product missing org' do
|
160
|
+
params = ["--product=lol", "--name=#{name}"]
|
161
|
+
result = run_cmd(@cmd + params)
|
162
|
+
expected_error = "At least one of options --organization-id,"\
|
163
|
+
" --organization, --organization-label is required"
|
164
|
+
|
165
|
+
assert_equal(result.exit_code, HammerCLI::EX_USAGE)
|
166
|
+
assert_match(/#{expected_error}/, result.err)
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'correctly resolves product_id and repository name' do
|
170
|
+
params = ["--product-id=#{product_id}",
|
171
|
+
"--name=#{name}",
|
172
|
+
"--async"]
|
173
|
+
expects_repository(repository_id, default_repository_options)
|
174
|
+
|
175
|
+
cvv_expect = api_expects(:repositories, :index) do |p|
|
176
|
+
assert_equal p['product_id'].to_s, product_id.to_s
|
177
|
+
assert_equal p["name"], name
|
178
|
+
end
|
179
|
+
|
180
|
+
cvv_expect.at_least_once.
|
181
|
+
returns(index_response([{'id' => repository_id}]))
|
182
|
+
|
183
|
+
ex = api_expects(:content_export_incrementals, :repository) do |p|
|
184
|
+
assert_equal p['id'], repository_id
|
185
|
+
end
|
186
|
+
ex.returns(response)
|
187
|
+
run_cmd(@cmd + params)
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'Errors out on lazy repositories' do
|
191
|
+
params = ["--id=#{repository_id}"]
|
192
|
+
expects_repository(repository_id, "download_policy" => "on_demand", "id" => repository_id)
|
193
|
+
|
194
|
+
ex = api_expects(:content_export_incrementals, :repository)
|
195
|
+
ex.returns(response)
|
196
|
+
|
197
|
+
expect_foreman_task(task_id).at_least_once
|
198
|
+
|
199
|
+
HammerCLIKatello::ContentExportIncremental::RepositoryCommand.
|
200
|
+
any_instance.
|
201
|
+
expects(:fetch_export_history).
|
202
|
+
returns(export_history)
|
203
|
+
|
204
|
+
HammerCLIKatello::ContentExportIncremental::RepositoryCommand.
|
205
|
+
any_instance.
|
206
|
+
expects(:exit).with(HammerCLI::EX_SOFTWARE)
|
207
|
+
|
208
|
+
result = run_cmd(@cmd + params)
|
209
|
+
assert_match(/Unable to fully export this repository because/, result.out)
|
210
|
+
assert_match(/#{repository_id}/, result.out)
|
211
|
+
end
|
212
|
+
end
|
@@ -12,10 +12,10 @@ module HammerCLIKatello
|
|
12
12
|
it 'resolves ID from name and repo id' do
|
13
13
|
api_expects(:module_streams, :index)
|
14
14
|
.with_params(search: "name = \"duck\"", name: "duck", repository_id: "1")
|
15
|
-
.returns(index_response([{'id' => 1}]))
|
15
|
+
.returns(index_response([{'id' => "1"}]))
|
16
16
|
|
17
17
|
api_expects(:module_streams, :show)
|
18
|
-
.with_params(repository_id: 1, id: 1)
|
18
|
+
.with_params(repository_id: 1, id: "1")
|
19
19
|
|
20
20
|
run_cmd(%w(module-stream info --name duck --repository-id 1))
|
21
21
|
end
|
@@ -16,12 +16,14 @@ describe HammerCLIKatello::Organization::ConfigureCdnCommand do
|
|
16
16
|
username = "foo"
|
17
17
|
url = "https://goo.com"
|
18
18
|
upstream_label = "GreatOrg"
|
19
|
+
type = 'network_sync'
|
19
20
|
params = ["--label=#{org_label}",
|
20
21
|
"--url=#{url}",
|
21
22
|
"--username=#{username}",
|
22
23
|
"--upstream-organization-label=#{upstream_label}",
|
23
24
|
"--password=#{password}",
|
24
|
-
"--ssl-ca-credential-id=#{ssl_cred_id}"
|
25
|
+
"--ssl-ca-credential-id=#{ssl_cred_id}",
|
26
|
+
"--type=#{type}"
|
25
27
|
]
|
26
28
|
expect_organization_search(org_label, org_id, field: 'label')
|
27
29
|
|
@@ -31,7 +33,8 @@ describe HammerCLIKatello::Organization::ConfigureCdnCommand do
|
|
31
33
|
par['url'] == url &&
|
32
34
|
par['password'] == password &&
|
33
35
|
par['ssl_ca_credential_id'].to_s == ssl_cred_id &&
|
34
|
-
par['upstream_organization_label'] == upstream_label
|
36
|
+
par['upstream_organization_label'] == upstream_label &&
|
37
|
+
par['type'] == type
|
35
38
|
end
|
36
39
|
|
37
40
|
assert_equal(
|