@@ -160,47 +160,48 @@ def get_all(cls, filters, context=None):
160160
161161 def create (self , context = None ):
162162 updates = self .obj_get_changes ()
163+ resource_type = updates ['resource_type' ]
164+ resource_uuid = updates ['resource_uuid' ]
165+ start_time = updates ['start_time' ]
166+ end_time = updates ['end_time' ]
167+ with utils .lock (utils .get_resource_lock_name (resource_type ,
168+ resource_uuid ),
169+ external = True ):
170+ self .verify_time_range (
171+ start_time , end_time ,
172+ updates .get ('offer_uuid' , None ),
173+ updates .get ('parent_lease_uuid' , None ),
174+ resource_type , resource_uuid )
163175
164- with utils .lock (utils .get_resource_lock_name (updates ['resource_type' ],
165- updates ['resource_uuid' ]),
176+ db_lease = self .dbapi .lease_create (updates )
177+ self ._from_db_object (context , self , db_lease )
178+
179+ def update (self , updates , context = None ):
180+ # only allow updates to end_time right now
181+ if 'end_time' not in updates :
182+ return
183+ new_end_time = updates ['end_time' ]
184+ with utils .lock (utils .get_resource_lock_name (self .resource_type ,
185+ self .resource_uuid ),
166186 external = True ):
167- if updates [ ' start_time' ] >= updates [ 'end_time' ] :
187+ if self . start_time >= new_end_time :
168188 raise exception .InvalidTimeRange (
169189 resource = 'lease' ,
170- start_time = str (updates [ ' start_time' ] ),
171- end_time = str (updates [ 'end_time' ] )
190+ start_time = str (self . start_time ),
191+ end_time = str (new_end_time )
172192 )
173193
174- # check availability
175- if 'offer_uuid' in updates :
176- # lease is being created from an offer
177- related_offer = offer_obj .Offer .get (updates ['offer_uuid' ])
178-
179- if related_offer .status != statuses .AVAILABLE :
180- raise exception .OfferNotAvailable (
181- offer_uuid = related_offer .uuid ,
182- status = related_offer .status )
183-
184- related_offer .verify_availability (updates ['start_time' ],
185- updates ['end_time' ])
186- elif 'parent_lease_uuid' in updates :
187- # lease is a child of an existing lease
188- parent_lease = Lease .get (updates ['parent_lease_uuid' ])
189-
190- if parent_lease .status != statuses .ACTIVE :
191- raise exception .LeaseNotActive (
192- updates ['parent_lease_uuid' ])
193-
194- parent_lease .verify_child_availability (updates ['start_time' ],
195- updates ['end_time' ])
196- else :
197- ro = get_resource_object (updates ['resource_type' ],
198- updates ['resource_uuid' ])
199- ro .verify_availability (updates ['start_time' ],
200- updates ['end_time' ])
194+ # only need to check availabilities if new end time is greater
195+ # than previous end time
196+ if new_end_time > self .end_time :
197+ self .verify_time_range (
198+ self .end_time , new_end_time ,
199+ self .offer_uuid , self .parent_lease_uuid ,
200+ self .resource_type , self .resource_uuid )
201201
202- db_lease = self .dbapi .lease_create (updates )
203- self ._from_db_object (context , self , db_lease )
202+ # lease is available in new range; set and save
203+ self .end_time = new_end_time
204+ self .save (context )
204205
205206 def cancel (self , context = None ):
206207 leases = Lease .get_all (
@@ -335,3 +336,38 @@ def deactivate(self, context, resource):
335336 notify .emit_end_notification (context , self ,
336337 'delete' , CRUD_NOTIFY_OBJ ,
337338 node = resource )
339+
340+ @staticmethod
341+ def verify_time_range (start_time , end_time ,
342+ offer_uuid , parent_lease_uuid ,
343+ resource_type , resource_uuid ):
344+ if start_time >= end_time :
345+ raise exception .InvalidTimeRange (
346+ resource = 'lease' ,
347+ start_time = str (start_time ),
348+ end_time = str (end_time )
349+ )
350+
351+ # check availability
352+ if offer_uuid :
353+ # lease is related to an offer
354+ related_offer = offer_obj .Offer .get (offer_uuid )
355+ if related_offer .status != statuses .AVAILABLE :
356+ raise exception .OfferNotAvailable (
357+ offer_uuid = related_offer .uuid ,
358+ status = related_offer .status )
359+ related_offer .verify_availability (start_time ,
360+ end_time )
361+ elif parent_lease_uuid :
362+ # lease is a child of an existing lease
363+ parent_lease = Lease .get (parent_lease_uuid )
364+ if parent_lease .status != statuses .ACTIVE :
365+ raise exception .LeaseNotActive (
366+ parent_lease_uuid )
367+ parent_lease .verify_child_availability (start_time ,
368+ end_time )
369+ else :
370+ ro = get_resource_object (resource_type ,
371+ resource_uuid )
372+ ro .verify_availability (start_time , end_time )
373+ return
0 commit comments