def handle_event()

in source/idea/idea-virtual-desktop-controller/src/ideavirtualdesktopcontroller/app/events/handlers/dcv_host_event_handlers/dcv_host_reboot_complete_event_handler.py [0:0]


    def handle_event(self, message_id: str, sender_id: str, event: VirtualDesktopEvent):
        sender_instance_id = self.get_dcv_instance_id_from_sender_id(sender_id)
        if Utils.is_empty(sender_instance_id):
            raise self.message_source_validation_failed(f'Corrupted sender_id: {sender_id}. Ignoring message')

        idea_session_id = Utils.get_value_as_string('idea_session_id', event.detail, None)
        idea_session_owner = Utils.get_value_as_string('idea_session_owner', event.detail, None)

        self.log_info(message_id=message_id, message=f'Received message from dcv-host for RES Session ID {idea_session_id}, {idea_session_owner}')
        if Utils.is_empty(idea_session_id) or Utils.is_empty(idea_session_owner):
            self.log_error(message_id=message_id, message=f'RES Session ID: {idea_session_id}, owner: {idea_session_owner}')
            return

        session = self.session_db.get_from_db(idea_session_owner=idea_session_owner, idea_session_id=idea_session_id)
        if Utils.is_empty(session):
            self.log_error(message_id=message_id, message='Invalid RES Session ID.')
            return

        # if session is RESUMING/READY/STOPPED/STOPPED_IDLE/ERROR continue, else ignore
        if session.state not in {VirtualDesktopSessionState.RESUMING, VirtualDesktopSessionState.READY, VirtualDesktopSessionState.ERROR, VirtualDesktopSessionState.STOPPED, VirtualDesktopSessionState.STOPPED_IDLE}:
            self.log_error(message_id=message_id, message=f'RES session {session.idea_session_id}:{session.name} is in state: {session.state}. Not handling.')
            return

        self.log_info(message_id=message_id, message=f'RES session {session.idea_session_id}:{session.name} is in state {session.state}. Handling reboot complete event')

        # if session RESUMING -> this is user trying to resume session
        # if session READY -> the machine has been restarted that means the session was active but either AWS or the user did a reboot.
        # either case we need to treat as reboot and resume session, or it is a bogus message. Check with the broker for session state first.
        if session.state in {VirtualDesktopSessionState.READY}:
            self.log_info(message_id=message_id, message=f"RES session {session.idea_session_id}:{session.name} is state: {session.state}. Needs additional validations.")
            response = self.context.dcv_broker_client.describe_sessions([session])
            current_session_info = Utils.get_value_as_dict(session.dcv_session_id, Utils.get_value_as_dict("sessions", response, {}), {})
            state = Utils.get_value_as_string("state", current_session_info, None)
            if state == 'CREATING':
                # session is stable. not need to worry.
                self.log_info(message_id=message_id, message=f"RES session {session.idea_session_id}:{session.name} is stable with state: {state}. No need to handle event. Returning.")
                return
            elif state == 'READY':
                counter_db_entry = self.session_counter_db.get(session.idea_session_id, VirtualDesktopSessionCounterType.DCV_SESSION_RESUMED_COUNTER)
                if counter_db_entry.counter < self.RESUME_REQUEST_COUNT_THRESHOLD:
                    counter_db_entry.counter = counter_db_entry.counter + 1
                    self.session_counter_db.create_or_update(counter_db_entry)
                    raise self.do_not_delete_message_exception(f'RES session {session.idea_session_id}:{session.name} might stable with state: {state}. No need to handle event now. Resume request count: {counter_db_entry.counter}. Threshold: {self.RESUME_REQUEST_COUNT_THRESHOLD}')
                else:
                    # session is stable for sure.
                    self.session_counter_db.delete(counter_db_entry)
                    self.log_info(message_id=message_id, message=f"RES session {session.idea_session_id}:{session.name} is stable with state: {state}. No need to handle event.")
                    return

            self.log_warning(message_id=message_id, message=f"RES session {session.idea_session_id}:{session.name} is NOT stable with state: {state}. Handling.")
        else:
            self.log_info(message_id=message_id, message=f"RES session {session.idea_session_id}:{session.name} is state: {session.state}. Resuming Session.")

        session = self.context.dcv_broker_client.resume_session(session)

        if Utils.is_not_empty(session.failure_reason):
            # Error in resuming now. DO NOT PROCESS THE MESSAGE YET.
            raise self.do_not_delete_message_exception(f'Issue in resuming session: {session.failure_reason}. Will try again later')

        self.log_info(message_id=message_id, message=f"Submitted resume request for RES session {session.idea_session_id}:{session.name}.")

        if session.state is not VirtualDesktopSessionState.RESUMING:
            session.state = VirtualDesktopSessionState.RESUMING
            session = self.session_db.update(session)

        server = self.server_db.get(instance_id=session.server.instance_id)
        if server.state != 'CREATED':
            server.state = 'CREATED'
            self.server_db.update(server)