/*
 * Copyright 2015-present Open Networking Foundation
 *
 * 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.onosproject.vtnrsc.event;

import org.onosproject.event.AbstractEvent;


/**
 * Describes network vtnrsc event.
 */
public class VtnRscEvent
        extends AbstractEvent<VtnRscEvent.Type, VtnRscEventFeedback> {

    /**
     * Type of vtnrsc events.
     */
    public enum Type {
        /**
         * Signifies that floating IP has create.
         */
        FLOATINGIP_PUT,
        /**
         * Signifies that floating IP has delete.
         */
        FLOATINGIP_DELETE,
        /**
         * Signifies that Floating IP has been bound.
         */
        FLOATINGIP_BIND,
        /**
         * Signifies that Floating IP has been unbound.
         */
        FLOATINGIP_UNBIND,
        /**
         * Signifies that router has create.
         */
        ROUTER_PUT,
        /**
         * Signifies that router has delete.
         */
        ROUTER_DELETE,
        /**
         * Signifies that router interface has add.
         */
        ROUTER_INTERFACE_PUT,
        /**
         * Signifies that router interface has remove.
         */
        ROUTER_INTERFACE_DELETE,
        /**
         * Signifies that port-pair has add.
         */
        PORT_PAIR_PUT,
        /**
         * Signifies that port-pair has remove.
         */
        PORT_PAIR_DELETE,
        /**
         * Signifies that port-pair has update.
         */
        PORT_PAIR_UPDATE,
        /**
         * Signifies that port-pair-group has add.
         */
        PORT_PAIR_GROUP_PUT,
        /**
         * Signifies that port-pair-group has remove.
         */
        PORT_PAIR_GROUP_DELETE,
        /**
         * Signifies that port-pair-group has update.
         */
        PORT_PAIR_GROUP_UPDATE,
        /**
         * Signifies that flow-classifier has add.
         */
        FLOW_CLASSIFIER_PUT,
        /**
         * Signifies that flow-classifier has remove.
         */
        FLOW_CLASSIFIER_DELETE,
        /**
         * Signifies that flow-classifier has update.
         */
        FLOW_CLASSIFIER_UPDATE,
        /**
         * Signifies that port-chain has add.
         */
        PORT_CHAIN_PUT,
        /**
         * Signifies that port-chain has remove.
         */
        PORT_CHAIN_DELETE,
        /**
         * Signifies that port-chain has update.
         */
        PORT_CHAIN_UPDATE,
        /**
         * Signifies that virtual-port has created.
         */
        VIRTUAL_PORT_PUT,
        /**
         * Signifies that virtual-port has removed.
         */
        VIRTUAL_PORT_DELETE
    }

    /**
     * Creates an event of a given type and for the specified vtn event feedback.
     *
     * @param type Vtnrsc event type
     * @param vtnFeedback event VtnrscEventFeedback subject
     */
    public VtnRscEvent(Type type, VtnRscEventFeedback vtnFeedback) {
        super(type, vtnFeedback);
    }

    /**
     * Creates an event of a given type and for the specified vtn event feedback.
     *
     * @param type Vtnrsc event type
     * @param vtnFeedback event VtnrscEventFeedback subject
     * @param time occurrence time
     */
    public VtnRscEvent(Type type, VtnRscEventFeedback vtnFeedback, long time) {
        super(type, vtnFeedback, time);
    }
}
