@@ -218,16 +218,19 @@ class ElementIncorrectStatusesView(
218218 read_only = True ,
219219 )
220220
221- def actualize_api_status (self ):
221+ def actualize_status (self ):
222222 engine = engines .engine_factory .get_engine ()
223223 with engine .session_manager () as s :
224224 s .execute (
225- """
226- UPDATE em_elements
225+ f """
226+ UPDATE { Element . __tablename__ }
227227 SET status = %s
228228 WHERE uuid = %s;
229229 """ ,
230- [self .actual_status , self .uuid ],
230+ (
231+ self .actual_status ,
232+ self .uuid ,
233+ ),
231234 )
232235
233236
@@ -416,17 +419,34 @@ def kind(self):
416419
417420 def calculate_full_hash (self ):
418421 if self .actual_resource is not None :
419- self .full_hash = self .actual_resource .full_hash
420- else :
421- target_state = self .render_target_state ()
422- self .full_hash = sdk_utils .calculate_hash (target_state )
423- self .update ()
424- return self .full_hash
422+ return self .actual_resource .full_hash
423+ target_state = self .render_target_state ()
424+ return sdk_utils .calculate_hash (target_state )
425+
426+ def _find_actual_resource (self ):
427+ if self .actual_resource is None :
428+ for actual_resource in sdk_models .Resource .objects .get_all (
429+ filters = {
430+ "uuid" : ra_filters .EQ (self .uuid ),
431+ "kind" : ra_filters .EQ (self .kind ),
432+ },
433+ ):
434+ return actual_resource
435+ return None
425436
426437 def actualize (self ):
427- target_state = self .render_target_state ()
438+ try :
439+ target_state = self .render_target_state ()
440+ except KeyError as e :
441+ LOG .debug (
442+ "Target state is not available for resource %s by reason: %r" ,
443+ self ,
444+ str (e ),
445+ )
446+ return
447+ self .actual_resource = self ._find_actual_resource ()
428448 hash = sdk_utils .calculate_hash (target_state )
429- self .calculate_full_hash ()
449+ self .full_hash = self . calculate_full_hash ()
430450 if self .target_resource is None :
431451 target_resource = sdk_models .TargetResource (
432452 uuid = self .uuid ,
@@ -439,22 +459,37 @@ def actualize(self):
439459 target_resource .insert ()
440460 self .target_resource = target_resource
441461 self .update ()
442- LOG .debug ("Target resource %r has been created." , target_resource )
462+ LOG .debug ("Target resource %s has been created." , target_resource )
443463 elif self .target_resource .hash != hash :
444464 self .target_resource .value = target_state
445465 self .target_resource .calculate_hash ()
446466 self .target_resource .full_hash = self .full_hash
447467 self .target_resource .tracked_at = self .updated_at
448468 self .target_resource .update ()
449469 LOG .debug (
450- "Target resource %r has been updated." ,
470+ "Target resource %s has been updated." ,
471+ self .target_resource ,
472+ )
473+ elif self .target_resource .full_hash != self .full_hash :
474+ self .target_resource .full_hash = self .full_hash
475+ self .target_resource .update ()
476+ LOG .debug (
477+ "Target resource %s full hash has been updated." ,
478+ self .target_resource ,
479+ )
480+ elif self .target_resource .tracked_at != self .updated_at :
481+ self .target_resource .tracked_at = self .updated_at
482+ self .target_resource .update ()
483+ LOG .debug (
484+ "Target resource %s tracked_at has been updated." ,
451485 self .target_resource ,
452486 )
453487 else :
454488 LOG .debug (
455- "Target resource %r is actual state." ,
489+ "Target resource %s is actual state." ,
456490 self .target_resource ,
457491 )
492+ self .update ()
458493
459494 def delete (self , session = None ):
460495 for ts in sdk_models .TargetResource .objects .get_all (
@@ -480,6 +515,33 @@ class OutdatedResources(models.ModelWithUUID, orm.SQLStorableMixin):
480515 )
481516
482517
518+ class ResourceIncorrectStatusesView (
519+ models .ModelWithUUID , orm .SQLStorableMixin
520+ ):
521+ __tablename__ = "em_incorrect_resource_statuses_view"
522+
523+ current_status = properties .property (
524+ ra_types .String (),
525+ required = True ,
526+ )
527+ actual_status = properties .property (
528+ ra_types .AllowNone (ra_types .String ()),
529+ default = None ,
530+ )
531+
532+ def actualize_status (self , session ):
533+ new_status = Status .NEW
534+ if self .actual_status == Status .ACTIVE .value :
535+ new_status = Status .ACTIVE
536+ elif self .actual_status is not None :
537+ new_status = Status .IN_PROGRESS
538+
539+ session .execute (
540+ f'UPDATE { Resource .__tablename__ } SET status=%s WHERE "uuid"=%s;' ,
541+ (new_status , self .uuid ),
542+ )
543+
544+
483545class Namespace :
484546
485547 def __init__ (self , element ):
0 commit comments