def update_instance()

in fbpcs/pid/service/pid_service/pid.py [0:0]


    def update_instance(self, instance_id: str) -> PIDInstance:
        self.logger.info(f"Updating PID Instance: {instance_id}")
        instance = self.instance_repository.read(instance_id)

        if instance.status in [PIDInstanceStatus.COMPLETED, PIDInstanceStatus.FAILED]:
            return instance

        for stage, status in instance.stages_status.copy().items():
            if status in [PIDStageStatus.COMPLETED, PIDStageStatus.FAILED]:
                continue
            containers = instance.stages_containers.get(stage, None)
            if containers:
                container_ids = [container.instance_id for container in containers]
                containers = list(
                    filter(None, self.onedocker_svc.get_containers(container_ids))
                )
                new_stage_status = PIDStage.get_stage_status_from_containers(containers)
                if new_stage_status is PIDStageStatus.FAILED:
                    instance.status = PIDInstanceStatus.FAILED
                instance.stages_status[stage] = new_stage_status
                instance.stages_containers[stage] = containers
                instance.current_stage = stage
        # if all of the stages are complete, then PID for instance is complete
        if all(
            status is PIDStageStatus.COMPLETED
            for status in instance.stages_status.values()
        ):
            instance.status = PIDInstanceStatus.COMPLETED
        self.instance_repository.update(instance)
        return instance