hammer_cli_foreman 3.0.0 → 3.3.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.
- checksums.yaml +4 -4
- data/config/foreman.yml +4 -0
- data/doc/configuration.md +30 -0
- data/doc/release_notes.md +31 -0
- data/lib/hammer_cli_foreman/api/authenticator.rb +9 -0
- data/lib/hammer_cli_foreman/api/connection.rb +2 -0
- data/lib/hammer_cli_foreman/api/negotiate_auth.rb +36 -0
- data/lib/hammer_cli_foreman/api/session_authenticator_wrapper.rb +6 -2
- data/lib/hammer_cli_foreman/api.rb +2 -1
- data/lib/hammer_cli_foreman/auth.rb +13 -0
- data/lib/hammer_cli_foreman/command_extensions/domain.rb +20 -0
- data/lib/hammer_cli_foreman/command_extensions/subnet.rb +25 -10
- data/lib/hammer_cli_foreman/command_extensions/user.rb +9 -5
- data/lib/hammer_cli_foreman/command_extensions.rb +1 -0
- data/lib/hammer_cli_foreman/commands.rb +6 -3
- data/lib/hammer_cli_foreman/compute_attribute.rb +1 -1
- data/lib/hammer_cli_foreman/compute_resource/libvirt.rb +4 -2
- data/lib/hammer_cli_foreman/compute_resource/vmware.rb +4 -2
- data/lib/hammer_cli_foreman/compute_resource.rb +1 -0
- data/lib/hammer_cli_foreman/domain.rb +5 -28
- data/lib/hammer_cli_foreman/exception_handler.rb +26 -0
- data/lib/hammer_cli_foreman/filter.rb +3 -3
- data/lib/hammer_cli_foreman/host.rb +1 -0
- data/lib/hammer_cli_foreman/hostgroup.rb +13 -6
- data/lib/hammer_cli_foreman/hosts/common_update_options.rb +7 -7
- data/lib/hammer_cli_foreman/id_resolver.rb +7 -7
- data/lib/hammer_cli_foreman/option_builders.rb +65 -53
- data/lib/hammer_cli_foreman/option_sources/id_params.rb +21 -8
- data/lib/hammer_cli_foreman/option_sources/ids_params.rb +22 -9
- data/lib/hammer_cli_foreman/partition_table.rb +30 -0
- data/lib/hammer_cli_foreman/report_template.rb +15 -0
- data/lib/hammer_cli_foreman/smart_proxy.rb +18 -5
- data/lib/hammer_cli_foreman/template.rb +33 -15
- data/lib/hammer_cli_foreman/user.rb +5 -4
- data/lib/hammer_cli_foreman/version.rb +1 -1
- data/locale/ca/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/de/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/en/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/en_GB/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/es/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/fr/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/it/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/ja/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/ko/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/pt_BR/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/ru/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/zh_CN/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/zh_TW/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/test/data/3.1/foreman_api.json +1 -0
- data/test/functional/compute_attribute_test.rb +20 -20
- data/test/functional/domain/create_test.rb +91 -0
- data/test/functional/domain/update_test.rb +90 -0
- data/test/functional/host_test.rb +34 -0
- data/test/functional/hostgroup/create_test.rb +11 -0
- data/test/functional/hostgroup/update_test.rb +11 -0
- data/test/functional/partition_table_test.rb +63 -0
- data/test/functional/personal_access_token_test.rb +4 -4
- data/test/functional/report_template_test.rb +24 -0
- data/test/functional/template_test.rb +134 -14
- data/test/functional/user_mail_notification_test.rb +3 -3
- data/test/test_helper.rb +1 -1
- data/test/unit/commands_test.rb +1 -2
- data/test/unit/option_builders_test.rb +88 -83
- data/test/unit/option_sources/id_params_test.rb +0 -9
- data/test/unit/option_sources/ids_params_test.rb +0 -9
- metadata +54 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70a45953e142e7d3a67ee81e99bb5cc6fccaf179d2a61e44922f3b809196a178
|
4
|
+
data.tar.gz: 6c958ff14e311eef47ac379a41ceb45cbabe7f7ed34b3d28c64c40fe963f2ca5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d436e24f99cc80f70aff4ad2c0436a92d63e8b60b5f1aa1ebb787e0fe202404c686fe78397ae16ae9bb3f2261834f8a02db39417a2511fd562c316344933d7a
|
7
|
+
data.tar.gz: 828772047e91923c3b6ac365fa942d381483988ed4c7303a1021d560e73d4f591d1656613ef45916cdc565fa3b7989a6b0f577c655c5624f5a5f8e9bdc82f24b
|
data/config/foreman.yml
CHANGED
@@ -29,6 +29,10 @@
|
|
29
29
|
#:oidc_client_id: example-client-id
|
30
30
|
#:oidc_redirect_uri: urn:ietf:wg:oauth:2.0:oob
|
31
31
|
|
32
|
+
# Negotiate (Kerberos) Auth:
|
33
|
+
# User needs to run kinit before using hammer (or initiate kerberos keyring in another way).
|
34
|
+
#:default_auth_type: 'Negotiate_Auth'
|
35
|
+
|
32
36
|
# Enable using sessions
|
33
37
|
# When sessions are enabled, hammer ignores credentials stored in the config file
|
34
38
|
# and asks for them interactively at the begining of each session.
|
data/doc/configuration.md
CHANGED
@@ -49,3 +49,33 @@ Please note that when you turn sessions on, the credentials stored in your confi
|
|
49
49
|
|
50
50
|
The default session timeout is 1 hour. This can be changed in the Foreman: `Settings > Authentication > Idle timeout`
|
51
51
|
When the session expires hammer will prompt for username and password again.
|
52
|
+
|
53
|
+
### Negotiate (Kerberos) auth
|
54
|
+
|
55
|
+
This implements Kerberos authentication, usually implemented in FreeIPA or Microsoft Active Directory.
|
56
|
+
For this to work, the host that we are trying to use hammer on, needs to have realm already configured on this host.
|
57
|
+
This can be achieved through `realm join`, please refer to that command for more info.
|
58
|
+
|
59
|
+
**Sessions needs to be enabled**
|
60
|
+
|
61
|
+
`~/.hammer/cli.modules.d/foreman.yml`
|
62
|
+
```yaml
|
63
|
+
:foreman:
|
64
|
+
:default_auth_type: 'Negotiate_Auth'
|
65
|
+
:use_sessions: true
|
66
|
+
```
|
67
|
+
|
68
|
+
```bash
|
69
|
+
# To initiate the kerberos keyring (this might be already done on login)
|
70
|
+
$ kinit <kerb_user>
|
71
|
+
# Enter your password
|
72
|
+
$ klist
|
73
|
+
Ticket cache: KEYRING:persistent:1000:1000
|
74
|
+
Default principal: kerb_user@REALM.EXAMPLE.COM
|
75
|
+
|
76
|
+
# use hammer as usuall, it will negotiate your auth on the first request
|
77
|
+
hammer ...
|
78
|
+
|
79
|
+
# or if you do not have negotiate as default auth, initiate the auth manually
|
80
|
+
hammer auth login negotiate
|
81
|
+
```
|
data/doc/release_notes.md
CHANGED
@@ -1,5 +1,36 @@
|
|
1
1
|
Release notes
|
2
2
|
=============
|
3
|
+
### 3.3.0 (2022-05-10)
|
4
|
+
* Add kerberos negotiate auth support ([PR #555](https://github.com/theforeman/hammer-cli-foreman/pull/555)), [#8923](http://projects.theforeman.org/issues/8923)
|
5
|
+
* Pin mocha gem to < 1.14.0
|
6
|
+
* Force api docs checksum check, [#28283](http://projects.theforeman.org/issues/28283)
|
7
|
+
* Add template report-remplate and partition-table export command ([PR #595](https://github.com/theforeman/hammer-cli-foreman/pull/595)), [#34503](http://projects.theforeman.org/issues/34503)
|
8
|
+
* Add template import and partition-table import commands ([PR #596](https://github.com/theforeman/hammer-cli-foreman/pull/596)), [#22692](http://projects.theforeman.org/issues/22692)
|
9
|
+
* Add resource information to download command ([PR #598](https://github.com/theforeman/hammer-cli-foreman/pull/598)), [#34621](http://projects.theforeman.org/issues/34621)
|
10
|
+
* Add command to import ipv4 subnet from smart proxy ([PR #593](https://github.com/theforeman/hammer-cli-foreman/pull/593)), [#33255](http://projects.theforeman.org/issues/33255)
|
11
|
+
* Bump to 3.3.0-develop
|
12
|
+
|
13
|
+
### 3.2.0 (2022-02-10)
|
14
|
+
* Domain update doesn't reset dns implicitly ([PR #591](https://github.com/theforeman/hammer-cli-foreman/pull/591)), [#34177](http://projects.theforeman.org/issues/34177)
|
15
|
+
* Send filter's tax params only when required ([PR #592](https://github.com/theforeman/hammer-cli-foreman/pull/592)), [#34199](http://projects.theforeman.org/issues/34199)
|
16
|
+
* Add boot_order to compute-attribute ([PR #588](https://github.com/theforeman/hammer-cli-foreman/pull/588)), [#33910](http://projects.theforeman.org/issues/33910)
|
17
|
+
* Add mail_enabled to user list/info command ([PR #589](https://github.com/theforeman/hammer-cli-foreman/pull/589)), [#34180](http://projects.theforeman.org/issues/34180)
|
18
|
+
* Add token to host info command ([PR #586](https://github.com/theforeman/hammer-cli-foreman/pull/586)), [#34120](http://projects.theforeman.org/issues/34120)
|
19
|
+
* Bump to 3.2.0-develop
|
20
|
+
|
21
|
+
### 3.1.0 (2021-11-10)
|
22
|
+
* Update test data for 3.1
|
23
|
+
* Make sure provided options override defaults, [#33711](http://projects.theforeman.org/issues/33711)
|
24
|
+
* Make template create/update commands use resolver, [#33721](http://projects.theforeman.org/issues/33721)
|
25
|
+
* Revert fix rake version
|
26
|
+
* Fix rake version
|
27
|
+
* Show status once for proxy info ([PR #581](https://github.com/theforeman/hammer-cli-foreman/pull/581)), [#19510](http://projects.theforeman.org/issues/19510)
|
28
|
+
* Add proxy status and version to info command ([PR #572](https://github.com/theforeman/hammer-cli-foreman/pull/572))
|
29
|
+
* Associate a vm via hammer to a compute resource, [#33047](http://projects.theforeman.org/issues/33047)
|
30
|
+
* Fix option builders and tests, [#33226](http://projects.theforeman.org/issues/33226)
|
31
|
+
* Bump to 3.1.0-develop
|
32
|
+
* Add parent title option for hostgroup, [#32878](http://projects.theforeman.org/issues/32878)
|
33
|
+
|
3
34
|
### 3.0.0 (2021-08-04)
|
4
35
|
* Puppet extraction ([PR #571](https://github.com/theforeman/hammer-cli-foreman/pull/571)), [#33174](http://projects.theforeman.org/issues/33174)
|
5
36
|
* Update rel-eng notebook ([PR #573](https://github.com/theforeman/hammer-cli-foreman/pull/573))
|
@@ -13,6 +13,8 @@ module HammerCLIForeman
|
|
13
13
|
void_auth
|
14
14
|
elsif auth_type == AUTH_TYPES[:basic_auth]
|
15
15
|
basic_auth
|
16
|
+
elsif auth_type == AUTH_TYPES[:negotiate]
|
17
|
+
negotiate_auth
|
16
18
|
elsif auth_type == AUTH_TYPES[:oauth_password_grant]
|
17
19
|
oauth_password_grant
|
18
20
|
elsif auth_type == AUTH_TYPES[:oauth_authentication_code_grant]
|
@@ -43,6 +45,13 @@ module HammerCLIForeman
|
|
43
45
|
end
|
44
46
|
end
|
45
47
|
|
48
|
+
def negotiate_auth
|
49
|
+
return unless HammerCLIForeman::Sessions.enabled?
|
50
|
+
|
51
|
+
authenticator = NegotiateAuth.new(uri)
|
52
|
+
SessionAuthenticatorWrapper.new(authenticator, uri, auth_type)
|
53
|
+
end
|
54
|
+
|
46
55
|
def oauth_password_grant
|
47
56
|
return unless HammerCLIForeman::Sessions.enabled?
|
48
57
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'hammer_cli_foreman/api/session_authenticator_wrapper'
|
2
2
|
require 'hammer_cli_foreman/api/authenticator'
|
3
3
|
require 'hammer_cli_foreman/api/interactive_basic_auth'
|
4
|
+
require 'hammer_cli_foreman/api/negotiate_auth'
|
4
5
|
require 'hammer_cli_foreman/api/oauth/authentication_code_grant'
|
5
6
|
require 'hammer_cli_foreman/api/oauth/password_grant'
|
6
7
|
require 'hammer_cli_foreman/api/void_auth'
|
@@ -10,6 +11,7 @@ module HammerCLIForeman
|
|
10
11
|
CONNECTION_NAME = 'foreman'
|
11
12
|
AUTH_TYPES = {
|
12
13
|
basic_auth: 'Basic_Auth',
|
14
|
+
negotiate: 'Negotiate_Auth',
|
13
15
|
oauth_authentication_code_grant: 'Oauth_Authentication_Code_Grant',
|
14
16
|
oauth_password_grant: 'Oauth_Password_Grant'
|
15
17
|
}.freeze
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module HammerCLIForeman
|
2
|
+
module Api
|
3
|
+
class NegotiateAuth < ApipieBindings::Authenticators::Negotiate
|
4
|
+
def initialize(foreman_url, **options)
|
5
|
+
super("#{foreman_url}/users/extlogin", HammerCLI::SSLOptions.new.get_options(foreman_url).merge(options))
|
6
|
+
end
|
7
|
+
|
8
|
+
def user
|
9
|
+
_('current Kerberos user')
|
10
|
+
end
|
11
|
+
|
12
|
+
def session_id
|
13
|
+
auth_cookie&.delete_prefix('_session_id=')
|
14
|
+
end
|
15
|
+
|
16
|
+
def status
|
17
|
+
if system('klist')
|
18
|
+
_('No session, but there is an active Kerberos session, that will be used for negotiate login.')
|
19
|
+
else
|
20
|
+
_('There is no active Kerberos session. Have you run %s?') % 'kinit'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def error(ex)
|
25
|
+
super unless ex.is_a?(RestClient::Unauthorized)
|
26
|
+
|
27
|
+
message = _('Invalid username or password.')
|
28
|
+
begin
|
29
|
+
message = JSON.parse(ex.response.body)['error']['message']
|
30
|
+
rescue
|
31
|
+
end
|
32
|
+
UnauthorizedError.new(message)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -24,6 +24,8 @@ module HammerCLIForeman
|
|
24
24
|
def status
|
25
25
|
if session.valid?
|
26
26
|
_("Session exists, currently logged in as '%s'.") % session.user_name
|
27
|
+
elsif @authenticator.respond_to?(:status)
|
28
|
+
@authenticator.status
|
27
29
|
else
|
28
30
|
_('Using sessions, you are currently not logged in.')
|
29
31
|
end
|
@@ -66,8 +68,10 @@ module HammerCLIForeman
|
|
66
68
|
end
|
67
69
|
|
68
70
|
def response(r)
|
69
|
-
|
70
|
-
|
71
|
+
session_id = @authenticator.session_id if @authenticator.respond_to?(:session_id)
|
72
|
+
session_id ||= r.cookies['_session_id']
|
73
|
+
if session_id && r.code != 401
|
74
|
+
session.id = session_id
|
71
75
|
session.user_name = @authenticator.user
|
72
76
|
session.store
|
73
77
|
end
|
@@ -28,6 +28,19 @@ module HammerCLIForeman
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
+
class Negotiate < HammerCLI::AbstractCommand
|
32
|
+
extend HammerCLIForeman::Authenticate::Login
|
33
|
+
|
34
|
+
command_name('negotiate')
|
35
|
+
desc('negotiate the login credentials from the auth ticket (Kerberos)')
|
36
|
+
|
37
|
+
def execute
|
38
|
+
Negotiate.execute_with_params(AUTH_TYPES[:negotiate])
|
39
|
+
print_message(_("Successfully authenticated using negotiate auth, using the KEYRING principal."))
|
40
|
+
HammerCLI::EX_OK
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
31
44
|
class Oauth < HammerCLI::AbstractCommand
|
32
45
|
extend HammerCLIForeman::Authenticate::Login
|
33
46
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module HammerCLIForeman
|
2
|
+
module CommandExtensions
|
3
|
+
class Domain < HammerCLI::CommandExtensions
|
4
|
+
option_sources do |sources, command|
|
5
|
+
sources.find_by_name('IdResolution').insert_relative(
|
6
|
+
:after,
|
7
|
+
'IdParams',
|
8
|
+
HammerCLIForeman::OptionSources::ReferencedResourceIdParams.new(command)
|
9
|
+
)
|
10
|
+
sources
|
11
|
+
end
|
12
|
+
|
13
|
+
option_family associate: 'dns' do
|
14
|
+
child '--dns', 'DNS_NAME', _('Name of DNS proxy to use within this domain'),
|
15
|
+
attribute_name: :option_dns_name,
|
16
|
+
referenced_resource: :smart_proxy
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,16 +1,7 @@
|
|
1
1
|
module HammerCLIForeman
|
2
2
|
module CommandExtensions
|
3
3
|
class Subnet < HammerCLI::CommandExtensions
|
4
|
-
option
|
5
|
-
attribute_name: :option_dns_name,
|
6
|
-
referenced_resource: :smart_proxy
|
7
|
-
option "--dhcp", "DHCP_NAME", _("DHCP Proxy to use within this subnet"),
|
8
|
-
attribute_name: :option_dhcp_name,
|
9
|
-
referenced_resource: :smart_proxy
|
10
|
-
option "--tftp", "TFTP_NAME", _("TFTP Proxy to use within this subnet"),
|
11
|
-
attribute_name: :option_tftp_name,
|
12
|
-
referenced_resource: :smart_proxy
|
13
|
-
option "--prefix", "PREFIX", _("Network prefix in CIDR notation (e.g. 64) for this subnet")
|
4
|
+
option '--prefix', 'PREFIX', _('Network prefix in CIDR notation (e.g. 64) for this subnet')
|
14
5
|
|
15
6
|
option_sources do |sources, command|
|
16
7
|
sources.find_by_name('IdResolution').insert_relative(
|
@@ -20,6 +11,30 @@ module HammerCLIForeman
|
|
20
11
|
)
|
21
12
|
sources
|
22
13
|
end
|
14
|
+
|
15
|
+
option_family associate: 'tftp' do
|
16
|
+
child '--tftp', 'TFTP_NAME', _('TFTP Proxy to use within this subnet'),
|
17
|
+
attribute_name: :option_tftp_name,
|
18
|
+
referenced_resource: :smart_proxy
|
19
|
+
end
|
20
|
+
|
21
|
+
option_family associate: 'dns' do
|
22
|
+
child '--dns', 'DNS_NAME', _('DNS Proxy to use within this subnet'),
|
23
|
+
attribute_name: :option_dns_name,
|
24
|
+
referenced_resource: :smart_proxy
|
25
|
+
end
|
26
|
+
|
27
|
+
option_family associate: 'dhcp' do
|
28
|
+
child '--dhcp', 'DHCP_NAME', _('DHCP Proxy to use within this subnet'),
|
29
|
+
attribute_name: :option_dhcp_name,
|
30
|
+
referenced_resource: :smart_proxy
|
31
|
+
end
|
32
|
+
|
33
|
+
option_family associate: 'bmc' do
|
34
|
+
child '--bmc', 'BMC_NAME', _('BMC Proxy to use within this subnet'),
|
35
|
+
attribute_name: :option_bmc_name,
|
36
|
+
referenced_resource: :smart_proxy
|
37
|
+
end
|
23
38
|
end
|
24
39
|
end
|
25
40
|
end
|
@@ -1,17 +1,21 @@
|
|
1
1
|
module HammerCLIForeman
|
2
2
|
module CommandExtensions
|
3
3
|
class User < HammerCLI::CommandExtensions
|
4
|
-
option '--default-organization', 'DEFAULT_ORGANIZATION_NAME', _('Default organization name'),
|
5
|
-
aliased_resource: 'default_organization', referenced_resource: 'default_organization'
|
6
|
-
option '--default-location', 'DEFAULT_LOCATION_NAME', _('Default location name'),
|
7
|
-
aliased_resource: 'default_location', referenced_resource: 'default_location'
|
8
|
-
|
9
4
|
option '--ask-password', 'ASK_PW', ' ', format: HammerCLI::Options::Normalizers::Bool.new
|
10
5
|
|
11
6
|
option_sources do |sources, command|
|
12
7
|
sources << HammerCLIForeman::OptionSources::UserParams.new(command)
|
13
8
|
sources
|
14
9
|
end
|
10
|
+
|
11
|
+
option_family associate: 'default_organization' do
|
12
|
+
child '--default-organization', 'DEFAULT_ORGANIZATION_NAME', _('Default organization name'),
|
13
|
+
aliased_resource: 'default_organization', referenced_resource: 'organization'
|
14
|
+
end
|
15
|
+
option_family associate: 'default_location' do
|
16
|
+
child '--default-location', 'DEFAULT_LOCATION_NAME', _('Default location name'),
|
17
|
+
aliased_resource: 'default_location', referenced_resource: 'location'
|
18
|
+
end
|
15
19
|
end
|
16
20
|
end
|
17
21
|
end
|
@@ -6,3 +6,4 @@ require 'hammer_cli_foreman/command_extensions/ping'
|
|
6
6
|
require 'hammer_cli_foreman/command_extensions/status'
|
7
7
|
require 'hammer_cli_foreman/command_extensions/user'
|
8
8
|
require 'hammer_cli_foreman/command_extensions/subnet'
|
9
|
+
require 'hammer_cli_foreman/command_extensions/domain'
|
@@ -97,9 +97,8 @@ module HammerCLIForeman
|
|
97
97
|
configurator = BuilderConfigurator.new(searchables, dependency_resolver)
|
98
98
|
|
99
99
|
builder = ForemanOptionBuilder.new(searchables)
|
100
|
-
builder.builders =
|
100
|
+
builder.builders = super.builders
|
101
101
|
builder.builders += configurator.builders_for(resource, resource.action(action)) if resource_defined?
|
102
|
-
builder.builders += super.builders
|
103
102
|
builder
|
104
103
|
end
|
105
104
|
|
@@ -745,13 +744,17 @@ module HammerCLIForeman
|
|
745
744
|
response = send_request
|
746
745
|
if option_path
|
747
746
|
filepath = store_response(response)
|
748
|
-
print_message(
|
747
|
+
print_message(saved_response_message(filepath))
|
749
748
|
else
|
750
749
|
puts response.body
|
751
750
|
end
|
752
751
|
return HammerCLI::EX_OK
|
753
752
|
end
|
754
753
|
|
754
|
+
def saved_response_message(filepath)
|
755
|
+
_("The response has been saved to %{path}.") % { path: filepath }
|
756
|
+
end
|
757
|
+
|
755
758
|
def default_filename
|
756
759
|
"Downloaded-#{Time.new.strftime("%Y-%m-%d")}.txt"
|
757
760
|
end
|
@@ -12,7 +12,7 @@ module HammerCLIForeman
|
|
12
12
|
profile = HammerCLIForeman.record_to_common_format(
|
13
13
|
HammerCLIForeman.foreman_resource(:compute_profiles).call(:show, 'id' => options['option_compute_profile_id'] )
|
14
14
|
)
|
15
|
-
params['compute_attribute'] = profile['compute_attributes'].select { |hash| hash['compute_resource_id'] == options['option_compute_resource_id']}[0] || {}
|
15
|
+
params['compute_attribute'] = profile['compute_attributes'].select { |hash| hash['compute_resource_id'].to_s == options['option_compute_resource_id'].to_s}[0] || {}
|
16
16
|
params['compute_attribute'].delete('attributes') if params['compute_attribute']['attributes']
|
17
17
|
params
|
18
18
|
end
|
@@ -9,7 +9,8 @@ module HammerCLIForeman
|
|
9
9
|
[
|
10
10
|
['cpus', _('Number of CPUs'), { bold: true }],
|
11
11
|
['memory', _('String, amount of memory, value in bytes'), { bold: true }],
|
12
|
-
['cpu_mode', _('Possible values: %{modes}') % { modes: 'default, host-model, host-passthrough' }]
|
12
|
+
['cpu_mode', _('Possible values: %{modes}') % { modes: 'default, host-model, host-passthrough' }],
|
13
|
+
['boot_order', _('Device names to specify the boot order')]
|
13
14
|
]
|
14
15
|
end
|
15
16
|
|
@@ -48,7 +49,8 @@ module HammerCLIForeman
|
|
48
49
|
Fields::Field.new(:label => _('Status'), :path => [:state]),
|
49
50
|
Fields::Field.new(:label => _('OS Type'), :path => [:os_type]),
|
50
51
|
Fields::Field.new(:label => _('Domain Type'), :path => [:domain_type]),
|
51
|
-
Fields::Field.new(:label => _('Persistent'), :path => [:persistent])
|
52
|
+
Fields::Field.new(:label => _('Persistent'), :path => [:persistent]),
|
53
|
+
Fields::List.new(:label => _('Boot order'), :path => [:boot_order])
|
52
54
|
]
|
53
55
|
end
|
54
56
|
|
@@ -25,7 +25,8 @@ module HammerCLIForeman
|
|
25
25
|
['scsi_controllers', [_('List with SCSI controllers definitions'),
|
26
26
|
' type - ' + _('ID of the controller from VMware'),
|
27
27
|
' key - ' + _('Key of the controller (e.g. 1000)')
|
28
|
-
].flatten(1).join("\n")]
|
28
|
+
].flatten(1).join("\n")],
|
29
|
+
['boot_order', _('Device names to specify the boot order')]
|
29
30
|
]
|
30
31
|
end
|
31
32
|
|
@@ -76,7 +77,8 @@ module HammerCLIForeman
|
|
76
77
|
Fields::Field.new(:label => _('Connection Status'), :path => [:connection_status]),
|
77
78
|
Fields::Field.new(:label => _('Hardware Version'), :path => [:hardware_version]),
|
78
79
|
Fields::Field.new(:label => _('Path'), :path => [:path]),
|
79
|
-
Fields::Field.new(:label => _('Operating System'), :path => [:operatingsystem])
|
80
|
+
Fields::Field.new(:label => _('Operating System'), :path => [:operatingsystem]),
|
81
|
+
Fields::List.new(:label => _('Boot order'), :path => [:boot_order])
|
80
82
|
]
|
81
83
|
end
|
82
84
|
|
@@ -107,6 +107,7 @@ module HammerCLIForeman
|
|
107
107
|
class AssociateVmsCommand < HammerCLIForeman::Command
|
108
108
|
action :associate
|
109
109
|
command_name 'associate-vms'
|
110
|
+
option "--vm-id","VM ID", _("Associate a specific VM")
|
110
111
|
success_message _("Virtual machines have been associated.")
|
111
112
|
failure_message _("Could not associate the virtual machines")
|
112
113
|
|
@@ -1,28 +1,5 @@
|
|
1
1
|
module HammerCLIForeman
|
2
|
-
|
3
|
-
module DomainUpdateCreateCommons
|
4
|
-
|
5
|
-
def self.included(base)
|
6
|
-
base.option "--dns-id", "DNS_ID", _("ID of DNS proxy to use within this domain")
|
7
|
-
base.option "--dns", "DNS_NAME", _("Name of DNS proxy to use within this domain")
|
8
|
-
end
|
9
|
-
|
10
|
-
def request_params
|
11
|
-
params = super
|
12
|
-
params['domain']["dns_id"] = option_dns_id || dns_id(option_dns)
|
13
|
-
params
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def dns_id(name)
|
19
|
-
resolver.smart_proxy_id('option_name' => name) if name
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
2
|
class Domain < HammerCLIForeman::Command
|
25
|
-
|
26
3
|
resource :domains
|
27
4
|
|
28
5
|
class ListCommand < HammerCLIForeman::ListCommand
|
@@ -52,24 +29,24 @@ module HammerCLIForeman
|
|
52
29
|
|
53
30
|
|
54
31
|
class CreateCommand < HammerCLIForeman::CreateCommand
|
55
|
-
include DomainUpdateCreateCommons
|
56
|
-
|
57
32
|
success_message _("Domain [%{name}] created.")
|
58
33
|
failure_message _("Could not create the domain")
|
59
34
|
|
60
35
|
option "--description", "DESC", _("Full name describing the domain"), :attribute_name => :option_fullname
|
61
|
-
build_options :without => [:domain_parameters_attributes, :fullname
|
36
|
+
build_options :without => [:domain_parameters_attributes, :fullname]
|
37
|
+
|
38
|
+
extend_with(HammerCLIForeman::CommandExtensions::Domain.new)
|
62
39
|
end
|
63
40
|
|
64
41
|
|
65
42
|
class UpdateCommand < HammerCLIForeman::UpdateCommand
|
66
|
-
include DomainUpdateCreateCommons
|
67
|
-
|
68
43
|
success_message _("Domain [%{name}] updated.")
|
69
44
|
failure_message _("Could not update the domain")
|
70
45
|
|
71
46
|
option "--description", "DESC", _("Full name describing the domain"), :attribute_name => :option_fullname
|
72
47
|
build_options :without => [:domain_parameters_attributes, :fullname]
|
48
|
+
|
49
|
+
extend_with(HammerCLIForeman::CommandExtensions::Domain.new)
|
73
50
|
end
|
74
51
|
|
75
52
|
|
@@ -12,6 +12,7 @@ module HammerCLIForeman
|
|
12
12
|
[RestClient::UnprocessableEntity, :handle_unprocessable_entity],
|
13
13
|
[RestClient::MovedPermanently, :handle_moved_permanently],
|
14
14
|
[RestClient::BadRequest, :handle_bad_request],
|
15
|
+
[ApipieBindings::AuthenticatorError, :handle_authenticator_error],
|
15
16
|
[HammerCLIForeman::Api::UnauthorizedError, :handle_foreman_unauthorized],
|
16
17
|
[HammerCLIForeman::Api::SessionExpired, :handle_sesion_expired],
|
17
18
|
[ArgumentError, :handle_argument_error],
|
@@ -112,6 +113,12 @@ module HammerCLIForeman
|
|
112
113
|
HammerCLI::EX_DATAERR
|
113
114
|
end
|
114
115
|
|
116
|
+
def handle_authenticator_error(e)
|
117
|
+
print_error authenticator_error_message(e)
|
118
|
+
log_full_error e.original_error
|
119
|
+
HammerCLI::EX_USAGE
|
120
|
+
end
|
121
|
+
|
115
122
|
def ssl_cert_instructions
|
116
123
|
host_url = HammerCLI::Settings.get(:_params, :host) || HammerCLI::Settings.get(:foreman, :host)
|
117
124
|
uri = URI.parse(host_url)
|
@@ -147,6 +154,25 @@ module HammerCLIForeman
|
|
147
154
|
|
148
155
|
private
|
149
156
|
|
157
|
+
def authenticator_error_message(e)
|
158
|
+
case e.type
|
159
|
+
when :negotiate then negotiation_error_message(e)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def negotiation_error_message(e)
|
164
|
+
case e.cause
|
165
|
+
when :configuration
|
166
|
+
_('Server misconfiguration detected') + "\n - " +
|
167
|
+
_('have you run installer with option %s?') % '--foreman-ipa-authentication=true' + "\n - " +
|
168
|
+
_('the user might come from a different authentication source') + "\n"
|
169
|
+
else
|
170
|
+
_('Could not authenticate using negotiation protocol') + "\n - " +
|
171
|
+
_('have you run %s (for Kerberos)?') % 'kinit' + "\n - " +
|
172
|
+
_('is the server down?') + "\n"
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
150
176
|
def response_message(response)
|
151
177
|
message = JSON.parse(response)["error"]["message"]
|
152
178
|
"\n #{message}"
|
@@ -97,10 +97,10 @@ module HammerCLIForeman
|
|
97
97
|
|
98
98
|
def request_params
|
99
99
|
params = super
|
100
|
-
|
100
|
+
unless override?
|
101
101
|
# Clear taxonomies in case the filter is switching override from true to false
|
102
|
-
params['filter']['location_ids'] = []
|
103
|
-
params['filter']['organization_ids'] = []
|
102
|
+
params['filter']['location_ids'] = [] if !@filter || !@filter['locations'].empty?
|
103
|
+
params['filter']['organization_ids'] = [] if !@filter || !@filter['organizations'].empty?
|
104
104
|
end
|
105
105
|
params
|
106
106
|
end
|
@@ -55,6 +55,7 @@ module HammerCLIForeman
|
|
55
55
|
field nil, _("Compute Resource"), Fields::SingleReference, :key => :compute_resource
|
56
56
|
field nil, _("Compute Profile"), Fields::SingleReference, :key => :compute_profile, :hide_blank => true
|
57
57
|
field :certname, _("Cert name")
|
58
|
+
field :token, _("Token")
|
58
59
|
field :managed, _("Managed"), Fields::Boolean
|
59
60
|
|
60
61
|
field :installed_at, _("Installed at"), Fields::Date
|
@@ -3,13 +3,20 @@ module HammerCLIForeman
|
|
3
3
|
module HostgroupUpdateCreateCommons
|
4
4
|
|
5
5
|
def self.included(base)
|
6
|
-
base.option
|
7
|
-
base.option
|
8
|
-
base.option ["--ask-root-password", "--ask-root-pass"], "ASK_ROOT_PW", "",
|
6
|
+
base.option '--root-password', 'ROOT_PASSWORD', _('Root password')
|
7
|
+
base.option '--ask-root-password', 'ASK_ROOT_PW', '',
|
9
8
|
format: HammerCLI::Options::Normalizers::Bool.new
|
10
|
-
base.option "--subnet6", "SUBNET6_NAME", _("Subnet IPv6 name")
|
11
9
|
|
12
10
|
base.build_options without: %i[root_pass]
|
11
|
+
|
12
|
+
base.option_family associate: 'subnet6' do
|
13
|
+
child '--subnet6', 'SUBNET6_NAME', _('Subnet IPv6 name')
|
14
|
+
end
|
15
|
+
|
16
|
+
base.option_family associate: 'parent' do
|
17
|
+
child '--parent', 'PARENT_NAME', _('Name of parent hostgroup')
|
18
|
+
child '--parent-title', 'PARENT_TITLE', _('Title of parent hostgroup')
|
19
|
+
end
|
13
20
|
end
|
14
21
|
|
15
22
|
def self.ask_password
|
@@ -19,8 +26,8 @@ module HammerCLIForeman
|
|
19
26
|
|
20
27
|
def request_params
|
21
28
|
params = super
|
22
|
-
params['hostgroup'][
|
23
|
-
|
29
|
+
params['hostgroup']['parent_id'] ||= resolver.hostgroup_id('option_name' => option_parent) if option_parent
|
30
|
+
params['hostgroup']['parent_id'] ||= resolver.hostgroup_id('option_title' => option_parent_title) if option_parent_title
|
24
31
|
params['hostgroup']['root_pass'] = option_root_password if option_root_password
|
25
32
|
params['hostgroup']['root_pass'] = HammerCLIForeman::HostgroupUpdateCreateCommons::ask_password if option_ask_root_password
|
26
33
|
|
@@ -3,11 +3,12 @@ module HammerCLIForeman
|
|
3
3
|
module CommonUpdateOptions
|
4
4
|
|
5
5
|
def self.included(base)
|
6
|
-
base.
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
base.option_family do
|
7
|
+
parent '--owner-id', 'OWNER_ID', _('ID of the owner'),
|
8
|
+
attribute_name: :option_owner_id
|
9
|
+
child '--owner', 'OWNER_LOGIN', _('Login of the owner'),
|
10
|
+
attribute_name: :option_user_login
|
11
|
+
end
|
11
12
|
base.option "--root-password", "ROOT_PW",
|
12
13
|
_("Required if host is managed and value is not inherited from host group or default password in settings")
|
13
14
|
|
@@ -112,14 +113,13 @@ module HammerCLIForeman
|
|
112
113
|
|
113
114
|
private
|
114
115
|
|
115
|
-
|
116
116
|
def owner_id(name, type)
|
117
117
|
return unless name
|
118
118
|
return resolver.usergroup_id('option_name' => name) if type == 'Usergroup'
|
119
119
|
|
120
120
|
resolver.user_id('option_login' => name)
|
121
121
|
end
|
122
|
-
|
122
|
+
|
123
123
|
def proxy_id(name)
|
124
124
|
resolver.smart_proxy_id('option_name' => name) if name
|
125
125
|
end
|