hammer_cli_katello 1.3.0 → 1.4.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/content_units.rb +66 -0
- data/lib/hammer_cli_katello/content_view_component.rb +4 -3
- data/lib/hammer_cli_katello/repository.rb +67 -31
- data/lib/hammer_cli_katello/version.rb +1 -1
- data/lib/hammer_cli_katello.rb +5 -5
- data/test/data/4.3/foreman_api.json +1 -1
- data/test/data/4.4/foreman_api.json +1 -0
- data/test/functional/content_units/info_test.rb +29 -0
- data/test/functional/content_units/list_test.rb +106 -0
- data/test/functional/organization/cdn_configuration_test.rb +5 -2
- data/test/functional/repository/info_test.rb +6 -0
- data/test/functional/repository/reclaim_space_test.rb +105 -0
- data/test/functional/repository/upload_test.rb +46 -23
- data/test/test_helper.rb +1 -1
- metadata +11 -3
- data/lib/hammer_cli_katello/ostree_branch.rb +0 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1ff46aa39c3547dea6343f671d10d5ae603ecee1d4e2c416ddea5b1884de3e0
|
4
|
+
data.tar.gz: 5c3a848bcf07dba7d725a882a8a5e667841327f08ec738c100375c910466bfef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2fe7eddfe5ec1ebb616afeadd16c57ccba45100997b00dd69912284c27fc94467d22bc2d0023685237e7c744f3eb257a2c8d92d31a5589eb520a3f2e5fb2c484
|
7
|
+
data.tar.gz: 615ed4f84b86117d9b78543c1d8b5a09b9e21240d4f2fa9d5c2899c5a0d229e4ea1da2d008b03095473c90f9ea5cb43a024d122168a0b29a3578affd0d62b040
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module HammerCLIKatello
|
2
|
+
class ContentUnitsCommand < HammerCLIKatello::Command
|
3
|
+
resource :generic_content_units
|
4
|
+
|
5
|
+
class ListCommand < HammerCLIKatello::ListCommand
|
6
|
+
extend RepositoryScopedToProduct
|
7
|
+
|
8
|
+
validate_repo_name_requires_product_options(:option_repository_name)
|
9
|
+
|
10
|
+
output do
|
11
|
+
field :id, _("Id")
|
12
|
+
field :name, _("Name")
|
13
|
+
field :version, _("Version")
|
14
|
+
field :filename, _("Filename"), Fields::Field, hide_blank: true
|
15
|
+
end
|
16
|
+
|
17
|
+
validate_options :before, 'IdResolution' do
|
18
|
+
organization_options = [:option_organization_id, :option_organization_name,
|
19
|
+
:option_organization_label]
|
20
|
+
if any(:option_product_name, :option_content_view_name).exist?
|
21
|
+
any(*organization_options).required
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
build_options do |o|
|
26
|
+
o.expand.including(:products, :organizations, :content_views)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class InfoCommand < HammerCLIKatello::InfoCommand
|
31
|
+
output do
|
32
|
+
field :id, _("Id")
|
33
|
+
field :name, _("Name")
|
34
|
+
field :version, _("Version")
|
35
|
+
field :filename, _("Filename"), Fields::Field, hide_blank: true
|
36
|
+
end
|
37
|
+
|
38
|
+
validate_options :before, 'IdResolution' do
|
39
|
+
organization_options = [:option_organization_id, :option_organization_name,
|
40
|
+
:option_organization_label]
|
41
|
+
product_options = [:option_product_id, :option_product_name]
|
42
|
+
repository_options = [:option_repository_id, :option_repository_name]
|
43
|
+
content_view_version_options = [:option_content_view_version_id,
|
44
|
+
:option_content_view_version_version]
|
45
|
+
|
46
|
+
if option(:option_product_name).exist?
|
47
|
+
any(*organization_options).required
|
48
|
+
end
|
49
|
+
|
50
|
+
if option(:option_repository_name).exist?
|
51
|
+
any(*product_options).required
|
52
|
+
end
|
53
|
+
|
54
|
+
if option(:option_name).exist?
|
55
|
+
any(*(repository_options + content_view_version_options)).required
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
build_options do |o|
|
60
|
+
o.expand.including(:products, :organizations, :content_views, :content_view_versions)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
autoload_subcommands
|
65
|
+
end
|
66
|
+
end
|
@@ -84,16 +84,16 @@ module HammerCLIKatello
|
|
84
84
|
include OrganizationOptions
|
85
85
|
include CompositeContentViewNameResolvable
|
86
86
|
output do
|
87
|
-
field :
|
87
|
+
field :content_view_id, _("Content View Id")
|
88
88
|
field :content_view_name, _("Name")
|
89
89
|
field :version, _("Version")
|
90
|
+
field :id, _("Component Id")
|
90
91
|
field :current_version, _("Current Version")
|
91
92
|
field :version_id, _("Version Id")
|
92
93
|
end
|
93
94
|
|
94
95
|
def extend_data(mod)
|
95
96
|
if mod['latest']
|
96
|
-
mod['content_view_name'] = mod["content_view"]["name"]
|
97
97
|
mod['version'] = _("Latest")
|
98
98
|
if mod['content_view_version']
|
99
99
|
mod['current_version'] = mod['content_view_version']['version']
|
@@ -102,10 +102,11 @@ module HammerCLIKatello
|
|
102
102
|
mod['current_version'] = _("No Published Version")
|
103
103
|
end
|
104
104
|
else
|
105
|
-
mod['content_view_name'] = mod["content_view"]["name"]
|
106
105
|
mod['version'] = mod['content_view_version']['version']
|
107
106
|
mod['version_id'] = mod['content_view_version']['id']
|
108
107
|
end
|
108
|
+
mod['content_view_name'] = mod["content_view"]["name"]
|
109
|
+
mod['content_view_id'] = mod["content_view"]["id"]
|
109
110
|
mod
|
110
111
|
end
|
111
112
|
|
@@ -86,7 +86,7 @@ module HammerCLIKatello
|
|
86
86
|
end
|
87
87
|
|
88
88
|
label _("GPG Key") do
|
89
|
-
from :
|
89
|
+
from :content_credential do
|
90
90
|
field :id, _("Id"), Fields::Field, :hide_blank => true
|
91
91
|
field :name, _("Name"), Fields::Field, :hide_blank => true
|
92
92
|
end
|
@@ -110,7 +110,6 @@ module HammerCLIKatello
|
|
110
110
|
field :docker_manifest_total, _("Container Image Manifests"), Fields::Field,
|
111
111
|
:hide_blank => true
|
112
112
|
field :docker_tag_total, _("Container Image Tags"), Fields::Field, :hide_blank => true
|
113
|
-
field :ostree_branch_total, _("OSTree Branches"), Fields::Field, :hide_blank => true
|
114
113
|
field :file_total, _("Files"), Fields::Field, :hide_blank => true
|
115
114
|
field :module_stream_total, _("Module Streams"), Fields::Field, :hide_blank => true
|
116
115
|
end
|
@@ -159,21 +158,11 @@ module HammerCLIKatello
|
|
159
158
|
data["docker_manifest_list_total"] = content_counts["docker_manifest_list"]
|
160
159
|
data["docker_manifest_total"] = content_counts["docker_manifest"]
|
161
160
|
data["docker_tag_total"] = content_counts["docker_tag"]
|
162
|
-
when "ostree"
|
163
|
-
setup_ostree(data)
|
164
161
|
when "file"
|
165
162
|
data["file_total"] = content_counts["file"]
|
166
163
|
end
|
167
164
|
end
|
168
165
|
|
169
|
-
def setup_ostree(data)
|
170
|
-
content_counts = data["content_counts"]
|
171
|
-
data["ostree_branch_total"] = content_counts["ostree_branch"]
|
172
|
-
if data["ostree_upstream_sync_policy"] == "custom"
|
173
|
-
data["_ostree_upstream_sync_depth"] = data["ostree_upstream_sync_depth"]
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
166
|
def get_sync_status(state)
|
178
167
|
sync_states = {
|
179
168
|
"failed" => _("Failed"), "success" => _("Success"), "finished" => _("Finished"),
|
@@ -400,6 +389,8 @@ module HammerCLIKatello
|
|
400
389
|
o.expand.including(:products, :organizations)
|
401
390
|
end
|
402
391
|
|
392
|
+
option "--async", :flag, _("Do not wait for the task.")
|
393
|
+
|
403
394
|
option "--ostree-repository-name", "OSTREE REPOSITORY NAME",
|
404
395
|
_("Name of OSTree repository in archive."),
|
405
396
|
:attribute_name => :option_ostree_repository_name,
|
@@ -426,6 +417,7 @@ module HammerCLIKatello
|
|
426
417
|
update_content_upload(upload_id, repo_id, file)
|
427
418
|
end
|
428
419
|
opts[:ostree_repository_name] = options["option_ostree_repository_name"]
|
420
|
+
opts[:filename] = filename
|
429
421
|
results = import_uploads([
|
430
422
|
{
|
431
423
|
id: upload_id,
|
@@ -434,7 +426,7 @@ module HammerCLIKatello
|
|
434
426
|
size: file.size,
|
435
427
|
checksum: checksum
|
436
428
|
}], opts)
|
437
|
-
print_results(filename, results)
|
429
|
+
print_results(filename, results, options["option_async"])
|
438
430
|
ensure
|
439
431
|
if upload_id
|
440
432
|
content_upload_resource.call(:destroy, :repository_id => get_identifier, :id => upload_id)
|
@@ -479,35 +471,54 @@ module HammerCLIKatello
|
|
479
471
|
params = {:id => get_identifier,
|
480
472
|
:uploads => uploads,
|
481
473
|
publish_repository: publish_repository,
|
482
|
-
sync_capsule: sync_capsule
|
474
|
+
sync_capsule: sync_capsule,
|
475
|
+
async: true
|
483
476
|
}
|
484
477
|
params[:content_type] = options["option_content_type"] if options["option_content_type"]
|
485
478
|
if options["option_ostree_repository_name"]
|
486
479
|
params[:ostree_repository_name] = options["option_ostree_repository_name"]
|
487
480
|
end
|
488
|
-
|
481
|
+
results = if options["option_async"]
|
482
|
+
resource.call(:import_uploads, params)
|
483
|
+
else
|
484
|
+
task_progress(resource.call(:import_uploads, params))
|
485
|
+
end
|
486
|
+
results
|
489
487
|
end
|
490
488
|
|
491
|
-
def
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
489
|
+
def task_progress(task_or_id)
|
490
|
+
super
|
491
|
+
task_id = task_or_id.is_a?(Hash) ? task_or_id['id'] : task_or_id
|
492
|
+
load_task(task_id)
|
493
|
+
end
|
494
|
+
|
495
|
+
# rubocop:disable CyclomaticComplexity
|
496
|
+
# rubocop:disable PerceivedComplexity
|
497
|
+
def print_results(name, results, async)
|
498
|
+
if !%w(error warning).include?(results) && !async # task successful && no async flag used
|
497
499
|
upload_results = results.dig('output', 'upload_results') || []
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
500
|
+
|
501
|
+
if upload_results.empty?
|
502
|
+
print_message _("Successfully uploaded file %s" % name)
|
503
|
+
else
|
504
|
+
upload_results.each do |result|
|
505
|
+
if result['type'] == 'docker_manifest'
|
506
|
+
print_message(
|
507
|
+
_("Successfully uploaded manifest file '%{name}' with digest '%{digest}'") % {
|
508
|
+
:name => name, :digest => result['digest'] })
|
509
|
+
else
|
510
|
+
print_message _("Successfully uploaded file %s" % name)
|
511
|
+
end
|
507
512
|
end
|
508
513
|
end
|
514
|
+
elsif results&.dig('id') && async # async flag used
|
515
|
+
print_message _("Content is being uploaded in task #{results['id']}.")
|
516
|
+
else
|
517
|
+
print_message _("Could not upload the content.")
|
509
518
|
end
|
510
519
|
end
|
520
|
+
# rubocop:enable CyclomaticComplexity
|
521
|
+
# rubocop:enable PerceivedComplexity
|
511
522
|
|
512
523
|
def silence_warnings
|
513
524
|
original_verbose = $VERBOSE
|
@@ -519,7 +530,6 @@ module HammerCLIKatello
|
|
519
530
|
end
|
520
531
|
end
|
521
532
|
end
|
522
|
-
# rubocop:enable ClassLength
|
523
533
|
|
524
534
|
class RemoveContentCommand < HammerCLIKatello::SingleResourceCommand
|
525
535
|
extend RepositoryScopedToProduct
|
@@ -547,6 +557,32 @@ module HammerCLIKatello
|
|
547
557
|
end
|
548
558
|
end
|
549
559
|
|
560
|
+
class ReclaimSpaceCommand < HammerCLIKatello::SingleResourceCommand
|
561
|
+
extend RepositoryScopedToProduct
|
562
|
+
include HammerCLIForemanTasks::Async
|
563
|
+
include OrganizationOptions
|
564
|
+
validate_repo_name_requires_product_options
|
565
|
+
action :reclaim_space
|
566
|
+
command_name "reclaim-space"
|
567
|
+
desc _("Reclaim space from an On Demand repository")
|
568
|
+
|
569
|
+
success_message _("Repository space reclaimed.")
|
570
|
+
failure_message _("Could not reclaim the repository")
|
571
|
+
|
572
|
+
validate_options :before, 'IdResolution' do
|
573
|
+
organization_options = [:option_organization_id, :option_organization_name, \
|
574
|
+
:option_organization_label]
|
575
|
+
|
576
|
+
if option(:option_product_name).exist?
|
577
|
+
any(*organization_options).required
|
578
|
+
end
|
579
|
+
end
|
580
|
+
|
581
|
+
build_options do |o|
|
582
|
+
o.expand.including(:products)
|
583
|
+
end
|
584
|
+
end
|
585
|
+
# rubocop:enable ClassLength
|
550
586
|
autoload_subcommands
|
551
587
|
end
|
552
588
|
end
|
data/lib/hammer_cli_katello.rb
CHANGED
@@ -117,16 +117,16 @@ module HammerCLIKatello
|
|
117
117
|
'hammer_cli_katello/erratum'
|
118
118
|
)
|
119
119
|
|
120
|
-
HammerCLI::MainCommand.lazy_subcommand("ostree-branch", _("Manipulate ostree branches"),
|
121
|
-
'HammerCLIKatello::OstreeBranchCommand',
|
122
|
-
'hammer_cli_katello/ostree_branch'
|
123
|
-
)
|
124
|
-
|
125
120
|
HammerCLI::MainCommand.lazy_subcommand("file", _("Manipulate files"),
|
126
121
|
'HammerCLIKatello::FileCommand',
|
127
122
|
'hammer_cli_katello/file'
|
128
123
|
)
|
129
124
|
|
125
|
+
HammerCLI::MainCommand.lazy_subcommand("content-units", _("Manipulate content units"),
|
126
|
+
'HammerCLIKatello::ContentUnitsCommand',
|
127
|
+
'hammer_cli_katello/content_units'
|
128
|
+
)
|
129
|
+
|
130
130
|
HammerCLI::MainCommand.lazy_subcommand("content-export",
|
131
131
|
_("Prepare content for export to a disconnected Katello"),
|
132
132
|
'HammerCLIKatello::ContentExport',
|