diff --git a/lib/puppet/provider/foreman_domain/rest_v3.rb b/lib/puppet/provider/foreman_domain/rest_v3.rb new file mode 100644 index 000000000..49bd7335a --- /dev/null +++ b/lib/puppet/provider/foreman_domain/rest_v3.rb @@ -0,0 +1,55 @@ +Puppet::Type.type(:foreman_domain).provide(:rest_v3, :parent => Puppet::Type.type(:foreman_resource).provider(:rest_v3)) do + confine :feature => [:json, :oauth] + + def exists? + !id.nil? + end + + def create + path = "api/v2/domains" + payload = { + :domain => { + :name => resource[:domain_name], + } + } + req = request(:post, path, {}, payload.to_json) + + unless success?(req) + error_string = "Error making POST request to Foreman at #{request_uri(path)}: #{error_message(req)}" + raise Puppet::Error.new(error_string) + end + end + + def destroy + req = request(:delete, destroy_path, {}) + + unless success?(req) + error_string = "Error making DELETE request to Foreman at #{request_uri(path)}: #{error_message(req)}" + raise Puppet::Error.new(error_string) + end + end + + def id + domain['id'] if domain + end + + def domain + @domain ||= begin + path = 'api/v2/domains' + req = request(:get, path, :search => %{name="#{resource[:domain_name]}"}) + + unless success?(req) + error_string = "Error making GET request to Foreman at #{request_uri(path)}: #{error_message(req)}" + raise Puppet::Error.new(error_string) + end + + JSON.load(req.body)['results'].first + end + end + + private + + def destroy_path + "api/v2/domains/#{id}" + end +end diff --git a/lib/puppet/type/foreman_domain.rb b/lib/puppet/type/foreman_domain.rb new file mode 100644 index 000000000..0add8709a --- /dev/null +++ b/lib/puppet/type/foreman_domain.rb @@ -0,0 +1,9 @@ +require_relative '../../puppet_x/foreman/common' + +Puppet::Type.newtype(:foreman_domain) do + desc 'foreman_domain creates a domain in foreman.' + + instance_eval(&PuppetX::Foreman::Common::REST_API_COMMON_PARAMS) + instance_eval(&PuppetX::Foreman::Common::FOREMAN_DOMAIN_PARAMS) + +end diff --git a/lib/puppet_x/foreman/common.rb b/lib/puppet_x/foreman/common.rb index 63a7f4ebd..33ae69ca3 100644 --- a/lib/puppet_x/foreman/common.rb +++ b/lib/puppet_x/foreman/common.rb @@ -56,6 +56,16 @@ module Common desc 'The name of the host.' end end + + FOREMAN_DOMAIN_PARAMS = Proc.new do + newparam(:name, :namevar => true) do + desc 'The name of the resource.' + end + + newparam(:domain_name) do + desc 'The name of the domain.' + end + end end end end diff --git a/spec/unit/foreman_domain_rest_v3_spec.rb b/spec/unit/foreman_domain_rest_v3_spec.rb new file mode 100644 index 000000000..f509b0b9b --- /dev/null +++ b/spec/unit/foreman_domain_rest_v3_spec.rb @@ -0,0 +1,72 @@ +require 'spec_helper' + +describe Puppet::Type.type(:foreman_domain).provider(:rest_v3) do + let(:resource) do + Puppet::Type.type(:foreman_domain).new( + :name => 'foreman-proxy.example.com', + :domain_name => 'proxy.example.com', + :facts => { 'foo' => 'bar' }, + :base_url => 'https://foreman.example.com', + :consumer_key => 'oauth_key', + :consumer_secret => 'oauth_secret', + :effective_user => 'admin' + ) + end + + let(:provider) do + provider = described_class.new + provider.resource = resource + provider + end + + describe '#create' do + it 'sends POST request' do + expect(provider).to receive(:request).with(:post, 'api/v2/domains/facts', {}, kind_of(String)).and_return( + double(:code => '201', :body => {'id' => 1, 'name' => 'proxy.example.com'}) + ) + provider.create + end + end + + describe '#destroy' do + it 'sends DELETE request' do + expect(provider).to receive(:id).and_return(1) + expect(provider).to receive(:request).with(:delete, 'api/v2/domains/1', {}).and_return(double(:code => '204')) + provider.destroy + end + end + + describe '#exists?' do + it 'returns true when domain is marked as a foreman domain' do + expect(provider).to receive(:domain).twice.and_return({"id" => 1}) + expect(provider.exists?).to be true + end + + it 'returns nil when domain does not exist' do + expect(provider).to receive(:domain).and_return(nil) + expect(provider.exists?).to be false + end + end + + describe '#id' do + it 'returns ID from domain hash' do + expect(provider).to receive(:domain).twice.and_return({'id' => 1}) + expect(provider.id).to eq(1) + end + + it 'returns nil when domain is absent' do + expect(provider).to receive(:domain).and_return(nil) + expect(provider.id).to be_nil + end + end + + describe '#domain' do + it 'returns domain hash from API results' do + expect(provider).to receive(:request).with(:get, 'api/v2/domains', :search => 'name="proxy.example.com"').and_return( + double('response', :body => {:results => [{:id => 1, :name => 'proxy.example.com'}]}.to_json, :code => '200') + ) + expect(provider.domain['id']).to eq(1) + expect(provider.domain['name']).to eq('proxy.example.com') + end + end +end