Skip to content

Commit 62e9496

Browse files
Merge pull request #207 from spirit03/onedatastore_validation
added post-run validation to provider
2 parents 340f37a + 6cc995c commit 62e9496

3 files changed

Lines changed: 93 additions & 19 deletions

File tree

lib/puppet/provider/onedatastore/cli.rb

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
# Based upon initial work from Ken Barber
77
# Modified by Martin Alfke
88
# Modified by Robert Waffen <robert.waffen@epost-dev.de>
9+
# Modified by Arne Hilmann
10+
# Modified by Gerald Schmidt
911
#
1012
# Copyright
1113
# initial provider had no copyright
@@ -25,11 +27,15 @@
2527
mk_resource_methods
2628

2729
def self.get_attributes
28-
[:name, :tm_mad, :type, :safe_dirs, :ds_mad, :disk_type, :driver, :bridge_list,
30+
get_checked_attributes + [:safe_dirs, :driver, :bridge_list,
2931
:ceph_host, :ceph_user, :ceph_secret, :pool_name, :staging_dir, :base_path,
3032
:ensure, :cluster, :cluster_id]
3133
end
3234

35+
def self.get_checked_attributes
36+
[:name, :ds_mad, :tm_mad, :disk_type, :type]
37+
end
38+
3339
def create
3440
file = Tempfile.new("onedatastore-#{resource[:name]}")
3541
builder = Nokogiri::XML::Builder.new do |xml|
@@ -43,11 +49,43 @@ def create
4349
file.write(tempfile)
4450
file.close
4551
self.debug "Adding new datastore using: #{tempfile}"
46-
onedatastore('create', file.path)
52+
begin
53+
onedatastore('create', file.path)
54+
post_validate_change
55+
rescue Exception => e
56+
destroy
57+
raise e
58+
end
4759
file.delete
60+
4861
@property_hash[:ensure] = :present
4962
end
5063

64+
def post_validate_change
65+
unless resource[:self_test]
66+
self.debug ":self_test not defined"
67+
return
68+
end
69+
70+
self.debug ":self_test defined"
71+
72+
[1..3].each do
73+
if is_status_success?
74+
break
75+
end
76+
sleep 30
77+
end
78+
79+
unless is_status_success?
80+
Puppet.debug("#{__method__}: attempts_max exceeded")
81+
raise "Failed to apply resource: status not 'ready'"
82+
end
83+
84+
unless is_obj_valid?
85+
raise "Failed to apply resources; object doesn't match parameters"
86+
end
87+
end
88+
5189
def destroy
5290
self.debug "Deleting datastore #{resource[:name]}"
5391
onedatastore('delete', resource[:name])
@@ -87,6 +125,34 @@ def self.get_datastore(xml)
87125
datastore_hash
88126
end
89127

128+
def is_status_success?
129+
# see https://github.com/OpenNebula/one/blob/master/include/Datastore.h
130+
# ll. 68ff.
131+
#
132+
# enum DatastoreState
133+
# {
134+
# READY = 0, /** < Datastore ready to use */
135+
# DISABLED = 1 /** < System Datastore can not be used */
136+
# };
137+
status_ready = 0
138+
datastore = Nokogiri::XML(onedatastore('show', resource[:name], '-x')).root.xpath('DATASTORE')
139+
(datastore.xpath('STATE').text.to_i == status_ready)
140+
end
141+
142+
def is_obj_valid?
143+
datastore = self.class.get_datastore(Nokogiri::XML(onedatastore('show', resource[:name], '-x')).xpath('DATASTORE'))
144+
145+
self.class.get_checked_attributes.each do |item|
146+
val = datastore[item]
147+
res_val = resource[item].to_s
148+
if val != res_val
149+
Puppet.debug("Value mismatch: '#{val}' != '#{res_val}' for item '#{item}'")
150+
return false
151+
end
152+
end
153+
true
154+
end
155+
90156
def self.instances
91157
datastores = Nokogiri::XML(onedatastore('list', '-x')).xpath('/DATASTORE_POOL/DATASTORE')
92158
datastores.collect do |datastore|
@@ -114,7 +180,7 @@ def flush
114180

115181
file.write(tempfile)
116182
file.close
117-
self.debug "Updating datastore using:\n#{tempfile}"
183+
Puppet.debug("Updating datastore using:\n#{tempfile}")
118184
onedatastore('update', resource[:name], file.path, '--append') unless @property_hash.empty?
119185
file.delete
120186
end

lib/puppet/type/onedatastore.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@
2222
end
2323
end
2424

25+
newparam(
26+
:self_test,
27+
:boolean => true
28+
) do
29+
desc 'Param to activate self-test: defaults to false'
30+
end
31+
2532
newproperty(:type) do
2633
desc 'Choose type of datastore. Valid values: images, system, files'
2734
defaultto :IMAGE_DS
@@ -87,4 +94,5 @@
8794
desc 'Array of safe directories'
8895
end
8996

97+
9098
end

spec/acceptance/onedatastore_spec.rb

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class { 'one':
1616
after(:each) do
1717
pp = <<-EOS
1818
onedatastore { 'nfs_ds':
19-
ensure => absent,
19+
ensure => absent,
2020
}
2121
EOS
2222

@@ -28,8 +28,8 @@ class { 'one':
2828
it 'should idempotently run' do
2929
pp = <<-EOS
3030
onedatastore { 'nfs_ds':
31-
tm_mad => 'shared',
32-
type => 'system_ds',
31+
tm_mad => 'shared',
32+
type => 'system_ds',
3333
}
3434
EOS
3535

@@ -93,8 +93,8 @@ class { 'one':
9393
it 'should idempotently run' do
9494
pp = <<-EOS
9595
onedatastore { 'production':
96-
ds_mad => 'fs',
97-
tm_mad => 'shared',
96+
ds_mad => 'fs',
97+
tm_mad => 'shared',
9898
}
9999
EOS
100100

@@ -107,8 +107,8 @@ class { 'one':
107107
it 'should idempotently run' do
108108
pp = <<-EOS
109109
onedatastore { 'vmfs_ds':
110-
ds_mad => 'vmfs',
111-
tm_mad => 'vmfs',
110+
ds_mad => 'vmfs',
111+
tm_mad => 'vmfs',
112112
}
113113
EOS
114114

@@ -121,8 +121,8 @@ class { 'one':
121121
it 'should idempotently run' do
122122
pp = <<-EOS
123123
onedatastore { 'lvm_ds':
124-
ds_mad => 'fs_lvm',
125-
tm_mad => 'fs_lvm',
124+
ds_mad => 'fs_lvm',
125+
tm_mad => 'fs_lvm',
126126
}
127127
EOS
128128

@@ -143,7 +143,7 @@ class { 'one':
143143
ceph_secret => 'cephsecret',
144144
pool_name => 'cephpoolname',
145145
disk_type => 'rbd',
146-
bridge_list => 'host1 host2 host3'
146+
bridge_list => 'host1 host2 host3',
147147
}
148148
EOS
149149

@@ -156,7 +156,7 @@ class { 'one':
156156
it 'should idempotently run' do
157157
pp =<<-EOS
158158
onedatastore { 'nfs_ds':
159-
ensure => absent,
159+
ensure => absent,
160160
}
161161
EOS
162162

@@ -169,7 +169,7 @@ class { 'one':
169169
it 'should idempotently run' do
170170
pp =<<-EOS
171171
onedatastore { 'kernels':
172-
ensure => absent,
172+
ensure => absent,
173173
}
174174
EOS
175175

@@ -182,7 +182,7 @@ class { 'one':
182182
it 'should idempotently run' do
183183
pp =<<-EOS
184184
onedatastore { 'production':
185-
ensure => absent,
185+
ensure => absent,
186186
}
187187
EOS
188188

@@ -195,7 +195,7 @@ class { 'one':
195195
it 'should idempotently run' do
196196
pp =<<-EOS
197197
onedatastore { 'vmfs_ds':
198-
ensure => absent,
198+
ensure => absent,
199199
}
200200
EOS
201201

@@ -208,7 +208,7 @@ class { 'one':
208208
it 'should idempotently run' do
209209
pp =<<-EOS
210210
onedatastore { 'lvm_ds':
211-
ensure => absent,
211+
ensure => absent,
212212
}
213213
EOS
214214

@@ -221,7 +221,7 @@ class { 'one':
221221
it 'should idempotently run' do
222222
pp =<<-EOS
223223
onedatastore { 'ceph_ds':
224-
ensure => absent,
224+
ensure => absent,
225225
}
226226
EOS
227227

0 commit comments

Comments
 (0)