Пример #1
0
def _send_mgmtworker_task(message, routing_key='workflow'):
    """Send a message to the mgmtworker exchange"""
    client = _get_amqp_client()
    send_handler = SendHandler(MGMTWORKER_QUEUE, routing_key=routing_key)
    client.add_handler(send_handler)
    with client:
        send_handler.publish(message)
def _send_mgmtworker_task(message, exchange=MGMTWORKER_QUEUE,
                          exchange_type='direct', routing_key='workflow'):
    """Send a message to the mgmtworker exchange"""
    client = _get_amqp_client()
    send_handler = SendHandler(exchange, exchange_type,
                               routing_key=routing_key)
    client.add_handler(send_handler)
    with client:
        send_handler.publish(message)
def _broadcast_mgmtworker_task(message,
                               exchange='cloudify-mgmtworker-service',
                               exchange_type='fanout',
                               routing_key='service'):
    """Broadcast a message to all mgmtworkers in a cluster."""
    client = get_amqp_client()
    send_handler = SendHandler(exchange,
                               exchange_type,
                               routing_key=routing_key)
    client.add_handler(send_handler)
    with client:
        send_handler.publish(message)
def _send_mgmtworker_task(message, routing_key='workflow'):
    """Send a message to the mgmtworker exchange"""
    client = get_client(amqp_host=config.instance.amqp_host,
                        amqp_user=config.instance.amqp_username,
                        amqp_pass=config.instance.amqp_password,
                        amqp_port=BROKER_SSL_PORT,
                        amqp_vhost='/',
                        ssl_enabled=True,
                        ssl_cert_path=config.instance.amqp_ca_path)
    send_handler = SendHandler(MGMTWORKER_QUEUE, routing_key=routing_key)
    client.add_handler(send_handler)
    with client:
        send_handler.publish(message)
def execute_workflow(
    execution,
    bypass_maintenance=None,
    wait_after_fail=600,
    handler: SendHandler = None,
):
    sm = get_storage_manager()
    token = generate_execution_token(execution)
    context = execution.render_context()
    context.update({
        'wait_after_fail':
        wait_after_fail,
        'bypass_maintenance':
        bypass_maintenance,
        'execution_token':
        token,
        'rest_host':
        [manager.private_ip for manager in sm.list(models.Manager)],
        'rest_token':
        execution.creator.get_auth_token(),
    })
    if context.get('plugin'):
        managed_plugins = sm.list(models.Plugin,
                                  filters={
                                      'package_name':
                                      context['plugin'].get('package_name'),
                                      'package_version':
                                      context['plugin'].get('package_version'),
                                  }).items
        if managed_plugins:
            context['plugin']['visibility'] = managed_plugins[0].visibility
            context['plugin']['tenant_name'] = managed_plugins[0].tenant_name

    execution_parameters = execution.parameters.copy()
    execution_parameters['__cloudify_context'] = context
    message = {
        'cloudify_task': {
            'kwargs': execution_parameters
        },
        'id': execution.id,
        'execution_creator': execution.creator.id
    }

    if handler is not None:
        handler.publish(message)
    else:
        _send_mgmtworker_task(message)
Пример #6
0
    def patch(self):
        """Replace CA certificates on running agents."""
        request_dict = get_json_and_verify_params({'bundle': {'type': bool}})
        # broker_ca_cert or manager_ca_cert can be None so no need to
        # specify their type
        broker_ca_cert = request_dict.get('broker_ca_cert')
        manager_ca_cert = request_dict.get('manager_ca_cert')
        bundle = request_dict.get('bundle')
        sm = get_storage_manager()
        num_of_updated_agents = 0

        new_broker_ca, new_manager_ca = self._get_new_ca_certs(
            sm, bundle, broker_ca_cert, manager_ca_cert)

        all_tenants = sm.list(models.Tenant, get_all_results=True)
        for tenant in all_tenants:
            tenant_agents = sm.list(models.Agent,
                                    get_all_results=True,
                                    all_tenants=True,
                                    filters={'tenant': tenant})

            amqp_client = get_amqp_client(tenant=tenant)
            to_send = []
            for agent in tenant_agents:
                message = {
                    'service_task': {
                        'task_name': 'replace-ca-certs',
                        'kwargs': {
                            'new_broker_ca': new_broker_ca,
                            'new_manager_ca': new_manager_ca
                        }
                    }
                }
                handler = SendHandler(agent.rabbitmq_exchange,
                                      exchange_type='direct',
                                      routing_key='service')
                to_send.append((handler, message))
                amqp_client.add_handler(handler)
                num_of_updated_agents += 1

            with amqp_client:
                for handler, message in to_send:
                    handler.publish(message)

        return {'number_of_updated_agents': num_of_updated_agents}
Пример #7
0
    def _send_cancel_task(self, target, execution_id):
        """Send a cancel-operation task to the agent given by `target`"""
        message = {
            'service_task': {
                'task_name': 'cancel-operation',
                'kwargs': {
                    'execution_id': execution_id
                }
            }
        }
        if target == MGMTWORKER_QUEUE:
            client = get_client()
        else:
            tenant = workflow_ctx.tenant
            client = get_client(amqp_user=tenant['rabbitmq_username'],
                                amqp_pass=tenant['rabbitmq_password'],
                                amqp_vhost=tenant['rabbitmq_vhost'])

        handler = SendHandler(exchange=target, routing_key='service')
        client.add_handler(handler)
        with client:
            handler.publish(message)
def uninstall_plugin(plugin):
    sm = get_storage_manager()
    pstates = sm.list(models._PluginState,
                      filters={
                          '_plugin_fk':
                          plugin._storage_id,
                          'state': [
                              PluginInstallationState.INSTALLED,
                              PluginInstallationState.INSTALLING,
                              PluginInstallationState.ERROR
                          ]
                      })
    agents_per_tenant = {}
    managers = []
    for pstate in pstates:
        if pstate.manager:
            managers.append(pstate.manager.hostname)
        if pstate.agent:
            agents_per_tenant.setdefault(pstate.agent.tenant,
                                         []).append(pstate.agent)
    if managers:
        _broadcast_mgmtworker_task(
            _get_plugin_message(plugin,
                                target_names=managers,
                                task='uninstall-plugin'))

    agent_message = _get_plugin_message(plugin, task='uninstall-plugin')
    if agents_per_tenant:
        for tenant, agents in agents_per_tenant.items():
            # amqp client for the given tenant's vhost.
            # Still use the manager's creds.
            tenant_client = get_amqp_client(tenant)
            with tenant_client:
                for agent in agents:
                    send_handler = SendHandler(agent.name,
                                               exchange_type='direct',
                                               routing_key='service')
                    tenant_client.add_handler(send_handler)
                    send_handler.publish(agent_message)
Пример #9
0
    def _send_cancel_task(self, target, execution_id):
        """Send a cancel-operation task to the agent given by `target`"""
        message = {
            'service_task': {
                'task_name': 'cancel-operation',
                'kwargs': {'execution_id': execution_id}
            }
        }
        if target == MGMTWORKER_QUEUE:
            client = get_client()
        else:
            tenant = workflow_ctx.tenant
            client = get_client(
                amqp_user=tenant['rabbitmq_username'],
                amqp_pass=tenant['rabbitmq_password'],
                amqp_vhost=tenant['rabbitmq_vhost']
            )

        handler = SendHandler(exchange=target, routing_key='service')
        client.add_handler(handler)
        with client:
            handler.publish(message)
Пример #10
0
def workflow_sendhandler() -> SendHandler:
    return SendHandler(MGMTWORKER_QUEUE, 'direct', routing_key='workflow')