Search in sources :

Example 26 with AiravataException

use of org.apache.airavata.common.exception.AiravataException in project airavata by apache.

the class RabbitMQPublisher method publish.

@Override
public void publish(MessageContext messageContext) throws AiravataException {
    try {
        byte[] body = ThriftUtils.serializeThriftObject(messageContext.getEvent());
        Message message = new Message();
        message.setEvent(body);
        message.setMessageId(messageContext.getMessageId());
        message.setMessageType(messageContext.getType());
        message.setUpdatedTime(messageContext.getUpdatedTime().getTime());
        String routingKey = routingKeySupplier.apply(messageContext);
        // log.info("publish messageId:" + messageContext.getMessageId() + ", messageType:" + messageContext.getType() + ", to routingKey:" + routingKey);
        byte[] messageBody = ThriftUtils.serializeThriftObject(message);
        send(messageBody, routingKey);
    } catch (TException e) {
        String msg = "Error while deserializing the object";
        log.error(msg, e);
        throw new AiravataException(msg, e);
    } catch (Exception e) {
        String msg = "Error while sending to rabbitmq";
        log.error(msg, e);
        throw new AiravataException(msg, e);
    }
}
Also used : TException(org.apache.thrift.TException) Message(org.apache.airavata.model.messaging.event.Message) TException(org.apache.thrift.TException) IOException(java.io.IOException) ShutdownSignalException(com.rabbitmq.client.ShutdownSignalException) AiravataException(org.apache.airavata.common.exception.AiravataException) AiravataException(org.apache.airavata.common.exception.AiravataException)

Example 27 with AiravataException

use of org.apache.airavata.common.exception.AiravataException in project airavata by apache.

the class RabbitMQSubscriber method createConnection.

private void createConnection() throws AiravataException {
    try {
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setUri(properties.getBrokerUrl());
        connectionFactory.setAutomaticRecoveryEnabled(properties.isAutoRecoveryEnable());
        connection = connectionFactory.newConnection();
        addShutdownListener();
        log.info("connected to rabbitmq: " + connection + " for " + properties.getExchangeName());
        channel = connection.createChannel();
        channel.basicQos(properties.getPrefetchCount());
        channel.exchangeDeclare(properties.getExchangeName(), properties.getExchangeType(), // durable
        true);
    } catch (Exception e) {
        String msg = "could not open channel for exchange " + properties.getExchangeName();
        log.error(msg);
        throw new AiravataException(msg, e);
    }
}
Also used : ConnectionFactory(com.rabbitmq.client.ConnectionFactory) IOException(java.io.IOException) ShutdownSignalException(com.rabbitmq.client.ShutdownSignalException) AiravataException(org.apache.airavata.common.exception.AiravataException) AiravataException(org.apache.airavata.common.exception.AiravataException)

Example 28 with AiravataException

use of org.apache.airavata.common.exception.AiravataException in project airavata by apache.

the class RabbitMQSubscriber method listen.

@Override
public String listen(BiFunction<Connection, Channel, Consumer> supplier, String queueName, List<String> routingKeys) throws AiravataException {
    try {
        if (!channel.isOpen()) {
            channel = connection.createChannel();
            channel.exchangeDeclare(properties.getExchangeName(), properties.getExchangeType(), false);
        }
        if (queueName == null) {
            queueName = channel.queueDeclare().getQueue();
        } else {
            channel.queueDeclare(queueName, // durable
            true, // exclusive
            false, // autoDelete
            false, // arguments
            null);
        }
        final String id = getId(routingKeys, queueName);
        if (queueDetailMap.containsKey(id)) {
            throw new IllegalStateException("This subscriber is already defined for this Subscriber, " + "cannot define the same subscriber twice");
        }
        // bind all the routing keys
        for (String key : routingKeys) {
            // log.info("Binding key:" + key + " to queue:" + queueName);
            channel.queueBind(queueName, properties.getExchangeName(), key);
        }
        channel.basicConsume(queueName, properties.isAutoAck(), properties.getConsumerTag(), supplier.apply(connection, channel));
        queueDetailMap.put(id, new QueueDetail(queueName, routingKeys));
        return id;
    } catch (IOException e) {
        String msg = "could not open channel for exchange " + properties.getExchangeName();
        log.error(msg);
        throw new AiravataException(msg, e);
    }
}
Also used : IOException(java.io.IOException) AiravataException(org.apache.airavata.common.exception.AiravataException)

Example 29 with AiravataException

use of org.apache.airavata.common.exception.AiravataException in project airavata by apache.

the class SharingServiceDBEventHandler method onMessage.

@Override
public void onMessage(MessageContext messageContext) {
    log.info("New DB Event message to sharing service.");
    try {
        byte[] bytes = ThriftUtils.serializeThriftObject(messageContext.getEvent());
        DBEventMessage dbEventMessage = new DBEventMessage();
        ThriftUtils.createThriftFromBytes(bytes, dbEventMessage);
        log.info("DB Event message to sharing service from " + dbEventMessage.getPublisherService());
        DBEventMessageContext dBEventMessageContext = dbEventMessage.getMessageContext();
        try {
            switch(dBEventMessageContext.getPublisher().getPublisherContext().getEntityType()) {
                case USER_PROFILE:
                    log.info("User profile specific DB Event communicated by " + dbEventMessage.getPublisherService());
                    UserProfile userProfile = new UserProfile();
                    ThriftUtils.createThriftFromBytes(dBEventMessageContext.getPublisher().getPublisherContext().getEntityDataModel(), userProfile);
                    User user = ThriftDataModelConversion.getUser(userProfile);
                    switch(dBEventMessageContext.getPublisher().getPublisherContext().getCrudType()) {
                        case CREATE:
                            log.info("Creating user. User Id : " + user.getUserId());
                            sharingRegistryClient.createUser(user);
                            log.debug("User created. User Id : " + user.getUserId());
                            break;
                        case READ:
                            // FIXME: Remove if not required
                            break;
                        case UPDATE:
                            log.info("Updating user. User Id : " + user.getUserId());
                            sharingRegistryClient.updatedUser(user);
                            log.debug("User updated. User Id : " + user.getUserId());
                            break;
                        case DELETE:
                            log.info("Deleting user. User Id : " + user.getUserId());
                            sharingRegistryClient.deleteUser(user.getDomainId(), user.getUserId());
                            log.debug("User deleted. User Id : " + user.getUserId());
                            break;
                    }
                    break;
                case TENANT:
                    log.info("Tenant specific DB Event communicated by " + dbEventMessage.getPublisherService());
                    Gateway gateway = new Gateway();
                    ThriftUtils.createThriftFromBytes(dBEventMessageContext.getPublisher().getPublisherContext().getEntityDataModel(), gateway);
                    switch(dBEventMessageContext.getPublisher().getPublisherContext().getCrudType()) {
                        case CREATE:
                        case UPDATE:
                            // Only create the domain is it doesn't already exist
                            if (sharingRegistryClient.isDomainExists(gateway.getGatewayId())) {
                                break;
                            }
                            /*
                                Following set of DB operations should happen in a transaction
                                As these are thrift calls we cannot enforce this restriction
                                If something goes wrong, message would get queued again and try to create
                                 DB entities which are already present. We catch DuplicateEntryException and
                                 log as a warning to handle such scenarios and move ahead.
                                 */
                            log.info("Creating domain. Id : " + gateway.getGatewayId());
                            Domain domain = new Domain();
                            domain.setDomainId(gateway.getGatewayId());
                            domain.setName(gateway.getGatewayName());
                            domain.setDescription("Domain entry for " + domain.name);
                            try {
                                sharingRegistryClient.createDomain(domain);
                                log.debug("Domain created. Id : " + gateway.getGatewayId());
                            } catch (DuplicateEntryException ex) {
                                log.warn("DuplicateEntryException while consuming TENANT create message, ex: " + ex.getMessage() + ", Domain Id : " + gateway.getGatewayId(), ex);
                            }
                            // Creating Entity Types for each domain
                            log.info("Creating entity type. Id : " + domain.domainId + ":PROJECT");
                            org.apache.airavata.sharing.registry.models.EntityType entityType = new org.apache.airavata.sharing.registry.models.EntityType();
                            entityType.setEntityTypeId(domain.domainId + ":PROJECT");
                            entityType.setDomainId(domain.domainId);
                            entityType.setName("PROJECT");
                            entityType.setDescription("Project entity type");
                            try {
                                sharingRegistryClient.createEntityType(entityType);
                                log.debug("Entity type created. Id : " + domain.domainId + ":PROJECT");
                            } catch (DuplicateEntryException ex) {
                                log.warn("DuplicateEntryException while consuming TENANT create message, ex: " + ex.getMessage() + ", Entity Id : " + domain.domainId + ":PROJECT", ex);
                            }
                            log.info("Creating entity type. Id : " + domain.domainId + ":EXPERIMENT");
                            entityType = new org.apache.airavata.sharing.registry.models.EntityType();
                            entityType.setEntityTypeId(domain.domainId + ":EXPERIMENT");
                            entityType.setDomainId(domain.domainId);
                            entityType.setName("EXPERIMENT");
                            entityType.setDescription("Experiment entity type");
                            try {
                                sharingRegistryClient.createEntityType(entityType);
                                log.debug("Entity type created. Id : " + domain.domainId + ":EXPERIMENT");
                            } catch (DuplicateEntryException ex) {
                                log.warn("DuplicateEntryException while consuming TENANT create message, ex: " + ex.getMessage() + ", Entity Id : " + domain.domainId + ":EXPERIMENT", ex);
                            }
                            log.info("Creating entity type. Id : " + domain.domainId + ":FILE");
                            entityType = new org.apache.airavata.sharing.registry.models.EntityType();
                            entityType.setEntityTypeId(domain.domainId + ":FILE");
                            entityType.setDomainId(domain.domainId);
                            entityType.setName("FILE");
                            entityType.setDescription("File entity type");
                            try {
                                sharingRegistryClient.createEntityType(entityType);
                                log.debug("Entity type created. Id : " + domain.domainId + ":FILE");
                            } catch (DuplicateEntryException ex) {
                                log.warn("DuplicateEntryException while consuming TENANT create message, ex: " + ex.getMessage() + ", Entity Id : " + domain.domainId + ":FILE", ex);
                            }
                            // Creating Permission Types for each domain
                            log.info("Creating Permission Type. Id : " + domain.domainId + ":READ");
                            PermissionType permissionType = new PermissionType();
                            permissionType.setPermissionTypeId(domain.domainId + ":READ");
                            permissionType.setDomainId(domain.domainId);
                            permissionType.setName("READ");
                            permissionType.setDescription("Read permission type");
                            try {
                                sharingRegistryClient.createPermissionType(permissionType);
                                log.debug("Permission Type created. Id : " + domain.domainId + ":READ");
                            } catch (DuplicateEntryException ex) {
                                log.warn("DuplicateEntryException while consuming TENANT create message, ex: " + ex.getMessage() + ", Permission Id : " + domain.domainId + ":READ", ex);
                            }
                            log.info("Creating Permission Type. Id : " + domain.domainId + ":WRITE");
                            permissionType = new PermissionType();
                            permissionType.setPermissionTypeId(domain.domainId + ":WRITE");
                            permissionType.setDomainId(domain.domainId);
                            permissionType.setName("WRITE");
                            permissionType.setDescription("Write permission type");
                            try {
                                sharingRegistryClient.createPermissionType(permissionType);
                                log.debug("Permission Type created. Id : " + domain.domainId + ":WRITE");
                            } catch (DuplicateEntryException ex) {
                                log.warn("DuplicateEntryException while consuming TENANT create message, ex: " + ex.getMessage() + ", Permission Id : " + domain.domainId + ":WRITE", ex);
                            }
                            break;
                    }
                    break;
                default:
                    log.error("Handler not defined for " + dBEventMessageContext.getPublisher().getPublisherContext().getEntityType());
            }
        } catch (DuplicateEntryException ex) {
            // log this exception and proceed (do nothing)
            // this exception is thrown mostly when messages are re-consumed in case of some exception, hence ignore
            log.warn("DuplicateEntryException while consuming db-event message, ex: " + ex.getMessage(), ex);
        }
        log.info("Sending ack. Message Delivery Tag : " + messageContext.getDeliveryTag());
        SharingServiceDBEventMessagingFactory.getDBEventSubscriber().sendAck(messageContext.getDeliveryTag());
    } catch (TException e) {
        log.error("Error processing message.", e);
    } catch (ApplicationSettingsException e) {
        log.error("Error fetching application settings.", e);
    } catch (AiravataException e) {
        log.error("Error sending ack. Message Delivery Tag : " + messageContext.getDeliveryTag(), e);
    }
}
Also used : TException(org.apache.thrift.TException) DBEventMessage(org.apache.airavata.model.dbevent.DBEventMessage) ApplicationSettingsException(org.apache.airavata.common.exception.ApplicationSettingsException) User(org.apache.airavata.sharing.registry.models.User) UserProfile(org.apache.airavata.model.user.UserProfile) PermissionType(org.apache.airavata.sharing.registry.models.PermissionType) DBEventMessageContext(org.apache.airavata.model.dbevent.DBEventMessageContext) Gateway(org.apache.airavata.model.workspace.Gateway) DuplicateEntryException(org.apache.airavata.model.error.DuplicateEntryException) Domain(org.apache.airavata.sharing.registry.models.Domain) AiravataException(org.apache.airavata.common.exception.AiravataException)

Example 30 with AiravataException

use of org.apache.airavata.common.exception.AiravataException in project airavata by apache.

the class ParameterNode method addConfigurationElement.

@Override
protected XmlElement addConfigurationElement(XmlElement nodeElement) {
    XmlElement configElement = nodeElement.addElement(GraphSchema.NS, GraphSchema.NODE_CONFIG_TAG);
    if (this.configured) {
        // Don't save the name here if this node has not been configured.
        XmlElement nameElement = configElement.addElement(GraphSchema.NS, NAME_TAG);
        nameElement.addChild(this.configuredName);
    }
    if (this.description != null) {
        XmlElement descriptionElement = configElement.addElement(GraphSchema.NS, DESCRIPTION_TAG);
        descriptionElement.addChild(this.description);
    }
    if (this.parameterType != null) {
        XmlElement qnameElement = configElement.addElement(GraphSchema.NS, DATA_TYPE_QNAME_TAG);
        qnameElement.addChild(this.parameterType.toString());
    }
    if (this.metadata != null) {
        XmlElement metadataElement = configElement.addElement(GraphSchema.NS, METADATA_TAG);
        // called multiple times.
        try {
            metadataElement.addChild(XMLUtil.deepClone(this.metadata));
        } catch (AiravataException e) {
            log.error(e.getMessage(), e);
        }
    }
    return configElement;
}
Also used : XmlElement(org.xmlpull.infoset.XmlElement) AiravataException(org.apache.airavata.common.exception.AiravataException)

Aggregations

AiravataException (org.apache.airavata.common.exception.AiravataException)40 IOException (java.io.IOException)10 TException (org.apache.thrift.TException)8 GFacException (org.apache.airavata.gfac.core.GFacException)6 RegistryException (org.apache.airavata.registry.cpi.RegistryException)6 XmlElement (org.xmlpull.infoset.XmlElement)5 ShutdownSignalException (com.rabbitmq.client.ShutdownSignalException)4 ApplicationSettingsException (org.apache.airavata.common.exception.ApplicationSettingsException)4 ProcessContext (org.apache.airavata.gfac.core.context.ProcessContext)4 MessagingException (javax.mail.MessagingException)3 MessageContext (org.apache.airavata.messaging.core.MessageContext)3 Session (com.jcraft.jsch.Session)2 ConnectionFactory (com.rabbitmq.client.ConnectionFactory)2 URI (java.net.URI)2 ArrayList (java.util.ArrayList)2 Matcher (java.util.regex.Matcher)2 Pattern (java.util.regex.Pattern)2 Flags (javax.mail.Flags)2 Message (javax.mail.Message)2 EmailParser (org.apache.airavata.gfac.core.monitor.EmailParser)2