hammer_cli_katello 0.3.0 → 0.10.0

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.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/lib/hammer_cli_katello.rb +0 -1
  3. data/lib/hammer_cli_katello/activation_key.rb +12 -29
  4. data/lib/hammer_cli_katello/composite_content_view_name_resolvable.rb +6 -8
  5. data/lib/hammer_cli_katello/content_override.rb +48 -0
  6. data/lib/hammer_cli_katello/content_view.rb +98 -5
  7. data/lib/hammer_cli_katello/content_view_name_resolvable.rb +4 -6
  8. data/lib/hammer_cli_katello/content_view_purge.rb +92 -0
  9. data/lib/hammer_cli_katello/content_view_version.rb +13 -0
  10. data/lib/hammer_cli_katello/erratum.rb +9 -0
  11. data/lib/hammer_cli_katello/filter_rule.rb +3 -4
  12. data/lib/hammer_cli_katello/host_collection.rb +8 -2
  13. data/lib/hammer_cli_katello/host_errata.rb +1 -1
  14. data/lib/hammer_cli_katello/host_subscription.rb +25 -0
  15. data/lib/hammer_cli_katello/hostgroup_extensions.rb +7 -6
  16. data/lib/hammer_cli_katello/id_resolver.rb +13 -4
  17. data/lib/hammer_cli_katello/katello_environment_name_resolvable.rb +4 -6
  18. data/lib/hammer_cli_katello/lifecycle_environment_name_resolvable.rb +4 -6
  19. data/lib/hammer_cli_katello/organization.rb +1 -0
  20. data/lib/hammer_cli_katello/package.rb +16 -3
  21. data/lib/hammer_cli_katello/package_group.rb +16 -2
  22. data/lib/hammer_cli_katello/product_content.rb +36 -0
  23. data/lib/hammer_cli_katello/repository.rb +48 -7
  24. data/lib/hammer_cli_katello/version.rb +1 -1
  25. data/test/data/3.4/foreman_api.json +1 -0
  26. data/test/functional/{activaton_key → activation_key}/add_host_collection_test.rb +0 -0
  27. data/test/functional/activation_key/content_override_test.rb +91 -0
  28. data/test/functional/{activaton_key → activation_key}/create_test.rb +0 -0
  29. data/test/functional/{activaton_key → activation_key}/list_test.rb +0 -0
  30. data/test/functional/{activaton_key → activation_key}/product_content_test.rb +0 -0
  31. data/test/functional/{activaton_key → activation_key}/remove_host_collection_test.rb +0 -0
  32. data/test/functional/{activaton_key → activation_key}/subscriptions_test.rb +0 -0
  33. data/test/functional/{activaton_key → activation_key}/update_test.rb +0 -0
  34. data/test/functional/content_view/add_content_view_version_test.rb +57 -3
  35. data/test/functional/content_view/add_repository_test.rb +1 -0
  36. data/test/functional/content_view/copy_test.rb +53 -0
  37. data/test/functional/content_view/delete_test.rb +62 -0
  38. data/test/functional/content_view/publish_test.rb +1 -0
  39. data/test/functional/content_view/puppet_module/add_test.rb +1 -0
  40. data/test/functional/content_view/purge_test.rb +72 -0
  41. data/test/functional/content_view/remove_content_view_version_test.rb +57 -3
  42. data/test/functional/content_view/remove_test.rb +78 -0
  43. data/test/functional/content_view/update_test.rb +53 -0
  44. data/test/functional/content_view/version/republish_repositories_test.rb +35 -0
  45. data/test/functional/erratum/list_test.rb +108 -0
  46. data/test/functional/host/subscription/content_override_test.rb +95 -0
  47. data/test/functional/host/subscription/product_content_test.rb +27 -0
  48. data/test/functional/host_collection/content_api_expectations.rb +35 -0
  49. data/test/functional/host_collection/content_install_test.rb +42 -17
  50. data/test/functional/host_collection/content_remove_test.rb +22 -12
  51. data/test/functional/host_collection/content_update_test.rb +22 -12
  52. data/test/functional/hostgroup/create_test.rb +6 -0
  53. data/test/functional/hostgroup/data/hostgroup.json +2 -2
  54. data/test/functional/hostgroup/info_test.rb +2 -1
  55. data/test/functional/hostgroup/update_test.rb +12 -0
  56. data/test/functional/package/list_test.rb +89 -18
  57. data/test/functional/package_group/list_test.rb +33 -0
  58. data/test/functional/repository/export_test.rb +121 -0
  59. data/test/functional/repository/remove_content_test.rb +98 -8
  60. data/test/functional/repository/update_test.rb +108 -0
  61. data/test/functional/repository/upload_test.rb +73 -3
  62. data/test/test_helper.rb +1 -1
  63. data/test/unit/id_resolver_test.rb +26 -0
  64. metadata +54 -21
@@ -1,27 +1,37 @@
1
1
  require_relative '../test_helper'
2
+ require_relative './content_api_expectations'
2
3
  require 'hammer_cli_katello/host_collection'
3
4
 
4
5
  module HammerCLIKatello
5
6
  describe HostCollection::RemoveContentBaseCommand do
6
- it 'removes packages from hosts in a host collection' do
7
- api_expects(:hosts_bulk_actions, :remove_content) do |p|
8
- p['organization_id'] == 1 &&
9
- p['included'] == { search: "host_collection_id=\"3\"" } &&
10
- p['content'] == ['wget']
11
- end
7
+ include HammerCLIKatello::ContentAPIExpectations
8
+
9
+ def api_expects_content_remove(content_type, expected_params)
10
+ api_expects_content_action(:remove_content, content_type, expected_params)
11
+ end
12
12
 
13
+ it 'removes packages from hosts in a host collection' do
14
+ api_expects_content_remove('package', :content => ['wget'])
13
15
  run_cmd(%w(host-collection package remove --id 3 --packages wget --organization-id 1))
14
16
  end
15
17
 
16
- it 'removes package groups from hosts in a host collection' do
17
- api_expects(:hosts_bulk_actions, :remove_content) do |p|
18
- p['organization_id'] == 1 &&
19
- p['included'] == { search: "host_collection_id=\"3\"" } &&
20
- p['content'] == ['birds']
21
- end
18
+ it 'removes packages from hosts in a host collection specified by name' do
19
+ api_expects_collection_search
20
+ api_expects_content_remove('package', :content => ['wget'])
21
+ run_cmd(%w(host-collection package remove --name Test --packages wget --organization-id 1))
22
+ end
22
23
 
24
+ it 'removes package groups from hosts in a host collection' do
25
+ api_expects_content_remove('package_group', :content => ['birds'])
23
26
  run_cmd(%w(host-collection package-group remove --id 3
24
27
  --package-groups birds --organization-id 1))
25
28
  end
29
+
30
+ it 'removes package groups from hosts in a host collection specified by name' do
31
+ api_expects_collection_search
32
+ api_expects_content_remove('package_group', :content => ['birds'])
33
+ run_cmd(%w(host-collection package-group remove --name Test
34
+ --package-groups birds --organization-id 1))
35
+ end
26
36
  end
27
37
  end
@@ -1,27 +1,37 @@
1
1
  require_relative '../test_helper'
2
+ require_relative './content_api_expectations'
2
3
  require 'hammer_cli_katello/host_collection'
3
4
 
4
5
  module HammerCLIKatello
5
6
  describe HostCollection::UpdateContentBaseCommand do
6
- it 'updates packages on hosts in a host collection' do
7
- api_expects(:hosts_bulk_actions, :update_content) do |p|
8
- p['organization_id'] == 1 &&
9
- p['included'] == { search: "host_collection_id=\"3\"" } &&
10
- p['content'] == ['wget']
11
- end
7
+ include HammerCLIKatello::ContentAPIExpectations
8
+
9
+ def api_expects_content_update(content_type, expected_params)
10
+ api_expects_content_action(:update_content, content_type, expected_params)
11
+ end
12
12
 
13
+ it 'updates packages on hosts in a host collection' do
14
+ api_expects_content_update('package', :content => ['wget'])
13
15
  run_cmd(%w(host-collection package update --id 3 --packages wget --organization-id 1))
14
16
  end
15
17
 
16
- it 'updates package groups on hosts in a host collection' do
17
- api_expects(:hosts_bulk_actions, :update_content) do |p|
18
- p['organization_id'] == 1 &&
19
- p['included'] == { search: "host_collection_id=\"3\"" } &&
20
- p['content'] == ['birds']
21
- end
18
+ it 'updates packages on hosts in a host collection specified by name' do
19
+ api_expects_collection_search
20
+ api_expects_content_update('package', :content => ['wget'])
21
+ run_cmd(%w(host-collection package update --name Test --packages wget --organization-id 1))
22
+ end
22
23
 
24
+ it 'updates package groups on hosts in a host collection' do
25
+ api_expects_content_update('package_group', :content => ['birds'])
23
26
  run_cmd(%w(host-collection package-group update --id 3
24
27
  --package-groups birds --organization-id 1))
25
28
  end
29
+
30
+ it 'updates package groups on hosts in a host collection specified by name' do
31
+ api_expects_collection_search
32
+ api_expects_content_update('package_group', :content => ['birds'])
33
+ run_cmd(%w(host-collection package-group update --name Test
34
+ --package-groups birds --organization-id 1))
35
+ end
26
36
  end
27
37
  end
@@ -31,6 +31,12 @@ module HammerCLIForeman
31
31
  run_cmd(%w(hostgroup create --name hg1 --content-view cv1 --query-organization-id 1))
32
32
  end
33
33
 
34
+ it 'requires organization options to resolve content view name' do
35
+ api_expects_no_call
36
+ result = run_cmd(%w(hostgroup create --name hg1 --content-view cv1))
37
+ assert_match(/--query-organization/, result.err)
38
+ end
39
+
34
40
  it 'allows lifecycle environment id' do
35
41
  api_expects(:hostgroups, :create) do |p|
36
42
  p['hostgroup']['name'] == 'hg1' && p['hostgroup']['lifecycle_environment_id'] == 1 &&
@@ -1,6 +1,6 @@
1
1
  {
2
- "content_source_id":null,
3
- "content_source_name":null,
2
+ "content_source_id":1,
3
+ "content_source_name":"foreman.example.com",
4
4
  "content_view_id":1,
5
5
  "content_view_name":"Default Organization View",
6
6
  "lifecycle_environment_id":1,
@@ -21,7 +21,8 @@ module HammerCLIForeman
21
21
 
22
22
  result = run_cmd(@cmd + params)
23
23
  expected_fields = [['Lifecycle Environment', 'Library'],
24
- ['Content View', 'Default Organization View']]
24
+ ['Content View', 'Default Organization View'],
25
+ ['Content Source', 'foreman.example.com']]
25
26
  expected_results = expected_fields.map { |field| success_result(FieldMatcher.new(*field)) }
26
27
  expected_results.each { |expected| assert_cmd(expected, result) }
27
28
  end
@@ -31,6 +31,12 @@ module HammerCLIForeman
31
31
  run_cmd(%w(hostgroup update --id 1 --content-view cv1 --query-organization-id 1))
32
32
  end
33
33
 
34
+ it 'requires organization options to resolve content view name' do
35
+ api_expects_no_call
36
+ result = run_cmd(%w(hostgroup update --id 1 --content-view cv1))
37
+ assert_match(/--query-organization/, result.err)
38
+ end
39
+
34
40
  it 'allows lifecycle environment id' do
35
41
  api_expects(:hostgroups, :update) do |p|
36
42
  p['id'] == '1' && p['hostgroup']['lifecycle_environment_id'] == 1 &&
@@ -56,6 +62,12 @@ module HammerCLIForeman
56
62
  result = run_cmd(%w(hostgroup update --name hg1 --lifecycle-environment le1))
57
63
  assert_match(/--query-organization/, result.err)
58
64
  end
65
+
66
+ it 'requires organization options to resolve lifecycle environment name' do
67
+ api_expects_no_call
68
+ result = run_cmd(%w(hostgroup update --id 1 --lifecycle-environment le1))
69
+ assert_match(/--query-organization/, result.err)
70
+ end
59
71
  end
60
72
  end
61
73
  end
@@ -1,47 +1,118 @@
1
1
  require_relative '../test_helper'
2
+ require_relative '../repository/repository_helpers'
3
+ require_relative '../product/product_helpers'
4
+ require_relative '../organization/organization_helpers'
2
5
  require 'hammer_cli_katello/package'
3
6
 
4
7
  module HammerCLIKatello
5
8
  describe PackageCommand::ListCommand do
9
+ include OrganizationHelpers
10
+ include RepositoryHelpers
11
+ include ProductHelpers
12
+
6
13
  it 'allows minimal options' do
7
14
  api_expects(:packages, :index)
8
15
 
9
16
  run_cmd(%w(package list))
10
17
  end
11
18
 
12
- describe 'organization options' do
13
- it 'can be provided by organization ID' do
19
+ describe 'repository options' do
20
+ it 'may be specified by ID' do
14
21
  api_expects(:packages, :index) do |params|
15
- params['organization_id'] == 1
22
+ params['repository_id'] == 1
16
23
  end
17
24
 
18
- run_cmd(%w(package list --organization-id 1))
25
+ run_cmd(%w(package list --repository-id 1))
19
26
  end
20
27
 
21
- it 'can be provided by organization name' do
22
- ex = api_expects(:organizations, :index) do |params|
23
- params[:search] == "name = \"org1\""
24
- end
25
- ex.at_least_once.returns(index_response([{'id' => 1}]))
28
+ it 'require product ID when given repository name' do
29
+ api_expects_no_call
30
+
31
+ r = run_cmd(%w(package list --repository repo1))
32
+ assert(r.err.include?("--product-id, --product is required"), "Invalid error message")
33
+ end
34
+
35
+ it 'may be specified by name and product ID' do
36
+ expect_repository_search(2, 'repo1', 1)
26
37
 
27
38
  api_expects(:packages, :index) do |params|
28
- params['organization_id'] == 1
39
+ params['repository_id'] == 1
29
40
  end
30
41
 
31
- run_cmd(%w(package list --organization org1))
42
+ run_cmd(%w(package list --repository repo1 --product-id 2))
32
43
  end
44
+ end
33
45
 
34
- it 'can be provided by organization label' do
35
- ex = api_expects(:organizations, :index) do |params|
36
- params[:search] == "label = \"org1\""
46
+ describe 'product options' do
47
+ it 'may be specified by ID' do
48
+ ex = api_expects(:repositories, :index) do |p|
49
+ p['product_id'] == 1
37
50
  end
38
- ex.at_least_once.returns(index_response([{'id' => 1}]))
51
+ ex.returns(index_response([{'id' => 2}]))
39
52
 
40
- api_expects(:packages, :index) do |params|
41
- params['organization_id'] == 1
53
+ api_expects(:packages, :index) do |p|
54
+ p['repository_id'] = 2
55
+ end
56
+
57
+ run_cmd(%w(package list --product-id 1))
58
+ end
59
+
60
+ it 'fail if more than one repository is found' do
61
+ ex = api_expects(:repositories, :index) do |p|
62
+ p['product_id'] == 1
63
+ end
64
+ ex.returns(index_response([{'id' => 2}, {'id' => 3}]))
65
+
66
+ r = run_cmd(%w(package list --product-id 1))
67
+ assert(r.err.include?("found more than one repository"), "Invalid error message")
68
+ end
69
+
70
+ it 'requires organization options to resolve ID by name' do
71
+ api_expects_no_call
72
+
73
+ r = run_cmd(%w(package list --product product1))
74
+ expected_error = "--organization-id, --organization, --organization-label is required"
75
+ assert(r.err.include?(expected_error), "Invalid error message")
76
+ end
77
+
78
+ it 'allows organization ID when resolving ID by name' do
79
+ expect_product_search(3, 'product1', 1)
80
+
81
+ expect_repository_search(1, nil, 2)
82
+
83
+ api_expects(:packages, :index) do |p|
84
+ p['repository_id'] = 2
85
+ end
86
+
87
+ run_cmd(%w(package list --product product1 --organization-id 3))
88
+ end
89
+
90
+ it 'allows organization name when resolving ID by name' do
91
+ expect_organization_search('org3', 3)
92
+
93
+ expect_product_search(3, 'product1', 1)
94
+
95
+ expect_repository_search(1, nil, 2)
96
+
97
+ api_expects(:packages, :index) do |p|
98
+ p['repository_id'] = 2
99
+ end
100
+
101
+ run_cmd(%w(package list --product product1 --organization org3))
102
+ end
103
+
104
+ it 'allows organization label when resolving ID by name' do
105
+ expect_organization_search('org3', 3, field: 'label')
106
+
107
+ expect_product_search(3, 'product1', 1)
108
+
109
+ expect_repository_search(1, nil, 2)
110
+
111
+ api_expects(:packages, :index) do |p|
112
+ p['repository_id'] = 2
42
113
  end
43
114
 
44
- run_cmd(%w(package list --organization-label org1))
115
+ run_cmd(%w(package list --product product1 --organization-label org3))
45
116
  end
46
117
  end
47
118
  end
@@ -0,0 +1,33 @@
1
+ require_relative '../test_helper'
2
+ require 'hammer_cli_katello/package_group'
3
+
4
+ module HammerCLIKatello
5
+ describe PackageGroupCommand::ListCommand do
6
+ it 'allows minimal options' do
7
+ api_expects(:package_groups, :index)
8
+
9
+ run_cmd(%w(package-group list))
10
+ end
11
+
12
+ it 'can be provided by repository ID' do
13
+ api_expects(:package_groups, :index) do |params|
14
+ params['repository_id'] == 1
15
+ end
16
+
17
+ run_cmd(%w(package-group list --repository-id 1))
18
+ end
19
+
20
+ it 'can be provided by repository name' do
21
+ ex = api_expects(:repositories, :index) do |params|
22
+ params['name'] = 'Repo'
23
+ end
24
+ ex.returns(index_response([{'id' => 1}]))
25
+
26
+ api_expects(:package_groups, :index) do |params|
27
+ params['repository_id'] == 1
28
+ end
29
+
30
+ run_cmd(%w(package-group list --repository Repo))
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,121 @@
1
+ require_relative '../test_helper'
2
+ require_relative '../organization/organization_helpers'
3
+ require 'hammer_cli_katello/repository'
4
+
5
+ module HammerCLIKatello
6
+ describe Repository::ExportCommand do
7
+ include ForemanTaskHelpers
8
+ include OrganizationHelpers
9
+
10
+ it 'allows minimal options' do
11
+ ex = api_expects(:repositories, :export) do |p|
12
+ p['id'] == '1'
13
+ end
14
+ ex.returns(id: 2)
15
+
16
+ expect_foreman_task('2')
17
+
18
+ run_cmd(%w(repository export --id 1))
19
+ end
20
+
21
+ describe 'resolves repository ID' do
22
+ it 'by requiring product' do
23
+ api_expects_no_call
24
+ result = run_cmd(%w(repository export --name repo1))
25
+ assert(result.err[/--product, --product-id is required/], 'Incorrect error message')
26
+ end
27
+
28
+ it 'by product ID' do
29
+ ex = api_expects(:repositories, :index) do |p|
30
+ p['name'] == 'repo1' && p['product_id'] == 3
31
+ end
32
+ ex.returns(index_response([{'id' => 1}]))
33
+
34
+ ex = api_expects(:repositories, :export) do |p|
35
+ p['id'] == 1
36
+ end
37
+ ex.returns(id: 2)
38
+
39
+ expect_foreman_task('2')
40
+
41
+ run_cmd(%w(repository export --name repo1 --product-id 3))
42
+ end
43
+ end
44
+
45
+ describe 'resolves product ID' do
46
+ it 'by requiring organization options' do
47
+ api_expects_no_call
48
+ result = run_cmd(%w(repository export --name repo1 --product prod1))
49
+ assert(result.err[/--organization-id, --organization, --organization-label is required/],
50
+ "Organization option requirements must be validated")
51
+ end
52
+
53
+ it 'by organization ID' do
54
+ ex = api_expects(:products, :index) do |p|
55
+ p['name'] == 'prod3' && p['organization_id'] == '5'
56
+ end
57
+ ex.returns(index_response([{'id' => 3}]))
58
+
59
+ ex = api_expects(:repositories, :index) do |p|
60
+ p['name'] == 'repo1' && p['product_id'] == 3
61
+ end
62
+ ex.returns(index_response([{'id' => 1}]))
63
+
64
+ ex = api_expects(:repositories, :export) do |p|
65
+ p['id'] == 1
66
+ end
67
+ ex.returns(id: 2)
68
+
69
+ expect_foreman_task('2')
70
+
71
+ run_cmd(%w(repository export --name repo1 --product prod3 --organization-id 5))
72
+ end
73
+
74
+ it 'by organization name' do
75
+ expect_organization_search('org5', 5)
76
+
77
+ ex = api_expects(:products, :index) do |p|
78
+ p['name'] == 'prod3' && p['organization_id'] == 5
79
+ end
80
+ ex.returns(index_response([{'id' => 3}]))
81
+
82
+ ex = api_expects(:repositories, :index) do |p|
83
+ p['name'] == 'repo1' && p['product_id'] == 3
84
+ end
85
+ ex.returns(index_response([{'id' => 1}]))
86
+
87
+ ex = api_expects(:repositories, :export) do |p|
88
+ p['id'] == 1
89
+ end
90
+ ex.returns(id: 2)
91
+
92
+ expect_foreman_task('2')
93
+
94
+ run_cmd(%w(repository export --name repo1 --product prod3 --organization org5))
95
+ end
96
+
97
+ it 'by organization label' do
98
+ expect_organization_search('org5', 5, field: 'label')
99
+
100
+ ex = api_expects(:products, :index) do |p|
101
+ p['name'] == 'prod3' && p['organization_id'] == 5
102
+ end
103
+ ex.returns(index_response([{'id' => 3}]))
104
+
105
+ ex = api_expects(:repositories, :index) do |p|
106
+ p['name'] == 'repo1' && p['product_id'] == 3
107
+ end
108
+ ex.returns(index_response([{'id' => 1}]))
109
+
110
+ ex = api_expects(:repositories, :export) do |p|
111
+ p['id'] == 1
112
+ end
113
+ ex.returns(id: 2)
114
+
115
+ expect_foreman_task('2')
116
+
117
+ run_cmd(%w(repository export --name repo1 --product prod3 --organization-label org5))
118
+ end
119
+ end
120
+ end
121
+ end