Commit cbbd0c655a398cd45c75cc119342f5492397e8c3
1 parent
c655f27d
Exists in
dev
Updated models.AgentCmd plus complet et precis -> faire un PYROS_DOCKER_UPDATE p…
…our mettre BD a jour - si question, repondre y a champ end_time replaced with r_end_time
Showing
2 changed files
with
60 additions
and
28 deletions
Show diff stats
src/core/pyros_django/agent/Agent.py
... | ... | @@ -408,7 +408,7 @@ class Agent: |
408 | 408 | # ------------------------------- |
409 | 409 | |
410 | 410 | # This command has a validity of 0s and thus should be tagged as "expired" |
411 | - ("self set_mode ATTENTIVE", 0, "MODE = ATTENTIVE", CMD_STATUS.CMD_OUTOFDATE), | |
411 | + ("self set_mode ATTENTIVE", 0, "MODE = ATTENTIVE", CMD_STATUS.CMD_EXPIRED), | |
412 | 412 | |
413 | 413 | # Agent general command |
414 | 414 | ("self set_mode ATTENTIVE", 200, "MODE = ATTENTIVE", CMD_STATUS.CMD_EXECUTED), |
... | ... | @@ -1042,6 +1042,8 @@ class Agent: |
1042 | 1042 | log.info("*"*10 + " NEXT COMMAND PROCESSING (START) " + "*"*10 + '\n') |
1043 | 1043 | try : |
1044 | 1044 | cmd = self._process_next_command_if_exists() |
1045 | + print("after get") | |
1046 | + print(cmd) | |
1045 | 1047 | except (AgentCmdUnimplementedException, AgentCmdBadArgsException, UnknownCmdException) as e : |
1046 | 1048 | print(e) |
1047 | 1049 | log.error(f"EXCEPTION on Agent command '{e.cmd.name}'") |
... | ... | @@ -1706,7 +1708,7 @@ class Agent: |
1706 | 1708 | if not commands.exists(): |
1707 | 1709 | log.info("<None>") |
1708 | 1710 | return None |
1709 | - "Current pending (or running) commands are (time ordered):" | |
1711 | + "Current pending (or running) commands (time ordered):" | |
1710 | 1712 | AgentCmd.show_commands(commands) |
1711 | 1713 | |
1712 | 1714 | # 2) Check if a PRIORITY command is in the list (even at the very end), |
... | ... | @@ -1719,7 +1721,7 @@ class Agent: |
1719 | 1721 | if cmd.is_running(): |
1720 | 1722 | return None |
1721 | 1723 | if cmd.is_expired(): |
1722 | - cmd.set_as_outofdate() | |
1724 | + cmd.set_as_expired() | |
1723 | 1725 | return None |
1724 | 1726 | return cmd |
1725 | 1727 | ''' |
... | ... | @@ -1749,7 +1751,7 @@ class Agent: |
1749 | 1751 | cmd = commands.first() |
1750 | 1752 | |
1751 | 1753 | if cmd.is_expired(): |
1752 | - cmd.set_as_outofdate() | |
1754 | + cmd.set_as_expired() | |
1753 | 1755 | return None |
1754 | 1756 | |
1755 | 1757 | if cmd.is_running(): |
... | ... | @@ -2405,6 +2407,7 @@ class Agent: |
2405 | 2407 | #self._cmdts.set_as_pending() |
2406 | 2408 | # SEND |
2407 | 2409 | self._cmdts.send() |
2410 | + log.info(f"*** NEW COMMAND SENT") | |
2408 | 2411 | #cmdts_is_processed = False |
2409 | 2412 | #cmdts_res = None |
2410 | 2413 | ... | ... |
src/core/pyros_django/common/models.py
... | ... | @@ -441,27 +441,49 @@ class AgentCmd(models.Model): |
441 | 441 | |
442 | 442 | # Command status codes |
443 | 443 | CMD_STATUS_CODES = Choices( |
444 | + | |
444 | 445 | # Cmd is pending, waiting for execution |
445 | 446 | "CMD_PENDING", |
446 | 447 | |
447 | - # Cmd is running (after having been "read") | |
448 | - "CMD_RUNNING", | |
449 | - | |
450 | - # Cmd was skipped (not run, because the agent is in a mode which does not allow execution of this command) | |
448 | + | |
449 | + ### 1 - ERRORS BEFORE EVEN BEING RUN ### | |
450 | + | |
451 | + # Cmd is invalid (unknown or bad args) | |
452 | + "CMD_INVALID", | |
453 | + | |
454 | + # Cmd is not yet implemented (by recipient agent) | |
455 | + "CMD_UNIMPLEMENTED", | |
456 | + | |
457 | + # Cmd was skipped (not run, because the agent is IDLE (or in a mode which does not allow execution of this command) | |
451 | 458 | "CMD_SKIPPED", |
452 | - | |
453 | - # Cmd was aborted, killed | |
454 | - # - either because of exec time too long and timeout reached | |
455 | - # - or because an agent sent an "do_abort_current_command" command | |
456 | - "CMD_KILLED", | |
457 | 459 | |
458 | 460 | # Cmd is out of date (expired) |
459 | 461 | # because it has been pending for too long |
460 | - "CMD_OUTOFDATE", | |
462 | + #"CMD_OUTOFDATE", | |
463 | + "CMD_EXPIRED", | |
464 | + | |
461 | 465 | |
462 | - # Cmd was run and finished ok | |
466 | + ### 2 - RUNNING ### | |
467 | + # Cmd is running (after having been "read") | |
468 | + "CMD_RUNNING", | |
469 | + | |
470 | + | |
471 | + ### 3 - ERRORS WHILE RUNNING ### | |
472 | + | |
473 | + # - Cmd was run and finished ok | |
463 | 474 | # ( simulé par un sleep(3) dans AgentX.core_process() ) |
464 | 475 | "CMD_EXECUTED", |
476 | + | |
477 | + # - Cmd was running, but then an error occured | |
478 | + "CMD_EXEC_ERROR", | |
479 | + | |
480 | + # - Cmd was running, but took too much time and timeout was reached | |
481 | + "CMD_EXEC_TIMEOUT", | |
482 | + | |
483 | + # - Cmd was aborted, killed by another agent | |
484 | + #"CMD_KILLED", | |
485 | + "CMD_EXEC_KILLED", | |
486 | + | |
465 | 487 | ) |
466 | 488 | |
467 | 489 | # Command default validity duration (from sending time) BEFORE execution, before being perempted (in sec) |
... | ... | @@ -493,6 +515,7 @@ class AgentCmd(models.Model): |
493 | 515 | #state = models.CharField(choices = CMD_STATUS_CODES, default=CMD_STATUS_CODES.CMD_PENDING, max_length=20) |
494 | 516 | state = models.CharField(choices=CMD_STATUS_CODES, default=CMD_STATUS_CODES.CMD_PENDING, max_length=20) |
495 | 517 | #state = models.IntegerField(choices=CMD_STATUS_CODES, default=RSCODE_PENDING) |
518 | + | |
496 | 519 | # TODO: maybe à mettre au format json (key:value) |
497 | 520 | result = models.CharField(max_length=400, blank=True) |
498 | 521 | |
... | ... | @@ -502,8 +525,9 @@ class AgentCmd(models.Model): |
502 | 525 | r_read_time = models.DateTimeField(null=True) |
503 | 526 | # - on launching: |
504 | 527 | r_start_time = models.DateTimeField(null=True) |
505 | - # - on skipping (because idle), expiration (because too old), kill, or end of execution | |
506 | - end_time = models.DateTimeField(null=True) | |
528 | + # - on end (after execution started or not) | |
529 | + #end_time = models.DateTimeField(null=True) | |
530 | + r_end_time = models.DateTimeField(null=True) | |
507 | 531 | |
508 | 532 | # Other agent (than sender or recipient) that set this command to KILLED or EXPIRED |
509 | 533 | killer_agent_name = models.CharField(max_length=50, help_text='sender agent name', null=True) |
... | ... | @@ -900,9 +924,12 @@ class AgentCmd(models.Model): |
900 | 924 | return self.state == self.CMD_STATUS_CODES.CMD_SKIPPED |
901 | 925 | |
902 | 926 | def is_killed(self): |
903 | - return self.state == self.CMD_STATUS_CODES.CMD_KILLED | |
927 | + return self.state == self.CMD_STATUS_CODES.CMD_EXEC_KILLED | |
904 | 928 | |
905 | 929 | def is_expired(self): |
930 | + if self.state == self.CMD_STATUS_CODES.CMD_EXPIRED: return True | |
931 | + # Must NOT be running | |
932 | + if self.is_running(): return False | |
906 | 933 | # return (datetime.utcnow() - self.s_deposit_time) > timedelta(seconds = self.validity_duration) |
907 | 934 | elapsed_time = (datetime.utcnow().astimezone() - self.s_deposit_time) |
908 | 935 | printd("elapsed_time", elapsed_time) |
... | ... | @@ -915,6 +942,7 @@ class AgentCmd(models.Model): |
915 | 942 | """ |
916 | 943 | |
917 | 944 | def is_timeout(self): |
945 | + if self.state == self.CMD_STATUS_CODES.CMD_EXEC_TIMEOUT: return True | |
918 | 946 | # Must be running |
919 | 947 | if not self.is_running(): return False |
920 | 948 | # return (datetime.utcnow() - self.s_deposit_time) > timedelta(seconds = self.validity_duration) |
... | ... | @@ -952,10 +980,11 @@ class AgentCmd(models.Model): |
952 | 980 | # Optimization: update the related fields, but does not work, why ? |
953 | 981 | ##self.save(update_fields=["state", "r_processed_time"]) |
954 | 982 | |
955 | - def set_as_outofdate(self): | |
983 | + #def set_as_outofdate(self): | |
984 | + def set_as_expired(self): | |
956 | 985 | print( |
957 | 986 | f"- Set this command as expired (older than its validity duration of {self.validity_duration}s): {self}") |
958 | - self.set_state_to(self.CMD_STATUS_CODES.CMD_OUTOFDATE) | |
987 | + self.set_state_to(self.CMD_STATUS_CODES.CMD_EXPIRED) | |
959 | 988 | |
960 | 989 | def set_as_pending(self): |
961 | 990 | self.set_state_to(self.CMD_STATUS_CODES.CMD_PENDING) |
... | ... | @@ -966,7 +995,7 @@ class AgentCmd(models.Model): |
966 | 995 | def set_as_killed_by(self, author_agent: str): |
967 | 996 | printd(f"- Set command {self.name} as killed") |
968 | 997 | #print(f"- Set this command as killed: {self}") |
969 | - self.set_state_to(self.CMD_STATUS_CODES.CMD_KILLED, author_agent) | |
998 | + self.set_state_to(self.CMD_STATUS_CODES.CMD_EXEC_KILLED, author_agent) | |
970 | 999 | |
971 | 1000 | def set_as_running(self): |
972 | 1001 | printd(f"- Set command {self.name} as running") |
... | ... | @@ -983,20 +1012,20 @@ class AgentCmd(models.Model): |
983 | 1012 | now_time = datetime.utcnow().astimezone() |
984 | 1013 | if result: |
985 | 1014 | self.set_result(result, False) |
986 | - if status in (self.CMD_STATUS_CODES.CMD_RUNNING, self.CMD_STATUS_CODES.CMD_SKIPPED, self.CMD_STATUS_CODES.CMD_OUTOFDATE): | |
1015 | + if status in (self.CMD_STATUS_CODES.CMD_RUNNING, self.CMD_STATUS_CODES.CMD_SKIPPED, self.CMD_STATUS_CODES.CMD_EXPIRED): | |
987 | 1016 | assert self.is_pending() |
988 | 1017 | if status == self.CMD_STATUS_CODES.CMD_RUNNING: |
989 | 1018 | self.r_start_time = now_time |
990 | 1019 | elif status in (self.CMD_STATUS_CODES.CMD_SKIPPED): |
991 | - self.end_time = now_time | |
1020 | + self.r_end_time = now_time | |
992 | 1021 | # EXPIRED |
993 | - elif status == self.CMD_STATUS_CODES.CMD_OUTOFDATE: | |
994 | - self.end_time = now_time | |
1022 | + elif status == self.CMD_STATUS_CODES.CMD_EXPIRED: | |
1023 | + self.r_end_time = now_time | |
995 | 1024 | self.killer_agent_name = author_agent_name |
996 | - elif status in (self.CMD_STATUS_CODES.CMD_EXECUTED, self.CMD_STATUS_CODES.CMD_KILLED): | |
1025 | + elif status in (self.CMD_STATUS_CODES.CMD_EXECUTED, self.CMD_STATUS_CODES.CMD_EXEC_KILLED): | |
997 | 1026 | assert self.is_running() |
998 | - self.end_time = now_time | |
999 | - if status == self.CMD_STATUS_CODES.CMD_KILLED: | |
1027 | + self.r_end_time = now_time | |
1028 | + if status == self.CMD_STATUS_CODES.CMD_EXEC_KILLED: | |
1000 | 1029 | self.killer_agent_name = author_agent_name |
1001 | 1030 | # Update command status |
1002 | 1031 | self.state = status | ... | ... |