{"type":"object","definitions":{"gossfileTest":{"properties":{"meta":{"$ref":"#/definitions/meta"},"skip":{"default":"","type":"boolean"},"title":{"$ref":"#/definitions/title"},"file":{"default":"myapp_gossfile.yaml","type":"string"}}},"packageTest":{"required":["installed"],"properties":{"versions":{"oneOf":[{"type":"object"},{"type":"array","default":["2.2.15"],"items":{"type":"string"}}]},"installed":{"default":"1","type":"boolean"},"skip":{"type":"boolean","default":""},"meta":{"$ref":"#/definitions/meta"},"title":{"$ref":"#/definitions/title"}}},"commandTest":{"type":"object","required":["exit-status"],"properties":{"meta":{"$ref":"#/definitions/meta"},"timeout":{"type":"integer","description":"in milliseconds"},"stdout":{"type":"array","description":"can be a string or pattern, see https://github.com/goss-org/goss/blob/master/docs/manual.md#patterns","items":{"type":"string"}},"stderr":{"type":"array","description":"can be a string or pattern, see https://github.com/goss-org/goss/blob/master/docs/manual.md#patterns","items":{"type":"string"}},"skip":{"default":"","type":"boolean"},"exit-status":{"type":"integer","description":"Validates the exit-status and output of a command"},"title":{"$ref":"#/definitions/title"},"exec":{"description":"command to execute, defaults to the hash key","type":"string"}}},"mountTest":{"properties":{"meta":{"$ref":"#/definitions/meta"},"filesystem":{"default":"xfs","type":"string"},"opts":{"default":["rw","relatime"],"items":{"type":"string"},"type":"array"},"exists":{"default":"1","type":"boolean"},"title":{"$ref":"#/definitions/title"},"source":{"type":"string","default":"/dev/mapper/fedora-home"},"usage":{"type":"object","properties":{"lt":{"default":"95","type":"integer"}},"description":"% of blocks used in this mountpoint\n"}},"required":["exists"]},"portTest":{"required":["listening"],"properties":{"listening":{"default":"1","type":"boolean"},"skip":{"type":"boolean","default":""},"meta":{"$ref":"#/definitions/meta"},"title":{"$ref":"#/definitions/title"},"ip":{"description":"what IP(s) is it listening on","type":"array","default":["0.0.0.0"],"items":{"type":"string"}}}},"interfaceTest":{"properties":{"addrs":{"items":{"type":"string"},"default":["172.17.0.2/16","fe80::42:acff:fe11:2/64"],"type":"array"},"meta":{"$ref":"#/definitions/meta"},"mtu":{"type":"integer","default":"1500"},"title":{"$ref":"#/definitions/title"},"exists":{"default":"1","type":"boolean"}},"required":["exists"]},"processTest":{"required":["running","skip"],"properties":{"title":{"$ref":"#/definitions/title"},"skip":{"default":"","type":"boolean"},"meta":{"$ref":"#/definitions/meta"},"running":{"default":"1","type":"boolean"}}},"kernelParamTest":{"description":"To see the full list of current values, run sysctl -a.\n","properties":{"meta":{"$ref":"#/definitions/meta"},"value":{"default":"Linux","type":"string"},"title":{"$ref":"#/definitions/title"}},"required":["value"]},"groupTest":{"required":["exists"],"properties":{"gid":{"type":"integer","default":"65534"},"skip":{"type":"boolean","default":""},"title":{"$ref":"#/definitions/title"},"groups":{"type":"object"},"exists":{"default":"1","type":"boolean"},"uid":{"type":"integer","default":"65534"},"meta":{"$ref":"#/definitions/meta"}}},"serviceTest":{"required":["enabled","running","skip"],"properties":{"running":{"type":"boolean","default":"1"},"enabled":{"type":"boolean","default":"1"},"skip":{"default":"","type":"boolean"},"meta":{"$ref":"#/definitions/meta"},"title":{"$ref":"#/definitions/title"}}},"dnsTest":{"required":["resolvable"],"properties":{"title":{"$ref":"#/definitions/title"},"addrs":{"type":"array","description":"list of addresses e.g. [\"127.0.0.1\", \"::1\"]\n","items":{"type":"string"},"default":["127.0.0.1","::1"]},"timeout":{"type":"integer","description":"in milliseconds (Only used when server attribute is provided)","default":"500"},"meta":{"$ref":"#/definitions/meta"},"server":{"default":"8.8.8.8","description":"Eg 8.8.8.8. Also supports server:port ","type":"string"},"resolvable":{"default":"1","type":"boolean"}}},"fileTest":{"required":["exists"],"properties":{"exists":{"default":"1","type":"boolean"},"filetype":{"enum":["file","symlink","directory"],"default":"file","type":"string"},"sha512":{"default":"cb71b1940dc879a3688bd502846bff6316dd537bbe917484964fe0f098e9245d80958258dc3bd6297bf42d5bd978cbe2c03d077d4ed45b2b1ed9cd831ceb1bd0","type":"string","description":"A stronger checksum alternatives to md5 (recommended)"},"md5":{"default":"7c9bb14b3bf178e82c00c2a4398c93cd","description":"md5 checksum of file","type":"string"},"mode":{"default":"0644","type":"string"},"size":{"description":"in bytes","type":"integer","default":"2118"},"sha256":{"type":"string","description":"A stronger checksum alternatives to md5 (recommended)","default":"7f78ce27859049f725936f7b52c6e25d774012947d915e7b394402cfceb70c4c"},"owner":{"type":"string","default":"root"},"skip":{"default":"","type":"boolean"},"group":{"type":"string","default":"root"},"meta":{"$ref":"#/definitions/meta"},"linked-to":{"default":"/usr/sbin/sendmail.sendmail","type":"string"},"title":{"$ref":"#/definitions/title"},"contains":{"items":{"type":"string","description":"string or patterns"},"type":"array","description":"Check file content for these patterns. can be a string or a pattern"}}},"userTest":{"required":["exists"],"properties":{"shell":{"default":"/sbin/nologin","type":"string"},"gid":{"anyOf":[{"$ref":"#/definitions/matchingTest"},{"type":"integer","default":"65534"}]},"groups":{"anyOf":[{"$ref":"#/definitions/matchingTest"},{"default":["nfsnobody"],"items":{"type":"string"},"type":"array"}]},"title":{"$ref":"#/definitions/title"},"skip":{"type":"boolean","default":""},"home":{"anyOf":[{"$ref":"#/definitions/matchingTest"},{"type":"string","default":"/var/lib/nfs"}]},"exists":{"default":"1","type":"boolean"},"uid":{"anyOf":[{"$ref":"#/definitions/matchingTest"},{"default":"65534","type":"integer"}]},"meta":{"$ref":"#/definitions/meta"}}},"addrTest":{"properties":{"local-address":{"type":"string","default":"127.0.0.1"},"reachable":{"default":"1","type":"boolean"},"timeout":{"default":"500","examples":["500"],"type":"integer"},"meta":{"$ref":"#/definitions/meta"},"title":{"$ref":"#/definitions/title"}},"required":["reachable","timeout"]},"meta":{"description":"meta (arbitrary data) attributes are persisted when adding other resources with goss add","type":"object"},"matchingTest":{"properties":{"meta":{"$ref":"#/definitions/meta"},"title":{"$ref":"#/definitions/title"},"matches":{"anyOf":[{"type":"integer"},{"type":"object"},{"type":"array"}]},"content":{"anyOf":[{"default":"some string","type":"string"},{"type":"array","default":["2"]},{"type":"object","default":{"baz":"ring","foo":"bar"}}]}}},"httpTest":{"properties":{"request-headers":{"description":"Set request header values, e.g. [ \"Content-Type: text/html\" ]\n","type":"array","default":["Content-Type: text/html"],"items":{"type":"string"}},"headers":{"description":"Check http response headers for these patterns (e.g. \"Content-Type: text/html\")\nNOTE: only the first Host header will be used to set the Request.Host value if multiple are provided.\n","type":"array","default":[],"items":{"type":"string"}},"skip":{"default":"","type":"boolean"},"allow-insecure":{"default":"","type":"boolean"},"body":{"description":"Check http response content for these patterns","type":"array"},"cert-file":{"default":"","type":"string","description":"certificate file to use for authentication (used with key-file)\n"},"request-body":{"type":"object","description":"request body","default":"{\"key\": \"value\"}"},"no-follow-redirects":{"default":"","type":"boolean","description":"Setting this to true will NOT follow redirects"},"timeout":{"default":"1000","type":"integer"},"status":{"type":"integer","default":"200"},"proxy":{"default":"","type":"string","description":"proxy server to proxy traffic through. Proxy can also be set with environment variables http_proxy.\n"},"title":{"$ref":"#/definitions/title"},"method":{"default":"PUT","enum":["GET","PUT","HEAD","POST","DELETE","PATCH","CONNECT","OPTIONS","TRACE"],"description":"http method","type":"string"},"key-file":{"type":"string","description":"private-key file to use for authentication (used with cert-file)\n","default":""},"ca-file":{"default":"","description":"CA root certs pem file, ex: /etc/ssl/cert.pem\n","type":"string"},"username":{"type":"string","description":"username for basic auth","default":""},"meta":{"$ref":"#/definitions/meta"},"password":{"default":"","type":"string","description":"password for basic auth"}},"required":["status"]},"title":{"description":"title attribute is persisted when adding other resources with goss add","type":"string","default":"UID must be between 50-100, GID doesn't matter. home is flexible"}},"title":"Goss-file-schema","$id":"https://github.com/goss-org/goss/master/docs/goss-json-schema.yaml","properties":{"mount":{"type":"object","description":"Validates mount point attributes.","additionalProperties":{"$ref":"#/definitions/mountTest"}},"service":{"additionalProperties":{"$ref":"#/definitions/serviceTest"},"type":"object","description":"Validates the state of a service."},"user":{"additionalProperties":{"$ref":"#/definitions/userTest"},"type":"object","description":"Validates the state of a user\"\nNOTE: This check is inspecting the contents of local passwd file /etc/passwd, this does not validate remote users (e.g. LDAP).\n"},"addr":{"description":"Validates if a remote address:port are accessible.","type":"object","examples":[{"tcp://ip-address-or-domain-name:80":{"reachable":"1","timeout":"500","local-address":"127.0.0.1"}}],"additionalProperties":{"$ref":"#/definitions/addrTest"}},"file":{"type":"object","description":"Validates the state of a file, directory, or symbolic link","additionalProperties":{"$ref":"#/definitions/fileTest"}},"group":{"additionalProperties":{"$ref":"#/definitions/groupTest"},"type":"object","description":"Validates the state of a group"},"gossfile":{"description":"Import other gossfiles from this one. This is the best way to maintain a large number of tests, and/or create profiles. See render for more examples. Glob patterns can be also be used to specify matching gossfiles.\nYou can specify the gossfile(s) either as the resource key, or using the 'file' attribute.\n\nIf the 'skip' attribute is true, then the file is not processed. If the filename is a glob pattern, then none of the matching files are processed. Note that this is not the same as skipping the contained resources; any overrides in the referenced gossfile will not be processed, and the resource count will not be incremented. Skipping a gossfile include is the same as omitting the gossfile resource entirely.\n","x-intellij-html-description":"Import other gossfiles from this one. This is the best way to maintain a large number of tests, and/or create profiles. See <a href=\"#render-r---render-gossfile-after-importing-all-referenced-gossfiles\">render</a> for more examples. Glob patterns can be also be used to specify matching gossfiles.</p>\n<div class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\"><pre><span class=\"pl-ent\">gossfile</span>:\n  <span class=\"pl-ent\">myapplication</span>:\n    <span class=\"pl-ent\">file</span>: <span class=\"pl-s\">myapp_gossfile.yaml</span>\n    <span class=\"pl-ent\">skip</span>: <span class=\"pl-c1\">false</span>\n  <span class=\"pl-s\">*.yaml:</span>\n    <span class=\"pl-ent\">skip</span>: <span class=\"pl-c1\">true</span>\n  <span class=\"pl-ent\">goss_httpd.yaml</span>: <span class=\"pl-s\">{}</span>\n  <span class=\"pl-ent\">/etc/goss.d/*.yaml</span>: <span class=\"pl-s\">{}</span></pre><div class=\"zeroclipboard-container position-absolute right-0 top-0\">\n    <clipboard-copy aria-label=\"Copy\" class=\"ClipboardButton btn js-clipboard-copy m-2 p-0 tooltipped-no-delay\" data-copy-feedback=\"Copied!\" data-tooltip-direction=\"w\" value=\"gossfile:\n  myapplication:\n    file: myapp_gossfile.yaml\n    skip: false\n  *.yaml:\n    skip: true\n  goss_httpd.yaml: {}\n  /etc/goss.d/*.yaml: {}\" tabindex=\"0\" role=\"button\" style=\"display: none;\">\n      <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-copy js-clipboard-copy-icon m-2\">\n    <path fill-rule=\"evenodd\" d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z\"></path><path fill-rule=\"evenodd\" d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z\"></path>\n</svg>\n      <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2\">\n    <path fill-rule=\"evenodd\" d=\"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z\"></path>\n</svg>\n    </clipboard-copy>\n  </div></div>\n<p dir=\"auto\">You can specify the gossfile(s) either as the resource key, or using the 'file' attribute.</p>\n<p dir=\"auto\">If the 'skip' attribute is true, then the file is not processed.  If the filename is a glob pattern, then none of the matching files are processed.  Note that this is not the same as skipping the contained resources; any overrides in the referenced gossfile will not be processed, and the resource count will not be incremented.  Skipping a gossfile include is the same as omitting the gossfile resource entirely.</p>\n","type":"object","additionalProperties":{"$ref":"#/definitions/gossfileTest"}},"process":{"additionalProperties":{"$ref":"#/definitions/processTest"},"description":"Validates if a process is running.","type":"object"},"http":{"additionalProperties":{"$ref":"#/definitions/httpTest"},"type":"object","description":"description: Validates network interface values"},"command":{"type":"object","description":"test executing a command","additionalProperties":{"$ref":"#/definitions/commandTest"}},"package":{"type":"object","description":"Validates the state of a package\"\nNOTE: this check uses the --package <format> parameter passed on the command line.\n","additionalProperties":{"$ref":"#/definitions/packageTest"}},"kernel-param":{"description":"test ","type":"object","additionalProperties":{"$ref":"#/definitions/kernelParamTest"}},"interface":{"additionalProperties":{"$ref":"#/definitions/interfaceTest"},"type":"object","description":"test "},"matching":{"type":"object","x-intellij-html-description":"<p dir=\"auto\">Validates specified content against a matcher. Best used with <a href=\"#templates\">Templates</a>.</p>\n<h4 dir=\"auto\"><a id=\"user-content-with-templates\" class=\"anchor\" aria-hidden=\"true\" href=\"#with-templates\"><svg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z\"></path></svg></a>With <a href=\"#templates\">Templates</a>:</h4>\n<p dir=\"auto\">Let's say we have a <code>data.json</code> file that gets generated as part of some testing pipeline:</p>\n<div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\"><pre>{\n  <span class=\"pl-ent\">\"instance_count\"</span>: <span class=\"pl-c1\">14</span>,\n  <span class=\"pl-ent\">\"failures\"</span>: <span class=\"pl-c1\">3</span>,\n  <span class=\"pl-ent\">\"status\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>FAIL<span class=\"pl-pds\">\"</span></span>\n}</pre><div class=\"zeroclipboard-container position-absolute right-0 top-0\">\n    <clipboard-copy aria-label=\"Copy\" class=\"ClipboardButton btn js-clipboard-copy m-2 p-0 tooltipped-no-delay\" data-copy-feedback=\"Copied!\" data-tooltip-direction=\"w\" value=\"{\n  &quot;instance_count&quot;: 14,\n  &quot;failures&quot;: 3,\n  &quot;status&quot;: &quot;FAIL&quot;\n}\" tabindex=\"0\" role=\"button\">\n      <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-copy js-clipboard-copy-icon m-2\">\n    <path fill-rule=\"evenodd\" d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z\"></path><path fill-rule=\"evenodd\" d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z\"></path>\n</svg>\n      <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2\">\n    <path fill-rule=\"evenodd\" d=\"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z\"></path>\n</svg>\n    </clipboard-copy>\n  </div></div>\n<p dir=\"auto\">This could then be passed into goss: <code>goss --vars data.json validate</code></p>\n<p dir=\"auto\">And then validated against:</p>\n<div class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\"><pre><span class=\"pl-ent\">matching</span>:\n  <span class=\"pl-ent\">check_instance_count</span>: <span class=\"pl-c\"><span class=\"pl-c\">#</span> Make sure there is at least one instance</span>\n    <span class=\"pl-ent\">content</span>: <span class=\"pl-s\">{{ .Vars.instance_count }}</span>\n    <span class=\"pl-ent\">matches</span>:\n      <span class=\"pl-ent\">gt</span>: <span class=\"pl-c1\">0</span>\n\n  <span class=\"pl-ent\">check_failure_count_from_all_instance</span>: <span class=\"pl-c\"><span class=\"pl-c\">#</span> expect no failures</span>\n    <span class=\"pl-ent\">content</span>: <span class=\"pl-s\">{{ .Vars.failures }}</span>\n    <span class=\"pl-ent\">matches</span>: <span class=\"pl-c1\">0</span>\n\n  <span class=\"pl-ent\">check_status</span>:\n    <span class=\"pl-ent\">content</span>: <span class=\"pl-s\">{{ .Vars.status }}</span>\n    <span class=\"pl-ent\">matches</span>:\n      - <span class=\"pl-ent\">not</span>: <span class=\"pl-s\">FAIL</span></pre><div class=\"zeroclipboard-container position-absolute right-0 top-0\">\n    <clipboard-copy aria-label=\"Copy\" class=\"ClipboardButton btn js-clipboard-copy m-2 p-0 tooltipped-no-delay\" data-copy-feedback=\"Copied!\" data-tooltip-direction=\"w\" value=\"matching:\n  check_instance_count: # Make sure there is at least one instance\n    content: {{ .Vars.instance_count }}\n    matches:\n      gt: 0\n\n  check_failure_count_from_all_instance: # expect no failures\n    content: {{ .Vars.failures }}\n    matches: 0\n\n  check_status:\n    content: {{ .Vars.status }}\n    matches:\n      - not: FAIL\" tabindex=\"0\" role=\"button\" style=\"display: none;\">\n      <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-copy js-clipboard-copy-icon m-2\">\n    <path fill-rule=\"evenodd\" d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z\"></path><path fill-rule=\"evenodd\" d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z\"></path>\n</svg>\n      <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2\">\n    <path fill-rule=\"evenodd\" d=\"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z\"></path>\n</svg>\n    </clipboard-copy>\n  </div></div>\n<h4 dir=\"auto\"><a id=\"user-content-without-templates\" class=\"anchor\" aria-hidden=\"true\" href=\"#without-templates\"><svg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z\"></path></svg></a>Without <a href=\"#templates\">Templates</a>:</h4>\n<div class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\"><pre><span class=\"pl-ent\">matching</span>:\n  <span class=\"pl-ent\">has_substr</span>: <span class=\"pl-c\"><span class=\"pl-c\">#</span> friendly test name</span>\n    <span class=\"pl-ent\">content</span>: <span class=\"pl-s\">some string</span>\n    <span class=\"pl-ent\">matches</span>:\n      <span class=\"pl-ent\">match-regexp</span>: <span class=\"pl-s\">some str</span>\n  <span class=\"pl-ent\">has_2</span>:\n    <span class=\"pl-ent\">content</span>:\n      - <span class=\"pl-c1\">2</span>\n    <span class=\"pl-ent\">matches</span>:\n      <span class=\"pl-ent\">contain-element</span>: <span class=\"pl-c1\">2</span>\n  <span class=\"pl-ent\">has_foo_bar_and_baz</span>:\n    <span class=\"pl-ent\">content</span>:\n      <span class=\"pl-ent\">foo</span>: <span class=\"pl-s\">bar</span>\n      <span class=\"pl-ent\">baz</span>: <span class=\"pl-s\">bing</span>\n    <span class=\"pl-ent\">matches</span>:\n      <span class=\"pl-ent\">and</span>:\n        - <span class=\"pl-ent\">have-key-with-value</span>:\n            <span class=\"pl-ent\">foo</span>: <span class=\"pl-s\">bar</span>\n        - <span class=\"pl-ent\">have-key</span>: <span class=\"pl-s\">baz</span></pre><div class=\"zeroclipboard-container position-absolute right-0 top-0\">\n    <clipboard-copy aria-label=\"Copy\" class=\"ClipboardButton btn js-clipboard-copy m-2 p-0 tooltipped-no-delay\" data-copy-feedback=\"Copied!\" data-tooltip-direction=\"w\" value=\"matching:\n  has_substr: # friendly test name\n    content: some string\n    matches:\n      match-regexp: some str\n  has_2:\n    content:\n      - 2\n    matches:\n      contain-element: 2\n  has_foo_bar_and_baz:\n    content:\n      foo: bar\n      baz: bing\n    matches:\n      and:\n        - have-key-with-value:\n            foo: bar\n        - have-key: baz\" tabindex=\"0\" role=\"button\" style=\"display: none;\">\n      <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-copy js-clipboard-copy-icon m-2\">\n    <path fill-rule=\"evenodd\" d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z\"></path><path fill-rule=\"evenodd\" d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z\"></path>\n</svg>\n      <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2\">\n    <path fill-rule=\"evenodd\" d=\"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z\"></path>\n</svg>\n    </clipboard-copy>\n  </div></div>\n\nadditionalProperties:\n$ref: \"#/definitions/matchTest\"\n","description":"Validates specified content against a matcher. Best used with Templates."},"dns":{"description":"Validates that the provided address is resolvable and the addrs it resolves to.","x-intellij-html-description":"<p dir=\"auto\">Validates that the provided address is resolvable and the addrs it resolves to.</p>\n<div class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\"><pre><span class=\"pl-ent\">dns</span>:\n  <span class=\"pl-ent\">localhost</span>:\n    <span class=\"pl-c\"><span class=\"pl-c\">#</span> required attributes</span>\n    <span class=\"pl-ent\">resolvable</span>: <span class=\"pl-c1\">true</span>\n    <span class=\"pl-c\"><span class=\"pl-c\">#</span> optional attributes</span>\n    <span class=\"pl-ent\">addrs</span>:\n    - <span class=\"pl-s\">127.0.0.1</span>\n    - <span class=\"pl-s\">::1</span>\n    <span class=\"pl-ent\">server</span>: <span class=\"pl-s\">8.8.8.8 </span><span class=\"pl-c\"><span class=\"pl-c\">#</span> Also supports server:port</span>\n    <span class=\"pl-ent\">timeout</span>: <span class=\"pl-c1\">500</span> <span class=\"pl-c\"><span class=\"pl-c\">#</span> in milliseconds (Only used when server attribute is provided)</span></pre><div class=\"zeroclipboard-container position-absolute right-0 top-0\">\n    <clipboard-copy aria-label=\"Copy\" class=\"ClipboardButton btn js-clipboard-copy m-2 p-0 tooltipped-no-delay\" data-copy-feedback=\"Copied!\" data-tooltip-direction=\"w\" value=\"dns:\n  localhost:\n    # required attributes\n    resolvable: true\n    # optional attributes\n    addrs:\n    - 127.0.0.1\n    - ::1\n    server: 8.8.8.8 # Also supports server:port\n    timeout: 500 # in milliseconds (Only used when server attribute is provided)\" tabindex=\"0\" role=\"button\" style=\"display: none;\">\n      <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-copy js-clipboard-copy-icon m-2\">\n    <path fill-rule=\"evenodd\" d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z\"></path><path fill-rule=\"evenodd\" d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z\"></path>\n</svg>\n      <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2\">\n    <path fill-rule=\"evenodd\" d=\"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z\"></path>\n</svg>\n    </clipboard-copy>\n  </div></div>\n<p dir=\"auto\">It is possible to validate the following types of DNS records, but requires the <code>server</code> attribute be set:</p>\n<ul dir=\"auto\">\n<li>A</li>\n<li>AAAA</li>\n<li>CAA</li>\n<li>CNAME</li>\n<li>MX</li>\n<li>NS</li>\n<li>PTR</li>\n<li>SRV</li>\n<li>TXT</li>\n</ul>\n<p dir=\"auto\">To validate specific DNS address types, prepend the hostname with the type and a colon, a few examples:</p>\n<div class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\"><pre><span class=\"pl-ent\">dns</span>:\n  <span class=\"pl-c\"><span class=\"pl-c\">#</span> Validate a CNAME record</span>\n  <span class=\"pl-ent\">CNAME:c.dnstest.io</span>:\n    <span class=\"pl-ent\">resolvable</span>: <span class=\"pl-c1\">true</span>\n    <span class=\"pl-ent\">server</span>: <span class=\"pl-s\">208.67.222.222</span>\n    <span class=\"pl-ent\">addrs</span>:\n    - <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>a.dnstest.io.<span class=\"pl-pds\">\"</span></span>\n\n  <span class=\"pl-c\"><span class=\"pl-c\">#</span> Validate a PTR record</span>\n  <span class=\"pl-ent\">PTR:8.8.8.8</span>:\n    <span class=\"pl-ent\">resolvable</span>: <span class=\"pl-c1\">true</span>\n    <span class=\"pl-ent\">server</span>: <span class=\"pl-s\">8.8.8.8</span>\n    <span class=\"pl-ent\">addrs</span>:\n    - <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>dns.google.<span class=\"pl-pds\">\"</span></span>\n\n  <span class=\"pl-c\"><span class=\"pl-c\">#</span> Validate and SRV record</span>\n  <span class=\"pl-ent\">SRV:_https._tcp.dnstest.io</span>:\n    <span class=\"pl-ent\">resolvable</span>: <span class=\"pl-c1\">true</span>\n    <span class=\"pl-ent\">server</span>: <span class=\"pl-s\">208.67.222.222</span>\n    <span class=\"pl-ent\">addrs</span>:\n    - <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>0 5 443 a.dnstest.io.<span class=\"pl-pds\">\"</span></span>\n    - <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>10 10 443 b.dnstest.io.<span class=\"pl-pds\">\"</span></span></pre><div class=\"zeroclipboard-container position-absolute right-0 top-0\">\n    <clipboard-copy aria-label=\"Copy\" class=\"ClipboardButton btn js-clipboard-copy m-2 p-0 tooltipped-no-delay\" data-copy-feedback=\"Copied!\" data-tooltip-direction=\"w\" value=\"dns:\n  # Validate a CNAME record\n  CNAME:c.dnstest.io:\n    resolvable: true\n    server: 208.67.222.222\n    addrs:\n    - &quot;a.dnstest.io.&quot;\n\n  # Validate a PTR record\n  PTR:8.8.8.8:\n    resolvable: true\n    server: 8.8.8.8\n    addrs:\n    - &quot;dns.google.&quot;\n\n  # Validate and SRV record\n  SRV:_https._tcp.dnstest.io:\n    resolvable: true\n    server: 208.67.222.222\n    addrs:\n    - &quot;0 5 443 a.dnstest.io.&quot;\n    - &quot;10 10 443 b.dnstest.io.&quot;\" tabindex=\"0\" role=\"button\">\n      <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-copy js-clipboard-copy-icon m-2\">\n    <path fill-rule=\"evenodd\" d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z\"></path><path fill-rule=\"evenodd\" d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z\"></path>\n</svg>\n      <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2\">\n    <path fill-rule=\"evenodd\" d=\"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z\"></path>\n</svg>\n    </clipboard-copy>\n  </div></div>\n<p dir=\"auto\">Please note that if you want <code>localhost</code> to <strong>only</strong> resolve <code>127.0.0.1</code> you'll need to use <a href=\"#advanced-matchers\">Advanced Matchers</a></p>\n<div class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\"><pre><span class=\"pl-ent\">dns</span>:\n  <span class=\"pl-ent\">localhost</span>:\n    <span class=\"pl-ent\">resolvable</span>: <span class=\"pl-c1\">true</span>\n    <span class=\"pl-ent\">addrs</span>:\n      <span class=\"pl-ent\">consist-of</span>: <span class=\"pl-s\">[127.0.0.1]</span>\n    <span class=\"pl-ent\">timeout</span>: <span class=\"pl-c1\">500</span> <span class=\"pl-c\"><span class=\"pl-c\">#</span> in milliseconds</span>\n","type":"object","additionalProperties":{"$ref":"#/definitions/dnsTest"}},"port":{"x-intellij-html-description":"<p dir=\"auto\">Validates the state of a local port.</p>\n<p dir=\"auto\"><strong>Note:</strong> Goss might consider your port to be listening on <code>tcp6</code> rather than <code>tcp</code>, try running <code>goss add port ..</code> to see how goss detects it. (<a href=\"https://github.com/goss-org/goss/issues/149\" data-hovercard-type=\"issue\" data-hovercard-url=\"/goss-org/goss/issues/149/hovercard\">explanation</a>)</p>\n<div class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\"><pre><span class=\"pl-ent\">port</span>:\n  <span class=\"pl-c\"><span class=\"pl-c\">#</span> {tcp,tcp6,udp,udp6}:port_num</span>\n  <span class=\"pl-ent\">tcp:22</span>:\n    <span class=\"pl-c\"><span class=\"pl-c\">#</span> required attributes</span>\n    <span class=\"pl-ent\">listening</span>: <span class=\"pl-c1\">true</span>\n    <span class=\"pl-c\"><span class=\"pl-c\">#</span> optional attributes</span>\n    <span class=\"pl-ent\">ip</span>: <span class=\"pl-c\"><span class=\"pl-c\">#</span> what IP(s) is it listening on</span>\n    - <span class=\"pl-s\">0.0.0.0</span>\n    <span class=\"pl-ent\">skip</span>: <span class=\"pl-c1\">false</span>\n","description":"Validates the state of a local port.\n\nNote: Goss might consider your port to be listening on tcp6 rather than tcp, try running goss add port .. to see how goss detects it. (explanation)\n","type":"object","additionalProperties":{"$ref":"#/definitions/portTest"}}},"description":"A file describing a series of tests","$schema":"http://json-schema.org/draft-07/schema#"}