Skip to content

Commit a2aeacc

Browse files
author
Rob Emanuele
committed
Add domains to the puppet API
1 parent 1c52729 commit a2aeacc

File tree

4 files changed

+146
-0
lines changed

4 files changed

+146
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
Puppet::Type.type(:foreman_domain).provide(:rest_v3, :parent => Puppet::Type.type(:foreman_resource).provider(:rest_v3)) do
2+
confine :feature => [:json, :oauth]
3+
4+
def exists?
5+
!id.nil?
6+
end
7+
8+
def create
9+
path = "api/v2/domains"
10+
payload = {
11+
:domain => {
12+
:name => resource[:domain_name],
13+
}
14+
}
15+
req = request(:post, path, {}, payload.to_json)
16+
17+
unless success?(req)
18+
error_string = "Error making POST request to Foreman at #{request_uri(path)}: #{error_message(req)}"
19+
raise Puppet::Error.new(error_string)
20+
end
21+
end
22+
23+
def destroy
24+
req = request(:delete, destroy_path, {})
25+
26+
unless success?(req)
27+
error_string = "Error making DELETE request to Foreman at #{request_uri(path)}: #{error_message(req)}"
28+
raise Puppet::Error.new(error_string)
29+
end
30+
end
31+
32+
def id
33+
domain['id'] if domain
34+
end
35+
36+
def domain
37+
@domain ||= begin
38+
path = 'api/v2/domains'
39+
req = request(:get, path, :search => %{name="#{resource[:domain_name]}"})
40+
41+
unless success?(req)
42+
error_string = "Error making GET request to Foreman at #{request_uri(path)}: #{error_message(req)}"
43+
raise Puppet::Error.new(error_string)
44+
end
45+
46+
JSON.load(req.body)['results'].first
47+
end
48+
end
49+
50+
private
51+
52+
def destroy_path
53+
"api/v2/domains/#{id}"
54+
end
55+
end

lib/puppet/type/foreman_domain.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
require_relative '../../puppet_x/foreman/common'
2+
3+
Puppet::Type.newtype(:foreman_domain) do
4+
desc 'foreman_domain creates a domain in foreman.'
5+
6+
instance_eval(&PuppetX::Foreman::Common::REST_API_COMMON_PARAMS)
7+
instance_eval(&PuppetX::Foreman::Common::FOREMAN_DOMAIN_PARAMS)
8+
9+
end

lib/puppet_x/foreman/common.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,16 @@ module Common
5656
desc 'The name of the host.'
5757
end
5858
end
59+
60+
FOREMAN_DOMAIN_PARAMS = Proc.new do
61+
newparam(:name, :namevar => true) do
62+
desc 'The name of the resource.'
63+
end
64+
65+
newparam(:domain_name) do
66+
desc 'The name of the domain.'
67+
end
68+
end
5969
end
6070
end
6171
end
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
require 'spec_helper'
2+
3+
describe Puppet::Type.type(:foreman_domain).provider(:rest_v3) do
4+
let(:resource) do
5+
Puppet::Type.type(:foreman_domain).new(
6+
:name => 'foreman-proxy.example.com',
7+
:domain_name => 'proxy.example.com',
8+
:facts => { 'foo' => 'bar' },
9+
:base_url => 'https://foreman.example.com',
10+
:consumer_key => 'oauth_key',
11+
:consumer_secret => 'oauth_secret',
12+
:effective_user => 'admin'
13+
)
14+
end
15+
16+
let(:provider) do
17+
provider = described_class.new
18+
provider.resource = resource
19+
provider
20+
end
21+
22+
describe '#create' do
23+
it 'sends POST request' do
24+
expect(provider).to receive(:request).with(:post, 'api/v2/domains/facts', {}, kind_of(String)).and_return(
25+
double(:code => '201', :body => {'id' => 1, 'name' => 'proxy.example.com'})
26+
)
27+
provider.create
28+
end
29+
end
30+
31+
describe '#destroy' do
32+
it 'sends DELETE request' do
33+
expect(provider).to receive(:id).and_return(1)
34+
expect(provider).to receive(:request).with(:delete, 'api/v2/domains/1', {}).and_return(double(:code => '204'))
35+
provider.destroy
36+
end
37+
end
38+
39+
describe '#exists?' do
40+
it 'returns true when domain is marked as a foreman domain' do
41+
expect(provider).to receive(:domain).twice.and_return({"id" => 1})
42+
expect(provider.exists?).to be true
43+
end
44+
45+
it 'returns nil when domain does not exist' do
46+
expect(provider).to receive(:domain).and_return(nil)
47+
expect(provider.exists?).to be false
48+
end
49+
end
50+
51+
describe '#id' do
52+
it 'returns ID from domain hash' do
53+
expect(provider).to receive(:domain).twice.and_return({'id' => 1})
54+
expect(provider.id).to eq(1)
55+
end
56+
57+
it 'returns nil when domain is absent' do
58+
expect(provider).to receive(:domain).and_return(nil)
59+
expect(provider.id).to be_nil
60+
end
61+
end
62+
63+
describe '#domain' do
64+
it 'returns domain hash from API results' do
65+
expect(provider).to receive(:request).with(:get, 'api/v2/domains', :search => 'name="proxy.example.com"').and_return(
66+
double('response', :body => {:results => [{:id => 1, :name => 'proxy.example.com'}]}.to_json, :code => '200')
67+
)
68+
expect(provider.domain['id']).to eq(1)
69+
expect(provider.domain['name']).to eq('proxy.example.com')
70+
end
71+
end
72+
end

0 commit comments

Comments
 (0)