CFINSPEC-128 Initial draft of resource generator

Signed-off-by: Sonu Saha <sonu.saha@progress.com>
This commit is contained in:
Sonu Saha 2022-03-04 21:45:06 +05:30
parent 270ad5fa4b
commit 81a04aacd5
8 changed files with 204 additions and 0 deletions

View file

@ -10,6 +10,7 @@ module InspecPlugins
require_relative "cli_profile"
require_relative "cli_plugin"
require_relative "cli_resource"
end
end
end

View file

@ -0,0 +1,73 @@
require_relative "renderer"
module InspecPlugins
module Init
class CLI < Inspec.plugin(2, :cli_command)
#-------------------------------------------------------------------#
# inspec init resource
#-------------------------------------------------------------------#
desc "resource RESOURCE_NAME [options]", "Generates an InSpec resource, which can extend the scope of InSpec resources support"
# General options
option :prompt, type: :boolean, default: true, desc: "Interactively prompt for information to put in your generated resource."
# Templating vars
option :supports_platform, type: :string, default: "linux", desc: "the platform supported by this resource"
option :description, type: :string, default: "Resource description ...", desc: "the description of this resource"
option :class_name, type: :string, default: "", desc: "Class Name for your resource."
def resource(resource_name)
template_vars = {
name: File.join("temp", resource_name),
resource_name: resource_name,
}
resource_vars_from_opts
template_vars.merge!(options)
template_path = "resources"
render_opts = {
templates_path: TEMPLATES_PATH,
overwrite: options[:overwrite],
file_rename_map: make_rename_map(resource_name),
}
renderer = InspecPlugins::Init::Renderer.new(ui, render_opts)
renderer.render_with_values(template_path, "resource", template_vars)
end
private
def make_rename_map(resource_name)
{
File.join("libraries", "inspec-resource-template.erb") => File.join("libraries", resource_name + ".rb"),
File.join("docs", "resource-doc.erb") => File.join("docs", resource_name + ".md"),
File.join("tests", "functional", "inspec-resource-test-template.erb") => File.join("tests", "functional", resource_name + "_test.rb"),
File.join("tests", "unit", "inspec-resource-test-template.erb") => File.join("tests", "unit", resource_name + "_test.rb"),
}
end
def resource_vars_from_opts
options[:class_name] ||= options[:resource_name]
if options[:prompt] && ui.interactive?
options.dup.merge(prompt_for_options)
else
ui.error("You requested interactive prompting for the template variables, but this does not seem to be an interactive terminal.")
ui.exit(:usage_error)
end
end
def prompt_for_options # rubocop: disable Metrics/AbcSize
option_defs = self.class.all_commands["resource"].options
options_order = {
supports_platform: {},
description: {},
class_name: {},
}
options_order.each do |opt_name, _|
opt_def = option_defs[opt_name]
options[opt_name] = ui.prompt.ask("Enter " + opt_def.description + ":", default: options[opt_name])
end
end
end
end
end

Binary file not shown.

View file

@ -0,0 +1,74 @@
+++
title = "<%= resource_name %> resource"
draft = false
gh_repo = "inspec"
platform = "<%= supports_platform %>"
[menu]
[menu.inspec]
title = "<%= resource_name %>"
identifier = "inspec/resources/os/<%= resource_name %>.md <%= resource_name %> resource"
parent = "inspec/resources/os"
+++
Use the `<%= resource_name %>` Chef InSpec audit resource to test the ...
## Availability
### Installation
This resource is distributed along with Chef InSpec itself. You can use it automatically.
## Syntax
An `<%= resource_name %>` Chef InSpec audit resource ...
describe <%= resource_name %> do
its('property') { should some_matcher 'value' }
end
where
- `'property'` is some property of specific this resource
- `'value'` is the value of ...
## Properties
- Properties of the resources: `property1`, `property2`
## Matchers
<%# Correct the url %>
For a full list of available matchers, please visit our [matchers page](/inspec/matchers/). The matcher of the resources are: `matcher1`, `matcher2`
### matcher1
The `matcher1` matcher tests the ...:
it { should matcher1("Value") }
## Examples
The following examples show how to use this Chef InSpec audit resource.
### Example 1
`property1` returns ...
describe <%= resource_name %> do
its('property2') { should eq 'some_expected_value' }
end
### Example 2
<%# Make matcher and property aligns %>
`matcher1` does the ...
describe <%= resource_name %> do
it { should matcher1("Value") }
end
{{< note >}}
Important information regarding the use of this resource. Replace it with appropriate message.
{{< /note >}}

Binary file not shown.

View file

@ -0,0 +1,54 @@
# Uncomment the below line to add required gems and files by the resource
# require ""
# require_relative ""
# Change module if required
module Inspec::Resources
class <%= class_name %> < Inspec.resource(1)
name "<%= resource_name %>"
# Restrict to only run on the below platforms (if none were given, all OS's supported)
supports platform: "<%= supports_platform %>"
desc "<%= description %>"
example <<~EXAMPLE
describe "<%= resource_name %>" do
its() { }
end
describe "<%= resource_name %>" do
it { }
end
EXAMPLE
# Resource initialization
def initialize
return skip_resource "The `<%= resource_name %>` resource is not yet available on your OS." unless inspec.os.<%= supports_platform %>?
# Initialize required path/params/configs
end
def resource_matcher?()
return "positive or negative expectations specific to this resource instance"
end
def resource_property
# Implementation of the property specific to this resource
end
def resource_id
# replace value specific unique to this individual resource instance
return "something special"
end
def to_s
"<%= resource_name %>"
end
private
# Methods to help the resource's public methods
def resource_helper_method()
# Add
end
end
end

View file

@ -0,0 +1 @@
# Some functional test code

View file

@ -0,0 +1 @@
# Some unit test code