hammer_cli_katello 0.0.24 → 0.0.25

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/lib/hammer_cli_katello.rb +1 -0
  3. data/lib/hammer_cli_katello/activation_key.rb +8 -6
  4. data/lib/hammer_cli_katello/capsule.rb +2 -21
  5. data/lib/hammer_cli_katello/commands.rb +2 -2
  6. data/lib/hammer_cli_katello/content_host.rb +3 -49
  7. data/lib/hammer_cli_katello/content_view.rb +19 -4
  8. data/lib/hammer_cli_katello/content_view_puppet_module.rb +8 -0
  9. data/lib/hammer_cli_katello/content_view_version.rb +69 -20
  10. data/lib/hammer_cli_katello/host.rb +4 -0
  11. data/lib/hammer_cli_katello/host_collection.rb +3 -22
  12. data/lib/hammer_cli_katello/host_errata.rb +1 -1
  13. data/lib/hammer_cli_katello/host_subscription.rb +31 -0
  14. data/lib/hammer_cli_katello/id_resolver.rb +45 -65
  15. data/lib/hammer_cli_katello/katello_environment_name_resolvable.rb +33 -0
  16. data/lib/hammer_cli_katello/lifecycle_environment_name_resolvable.rb +1 -13
  17. data/lib/hammer_cli_katello/ping.rb +4 -0
  18. data/lib/hammer_cli_katello/repository.rb +10 -8
  19. data/lib/hammer_cli_katello/search_options_creators.rb +70 -0
  20. data/lib/hammer_cli_katello/version.rb +1 -1
  21. data/test/data/3.0/foreman_api.json +1 -0
  22. data/test/functional/activaton_key/list_test.rb +69 -0
  23. data/test/functional/content_view/content_view_helpers.rb +10 -0
  24. data/test/functional/content_view/create_test.rb +119 -0
  25. data/test/functional/content_view/list_test.rb +67 -0
  26. data/test/functional/content_view/version/incremental_update_test.rb +91 -0
  27. data/test/functional/host/errata/apply_test.rb +46 -0
  28. data/test/functional/host/host_helpers.rb +10 -0
  29. data/test/functional/host/subscription/register_test.rb +53 -0
  30. data/test/functional/host/subscription/unregister_test.rb +37 -0
  31. data/test/functional/lifecycle_environment/lifecycle_environment_helpers.rb +17 -0
  32. data/test/functional/organization/organization_helpers.rb +10 -0
  33. data/test/functional/ping_test.rb +19 -0
  34. data/test/functional/product/product_helpers.rb +8 -0
  35. data/test/functional/repository/info_test.rb +46 -0
  36. data/test/functional/repository/list_test.rb +69 -0
  37. data/test/functional/repository/repository_helpers.rb +9 -0
  38. data/test/functional/repository/synchronize_test.rb +57 -0
  39. data/test/functional/repository/upload_test.rb +86 -0
  40. data/test/task_helper.rb +7 -0
  41. data/test/test_helper.rb +16 -3
  42. data/test/unit/id_resolver_test.rb +32 -0
  43. data/test/unit/search_options_creators_test.rb +107 -0
  44. metadata +53 -3
@@ -0,0 +1,10 @@
1
+ module ContentViewHelpers
2
+
3
+ def expect_content_view_search(org_id, name, id)
4
+ ex = api_expects(:content_views, :index, 'Find the content view') do |par|
5
+ par['name'] == name && par['organization_id'] == org_id
6
+ end
7
+ ex.returns(index_response([{'id' => id}]))
8
+ end
9
+
10
+ end
@@ -0,0 +1,119 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper')
2
+
3
+ # Workaround for issue #14289
4
+ require 'hammer_cli_katello/content_view_puppet_module'
5
+
6
+ describe 'content-view create' do
7
+ before do
8
+ @cmd = %w(content-view create)
9
+ @base_params = ["--organization-id=#{org_id}", "--name=#{name}"]
10
+ end
11
+ let(:error_heading) { "Could not create the content view" }
12
+ let(:name) { 'test-cv' }
13
+ let(:org_id) { 1 }
14
+ let(:product) do
15
+ { 'name' => 'product-1', 'id' => 1 }
16
+ end
17
+ let(:repositories) do
18
+ [
19
+ {'name' => 'repo-1', 'id' => '1'},
20
+ {'name' => 'repo-2', 'id' => '2'},
21
+ {'name' => 'repo-3', 'id' => '3'}
22
+ ]
23
+ end
24
+
25
+ it 'creates the content view with repositories specified by ids' do
26
+ wanted = repositories.take(2)
27
+ ids = wanted.map { |repo| repo['id'] }
28
+ params = %W(--repository-ids=#{ids.join(',')})
29
+
30
+ api_expects(:content_views, :create, 'Create content view') do |par|
31
+ par['name'] == name &&
32
+ par['repository_ids'] == ids &&
33
+ par['organization_id'] == org_id
34
+ end
35
+
36
+ expected_result = success_result("Content view created\n")
37
+ result = run_cmd(@cmd + @base_params + params)
38
+ assert_cmd(expected_result, result)
39
+ end
40
+
41
+ it 'create the content view with repositories specified by product id and names' do
42
+ wanted = repositories.take(2)
43
+ ids = wanted.map { |repo| repo['id'] }
44
+ names = wanted.map { |repo| repo['name'] }
45
+ params = %W(--product-id=#{product['id']} --repositories=#{names.join(',')})
46
+
47
+ api_repositories = api_expects(:repositories, :index,
48
+ 'Find repositories belonging to product') do |par|
49
+ par['product_id'] == product['id'] && par['organization_id'] == org_id
50
+ end
51
+ api_repositories.returns(repositories)
52
+
53
+ api_expects(:content_views, :create, 'Create content view') do |par|
54
+ par['organization_id'] == org_id &&
55
+ par['name'] == name &&
56
+ par['repository_ids'] == ids
57
+ end
58
+
59
+ expected_result = success_result("Content view created\n")
60
+ result = run_cmd(@cmd + @base_params + params)
61
+ assert_cmd(expected_result, result)
62
+ end
63
+
64
+ it 'create the content view with repositories specified by product name and names' do
65
+ wanted = repositories.take(2)
66
+ ids = wanted.map { |repo| repo['id'] }
67
+ names = wanted.map { |repo| repo['name'] }
68
+ params = %W(--product=#{product['name']} --repositories=#{names.join(',')})
69
+
70
+ api_products = api_expects(:products, :index, 'Find ID of product') do |par|
71
+ par['organization_id'] == org_id && par['name'] == product['name']
72
+ end
73
+ api_products.returns(product)
74
+
75
+ api_repositories = api_expects(:repositories, :index,
76
+ 'Find repositories belonging to product') do |par|
77
+ par['product_id'] == product['id'] && par['organization_id'] == org_id
78
+ end
79
+ api_repositories.returns(repositories)
80
+
81
+ api_expects(:content_views, :create, 'Create content view') do |par|
82
+ par['organization_id'] == org_id &&
83
+ par['name'] == name &&
84
+ par['repository_ids'] == ids
85
+ end
86
+
87
+ expected_result = success_result("Content view created\n")
88
+ result = run_cmd(@cmd + @base_params + params)
89
+ assert_cmd(expected_result, result)
90
+ end
91
+
92
+ it 'fails on providing repository names without product' do
93
+ params = %w(--repositories=repo-1,repo-2)
94
+
95
+ expected_result = usage_error_result(
96
+ @cmd,
97
+ 'At least one of options --product-id, --product is required',
98
+ error_heading
99
+ )
100
+
101
+ api_expects_no_call
102
+ result = run_cmd(@cmd + @base_params + params)
103
+ assert_cmd(expected_result, result)
104
+ end
105
+
106
+ it 'fails on providing product and repository ids' do
107
+ params = %w(--product=testproduct --repository-ids=1,2,3,4,5)
108
+
109
+ expected_result = usage_error_result(
110
+ @cmd,
111
+ "You can't set any of options --product-id, --product",
112
+ error_heading
113
+ )
114
+
115
+ api_expects_no_call
116
+ result = run_cmd(@cmd + params)
117
+ assert_cmd(expected_result, result)
118
+ end
119
+ end
@@ -0,0 +1,67 @@
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-views' do
7
+ include LifecycleEnvironmentHelpers
8
+
9
+ before do
10
+ @cmd = %w(content-view list)
11
+ end
12
+
13
+ let(:org_id) { 1 }
14
+ let(:lifecycle_env_id) { 1 }
15
+ let(:empty_response) do {
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 an organizations content-views" do
31
+ params = ["--organization-id=#{org_id}"]
32
+
33
+ ex = api_expects(:content_views, :index, 'Organizations content-views list') do |par|
34
+ par['organization_id'] == org_id && par['page'] == 1 &&
35
+ par['per_page'] == 1000
36
+ end
37
+
38
+ ex.returns(empty_response)
39
+ expected_result = success_result("----------------|------|-------|-----------|---------------
40
+ CONTENT VIEW ID | NAME | LABEL | COMPOSITE | REPOSITORY IDS
41
+ ----------------|------|-------|-----------|---------------
42
+ ")
43
+
44
+ result = run_cmd(@cmd + params)
45
+ assert_cmd(expected_result, result)
46
+ end
47
+
48
+ it "lists the content-views belonging to a lifecycle-environment by name" do
49
+ params = ["--organization-id=#{org_id}", '--lifecycle-environment=test']
50
+
51
+ expect_lifecycle_environment_search(org_id, 'test', lifecycle_env_id).at_least_once
52
+
53
+ ex = api_expects(:content_views, :index, 'lifecycles content-views list') 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
+ expected_result = success_result("----------------|------|-------|-----------|---------------
60
+ CONTENT VIEW ID | NAME | LABEL | COMPOSITE | REPOSITORY IDS
61
+ ----------------|------|-------|-----------|---------------
62
+ ")
63
+
64
+ result = run_cmd(@cmd + params)
65
+ assert_cmd(expected_result, result)
66
+ end
67
+ end
@@ -0,0 +1,91 @@
1
+ require File.join(File.dirname(__FILE__), '../../test_helper')
2
+ require File.join(File.dirname(__FILE__), '../../organization/organization_helpers')
3
+ require File.join(File.dirname(__FILE__),
4
+ '../../lifecycle_environment/lifecycle_environment_helpers')
5
+
6
+ describe 'content-view version incremental-update' do
7
+ include OrganizationHelpers
8
+ include LifecycleEnvironmentHelpers
9
+ include ForemanTaskHelpers
10
+
11
+ before do
12
+ @cmd = %w(content-view version incremental-update)
13
+ end
14
+
15
+ it "performs incremental update with no updates" do
16
+ params = ['--errata-ids=FOO2012', '--lifecycle-environment-ids=1,2,3',
17
+ '--content-view-version-id=5']
18
+
19
+ ex = api_expects(:content_view_versions, :incremental_update, 'Incremental Update') do |par|
20
+ par['update_hosts'].nil? &&
21
+ par[:content_view_version_environments][0][:environment_ids] == %w(1 2 3) &&
22
+ par[:content_view_version_environments][0][:content_view_version_id] == 5 &&
23
+ par['add_content']['errata_ids'] == ['FOO2012']
24
+ end
25
+ ex.returns('id' => '3', 'state' => 'stopped')
26
+
27
+ expect_foreman_task('3')
28
+
29
+ result = run_cmd(@cmd + params)
30
+ assert(result.exit_code, 0)
31
+ end
32
+
33
+ it "performs incremental update with update all hosts" do
34
+ params = ['--update-all-hosts=true', '--errata-ids=FOO2012',
35
+ '--lifecycle-environment-ids=1,2,3', '--content-view-version-id=5']
36
+
37
+ ex = api_expects(:content_view_versions, :incremental_update, 'Incremental Update') do |par|
38
+ par['update_hosts']['included'][:search] == '' &&
39
+ par[:content_view_version_environments][0][:environment_ids] == %w(1 2 3) &&
40
+ par[:content_view_version_environments][0][:content_view_version_id] == 5 &&
41
+ par['add_content']['errata_ids'] == ['FOO2012']
42
+ end
43
+ ex.returns('id' => '3', 'state' => 'stopped')
44
+
45
+ expect_foreman_task('3')
46
+
47
+ result = run_cmd(@cmd + params)
48
+ assert(result.exit_code, 0)
49
+ end
50
+
51
+ it "performs incremental update with no environment" do
52
+ params = ['--update-all-hosts=true', '--errata-ids=FOO2012', '--content-view-version-id=5']
53
+
54
+ ex = api_expects(:content_view_versions, :incremental_update, 'Incremental Update') do |par|
55
+ par['update_hosts']['included'][:search] == '' &&
56
+ par[:content_view_version_environments][0][:environment_ids].nil? &&
57
+ par[:content_view_version_environments][0][:content_view_version_id] == 5 &&
58
+ par['add_content']['errata_ids'] == ['FOO2012']
59
+ end
60
+ ex.returns('id' => '3', 'state' => 'stopped')
61
+
62
+ expect_foreman_task('3')
63
+
64
+ result = run_cmd(@cmd + params)
65
+ assert(result.exit_code, 0)
66
+ end
67
+
68
+ it "performs incremental update with names" do
69
+ params = ['--update-all-hosts=true', '--errata-ids=FOO2012',
70
+ '--lifecycle-environments=trump,cruz,bernie',
71
+ '--content-view-version-id=5', '--organization=USA']
72
+
73
+ expect_organization_search('USA', 5)
74
+ expect_lifecycle_environments_request(5, [{'name' => 'trump', 'id' => 1},
75
+ {'name' => 'cruz', 'id' => 2},
76
+ {'name' => 'bernie', 'id' => 3}])
77
+
78
+ ex = api_expects(:content_view_versions, :incremental_update, 'Incremental Update') do |par|
79
+ par['update_hosts']['included'][:search] == '' &&
80
+ par[:content_view_version_environments][0][:environment_ids] == [1, 2, 3] &&
81
+ par[:content_view_version_environments][0][:content_view_version_id] == 5 &&
82
+ par['add_content']['errata_ids'] == ['FOO2012']
83
+ end
84
+ ex.returns('id' => '3', 'state' => 'stopped')
85
+
86
+ expect_foreman_task('3')
87
+
88
+ result = run_cmd(@cmd + params)
89
+ assert(result.exit_code, 0)
90
+ end
91
+ end
@@ -0,0 +1,46 @@
1
+ require File.join(File.dirname(__FILE__), '../../test_helper')
2
+
3
+ require 'hammer_cli_katello/content_view_puppet_module'
4
+
5
+ describe 'apply an errata' do
6
+ include ForemanTaskHelpers
7
+
8
+ before do
9
+ @cmd = %w(host errata apply)
10
+ end
11
+
12
+ let(:errata_id) { "RHEA-1111:1111" }
13
+ let(:host_id) { 1 }
14
+ let(:task_id) { 5 }
15
+ let(:response) do {
16
+ 'id' => task_id,
17
+ 'state' => 'stopped'
18
+ }
19
+ end
20
+
21
+ it "applies an errata to a host" do
22
+ params = ["--errata-ids=#{errata_id}", "--host-id=#{host_id}"]
23
+
24
+ ex = api_expects(:host_errata, :apply, 'Host errata apply') do |par|
25
+ par['errata_ids'] == [errata_id] && par['host_id'] == host_id
26
+ end
27
+
28
+ ex.returns(response)
29
+
30
+ expect_foreman_task(task_id)
31
+
32
+ run_cmd(@cmd + params)
33
+ end
34
+
35
+ it "applies an errata to a host with async flag" do
36
+ params = ["--errata-ids=#{errata_id}", "--host-id=#{host_id}", "--async"]
37
+
38
+ ex = api_expects(:host_errata, :apply, 'Host errata apply') do |par|
39
+ par['errata_ids'] == [errata_id] && par['host_id'] == host_id
40
+ end
41
+
42
+ ex.returns(response)
43
+
44
+ run_cmd(@cmd + params)
45
+ end
46
+ end
@@ -0,0 +1,10 @@
1
+ module HostHelpers
2
+
3
+ def expect_host_search(name, id)
4
+ ex = api_expects(:hosts, :index, 'Find the host') do |par|
5
+ par[:search] == "name = \"#{name}\""
6
+ end
7
+ ex.returns(index_response([{'id' => id}]))
8
+ end
9
+
10
+ end
@@ -0,0 +1,53 @@
1
+ require File.join(File.dirname(__FILE__), '../../test_helper')
2
+ require File.join(File.dirname(__FILE__), '../../content_view/content_view_helpers')
3
+ require File.join(File.dirname(__FILE__), '../../organization/organization_helpers')
4
+ require File.join(File.dirname(__FILE__),
5
+ '../../lifecycle_environment/lifecycle_environment_helpers')
6
+
7
+ describe 'host subscription register' do
8
+ include OrganizationHelpers
9
+ include ContentViewHelpers
10
+ include LifecycleEnvironmentHelpers
11
+
12
+ before do
13
+ @cmd = %w(host subscription register)
14
+ end
15
+
16
+ it "subscribe a host" do
17
+ params = ['--name=trump.wall.com', '--content-view-id=1', '--lifecycle-environment-id=2']
18
+ ex = api_expects(:host_subscriptions, :create, 'Host subscription register') do |par|
19
+ par['name'] == 'trump.wall.com' && par['content_view_id'] == 1 &&
20
+ par['lifecycle_environment_id'] == 2
21
+ end
22
+ ex.returns({})
23
+
24
+ expected_result = success_result(
25
+ 'Host successfully registered
26
+ '
27
+ )
28
+
29
+ result = run_cmd(@cmd + params)
30
+ assert_cmd(expected_result, result)
31
+ end
32
+
33
+ it "resolves ids from names" do
34
+ params = ['--name=trump.wall.com', '--content-view=someview', '--lifecycle-environment=someenv',
35
+ '--organization=trumporg']
36
+
37
+ api_expects(:host_subscriptions, :create, 'Host subscription register') do |par|
38
+ par['name'] == 'trump.wall.com' && par['content_view_id'] == 1 &&
39
+ par['lifecycle_environment_id'] == 2
40
+ end
41
+
42
+ expect_organization_search('trumporg', 3)
43
+ expect_content_view_search(3, 'someview', 1)
44
+ expect_lifecycle_environment_search(3, 'someenv', 2)
45
+
46
+ expected_result = success_result(
47
+ 'Host successfully registered
48
+ '
49
+ )
50
+ result = run_cmd(@cmd + params)
51
+ assert_cmd(expected_result, result)
52
+ end
53
+ end
@@ -0,0 +1,37 @@
1
+ require File.join(File.dirname(__FILE__), '../../test_helper')
2
+ require File.join(File.dirname(__FILE__), '../host_helpers')
3
+
4
+ describe 'host subscription unregister' do
5
+ include HostHelpers
6
+
7
+ before do
8
+ @cmd = %w(host subscription unregister)
9
+ end
10
+
11
+ it "unregisters the host" do
12
+ params = ['--host-id=3']
13
+ ex = api_expects(:host_subscriptions, :destroy, 'Host unregister') do |par|
14
+ par['host_id'] == 3
15
+ end
16
+ ex.returns({})
17
+
18
+ expected_result = success_result(
19
+ 'Host unregistered
20
+ '
21
+ )
22
+
23
+ result = run_cmd(@cmd + params)
24
+ assert_cmd(expected_result, result)
25
+ end
26
+
27
+ it "resolves id from name" do
28
+ params = ['--host=host1']
29
+
30
+ api_expects(:host_subscriptions, :destroy, 'Host unregister') do |par|
31
+ par['host_id'].to_i == 3
32
+ end
33
+ expect_host_search('host1', '3')
34
+
35
+ run_cmd(@cmd + params)
36
+ end
37
+ end
@@ -0,0 +1,17 @@
1
+ module LifecycleEnvironmentHelpers
2
+
3
+ def expect_lifecycle_environment_search(org_id, name, id)
4
+ ex = api_expects(:lifecycle_environments, :index, 'Find the lifecycle environment') do |par|
5
+ par['name'] == name && par['organization_id'] == org_id
6
+ end
7
+ ex.returns(index_response([{'id' => id}]))
8
+ end
9
+
10
+ def expect_lifecycle_environments_request(org_id, results)
11
+ ex = api_expects(:lifecycle_environments, :index, 'List the lifecycle environments') do |par|
12
+ par['organization_id'] == org_id
13
+ end
14
+ ex.returns(index_response(results))
15
+ end
16
+
17
+ end