dm-puppetdb-adapter 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dc43764da2ab76ebf53855bdc93cf7f11d6fb6b9
4
- data.tar.gz: 9fbaf2dbab49f1b7b62e1bd0bb976d846034600f
3
+ metadata.gz: 445d518825690ce87e8ea8bbdf46bdfaa2947cd0
4
+ data.tar.gz: c8d0acc1b381d1de67e43029f9177fc2e0031ba4
5
5
  SHA512:
6
- metadata.gz: 057bec1165d3c9588b6ad4316bb51ecd54ffe9cc83db02dd39b3002e9e87614f933756c6d4802015ab217cca2a6b942013038e6558fdc595f36dba81ac62d824
7
- data.tar.gz: a0247bbcb3e0c2c1c5a721d0b9191ec79e7a3c597a52b55cff830eb3774f23a3c8a60a5cfb308172b81c23535980c2664ee8b9c9fbf3e8de8b16e90b40b1dc2e
6
+ metadata.gz: 959e86b132178136230087361e65008341df7500d6afd6ff82c775aee4caf20a777256c344d3d64e5aef97882fbc9de7229902738bdb7cc3caf4d98f1b16c3dc
7
+ data.tar.gz: 06bfa287b76ed9037112528da330ac049647ec2be1d8d03368672cc701ff34d9c4277d13eb7f4364518a0a5ace19120645db40036db58fe7e846ec0e7b9f8c76
@@ -0,0 +1 @@
1
+ /*.gem
@@ -0,0 +1,53 @@
1
+ # DataMapper PuppetDB Adapter
2
+
3
+ ## Install
4
+
5
+ Requirements:
6
+
7
+ * json
8
+ * puppet 3.x
9
+ * dm-types
10
+
11
+ gem install dm-puppetdb-adapter
12
+
13
+ ## Usage
14
+
15
+ It will use the puppet configuration of the user it runs under, so make sure it has a SSL certificate that can connect to your PuppetDB instace.
16
+
17
+ To setup the adapter:
18
+
19
+ DataMapper.setup(:default, {
20
+ :adapter => 'puppetdb',
21
+ :host => 'puppetdb.example.com',
22
+ :port => 8081,
23
+ :ssl => true,
24
+ })
25
+
26
+ Or if you use it under `dm-rails` add this to `config/database.yml`:
27
+
28
+ defaults: &defaults
29
+ adapter: puppetdb
30
+ host: 'puppetdb.example.com'
31
+ port: 8081
32
+ ssl: true
33
+
34
+ development:
35
+ <<: *defaults
36
+
37
+ test:
38
+ <<: *defaults
39
+
40
+ production:
41
+ <<: *defaults
42
+
43
+ To include all predefined PuppetDB models add this:
44
+
45
+ require "dm-puppetdb-adapter/models"
46
+
47
+ Queries like `Node.all(:name.like => '%.example.com')` etc should then work. See the models and DataMapper documentation for more info on query syntax.
48
+
49
+ ## Notes
50
+
51
+ * It handles subqueries by doing multiple queries to PuppetDB, so it doesn't have optimal performance for them.
52
+ * There's no select method implemented on the adapter for doing manual queries yet.
53
+ * PuppetDB can only search for some fields server side, so the other fields are filtered client side, but all of them work filtering against. Same goes for limits and offsets.
@@ -20,6 +20,7 @@ Gem::Specification.new do |gem|
20
20
  gem.add_dependency 'json'
21
21
  gem.add_dependency 'puppet', '~> 3'
22
22
  gem.add_dependency 'dm-types'
23
+ gem.add_dependency 'dm-core'
23
24
 
24
25
  gem.add_development_dependency 'rake'
25
26
  end
@@ -11,11 +11,8 @@ module DataMapper
11
11
  attr_accessor :http, :host, :port, :ssl
12
12
 
13
13
  def read(query)
14
- puts query.inspect
15
14
  model = query.model
16
15
 
17
- pdbquery = build_query(query)
18
- puts pdbquery.inspect
19
16
  query.filter_records(puppetdb_get(model.storage_name(model.repository_name), build_query(query)))
20
17
  end
21
18
 
@@ -37,61 +34,67 @@ module DataMapper
37
34
  # contruct a puppetdb query from a datamapper query
38
35
  def build_query(query)
39
36
  conditions = query.conditions
40
- if conditions.empty?
37
+ if conditions.nil?
41
38
  nil
42
- elsif conditions.one?
43
- puppetdb_condition(conditions.first)
44
39
  else
45
- q = ['and', *conditions.map do |c|
46
- puppetdb_condition c
47
- end.compact ]
48
- # In case we couldn't build any query from the contained
49
- # conditions return nil instead of a empty and
50
- return q.last if q.count == 2
51
- return nil if q.count < 2
52
- q
40
+ puppetdb_condition(conditions, query.model)
53
41
  end
54
42
  end
55
43
 
56
44
  ##
57
45
  # return puppetdb syntax for a condition
58
- def puppetdb_condition(c)
46
+ def puppetdb_condition(c, model)
59
47
  case c
60
48
  when DataMapper::Query::Conditions::NullOperation
61
49
  nil
62
50
  when DataMapper::Query::Conditions::AbstractOperation
63
- q = [c.class.slug.to_s, *c.operands.map { |o| puppetdb_condition o }.compact]
51
+ q = [c.class.slug.to_s, *c.operands.map { |o| puppetdb_condition o, model }.compact]
64
52
  # In case we couldn't build any query from the contained
65
53
  # conditions return nil instead of a empty and
54
+ return q.last if q.count == 2
66
55
  return nil if q.count < 2
67
- q
56
+ return q
57
+ end
58
+
59
+ # Determine the property we should match on
60
+ if c.subject.kind_of? DataMapper::Property
61
+ property = c.subject
62
+ elsif c.subject.kind_of? DataMapper::Associations::Relationship
63
+ property = c.subject.parent_key.first
64
+ else
65
+ puts "Unhandled subject #{c.subject.inspect}"
66
+ raise RuntimeError, "Unhandled subject #{c.subject.inspect}"
68
67
  end
69
68
 
70
69
  # We can only do comparison on certain fields
71
70
  # on the server side
72
- if c.subject.model.respond_to? :server_fields
73
- return nil unless c.subject.model.server_fields.include? c.subject.name
71
+ if property.model.respond_to? :server_fields
72
+ return nil unless property.model.server_fields.include? property.name
74
73
  end
75
74
 
76
75
  case c
77
76
  when DataMapper::Query::Conditions::EqualToComparison
78
- ['=', c.subject.field, format_value(c.value)]
77
+ ['=', property.field, format_value(c.value)]
79
78
  when DataMapper::Query::Conditions::RegexpComparison
80
- ['~', c.subject.field, format_value(c.value)]
79
+ ['~', property.field, format_value(c.value)]
81
80
  when DataMapper::Query::Conditions::LessThanComparison
82
- ['<', c.subject.field, format_value(c.value)]
81
+ ['<', property.field, format_value(c.value)]
83
82
  when DataMapper::Query::Conditions::GreaterThanComparison
84
- ['>', c.subject.field, format_value(c.value)]
83
+ ['>', property.field, format_value(c.value)]
85
84
  # The following comparison operators aren't supported by PuppetDB
86
85
  # So we emulate them
87
86
  when DataMapper::Query::Conditions::LikeComparison
88
- ['~', c.subject.field, c.value.gsub('%', '.*')]
87
+ ['~', property.field, c.value.gsub('%', '.*')]
89
88
  when DataMapper::Query::Conditions::LessThanOrEqualToComparison
90
- ['or', ['=', c.subject.field, format_value(c.value)], ['<', c.subject.field, format_value(c.value)]]
89
+ ['or', ['=', property.field, format_value(c.value)], ['<', property.field, format_value(c.value)]]
91
90
  when DataMapper::Query::Conditions::GreaterThanOrEqualToComparison
92
- ['or', ['=', c.subject.field, format_value(c.value)], ['>', c.subject.field, format_value(c.value)]]
91
+ ['or', ['=', property.field, format_value(c.value)], ['>', property.field, format_value(c.value)]]
93
92
  when DataMapper::Query::Conditions::InclusionComparison
94
- ['or', ['=', c.subject.field, format_value(c.value.first)], ['>', c.subject.field, format_value(c.value.first)], ['<', c.subject.field, format_value(c.value.last)], ['=', c.subject.field, format_value(c.value.last)]]
93
+ if c.value.kind_of? Range
94
+ ['or', ['=', property.field, format_value(c.value.first)], ['>', property.field, format_value(c.value.first)], ['<', property.field, format_value(c.value.last)], ['=', property.field, format_value(c.value.last)]]
95
+ else
96
+ ['or', *c.value.collect { |v| ['=', property.field, v.value]} ]
97
+ end
95
98
  end
96
99
  end
97
100
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dm-puppetdb-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik Dalén
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-30 00:00:00.000000000 Z
11
+ date: 2013-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: dm-core
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rake
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -74,8 +88,10 @@ extensions: []
74
88
  extra_rdoc_files:
75
89
  - LICENSE
76
90
  files:
91
+ - .gitignore
77
92
  - Gemfile
78
93
  - LICENSE
94
+ - README.md
79
95
  - dm-puppetdb-adapter.gemspec
80
96
  - lib/dm-puppetdb-adapter.rb
81
97
  - lib/dm-puppetdb-adapter/adapter.rb