Merge pull request #5302 from yarick/yt/wildcart_support_platform_name

Added platform-name wildcard support
This commit is contained in:
Nick Schwaderer 2020-12-03 13:17:02 +00:00 committed by GitHub
commit c766519485
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 61 additions and 9 deletions

View file

@ -18,7 +18,7 @@ is a standalone structure with its own distribution and execution flow.
## Profile Structure ## Profile Structure
A profile should have the following structure:: A profile should have the following structure:
```YAML ```YAML
examples/profile examples/profile
@ -115,8 +115,8 @@ inspec check examples/profile
Use the `supports` setting in the `inspec.yml` file to specify one (or more) platforms for which a profile is targeting. The list of supported platforms may contain the following: Use the `supports` setting in the `inspec.yml` file to specify one (or more) platforms for which a profile is targeting. The list of supported platforms may contain the following:
- Use `platform-family` to restrict to a specific platform family. - Use `platform-family` to restrict to a specific platform family.
- Use `platform-name` to restrict on a specific platform name. - Use `platform-name` to restrict on a specific platform name. `platform-name` supports asterisk (`*`) wildcard use.
- Use `release` to restrict to a specific platform version (used with platform-name). - Use `release` to restrict to a specific platform version, and use together with `platform-name`. `release` supports asterisk (`*`) wildcard use.
- Use `platform` to restrict on either platform-name or platform-family. - Use `platform` to restrict on either platform-name or platform-family.
For compatibility we support `os-name` and `os-family`. We recommend all users For compatibility we support `os-name` and `os-family`. We recommend all users
@ -125,7 +125,7 @@ to change `os-name` to `platform-name` and `os-family` to `platform-family`.
With Chef InSpec 2.0, we introduced new families to help distinguish the cloud With Chef InSpec 2.0, we introduced new families to help distinguish the cloud
platforms. The new families can restrict the platform family to `os`, `aws`, `azure` or `gcp`. platforms. The new families can restrict the platform family to `os`, `aws`, `azure` or `gcp`.
For example, to target anything running Debian Linux: For example, to target anything running Debian Linux, use:
```YAML ```YAML
name: ssh name: ssh
@ -133,7 +133,7 @@ supports:
- platform-name: debian - platform-name: debian
``` ```
and to target only Ubuntu version 14.04 To target only Ubuntu version 14.04, use:
```YAML ```YAML
name: ssh name: ssh
@ -142,7 +142,16 @@ supports:
release: 14.04 release: 14.04
``` ```
and to target the entire RedHat platform (including CentOS and Oracle Linux): To target the entire release of Ubuntu version 14.x, use:
```YAML
name: ssh
supports:
- platform-name: ubuntu
release: 14.*
```
To target the entire RedHat platform (including CentOS and Oracle Linux), use:
```YAML ```YAML
name: ssh name: ssh
@ -150,7 +159,15 @@ supports:
- platform-family: redhat - platform-family: redhat
``` ```
and to target anything running on Amazon AWS: To target the entire Windows 2019 platform family including Datcenter and Core Servers, use:
```YAML
name: ssh
supports:
- platform-name: windows_server_2019*
```
To target anything running on Amazon AWS, use:
```YAML ```YAML
name: ssh name: ssh
@ -158,7 +175,7 @@ supports:
- platform: aws - platform: aws
``` ```
and to target all of these examples in a single `inspec.yml` file: To target all of these examples in a single `inspec.yml` file, use:
```YAML ```YAML
name: ssh name: ssh

View file

@ -81,7 +81,7 @@ module Inspec::Resources
when :os, :platform then when :os, :platform then
platform?(v) platform?(v)
when :os_name, :platform_name then when :os_name, :platform_name then
name == v check_name(v)
when :release then when :release then
check_release(v) check_release(v)
end end
@ -99,6 +99,16 @@ module Inspec::Resources
private private
def check_name(value)
# allow wild card matching
if value.include?("*")
cleaned = Regexp.escape(value).gsub('\*', ".*?")
name =~ /#{cleaned}/
else
name == value
end
end
def check_release(value) def check_release(value)
# allow wild card matching # allow wild card matching
if value.include?("*") if value.include?("*")

View file

@ -25,6 +25,8 @@ class MockLoader
mint17: { name: "linuxmint", family: "debian", release: "17.3", arch: "x86_64" }, mint17: { name: "linuxmint", family: "debian", release: "17.3", arch: "x86_64" },
mint18: { name: "linuxmint", family: "debian", release: "18", arch: "x86_64" }, mint18: { name: "linuxmint", family: "debian", release: "18", arch: "x86_64" },
windows: { name: "windows", family: "windows", release: "6.2.9200", arch: "x86_64" }, windows: { name: "windows", family: "windows", release: "6.2.9200", arch: "x86_64" },
windows2016: { name: "windows_server_2016_datacenter", family: "windows", release: "10.0.14393", arch: "x86_64" },
windows2019: { name: "windows_server_2019_datacenter", family: "windows", release: "10.0.17763", arch: "x86_64" },
wrlinux: { name: "wrlinux", family: "redhat", release: "7.0(3)I2(2)", arch: "x86_64" }, wrlinux: { name: "wrlinux", family: "redhat", release: "7.0(3)I2(2)", arch: "x86_64" },
solaris11: { name: "solaris", family: "solaris", release: "11", arch: "i386" }, solaris11: { name: "solaris", family: "solaris", release: "11", arch: "i386" },
solaris10: { name: "solaris", family: "solaris", release: "10", arch: "i386" }, solaris10: { name: "solaris", family: "solaris", release: "10", arch: "i386" },

View file

@ -98,4 +98,27 @@ describe "Inspec::Resources::Platform" do
] ]
_(resource).wont_be :supported?, supports _(resource).wont_be :supported?, supports
end end
let(:resource2) { MockLoader.new(:windows2016).load_resource("platform") }
it "loads a profile which supports platform-name windows_server_2016*" do
supports = [
{ 'platform-name': "windows_server_2016*" },
]
_(resource2).must_be :supported?, supports
end
it "loads a profile which supports platform-name windows_server_2016*" do
supports = [
{ 'platform-name': "*2016*" },
]
_(resource2).must_be :supported?, supports
end
it "reject a profile which supports platform-name not matching regex windows_server_2016*" do
supports = [
{ 'platform-name': "*2019*" },
]
_(resource2).wont_be :supported?, supports
end
end end