hammer_cli_foreman_puppet 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +5 -0
  3. data/README.md +20 -0
  4. data/config/foreman_puppet.yml +2 -0
  5. data/lib/hammer_cli_foreman_puppet.rb +57 -0
  6. data/lib/hammer_cli_foreman_puppet/associating_commands.rb +1 -0
  7. data/lib/hammer_cli_foreman_puppet/associating_commands/associating_commands.rb +40 -0
  8. data/lib/hammer_cli_foreman_puppet/class.rb +54 -0
  9. data/lib/hammer_cli_foreman_puppet/combination.rb +14 -0
  10. data/lib/hammer_cli_foreman_puppet/command_extensions.rb +2 -0
  11. data/lib/hammer_cli_foreman_puppet/command_extensions/discovery.rb +8 -0
  12. data/lib/hammer_cli_foreman_puppet/command_extensions/environment.rb +24 -0
  13. data/lib/hammer_cli_foreman_puppet/command_extensions/environments.rb +24 -0
  14. data/lib/hammer_cli_foreman_puppet/command_extensions/host.rb +41 -0
  15. data/lib/hammer_cli_foreman_puppet/command_extensions/hostgroup.rb +47 -0
  16. data/lib/hammer_cli_foreman_puppet/command_extensions/location.rb +9 -0
  17. data/lib/hammer_cli_foreman_puppet/command_extensions/organization.rb +9 -0
  18. data/lib/hammer_cli_foreman_puppet/commands.rb +76 -0
  19. data/lib/hammer_cli_foreman_puppet/config_group.rb +45 -0
  20. data/lib/hammer_cli_foreman_puppet/discovery.rb +11 -0
  21. data/lib/hammer_cli_foreman_puppet/environment.rb +59 -0
  22. data/lib/hammer_cli_foreman_puppet/environment_name_mapping.rb +20 -0
  23. data/lib/hammer_cli_foreman_puppet/host.rb +70 -0
  24. data/lib/hammer_cli_foreman_puppet/hostgroup.rb +76 -0
  25. data/lib/hammer_cli_foreman_puppet/id_resolver.rb +73 -0
  26. data/lib/hammer_cli_foreman_puppet/location.rb +35 -0
  27. data/lib/hammer_cli_foreman_puppet/option_sources.rb +1 -0
  28. data/lib/hammer_cli_foreman_puppet/option_sources/puppet_environment_params.rb +60 -0
  29. data/lib/hammer_cli_foreman_puppet/organization.rb +35 -0
  30. data/lib/hammer_cli_foreman_puppet/puppet_references.rb +20 -0
  31. data/lib/hammer_cli_foreman_puppet/references.rb +22 -0
  32. data/lib/hammer_cli_foreman_puppet/smart_class_parameter.rb +182 -0
  33. data/lib/hammer_cli_foreman_puppet/smart_proxy.rb +58 -0
  34. data/lib/hammer_cli_foreman_puppet/version.rb +5 -0
  35. data/test/data/2.1/foreman_api.json +1 -0
  36. data/test/data/3.0/foreman_api.json +1 -0
  37. data/test/data/README.md +27 -0
  38. data/test/functional/config_group_test.rb +28 -0
  39. data/test/functional/host/create_test.rb +164 -0
  40. data/test/functional/host/update_test.rb +97 -0
  41. data/test/functional/hostgroup/create_test.rb +149 -0
  42. data/test/functional/hostgroup/update_test.rb +97 -0
  43. data/test/functional/proxy_test.rb +86 -0
  44. data/test/functional/smart_class_parameter_test.rb +97 -0
  45. data/test/functional/template_test.rb +38 -0
  46. data/test/functional/test_helper.rb +7 -0
  47. data/test/test_helper.rb +29 -0
  48. data/test/unit/apipie_resource_mock.rb +186 -0
  49. data/test/unit/config_group_test.rb +81 -0
  50. data/test/unit/helpers/command.rb +163 -0
  51. data/test/unit/helpers/fake_searchables.rb +19 -0
  52. data/test/unit/helpers/resource_disabled.rb +24 -0
  53. data/test/unit/puppet_class_test.rb +72 -0
  54. data/test/unit/puppet_environment_test.rb +116 -0
  55. data/test/unit/smart_class_parameter_test.rb +114 -0
  56. data/test/unit/test_helper.rb +18 -0
  57. data/test/unit/test_output_adapter.rb +22 -0
  58. metadata +143 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c8cf103215c0693d5edeedfba47ce25c89a894b042ab4da48d16839d414b49c0
4
+ data.tar.gz: 740d0819a7ca0142f7f962df9aef29a0bd6f6cc27e8ac8bfdf5ae8f246b027d1
5
+ SHA512:
6
+ metadata.gz: 4ca662500bc6c2fea49c077daadfa82b4cceb26af0f3668adb21f6b013579e6ef07397d230a1b4928c5993c6b49bb07d350ffbfe7488e9aa5cc0b9d893c24fca
7
+ data.tar.gz: ecbd3bae2f043ae3e5bba7887343aee0d121bbc1523454b8ec3644ace72465203aead339ac6ab489c2f4d347ebab19aa2cb17b815e2a4d521950b300b82a33a6
data/LICENSE ADDED
@@ -0,0 +1,5 @@
1
+ This program and entire repository is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version.
2
+
3
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
4
+
5
+ You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
data/README.md ADDED
@@ -0,0 +1,20 @@
1
+ [WIP] hammer_cli_foreman_puppet
2
+ =========================================
3
+
4
+ This [Hammer CLI](https://github.com/theforeman/hammer-cli) plugin contains
5
+ set of commands for puppet.
6
+ Configuration
7
+ -------------
8
+
9
+ Configuration is expected to be placed in one of hammer's configuration directories for plugins:
10
+ - `/etc/hammer/cli.modules.d/`
11
+ - `~/.hammer/cli.modules.d/`
12
+ - `./.config/cli.modules.d/` (config dir in CWD)
13
+
14
+ If you install `hammer_cli_foreman_puppet` from source you'll have to copy the config file manually
15
+ from `config/foreman_puppet.yml`.
16
+
17
+ License
18
+ -------
19
+
20
+ This project is licensed under the GPLv3+.
@@ -0,0 +1,2 @@
1
+ :foreman_puppet:
2
+ :enable_module: true
@@ -0,0 +1,57 @@
1
+ module HammerCLIForemanPuppet
2
+ require 'hammer_cli'
3
+ require 'hammer_cli_foreman'
4
+
5
+ require 'hammer_cli_foreman_puppet/version'
6
+ require 'hammer_cli_foreman_puppet/puppet_references'
7
+ require 'hammer_cli_foreman_puppet/environment_name_mapping'
8
+ require 'hammer_cli_foreman_puppet/commands'
9
+ require 'hammer_cli_foreman_puppet/command_extensions'
10
+ require 'hammer_cli_foreman_puppet/option_sources'
11
+ require 'hammer_cli_foreman_puppet/associating_commands'
12
+ require 'hammer_cli_foreman_puppet/id_resolver'
13
+
14
+ # Puppet commands
15
+ require 'hammer_cli_foreman_puppet/smart_class_parameter'
16
+ require 'hammer_cli_foreman_puppet/environment'
17
+ require 'hammer_cli_foreman_puppet/config_group'
18
+ require 'hammer_cli_foreman_puppet/class'
19
+
20
+ # extensions to hammer_cli_foreman commands
21
+ require 'hammer_cli_foreman_puppet/host'
22
+ require 'hammer_cli_foreman_puppet/organization'
23
+ require 'hammer_cli_foreman_puppet/location'
24
+ require 'hammer_cli_foreman_puppet/smart_proxy'
25
+ require 'hammer_cli_foreman_puppet/combination'
26
+ require 'hammer_cli_foreman_puppet/hostgroup'
27
+
28
+ HammerCLI::MainCommand.lazy_subcommand(
29
+ 'puppet-class',
30
+ _('Manage Foreman Puppet classes'),
31
+ 'HammerCLIForemanPuppet::PuppetClass',
32
+ 'hammer_cli_foreman_puppet/class'
33
+ )
34
+ HammerCLI::MainCommand.lazy_subcommand(
35
+ 'puppet-environment',
36
+ _('Manage Foreman Puppet environments'),
37
+ 'HammerCLIForemanPuppet::PuppetEnvironment',
38
+ 'hammer_cli_foreman_puppet/environment'
39
+ )
40
+ HammerCLI::MainCommand.lazy_subcommand(
41
+ 'config-group',
42
+ _('Manage Foreman config groups'),
43
+ 'HammerCLIForemanPuppet::ConfigGroup',
44
+ 'hammer_cli_foreman_puppet/config_group'
45
+ )
46
+ HammerCLI::MainCommand.lazy_subcommand(
47
+ 'sc-param',
48
+ _('Manage Foreman Puppet smart class parameters'),
49
+ 'HammerCLIForemanPuppet::SmartClassParameter',
50
+ 'hammer_cli_foreman_puppet/smart_class_parameter'
51
+ )
52
+
53
+ # plugins extensions
54
+ begin
55
+ require 'hammer_cli_foreman_puppet/discovery'
56
+ rescue LoadError
57
+ end
@@ -0,0 +1 @@
1
+ require 'hammer_cli_foreman_puppet/associating_commands/associating_commands'
@@ -0,0 +1,40 @@
1
+ module HammerCLIForemanPuppet
2
+ module AssociatingCommands
3
+ module ExtendCommands
4
+ def create_subcommand(name = :PuppetEnvironment)
5
+ commands = constants.select { |c| c.to_s.include? name.to_s }.map { |p| const_get(p)}
6
+ commands.each do |command|
7
+ subcommand(command.command_name, command.desc, command, warning: command.warning)
8
+ end
9
+ end
10
+ end
11
+
12
+ module PuppetEnvironment
13
+ extend HammerCLIForeman::AssociatingCommands::CommandExtension
14
+
15
+ class AddPuppetEnvironmentCommand < HammerCLIForemanPuppet::AddAssociatedCommand
16
+ include EnvironmentNameMapping
17
+ associated_resource :environments
18
+ desc _('Associate a Puppet environment')
19
+ command_name "add-environment"
20
+
21
+ success_message _("The environment has been associated.")
22
+ failure_message _("Could not associate the environment")
23
+
24
+ extend_with(HammerCLIForemanPuppet::CommandExtensions::PuppetEnvironment.new)
25
+ end
26
+
27
+ class RemovePuppetEnvironmentCommand < HammerCLIForemanPuppet::RemoveAssociatedCommand
28
+ include EnvironmentNameMapping
29
+ associated_resource :environments
30
+ desc _('Disassociate a Puppet environment')
31
+ command_name "remove-environment"
32
+
33
+ success_message _("The environment has been disassociated.")
34
+ failure_message _("Could not disassociate the environment")
35
+
36
+ extend_with(HammerCLIForemanPuppet::CommandExtensions::PuppetEnvironment.new)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,54 @@
1
+ module HammerCLIForemanPuppet
2
+ class PuppetClass < HammerCLIForemanPuppet::Command
3
+
4
+ resource :puppetclasses
5
+
6
+ class ListCommand < HammerCLIForemanPuppet::ListCommand
7
+ output do
8
+ field :id, _("Id")
9
+ field :name, _("Name")
10
+ end
11
+
12
+ def send_request
13
+ self.class.unhash_classes(super)
14
+ end
15
+
16
+ def self.unhash_classes(classes)
17
+ clss = classes.first.inject([]) { |list, (pp_module, pp_module_classes)| list + pp_module_classes }
18
+
19
+ HammerCLI::Output::RecordCollection.new(clss, :meta => classes.meta)
20
+ end
21
+
22
+ build_options
23
+
24
+ extend_with(HammerCLIForemanPuppet::CommandExtensions::PuppetEnvironment.new)
25
+ end
26
+
27
+ class InfoCommand < HammerCLIForemanPuppet::InfoCommand
28
+ output ListCommand.output_definition do
29
+ collection :smart_class_parameters, _('Smart class parameters'), :numbered => false do
30
+ custom_field Fields::Reference, :name_key => :parameter
31
+ end
32
+ HammerCLIForeman::References.hostgroups(self)
33
+ HammerCLIForemanPuppet::PuppetReferences.environments(self)
34
+ HammerCLIForeman::References.parameters(self)
35
+ end
36
+
37
+ build_options
38
+
39
+ extend_with(HammerCLIForemanPuppet::CommandExtensions::PuppetEnvironment.new)
40
+ end
41
+
42
+
43
+ class SCParamsCommand < HammerCLIForemanPuppet::SmartClassParametersBriefList
44
+ build_options_for :puppetclasses
45
+
46
+ def validate_options
47
+ super
48
+ validator.any(:option_puppetclass_name, :option_puppetclass_id).required
49
+ end
50
+ end
51
+
52
+ autoload_subcommands
53
+ end
54
+ end
@@ -0,0 +1,14 @@
1
+
2
+ require 'hammer_cli_foreman/combination'
3
+
4
+ module HammerCLIForemanPuppet
5
+ HammerCLIForeman::Combination::InfoCombination.extend_with(
6
+ HammerCLIForemanPuppet::CommandExtensions::PuppetEnvironment.new
7
+ )
8
+ HammerCLIForeman::Combination::UpdateCombination.extend_with(
9
+ HammerCLIForemanPuppet::CommandExtensions::PuppetEnvironment.new
10
+ )
11
+ HammerCLIForeman::Combination::CreateCombination.extend_with(
12
+ HammerCLIForemanPuppet::CommandExtensions::PuppetEnvironment.new
13
+ )
14
+ end
@@ -0,0 +1,2 @@
1
+ require 'hammer_cli_foreman_puppet/command_extensions/environment'
2
+ require 'hammer_cli_foreman_puppet/command_extensions/environments'
@@ -0,0 +1,8 @@
1
+ module HammerCLIForemanPuppet
2
+ module CommandExtensions
3
+ class Provision < HammerCLI::CommandExtensions
4
+ option "--puppetclass-ids", "PUPPETCLASS_IDS", " ",
5
+ :format => HammerCLI::Options::Normalizers::List.new
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,24 @@
1
+ module HammerCLIForemanPuppet
2
+ module CommandExtensions
3
+ class PuppetEnvironment < HammerCLI::CommandExtensions
4
+ # FIXME: Temp workaround for option builders in case of multiple plugins
5
+ # extensions of the same command
6
+ option_family do
7
+ parent '--puppet-environment-id', 'PUPPET_ENVIRONMENT_ID', _('ID of associated Puppet environment'),
8
+ format: HammerCLI::Options::Normalizers::Number.new,
9
+ attribute_name: :option_environment_id
10
+ child '--puppet-environment', 'PUPPET_ENVIRONMENT_NAME', _('Name of associated Puppet environment'),
11
+ attribute_name: :option_environment_name
12
+ end
13
+
14
+ option_sources do |sources, command|
15
+ sources.find_by_name('IdResolution').insert_relative(
16
+ :after,
17
+ 'IdParams',
18
+ HammerCLIForemanPuppet::OptionSources::PuppetEnvironmentParams.new(command)
19
+ )
20
+ sources
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ module HammerCLIForemanPuppet
2
+ module CommandExtensions
3
+ class PuppetEnvironments < HammerCLI::CommandExtensions
4
+ # FIXME: Temp workaround for option builders in case of multiple plugins
5
+ # extensions of the same command
6
+ option_family do
7
+ parent '--puppet-environment-ids', 'PUPPET_ENVIRONMENT_IDS', _('IDs of associated Puppet environment'),
8
+ format: HammerCLI::Options::Normalizers::List.new,
9
+ attribute_name: :option_environment_ids
10
+ child '--puppet-environments', 'PUPPET_ENVIRONMENT_NAMES', _('Names of associated Puppet environment'),
11
+ attribute_name: :option_environment_names
12
+ end
13
+
14
+ option_sources do |sources, command|
15
+ sources.find_by_name('IdResolution').insert_relative(
16
+ :after,
17
+ 'IdsParams',
18
+ HammerCLIForemanPuppet::OptionSources::PuppetEnvironmentParams.new(command)
19
+ )
20
+ sources
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,41 @@
1
+ module HammerCLIForemanPuppet
2
+ module CommandExtensions
3
+ class Host < HammerCLI::CommandExtensions
4
+ output do |definition|
5
+ definition.insert(:after, :location, HammerCLIForemanPuppet::Host::InfoCommand.output_definition.fields)
6
+ end
7
+ end
8
+
9
+ class HostPuppetProxy < HammerCLI::CommandExtensions
10
+ option_family(
11
+ format: HammerCLI::Options::Normalizers::List.new,
12
+ aliased_resource: 'puppet-class',
13
+ description: 'Names/Ids of associated Puppet classes'
14
+ ) do
15
+ parent '--puppet-class-ids', 'PUPPET_CLASS_IDS', _('List of Puppet class ids'),
16
+ attribute_name: :option_puppetclass_ids
17
+ child '--puppet-classes', 'PUPPET_CLASS_NAMES', '',
18
+ attribute_name: :option_puppetclass_names
19
+ end
20
+ option '--puppet-ca-proxy', 'PUPPET_CA_PROXY_NAME', _('Name of Puppet CA proxy')
21
+ option '--puppet-proxy', 'PUPPET_PROXY_NAME', _('Name of Puppet proxy')
22
+
23
+ request_params do |params, command_object|
24
+ if command_object.option_puppet_proxy
25
+ params['host']['puppet_proxy_id'] ||= HammerCLIForemanPuppet::CommandExtensions::HostPuppetProxy.proxy_id(
26
+ command_object.resolver, command_object.option_puppet_proxy
27
+ )
28
+ end
29
+ if command_object.option_puppet_ca_proxy
30
+ params['host']['puppet_ca_proxy_id'] ||= HammerCLIForemanPuppet::CommandExtensions::HostPuppetProxy.proxy_id(
31
+ command_object.resolver, command_object.option_puppet_ca_proxy
32
+ )
33
+ end
34
+ end
35
+
36
+ def self.proxy_id(resolver, name)
37
+ resolver.smart_proxy_id('option_name' => name)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,47 @@
1
+ module HammerCLIForemanPuppet
2
+ module CommandExtensions
3
+ class HostgroupInfo < HammerCLI::CommandExtensions
4
+ output do |definition|
5
+ definition.insert(:after, :compute_resource, HammerCLIForemanPuppet::Hostgroup::InfoCommand.output_definition.fields)
6
+ end
7
+ end
8
+
9
+ class HostgroupList < HammerCLI::CommandExtensions
10
+ output do |definition|
11
+ definition.insert(:after, :operatingsystem, HammerCLIForemanPuppet::Hostgroup::ListCommand.output_definition.fields)
12
+ end
13
+ end
14
+
15
+ class HostgroupPuppetProxy < HammerCLI::CommandExtensions
16
+ option_family(
17
+ format: HammerCLI::Options::Normalizers::List.new,
18
+ aliased_resource: 'puppet-class',
19
+ description: 'Names/Ids of associated Puppet classes'
20
+ ) do
21
+ parent '--puppet-class-ids', 'PUPPET_CLASS_IDS', _('List of Puppet class ids'),
22
+ attribute_name: :option_puppetclass_ids
23
+ child '--puppet-classes', 'PUPPET_CLASS_NAMES', '',
24
+ attribute_name: :option_puppetclass_names
25
+ end
26
+ option '--puppet-ca-proxy', 'PUPPET_CA_PROXY_NAME', _('Name of Puppet CA proxy')
27
+ option '--puppet-proxy', 'PUPPET_PROXY_NAME', _('Name of Puppet proxy')
28
+
29
+ request_params do |params, command_object|
30
+ if command_object.option_puppet_proxy
31
+ params['hostgroup']['puppet_proxy_id'] ||= HammerCLIForemanPuppet::CommandExtensions::HostgroupPuppetProxy.proxy_id(
32
+ command_object.resolver, command_object.option_puppet_proxy
33
+ )
34
+ end
35
+ if command_object.option_puppet_ca_proxy
36
+ params['hostgroup']['puppet_ca_proxy_id'] ||= HammerCLIForemanPuppet::CommandExtensions::HostgroupPuppetProxy.proxy_id(
37
+ command_object.resolver, command_object.option_puppet_ca_proxy
38
+ )
39
+ end
40
+ end
41
+
42
+ def self.proxy_id(resolver, name)
43
+ resolver.smart_proxy_id('option_name' => name)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,9 @@
1
+ module HammerCLIForemanPuppet
2
+ module CommandExtensions
3
+ class LocationInfo < HammerCLI::CommandExtensions
4
+ output do |definition|
5
+ definition.insert(:after, :realms, HammerCLIForemanPuppet::Location::InfoCommand.output_definition.fields)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module HammerCLIForemanPuppet
2
+ module CommandExtensions
3
+ class OrganizationInfo < HammerCLI::CommandExtensions
4
+ output do |definition|
5
+ definition.insert(:after, :realms, HammerCLIForemanPuppet::Organization::InfoCommand.output_definition.fields)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,76 @@
1
+ module HammerCLIForemanPuppet
2
+ RESOURCE_NAME_MAPPING = {
3
+ :puppetclass => :puppet_class,
4
+ :puppetclasses => :puppet_classes,
5
+ :environment => :puppet_environment,
6
+ :environments => :puppet_environments
7
+ }.freeze
8
+
9
+ RESOURCE_ALIAS_NAME_MAPPING = {
10
+ environment: :puppet_environment,
11
+ environments: :puppet_environments
12
+ }.freeze
13
+
14
+ module ResolverCommons
15
+ def self.included(base)
16
+ base.extend(ClassMethods)
17
+ end
18
+ module ClassMethods
19
+
20
+ def api_connection
21
+ if HammerCLI.context[:api_connection]
22
+ HammerCLI.context[:api_connection].get("foreman")
23
+ else
24
+ HammerCLI::Connection.get("foreman").api
25
+ end
26
+ end
27
+
28
+ def resolver
29
+ HammerCLIForemanPuppet::IdResolver.new(
30
+ api_connection,
31
+ HammerCLIForemanPuppet::Searchables.new
32
+ )
33
+ end
34
+ def resource_name_mapping
35
+ HammerCLIForemanPuppet::RESOURCE_NAME_MAPPING.dup
36
+ end
37
+
38
+ def searchables
39
+ @searchables ||= HammerCLIForemanPuppet::Searchables.new
40
+ @searchables
41
+ end
42
+ end
43
+ end
44
+
45
+ class Command < HammerCLIForeman::Command
46
+ include HammerCLIForemanPuppet::ResolverCommons
47
+ end
48
+
49
+ class UpdateCommand < HammerCLIForeman::UpdateCommand
50
+ include HammerCLIForemanPuppet::ResolverCommons
51
+ end
52
+
53
+ class InfoCommand < HammerCLIForeman::InfoCommand
54
+ include HammerCLIForemanPuppet::ResolverCommons
55
+ end
56
+
57
+ class CreateCommand < HammerCLIForeman::CreateCommand
58
+ include HammerCLIForemanPuppet::ResolverCommons
59
+ end
60
+
61
+ class DeleteCommand < HammerCLIForeman::DeleteCommand
62
+ include HammerCLIForemanPuppet::ResolverCommons
63
+ end
64
+
65
+ class ListCommand < HammerCLIForeman::ListCommand
66
+ include HammerCLIForemanPuppet::ResolverCommons
67
+ end
68
+
69
+ class AddAssociatedCommand < HammerCLIForeman::AddAssociatedCommand
70
+ include HammerCLIForemanPuppet::ResolverCommons
71
+ end
72
+
73
+ class RemoveAssociatedCommand < HammerCLIForeman::RemoveAssociatedCommand
74
+ include HammerCLIForemanPuppet::ResolverCommons
75
+ end
76
+ end