示例#1
0
def on_workflow_complete(wf_ex):
    if wf_ex.task_execution_id:
        return

    if not wf_ex.description:
        return

    try:
        description = json.loads(wf_ex.description)
    except ValueError as e:
        LOG.debug(str(e))
        return

    if not isinstance(description, dict):
        return

    triggered = description.get('triggered_by')

    if not triggered:
        return

    if triggered['type'] == 'cron_trigger':
        if not db_api.load_cron_trigger(triggered['name']):
            security.delete_trust()
    elif triggered['type'] == 'event_trigger':
        if not db_api.load_event_trigger(triggered['id'], True):
            security.delete_trust()
示例#2
0
def delete_cron_trigger(name, trust_id=None):
    if not trust_id:
        trigger = db_api.get_cron_trigger(name)
        trust_id = trigger.trust_id

    security.delete_trust(trust_id)
    return db_api.delete_cron_trigger(name)
示例#3
0
def on_workflow_complete(wf_ex):
    if wf_ex.task_execution_id:
        return

    if not wf_ex.description:
        return

    try:
        description = json.loads(wf_ex.description)
    except ValueError as e:
        LOG.debug(str(e))
        return

    if not isinstance(description, dict):
        return

    triggered = description.get('triggered_by')

    if not triggered:
        return

    if triggered['type'] == 'cron_trigger':
        if not db_api.load_cron_trigger(triggered['name']):
            security.delete_trust()
    elif triggered['type'] == 'event_trigger':
        if not db_api.load_event_trigger(triggered['id'], True):
            security.delete_trust()
示例#4
0
def delete_cron_trigger(name, trust_id=None):
    if not trust_id:
        trigger = db_api.get_cron_trigger(name)
        trust_id = trigger.trust_id

    modified_count = db_api.delete_cron_trigger(name)
    if modified_count:
        # Delete trust only together with deleting trigger.
        security.delete_trust(trust_id)

    return modified_count
示例#5
0
def delete_cron_trigger(identifier, trust_id=None, delete_trust=True):
    if not trust_id:
        trigger = db_api.get_cron_trigger(identifier)
        trust_id = trigger.trust_id

    modified_count = db_api.delete_cron_trigger(identifier)

    if modified_count and delete_trust:
        # Delete trust only together with deleting trigger.
        security.delete_trust(trust_id)

    return modified_count
示例#6
0
def delete_cron_trigger(identifier, trust_id=None, delete_trust=True):
    if not trust_id:
        trigger = db_api.get_cron_trigger(identifier)
        trust_id = trigger.trust_id

    modified_count = db_api.delete_cron_trigger(identifier)

    if modified_count and delete_trust:
        # Delete trust only together with deleting trigger.
        security.delete_trust(trust_id)

    return modified_count
示例#7
0
def delete_event_trigger(event_trigger):
    db_api.delete_event_trigger(event_trigger['id'])

    trigs = db_api.get_event_triggers(insecure=True,
                                      exchange=event_trigger['exchange'],
                                      topic=event_trigger['topic'])
    events = set([t.event for t in trigs])

    # NOTE(kong): Send RPC message within the db transaction, rollback if
    # any error occurs.
    rpc.get_event_engine_client().delete_event_trigger(event_trigger,
                                                       list(events))

    security.delete_trust(event_trigger['trust_id'])
示例#8
0
def delete_event_trigger(event_trigger):
    db_api.delete_event_trigger(event_trigger['id'])

    trigs = db_api.get_event_triggers(
        insecure=True,
        exchange=event_trigger['exchange'],
        topic=event_trigger['topic']
    )
    events = set([t.event for t in trigs])

    # NOTE(kong): Send RPC message within the db transaction, rollback if
    # any error occurs.
    rpc.get_event_engine_client().delete_event_trigger(
        event_trigger,
        list(events)
    )

    security.delete_trust(event_trigger['trust_id'])
示例#9
0
    def delete_event_trigger(self, trigger, events):
        """An endpoint method for deleting event trigger.

        If there is no event binding to (exchange, topic) after deletion, we
        need to delete the related listener. Otherwise, we need to restart
        that listener.

        :param trigger: a dict containing event trigger information.
        :param events: a list of events binding to the (exchange, topic) of
                       the event trigger.
        """
        assert trigger['event'] in self.event_triggers_map

        with self.lock:
            for t in self.event_triggers_map[trigger['event']]:
                if t['id'] == trigger['id']:
                    self.event_triggers_map[trigger['event']].remove(t)
                    break

            if not self.event_triggers_map[trigger['event']]:
                del self.event_triggers_map[trigger['event']]

        if not events:
            key = (trigger['exchange'], trigger['topic'])

            listener = self.exchange_topic_listener_map[key]
            listener.stop()
            listener.wait()

            del self.exchange_topic_listener_map[key]

            LOG.info('Deleted listener for exchange: %s, topic: %s',
                     trigger['exchange'], trigger['topic'])

            return

        security.delete_trust(trigger['trust_id'])

        self._add_event_listener(trigger['exchange'], trigger['topic'], events)
示例#10
0
def create_cron_trigger(name,
                        workflow_name,
                        workflow_input,
                        workflow_params=None,
                        pattern=None,
                        first_time=None,
                        count=None,
                        start_time=None,
                        workflow_id=None):
    if not start_time:
        start_time = datetime.datetime.utcnow()

    if isinstance(first_time, six.string_types):
        try:
            first_time = datetime.datetime.strptime(first_time,
                                                    '%Y-%m-%d %H:%M')
        except ValueError as e:
            raise exc.InvalidModelException(str(e))

    validate_cron_trigger_input(pattern, first_time, count)

    if first_time:
        next_time = first_time

        if not (pattern or count):
            count = 1
    else:
        next_time = get_next_execution_time(pattern, start_time)

    with db_api.transaction():
        wf_def = db_api.get_workflow_definition(
            workflow_id if workflow_id else workflow_name)

        wf_spec = parser.get_workflow_spec_by_definition_id(
            wf_def.id, wf_def.updated_at)

        # TODO(rakhmerov): Use Workflow object here instead of utils.
        eng_utils.validate_input(wf_spec.get_input(), workflow_input,
                                 wf_spec.get_name(),
                                 wf_spec.__class__.__name__)

        trigger_parameters = {
            'name': name,
            'pattern': pattern,
            'first_execution_time': first_time,
            'next_execution_time': next_time,
            'remaining_executions': count,
            'workflow_name': wf_def.name,
            'workflow_id': wf_def.id,
            'workflow_input': workflow_input or {},
            'workflow_params': workflow_params or {},
            'scope': 'private'
        }

        security.add_trust_id(trigger_parameters)

        try:
            trig = db_api.create_cron_trigger(trigger_parameters)
        except Exception:
            # Delete trust before raising exception.
            security.delete_trust(trigger_parameters.get('trust_id'))
            raise

    return trig
示例#11
0
def create_cron_trigger(name, workflow_name, workflow_input,
                        workflow_params=None, pattern=None, first_time=None,
                        count=None, start_time=None, workflow_id=None):
    if not start_time:
        start_time = datetime.datetime.utcnow()

    if isinstance(first_time, six.string_types):
        try:
            first_time = datetime.datetime.strptime(
                first_time,
                '%Y-%m-%d %H:%M'
            )
        except ValueError as e:
            raise exc.InvalidModelException(str(e))

    validate_cron_trigger_input(pattern, first_time, count)

    if first_time:
        next_time = first_time

        if not (pattern or count):
            count = 1
    else:
        next_time = get_next_execution_time(pattern, start_time)

    with db_api.transaction():
        wf_def = db_api.get_workflow_definition(
            workflow_id if workflow_id else workflow_name
        )

        wf_spec = parser.get_workflow_spec_by_definition_id(
            wf_def.id,
            wf_def.updated_at
        )

        # TODO(rakhmerov): Use Workflow object here instead of utils.
        eng_utils.validate_input(
            wf_spec.get_input(),
            workflow_input,
            wf_spec.get_name(),
            wf_spec.__class__.__name__
        )

        trigger_parameters = {
            'name': name,
            'pattern': pattern,
            'first_execution_time': first_time,
            'next_execution_time': next_time,
            'remaining_executions': count,
            'workflow_name': wf_def.name,
            'workflow_id': wf_def.id,
            'workflow_input': workflow_input or {},
            'workflow_params': workflow_params or {},
            'scope': 'private'
        }

        security.add_trust_id(trigger_parameters)

        try:
            trig = db_api.create_cron_trigger(trigger_parameters)
        except Exception:
            # Delete trust before raising exception.
            security.delete_trust(trigger_parameters.get('trust_id'))
            raise

    return trig