Ejemplo n.º 1
0
    def update_history(self,
                       status_name,
                       size,
                       task=None,
                       tmp_status=None,
                       fault=None,
                       deploy_fault_message=None,
                       deploy_fault_trace=None,
                       first_update=False):
        """
        Given the status name and size, look up the previous history object
        If nothing has changed: return (False, last_history)
        else: end date previous history object, start new history object.
              return (True, new_history)
        """
        # FIXME: Move this call so that it happens inside InstanceStatusHistory to avoid circ.dep.
        from core.models import InstanceStatusHistory
        import traceback
        # 1. Get status name
        status_name = _get_status_name_for_provider(self.source.provider,
                                                    status_name, task,
                                                    tmp_status)
        activity = self.esh_activity()
        status = self.esh_status()
        extra = InstanceStatusHistory._build_extra(
            status_name=status_name,
            fault=fault,
            deploy_fault_message=deploy_fault_message,
            deploy_fault_trace=deploy_fault_trace)

        # 2. Get the last history (or Build a new one if no other exists)
        has_history = self.instancestatushistory_set.all().count()
        if not has_history:
            last_history = InstanceStatusHistory.create_history(
                status_name,
                self,
                size,
                start_date=self.start_date,
                activity=activity,
                extra=extra)
            last_history.save()
            logger.debug(
                "STATUSUPDATE - FIRST - Instance:%s Old Status: %s - %s New\
                Status: %s Tmp Status: %s" %
                (self.provider_alias, status, activity, status_name,
                 tmp_status))
            logger.debug("STATUSUPDATE - Traceback: %s" %
                         traceback.format_stack())
        last_history = self.get_last_history()
        # 2. Size and name must match to continue using last history
        if last_history.status.name == status_name \
                and last_history.size.id == size.id:
            # logger.info("status_name matches last history:%s " %
            #        last_history.status.name)
            return (False, last_history)
        logger.debug(
            "STATUSUPDATE - Instance:%s Old Status: %s - %s New Status: %s\
            Tmp Status: %s" %
            (self.provider_alias, status, activity, status_name, tmp_status))
        logger.debug("STATUSUPDATE - Traceback: %s" % traceback.format_stack())
        # 3. ASSERT: A new history item is required due to a State or Size
        # Change
        now_time = timezone.now()
        try:
            new_history = InstanceStatusHistory.transaction(
                status_name,
                activity,
                self,
                size,
                extra=extra,
                start_time=now_time,
                last_history=last_history)
            return (True, new_history)
        except ValueError:
            logger.exception("Bad transaction")
            return (False, last_history)
    def update_history(
        self,
        status_name,
        size,
        task=None,
        tmp_status=None,
        fault=None,
        deploy_fault_message=None,
        deploy_fault_trace=None,
        first_update=False
    ):
        """
        Given the status name and size, look up the previous history object
        If nothing has changed: return (False, last_history)
        else: end date previous history object, start new history object.
              return (True, new_history)
        """
        # FIXME: Move this call so that it happens inside InstanceStatusHistory to avoid circ.dep.
        from core.models import InstanceStatusHistory
        import traceback
        # 1. Get status name
        status_name = _get_status_name_for_provider(
            self.source.provider, status_name, task, tmp_status
        )
        activity = self.esh_activity()
        status = self.esh_status()
        extra = InstanceStatusHistory._build_extra(
            status_name=status_name,
            fault=fault,
            deploy_fault_message=deploy_fault_message,
            deploy_fault_trace=deploy_fault_trace
        )

        # 2. Get the last history (or Build a new one if no other exists)
        has_history = self.instancestatushistory_set.all().count()
        if not has_history:
            last_history = InstanceStatusHistory.create_history(
                status_name,
                self,
                size,
                start_date=self.start_date,
                activity=activity,
                extra=extra
            )
            last_history.save()
            logger.debug(
                "STATUSUPDATE - FIRST - Instance:%s Old Status: %s - %s New\
                Status: %s Tmp Status: %s" % (
                    self.provider_alias, status, activity, status_name,
                    tmp_status
                )
            )
            logger.debug(
                "STATUSUPDATE - Traceback: %s" % traceback.format_stack()
            )
        last_history = self.get_last_history()
        # 2. Size and name must match to continue using last history
        if last_history.status.name == status_name \
                and last_history.size.id == size.id:
            # logger.info("status_name matches last history:%s " %
            #        last_history.status.name)
            return (False, last_history)
        logger.debug(
            "STATUSUPDATE - Instance:%s Old Status: %s - %s New Status: %s\
            Tmp Status: %s" %
            (self.provider_alias, status, activity, status_name, tmp_status)
        )
        logger.debug("STATUSUPDATE - Traceback: %s" % traceback.format_stack())
        # 3. ASSERT: A new history item is required due to a State or Size
        # Change
        now_time = timezone.now()
        try:
            new_history = InstanceStatusHistory.transaction(
                status_name,
                activity,
                self,
                size,
                extra=extra,
                start_time=now_time,
                last_history=last_history
            )
            return (True, new_history)
        except ValueError:
            logger.exception("Bad transaction")
            return (False, last_history)