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 OrganizationHelpers
2
+
3
+ def expect_organization_search(name, id)
4
+ ex = api_expects(:organizations, :index, 'Find the organization') do |par|
5
+ par[:search] == "name = \"#{name}\""
6
+ end
7
+ ex.at_least_once.returns(index_response([{'id' => id}]))
8
+ end
9
+
10
+ end
@@ -0,0 +1,19 @@
1
+ require_relative 'test_helper'
2
+
3
+ describe 'ping' do
4
+ it 'does not require authentication' do
5
+ api_expects(:ping, :index).returns(
6
+ 'status' => 'ok',
7
+ 'services' => {
8
+ 'foreman_tasks' => {'status' => 'ok', 'duration_ms' => '34'},
9
+ 'foreman_auth' => {'status' => 'ok', 'duration_ms' => '34'},
10
+ 'candlepin' => {'status' => 'ok', 'duration_ms' => '34'},
11
+ 'candlepin_auth' => {'status' => 'ok', 'duration_ms' => '34'},
12
+ 'pulp' => {'status' => 'ok', 'duration_ms' => '34'},
13
+ 'pulp_auth' => {'status' => 'ok', 'duration_ms' => '34'}
14
+ }
15
+ )
16
+
17
+ run_cmd(%w(ping))
18
+ end
19
+ end
@@ -0,0 +1,8 @@
1
+ module ProductHelpers
2
+ def expect_product_search(org_id, name, id)
3
+ ex = api_expects(:products, :index, 'Find the Product') do |par|
4
+ par['name'] == name && par['organization_id'] == org_id
5
+ end
6
+ ex.returns(index_response([{'id' => id}]))
7
+ end
8
+ end
@@ -0,0 +1,46 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper')
2
+ require File.join(File.dirname(__FILE__), '../product/product_helpers')
3
+ require File.join(File.dirname(__FILE__), './repository_helpers')
4
+
5
+ describe "get repository info" do
6
+ include ProductHelpers
7
+ include RepositoryHelpers
8
+
9
+ before do
10
+ @cmd = %w(repository info)
11
+ end
12
+
13
+ let(:org_id) { 1 }
14
+ let(:product_id) { 2 }
15
+ let(:repo_id) { 3 }
16
+
17
+ it "Shows information about a repository" do
18
+ params = ["--id=#{repo_id}"]
19
+
20
+ ex = api_expects(:repositories, :show, "Get info") do |par|
21
+ par["id"] == repo_id.to_s
22
+ end
23
+
24
+ ex.returns({})
25
+
26
+ result = run_cmd(@cmd + params)
27
+ assert(result.exit_code, 0)
28
+ end
29
+
30
+ it "Shows information about a repository with organization-id and product name" do
31
+ params = ["--name=test_repo", "--product=test_product", "--organization-id=#{org_id}"]
32
+
33
+ expect_product_search(org_id, 'test_product', product_id)
34
+
35
+ expect_repository_search(org_id, product_id, 'test_repo', repo_id)
36
+
37
+ ex2 = api_expects(:repositories, :show, "Get info") do |par|
38
+ par["id"] == repo_id
39
+ end
40
+
41
+ ex2.returns({})
42
+
43
+ result = run_cmd(@cmd + params)
44
+ assert(result.exit_code, 0)
45
+ end
46
+ end
@@ -0,0 +1,69 @@
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 repositories' do
7
+ include LifecycleEnvironmentHelpers
8
+
9
+ before do
10
+ @cmd = %w(repository 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 repositories" do
31
+ params = ["--organization-id=#{org_id}"]
32
+
33
+ ex = api_expects(:repositories, :index, 'Organizations repositories 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
+
40
+ expected_result = success_result("---|------|---------|--------------|----
41
+ ID | NAME | PRODUCT | CONTENT TYPE | URL
42
+ ---|------|---------|--------------|----
43
+ ")
44
+
45
+ result = run_cmd(@cmd + params)
46
+ assert_cmd(expected_result, result)
47
+ end
48
+
49
+ it "lists the repositories belonging to a lifecycle-environment by name" do
50
+ params = ['--organization-id=1', '--environment=test']
51
+
52
+ expect_lifecycle_environment_search(org_id, 'test', lifecycle_env_id)
53
+
54
+ ex = api_expects(:repositories, :index, 'lifecycle repositories list') do |par|
55
+ par['organization_id'] == org_id && par['page'] == 1 &&
56
+ par['per_page'] == 1000
57
+ end
58
+
59
+ ex.returns(empty_response)
60
+
61
+ expected_result = success_result("---|------|---------|--------------|----
62
+ ID | NAME | PRODUCT | CONTENT TYPE | URL
63
+ ---|------|---------|--------------|----
64
+ ")
65
+
66
+ result = run_cmd(@cmd + params)
67
+ assert_cmd(expected_result, result)
68
+ end
69
+ end
@@ -0,0 +1,9 @@
1
+ module RepositoryHelpers
2
+ def expect_repository_search(org_id, product_id, name, id)
3
+ ex = api_expects(:repositories, :index, 'Find a repository') do |par|
4
+ par['name'] == name && par['organization_id'] == org_id &&
5
+ par['product_id'] == product_id
6
+ end
7
+ ex.returns(index_response([{'id' => id}]))
8
+ end
9
+ end
@@ -0,0 +1,57 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper')
2
+ require File.join(File.dirname(__FILE__), '../product/product_helpers')
3
+ require File.join(File.dirname(__FILE__), './repository_helpers')
4
+
5
+ describe 'Synchronize a repository' do
6
+ include ForemanTaskHelpers
7
+ include ProductHelpers
8
+ include RepositoryHelpers
9
+
10
+ before do
11
+ @cmd = %w(repository synchronize)
12
+ end
13
+
14
+ let(:org_id) { 1 }
15
+ let(:repo_id) { 2 }
16
+ let(:product_id) { 3 }
17
+ let(:sync_response) do
18
+ {
19
+ 'id' => repo_id,
20
+ 'state' => 'planned'
21
+ }
22
+ end
23
+
24
+ it "synchronizes a repository" do
25
+ params = ["--id=#{repo_id}"]
26
+
27
+ ex = api_expects(:repositories, :sync, 'Repository is synced') do |par|
28
+ par['id'] == repo_id.to_s
29
+ end
30
+
31
+ ex.returns(sync_response)
32
+
33
+ expect_foreman_task('3')
34
+
35
+ result = run_cmd(@cmd + params)
36
+ assert(result.exit_code, 0)
37
+ end
38
+
39
+ it "synchronizes a repository with a repository name" do
40
+ params = ["--name=test_repo", "--product=test_product", "--organization-id=#{org_id}"]
41
+
42
+ expect_product_search(org_id, "test_product", product_id)
43
+
44
+ expect_repository_search(org_id, product_id, "test_repo", repo_id)
45
+
46
+ ex = api_expects(:repositories, :sync, 'Repository is synced') do |par|
47
+ par['id'] == repo_id
48
+ end
49
+
50
+ ex.returns(sync_response)
51
+
52
+ expect_foreman_task('3')
53
+
54
+ result = run_cmd(@cmd + params)
55
+ assert(result.exit_code, 0)
56
+ end
57
+ end
@@ -0,0 +1,86 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper')
2
+ require File.join(File.dirname(__FILE__), '../product/product_helpers')
3
+ require File.join(File.dirname(__FILE__), './repository_helpers')
4
+
5
+ describe 'upload repository' do
6
+ include ProductHelpers
7
+ include RepositoryHelpers
8
+
9
+ before do
10
+ @cmd = %w(repository upload-content)
11
+ end
12
+
13
+ let(:org_id) { 1 }
14
+ let(:product_id) { 2 }
15
+ let(:repo_id) { 3 }
16
+ let(:path) { "./test.rpm" }
17
+ let(:upload_id) { "1234" }
18
+ let(:_href) { "/pulp/api/v2/content/uploads/#{upload_id}" }
19
+ let(:upload_response) do
20
+ {
21
+ "upload_id" => upload_id,
22
+ "_href" => _href
23
+ }
24
+ end
25
+
26
+ it "uploads a package" do
27
+ File.new("test.rpm", "w")
28
+
29
+ params = ["--id=#{repo_id}", "--path=#{path}"]
30
+
31
+ ex = api_expects(:content_uploads, :create, "Create upload for content") do |par|
32
+ par[:repository_id] == repo_id.to_s
33
+ end
34
+
35
+ ex.returns(upload_response)
36
+
37
+ ex2 = api_expects(:repositories, :import_uploads, 'Take in an upload') do |par|
38
+ par[:id] == repo_id.to_s && par[:upload_ids] == ['1234']
39
+ end
40
+
41
+ ex2.returns("")
42
+
43
+ ex3 = api_expects(:content_uploads, :destroy, "Delete the upload") do |par|
44
+ par[:id] == upload_id && par[:repository_id] == repo_id.to_s
45
+ end
46
+
47
+ ex3.returns("")
48
+
49
+ result = run_cmd(@cmd + params)
50
+ assert(result.exit_code, 0)
51
+ File.delete("test.rpm")
52
+ end
53
+
54
+ it "uploads a package with an organization-id" do
55
+ File.new("test.rpm", "w")
56
+
57
+ params = ["--name=test_repo", "--product=test_product", "--organization-id=#{org_id}",
58
+ "--path=#{path}"]
59
+
60
+ expect_product_search(org_id, 'test_product', product_id)
61
+
62
+ expect_repository_search(org_id, product_id, 'test_repo', repo_id)
63
+
64
+ ex = api_expects(:content_uploads, :create, "Create upload for content") do |par|
65
+ par[:repository_id] == repo_id
66
+ end
67
+
68
+ ex.returns(upload_response)
69
+
70
+ ex2 = api_expects(:repositories, :import_uploads, 'Take in an upload') do |par|
71
+ par[:id] == repo_id && par[:upload_ids] == ['1234']
72
+ end
73
+
74
+ ex2.returns("")
75
+
76
+ ex3 = api_expects(:content_uploads, :destroy, "Delete the upload") do |par|
77
+ par[:id] == upload_id && par[:repository_id] == repo_id
78
+ end
79
+
80
+ ex3.returns("")
81
+
82
+ result = run_cmd(@cmd + params)
83
+ assert(result.exit_code, 0)
84
+ File.delete("test.rpm")
85
+ end
86
+ end
@@ -0,0 +1,7 @@
1
+ module ForemanTaskHelpers
2
+ def expect_foreman_task(task_id)
3
+ ex = api_expects(:foreman_tasks, :show, 'Show task')
4
+ ex.returns('id' => task_id, 'state' => 'stopped', 'progress' => 1,
5
+ 'humanized' => {'output' => '', 'errors' => ''})
6
+ end
7
+ end
data/test/test_helper.rb CHANGED
@@ -1,11 +1,24 @@
1
+ if RUBY_VERSION > "2.2"
2
+ # Coverage - Keep these two lines at the top of this file
3
+ require 'simplecov'
4
+ require 'coveralls'
5
+ SimpleCov.formatters = [SimpleCov::Formatter::HTMLFormatter, Coveralls::SimpleCov::Formatter]
6
+ SimpleCov.start do
7
+ minimum_coverage 46
8
+ refuse_coverage_drop
9
+ track_files "lib/**/*.rb"
10
+ add_filter '/test/'
11
+ end
12
+ end
13
+
14
+ require File.join(File.dirname(__FILE__), './task_helper.rb')
1
15
  require 'minitest/autorun'
2
16
  require 'minitest/spec'
3
- require "mocha/setup"
4
-
17
+ require 'mocha/setup'
5
18
  require 'hammer_cli'
6
19
  require 'hammer_cli_foreman/commands'
7
20
 
8
- KATELLO_VERSION = Gem::Version.new(ENV['TEST_API_VERSION'] || '2.5')
21
+ KATELLO_VERSION = Gem::Version.new(ENV['TEST_API_VERSION'] || '3.0')
9
22
 
10
23
  HammerCLIForeman.stubs(:resource_config).returns(
11
24
  :apidoc_cache_dir => 'test/data/' + KATELLO_VERSION.to_s,
@@ -0,0 +1,32 @@
1
+ require_relative '../test_helper'
2
+ require 'hammer_cli_katello/id_resolver'
3
+
4
+ module HammerCLIKatello
5
+ describe IdResolver do
6
+ let(:api) { mock('api') }
7
+ let(:searchables) { mock('searchables') }
8
+ let(:id_resolver) { IdResolver.new api, searchables }
9
+ describe '#repository_ids' do
10
+ before(:each) do
11
+ api.stubs(:resources).returns([])
12
+ end
13
+ it 'accepts repository_ids' do
14
+ id_resolver.repository_ids(
15
+ 'option_repository_ids' => [1, 2]
16
+ ).must_equal [1, 2]
17
+ end
18
+
19
+ it 'accepts repository_names' do
20
+ id_resolver.stubs(:find_resources).returns(
21
+ [
22
+ {'id' => 1, 'name' => 'repo1'},
23
+ {'id' => 2, 'name' => 'repo2'}
24
+ ]
25
+ )
26
+ id_resolver.repository_ids(
27
+ 'option_names' => %w(repo1 repo2)
28
+ ).must_equal [1, 2]
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,107 @@
1
+ require_relative '../test_helper'
2
+ require 'hammer_cli_katello/search_options_creators'
3
+
4
+ class SearchOptionsCreatorsMock
5
+ include HammerCLIKatello::SearchOptionsCreators
6
+
7
+ def one
8
+ end
9
+
10
+ def two
11
+ end
12
+ end
13
+
14
+ describe HammerCLIKatello::SearchOptionsCreators do
15
+
16
+ let(:search_options_creators) { SearchOptionsCreatorsMock.new }
17
+ let(:options) { Hash.new }
18
+ let(:resource) { mock('ApipieBindings::Resource') }
19
+
20
+ describe '#create_repositories_search_options' do
21
+ it 'handles an array of names' do
22
+ search_options_creators.create_repositories_search_options(
23
+ 'option_names' => ['repo1']
24
+ )['names'].must_equal ['repo1']
25
+ end
26
+
27
+ it 'handles a single value name' do
28
+ search_options_creators.create_repositories_search_options(
29
+ 'option_name' => 'repo1'
30
+ )['name'].must_equal 'repo1'
31
+ end
32
+
33
+ it 'handles a single value product_id' do
34
+ search_options_creators.create_repositories_search_options(
35
+ 'option_product_id' => 3
36
+ )['product_id'].must_equal 3
37
+ end
38
+ end
39
+
40
+ describe '#create_content_view_versions_search_options(options)' do
41
+ it 'handles a single value environment_id' do
42
+ search_options_creators.create_content_view_versions_search_options(
43
+ 'option_environment_id' => 3,
44
+ 'option_content_view_id' => :required_option
45
+ )['environment_id'].must_equal 3
46
+ end
47
+
48
+ it 'handles a single value content_view_id' do
49
+ search_options_creators.create_content_view_versions_search_options(
50
+ 'option_content_view_id' => 3
51
+ )['content_view_id'].must_equal 3
52
+ end
53
+
54
+ it 'handles a single value version' do
55
+ search_options_creators.create_content_view_versions_search_options(
56
+ 'option_version' => 3
57
+ )['version'].must_equal 3
58
+ end
59
+ end
60
+
61
+ describe 'without the katello api' do
62
+ let(:api) { mock('api') }
63
+
64
+ before(:each) do
65
+ search_options_creators.expects(:create_search_options_without_katello_api)
66
+ search_options_creators.stubs(:api).returns(api)
67
+ api.stubs(:resource)
68
+ end
69
+
70
+ describe '#create_organizations_search_options(options)' do
71
+ it 'does not use the katello api' do
72
+ search_options_creators.create_organizations_search_options(:anything)
73
+ end
74
+ end
75
+
76
+ describe '#create_smart_proxies_search_options(options)' do
77
+ it 'does not use the katello api' do
78
+ search_options_creators.create_organizations_search_options(:anything)
79
+ end
80
+ end
81
+
82
+ describe '#create_capsules_search_options(options)' do
83
+ it 'does not use the katello api' do
84
+ search_options_creators.create_organizations_search_options(:anything)
85
+ end
86
+ end
87
+
88
+ describe '#create_search_options_with_katello_api(options, resource)' do
89
+ it 'does not use the katello api' do
90
+ search_options_creators.create_organizations_search_options(:anything)
91
+ end
92
+ end
93
+
94
+ end # describe 'without the katello api'
95
+
96
+ describe '#create_search_options_with_katello_api' do
97
+ it 'translates all searchable fields from options' do
98
+ search_options_creators.stubs(:searchables).
99
+ returns([search_options_creators.method(:one), search_options_creators.method(:two)])
100
+
101
+ search_options_creators.create_search_options_with_katello_api(
102
+ {'option_one' => 1, 'option_two' => 2}, resource
103
+ ).must_equal('one' => '1', 'two' => '2')
104
+ end
105
+ end # describe '#create_search_options_with_katello_api'
106
+
107
+ end # describe HammerCLIKatello::SearchOptionsCreators