Skip to content

Commit 80577be

Browse files
committed
EM Builder fixes
1 parent b9b40fe commit 80577be

4 files changed

Lines changed: 119 additions & 34 deletions

File tree

.vscode/launch.json

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,6 @@
44
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
55
"version": "0.2.0",
66
"configurations": [
7-
8-
9-
10-
11-
12-
13-
14-
15-
167
{
178
"name": "Python Debugger: User API",
189
"type": "debugpy",

genesis_core/elements/dm/models.py

Lines changed: 77 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
483545
class Namespace:
484546

485547
def __init__(self, element):

genesis_core/elements/services/builders.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import logging
1818

1919
from gcl_looper.services import basic
20+
from restalchemy.common import contexts
2021

2122
from genesis_core.elements.dm import models
2223

@@ -36,30 +37,45 @@ def __init__(
3637
self._first_step = True
3738

3839
def _actualize_target_resources(self):
40+
# Delete outdated resources that do not have a corresponding EM
3941
for info in models.OutdatedResources.objects.get_all():
4042
if info.em_resource is None:
4143
info.target_resource.delete()
44+
LOG.info(" Resource %s has been deleted", info.target_resource)
4245

4346
for resource in self._element_engine.get_resources():
4447
resource.actualize()
4548

46-
def _actualize_statuses(self):
47-
incorrect_statuses = (
49+
def _actualize_statuses(self, session):
50+
incorrect_resource_statuses = (
51+
models.ResourceIncorrectStatusesView.objects.get_all()
52+
)
53+
for em_status_model in incorrect_resource_statuses:
54+
LOG.info(
55+
"Actualizing status for resource (%s): %s -> %s...",
56+
em_status_model.uuid,
57+
em_status_model.current_status,
58+
em_status_model.actual_status,
59+
)
60+
em_status_model.actualize_status(session)
61+
62+
incorrect_element_statuses = (
4863
models.ElementIncorrectStatusesView.objects.get_all()
4964
)
50-
for em_status_model in incorrect_statuses:
65+
for em_status_model in incorrect_element_statuses:
5166
LOG.info(
5267
"Actualizing status for element (%s): %s -> %s...",
5368
em_status_model.name,
5469
em_status_model.api_status,
5570
em_status_model.actual_status,
5671
)
57-
em_status_model.actualize_api_status()
72+
em_status_model.actualize_status()
5873

5974
def _iteration(self):
60-
if self._first_step:
61-
self._element_engine.load_from_database()
62-
self._first_step = True # Disable optimization
63-
self._actualize_target_resources()
64-
self._actualize_statuses()
65-
LOG.debug("Starting iteration")
75+
with contexts.Context().session_manager() as session:
76+
if self._first_step:
77+
self._element_engine.load_from_database()
78+
self._first_step = True # Disable optimization
79+
self._actualize_target_resources()
80+
self._actualize_statuses(session)
81+
LOG.debug("Starting iteration")

migrations/0019-add-elements-76bca4.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,21 @@ def upgrade(self, session):
147147
OR "utr"."uuid" IS NULL
148148
OR "er"."updated_at" <> "utr"."tracked_at";
149149
""",
150+
"""
151+
CREATE OR REPLACE VIEW "em_incorrect_resource_statuses_view" AS
152+
SELECT
153+
"er"."uuid" AS "uuid",
154+
"er"."status" AS "current_status",
155+
"uar"."status" AS "actual_status"
156+
FROM
157+
"em_resources" "er"
158+
LEFT JOIN
159+
"ua_actual_resources" "uar"
160+
ON
161+
"er"."uuid" = "uar"."uuid"
162+
WHERE
163+
"er"."status" <> "uar"."status";
164+
""",
150165
]
151166

152167
for expression in expressions:
@@ -160,6 +175,7 @@ def downgrade(self, session):
160175
]
161176
views = [
162177
"em_incorrect_statuses_view",
178+
"em_incorrect_resource_statuses_view",
163179
"em_outdated_resources_view",
164180
]
165181

0 commit comments

Comments
 (0)