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
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
0 commit comments