org.openbaton.nse.api.EventReceiver.java Source code

Java tutorial

Introduction

Here is the source code for org.openbaton.nse.api.EventReceiver.java

Source

/*
 *
 *  * Copyright (c) 2016 Open Baton (http://www.openbaton.org)
 *  *
 *  * Licensed under the Apache License, Version 2.0 (the "License");
 *  * you may not use this file except in compliance with the License.
 *  * You may obtain a copy of the License at
 *  *
 *  *     http://www.apache.org/licenses/LICENSE-2.0
 *  *
 *  * Unless required by applicable law or agreed to in writing, software
 *  * distributed under the License is distributed on an "AS IS" BASIS,
 *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  * See the License for the specific language governing permissions and
 *  * limitations under the License.
 *
 */

package org.openbaton.nse.api;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonParser;

import org.openbaton.catalogue.mano.descriptor.InternalVirtualLink;
import org.openbaton.catalogue.mano.record.NetworkServiceRecord;
import org.openbaton.catalogue.mano.record.VirtualNetworkFunctionRecord;
import org.openbaton.catalogue.nfvo.Action;
import org.openbaton.catalogue.nfvo.EndpointType;
import org.openbaton.catalogue.nfvo.EventEndpoint;
import org.openbaton.nse.beans.openbaton.QoSAllocator;
import org.openbaton.nse.properties.NetworkSlicingEngineProperties;
import org.openbaton.nse.properties.RabbitMQProperties;
import org.openbaton.sdk.NFVORequestor;
import org.openbaton.sdk.api.exception.SDKException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.List;

import javax.annotation.PreDestroy;

/**
 * Created by maa on 11.11.15.
 */
@Service
public class EventReceiver implements CommandLineRunner {

    @Autowired
    private NFVORequestor requestor;
    @Autowired
    private RabbitMQProperties rabbitMQProperties;
    @Autowired
    private QoSAllocator creator;
    @Autowired
    private Gson mapper;
    @Autowired
    private NetworkSlicingEngineProperties nse_configuration;

    private Logger logger = LoggerFactory.getLogger(this.getClass());
    private List<String> eventIds;

    public static final String queueName_eventInstantiateFinish = "openbaton.nse.nsr.create";
    public static final String queueName_eventError = "openbaton.nse.nsr.error";
    public static final String queueName_eventScale = "openbaton.nse.nsr.scale";

    private void init() throws SDKException, IOException {

        this.eventIds = new ArrayList<>();

        EventEndpoint eventEndpointCreation = new EventEndpoint();
        eventEndpointCreation.setType(EndpointType.RABBIT);
        eventEndpointCreation.setEvent(Action.INSTANTIATE_FINISH);
        eventEndpointCreation.setEndpoint(queueName_eventInstantiateFinish);
        eventEndpointCreation.setName("eventNsrInstantiateFinish");
        eventEndpointCreation = requestor.getEventAgent().create(eventEndpointCreation);

        EventEndpoint eventEndpointDeletion = new EventEndpoint();
        eventEndpointDeletion.setType(EndpointType.RABBIT);
        eventEndpointDeletion.setEvent(Action.ERROR);
        eventEndpointDeletion.setEndpoint(queueName_eventError);
        eventEndpointDeletion.setName("eventNsrError");
        eventEndpointDeletion = requestor.getEventAgent().create(eventEndpointDeletion);

        EventEndpoint eventEndpointScale = new EventEndpoint();
        eventEndpointScale.setType(EndpointType.RABBIT);
        eventEndpointScale.setEvent(Action.SCALED);
        eventEndpointScale.setEndpoint(queueName_eventScale);
        eventEndpointScale.setName("eventNsrScaleFinish");
        eventEndpointScale = requestor.getEventAgent().create(eventEndpointScale);

        this.eventIds.add(eventEndpointCreation.getId());
        this.eventIds.add(eventEndpointDeletion.getId());
        this.eventIds.add(eventEndpointScale.getId());
    }

    public void receiveConfiguration(String message) {
        logger.debug("received new event " + message);
        Action action;
        NetworkServiceRecord nsr;

        try {
            logger.debug("Trying to deserialize it");
            JsonParser jsonParser = new JsonParser();
            JsonObject json = jsonParser.parse(message).getAsJsonObject();
            action = mapper.fromJson(json.get("action"), Action.class);
            nsr = mapper.fromJson(json.get("payload"), NetworkServiceRecord.class);
        } catch (JsonParseException e) {
            if (logger.isDebugEnabled() || logger.isTraceEnabled())
                logger.warn("Error in payload, expected NSR ", e);
            else
                logger.warn("Error in payload, expected NSR " + e.getMessage());
            return;
        }

        logger.info("[OPENBATON-EVENT-SUBSCRIPTION] received new NSR " + nsr.getId()
                + "for slice allocation at time " + new Date().getTime());
        logger.debug("ACTION: " + action + " PAYLOAD: " + nsr.toString());

        // So here we need to distinguish for the neutron-driver
        // since it only needs to be executed once...
        if (nse_configuration.getDriver().equals("neutron")) {
            // The check if the nsr contains QoS is done afterwards...
            creator.addQos(nsr.getVnfr(), nsr.getId());
            return;
        }
        for (VirtualNetworkFunctionRecord vnfr : nsr.getVnfr()) {
            logger.debug("VNFR: " + vnfr.toString());
            for (InternalVirtualLink vlr : vnfr.getVirtual_link()) {
                logger.debug("VLR: " + vlr.toString());
                if (!vlr.getQos().isEmpty()) {
                    for (String qosAttr : vlr.getQos()) {
                        logger.debug("QoS Attribute: " + qosAttr);
                        if (qosAttr.contains("minimum_bandwith")) {
                            logger.info("[OPENBATON-EVENT-SUBSCRIPTION] sending the NSR " + nsr.getId()
                                    + "for slice allocation to nsr handler at time " + new Date().getTime());
                            creator.addQos(nsr.getVnfr(), nsr.getId());
                        }
                    }
                }
            }
        }
        logger.info("[OPENBATON-EVENT-SUBSCRIPTION] Ended message callback function at " + new Date().getTime());
    }

    public void deleteConfiguration(String message) {

        logger.debug("received new event " + message);
        Action action;
        NetworkServiceRecord nsr;

        try {
            logger.debug("Trying to deserialize it");
            JsonParser jsonParser = new JsonParser();
            JsonObject json = jsonParser.parse(message).getAsJsonObject();
            action = mapper.fromJson(json.get("action"), Action.class);
            nsr = mapper.fromJson(json.get("payload"), NetworkServiceRecord.class);
        } catch (JsonParseException e) {
            if (logger.isDebugEnabled() || logger.isTraceEnabled())
                logger.warn("Error in payload, expected NSR ", e);
            else
                logger.warn("Error in payload, expected NSR " + e.getMessage());
            return;
        }

        logger.info("[OPENBATON-EVENT-SUBSCRIPTION] received new NSR " + nsr.getId() + " for slice removal at time "
                + new Date().getTime());
        logger.debug("ACTION: " + action + " PAYLOAD " + nsr.toString());

        // Neutron handles removing ports with the allocated QoS itself
        if (nse_configuration.getDriver().equals("neutron")) {
            return;
        }
        for (VirtualNetworkFunctionRecord vnfr : nsr.getVnfr()) {
            logger.debug("VNFR: " + vnfr.toString());
            for (InternalVirtualLink vlr : vnfr.getVirtual_link()) {
                logger.debug("VLR: " + vlr.toString());
                if (!vlr.getQos().isEmpty()) {
                    for (String qosAttr : vlr.getQos()) {
                        if (qosAttr.contains("minimum_bandwith")) {
                            logger.info("[OPENBATON-EVENT-SUBSCRIPTION] sending the NSR " + nsr.getId()
                                    + "for slice removal to nsr handler at time " + new Date().getTime());
                            creator.removeQos(nsr.getVnfr(), nsr.getId());
                        }
                    }
                }
            }
        }
    }

    public void scaleConfiguration(String message) {

        logger.debug("received new event " + message);
        Action action;
        VirtualNetworkFunctionRecord vnfr;

        try {
            logger.debug("Trying to deserialize it");
            JsonParser jsonParser = new JsonParser();
            JsonObject json = jsonParser.parse(message).getAsJsonObject();
            action = mapper.fromJson(json.get("action"), Action.class);
            vnfr = mapper.fromJson(json.get("payload"), VirtualNetworkFunctionRecord.class);
        } catch (JsonParseException e) {
            if (logger.isDebugEnabled() || logger.isTraceEnabled())
                logger.warn("Error in payload, expected NSR ", e);
            else
                logger.warn("Error in payload, expected NSR " + e.getMessage());
            return;
        }

        logger.info("[OPENBATON-EVENT-SUBSCRIPTION] received new VNFR " + vnfr.getId()
                + " for scaled slice at time " + new Date().getTime());
        logger.debug("ACTION: " + action + " PAYLOAD " + vnfr.toString());

        for (InternalVirtualLink vlr : vnfr.getVirtual_link()) {
            logger.debug("VLR: " + vlr.toString());
            if (!vlr.getQos().isEmpty()) {
                for (String qosAttr : vlr.getQos()) {
                    if (qosAttr.contains("minimum_bandwith")) {
                        logger.info("[OPENBATON-EVENT-SUBSCRIPTION] sending the VNFR " + vnfr.getId()
                                + "for slice scale to nsr handler at time " + new Date().getTime());
                        creator.addQos(new HashSet<VirtualNetworkFunctionRecord>(Arrays.asList(vnfr)),
                                vnfr.getParent_ns_id());
                    }
                }
            }
        }
    }

    @PreDestroy
    private void dispose() throws SDKException {
        for (String id : this.eventIds) {
            requestor.getEventAgent().delete(id);
        }
    }

    @Bean
    public ConnectionFactory getConnectionFactory(Environment env) {
        logger.debug("Created ConnectionFactory");
        CachingConnectionFactory factory = new CachingConnectionFactory(rabbitMQProperties.getHost());
        factory.setPassword(rabbitMQProperties.getPassword());
        factory.setUsername(rabbitMQProperties.getUsername());
        return factory;
    }

    @Bean
    public TopicExchange getTopic() {
        logger.debug("Created Topic Exchange");
        return new TopicExchange("openbaton-exchange");
    }

    @Bean
    public Queue getCreationQueue() {
        logger.debug("Created Queue for NSR Create event");
        return new Queue(queueName_eventInstantiateFinish, false, false, true);
    }

    @Bean
    public Queue getErrorQueue() {
        logger.debug("Created Queue for NSR error event");
        return new Queue(queueName_eventError, false, false, true);
    }

    @Bean
    public Queue getScaleQueue() {
        logger.debug("Created Queue for NSR scale event");
        return new Queue(queueName_eventScale, false, false, true);
    }

    @Bean
    public Binding setCreationBinding(@Qualifier("getCreationQueue") Queue queue, TopicExchange topicExchange) {
        logger.debug("Created Binding for NSR Creation event");
        return BindingBuilder.bind(queue).to(topicExchange).with("ns-creation");
    }

    @Bean
    public Binding setErrorBinding(@Qualifier("getErrorQueue") Queue queue, TopicExchange topicExchange) {
        logger.debug("Created Binding for NSR error event");
        return BindingBuilder.bind(queue).to(topicExchange).with("ns-error");
    }

    @Bean
    public Binding setScaleBinding(@Qualifier("getScaleQueue") Queue queue, TopicExchange topicExchange) {
        logger.debug("Created Binding for NSR scale event");
        return BindingBuilder.bind(queue).to(topicExchange).with("ns-scale");
    }

    @Bean
    public MessageListenerAdapter setCreationMessageListenerAdapter() {
        return new MessageListenerAdapter(this, "receiveConfiguration");
    }

    @Bean
    public MessageListenerAdapter setErrorMessageListenerAdapter() {
        return new MessageListenerAdapter(this, "deleteConfiguration");
    }

    @Bean
    public MessageListenerAdapter setScaleMessageListenerAdapter() {
        return new MessageListenerAdapter(this, "scaleConfiguration");
    }

    @Bean
    public SimpleMessageListenerContainer setCreationMessageContainer(ConnectionFactory connectionFactory,
            @Qualifier("getCreationQueue") Queue queue,
            @Qualifier("setCreationMessageListenerAdapter") MessageListenerAdapter adapter) {
        logger.debug("Created MessageContainer for NSR Creation event");
        SimpleMessageListenerContainer res = new SimpleMessageListenerContainer();
        res.setConnectionFactory(connectionFactory);
        res.setQueues(queue);
        res.setMessageListener(adapter);
        return res;
    }

    @Bean
    public SimpleMessageListenerContainer setErrorMessageContainer(ConnectionFactory connectionFactory,
            @Qualifier("getErrorQueue") Queue queue,
            @Qualifier("setErrorMessageListenerAdapter") MessageListenerAdapter adapter) {
        logger.debug("Created MessageContainer for NSR error event");
        SimpleMessageListenerContainer res = new SimpleMessageListenerContainer();
        res.setConnectionFactory(connectionFactory);
        res.setQueues(queue);
        res.setMessageListener(adapter);
        return res;
    }

    @Bean
    public SimpleMessageListenerContainer setScaleMessageContainer(ConnectionFactory connectionFactory,
            @Qualifier("getScaleQueue") Queue queue,
            @Qualifier("setScaleMessageListenerAdapter") MessageListenerAdapter adapter) {
        logger.debug("Created MessageContainer for NSR scale event");
        SimpleMessageListenerContainer res = new SimpleMessageListenerContainer();
        res.setConnectionFactory(connectionFactory);
        res.setQueues(queue);
        res.setMessageListener(adapter);
        return res;
    }

    public void run(String... args) throws Exception {
        init();
    }
}