/*
 * Copyright 2015 Open Networking Laboratory
 *
 * 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;

import java.util.Collection;
import java.util.Set;

import org.onlab.packet.MacAddress;
import org.onosproject.net.DeviceId;

/**
 * Representation of the VirtualPort.
 */
public interface VirtualPort {
    /**
     * Coarse classification of the type of the virtual port.
     */
    public enum State {
        /**
         * Signifies that a virtualPort is currently active,This state mean that
         * this virtualPort is available.
         */
        ACTIVE,
        /**
         * Signifies that a virtualPort is currently unavailable.
         */
        DOWN;
    }

    /**
     * Returns the virtualPort identifier.
     *
     * @return virtualPort identifier
     */
    VirtualPortId portId();

    /**
     * Returns the network identifier.
     *
     * @return tenantNetwork identifier
     */
    TenantNetworkId networkId();

    /**
     * Returns the symbolic name for the virtualPort.
     *
     * @return virtualPort name
     */
    String name();

    /**
     * Returns the administrative status of the port,which is up(true) or
     * down(false).
     *
     * @return true if the administrative status of the port is up
     */
    boolean adminStateUp();

    /**
     * Returns the state.
     *
     * @return state
     */
    State state();

    /**
     * Returns the MAC address.
     *
     * @return MAC Address
     */
    MacAddress macAddress();

    /**
     * Returns the port tenantId.
     *
     * @return port tenantId
     */
    TenantId tenantId();

    /**
     * Returns the device identifier.
     *
     * @return deviceId
     */
    DeviceId deviceId();

    /**
     * Returns the identifier of the entity that uses this port.
     *
     * @return deviceOwner
     */
    String deviceOwner();

    /**
     * Returns the virtualPort allowedAddressPairs.
     *
     * @return virtualPort allowedAddressPairs
     */
    Collection<AllowedAddressPair> allowedAddressPairs();

    /**
     * Returns set of IP addresses for the port, include the IP addresses and subnet
     * identity.
     *
     * @return FixedIps Set of fixedIp
     */
    Set<FixedIp> fixedIps();

    /**
     * Returns the virtualPort bindinghostId.
     *
     * @return virtualPort bindinghostId
     */
    BindingHostId bindingHostId();

    /**
     * Returns the virtualPort bindingVnicType.
     *
     * @return virtualPort bindingVnicType
     */
    String bindingVnicType();

    /**
     * Returns the virtualPort bindingVifType.
     *
     * @return virtualPort bindingVifType
     */
    String bindingVifType();

    /**
     * Returns the virtualPort bindingvifDetail.
     *
     * @return virtualPort bindingvifDetail
     */
    String bindingVifDetails();

    /**
     * Returns the security groups.
     *
     * @return port security groups
     */
    Iterable<SecurityGroup> securityGroups();
}
