summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/chef/compliance/fetcher/automate.rb19
-rw-r--r--spec/unit/compliance/fetcher/automate_spec.rb8
2 files changed, 23 insertions, 4 deletions
diff --git a/lib/chef/compliance/fetcher/automate.rb b/lib/chef/compliance/fetcher/automate.rb
index b254684280..64aff6833a 100644
--- a/lib/chef/compliance/fetcher/automate.rb
+++ b/lib/chef/compliance/fetcher/automate.rb
@@ -32,12 +32,12 @@ class Chef
profile_fetch_url = target[:url]
else
# verifies that the target e.g base/ssh exists
- base_path = "/compliance/profiles/#{uri.host}#{uri.path}"
-
+ profile = sanitize_profile_name(uri)
+ owner, id = profile.split("/")
profile_path = if target.respond_to?(:key?) && target.key?(:version)
- "#{base_path}/version/#{target[:version]}/tar"
+ "/compliance/profiles/#{owner}/#{id}/version/#{target[:version]}/tar"
else
- "#{base_path}/tar"
+ "/compliance/profiles/#{owner}/#{id}/tar"
end
url = URI(Chef::Config[:data_collector][:server_url])
@@ -60,6 +60,17 @@ class Chef
nil
end
+ # returns a parsed url for `admin/profile` or `compliance://admin/profile`
+ # TODO: remove in future, copied from inspec to support older versions of inspec
+ def self.sanitize_profile_name(profile)
+ uri = if URI(profile).scheme == "compliance"
+ URI(profile)
+ else
+ URI("compliance://#{profile}")
+ end
+ uri.to_s.sub(%r{^compliance:\/\/}, "")
+ end
+
def to_s
"#{ChefUtils::Dist::Automate::PRODUCT} for #{ChefUtils::Dist::Solo::PRODUCT} Fetcher"
end
diff --git a/spec/unit/compliance/fetcher/automate_spec.rb b/spec/unit/compliance/fetcher/automate_spec.rb
index bc2125aaa7..f3554b8b0f 100644
--- a/spec/unit/compliance/fetcher/automate_spec.rb
+++ b/spec/unit/compliance/fetcher/automate_spec.rb
@@ -21,6 +21,14 @@ describe Chef::Compliance::Fetcher::Automate do
expect(res.target).to eq(expected)
end
+ it "should resolve a compliance URL with a @ in the namespace" do
+ res = Chef::Compliance::Fetcher::Automate.resolve("compliance://name@space/profile_name")
+
+ expect(res).to be_kind_of(Chef::Compliance::Fetcher::Automate)
+ expected = "https://automate.test/compliance/profiles/name@space/profile_name/tar"
+ expect(res.target).to eq(expected)
+ end
+
it "raises an exception with no data collector token" do
Chef::Config[:data_collector].delete(:token)