/*
 * Copyright 2020-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.kubevirtnode.api;

import org.onlab.packet.IpAddress;
import org.onosproject.net.DeviceId;
import org.onosproject.net.PortNumber;

import java.util.Collection;

/**
 * Representation of a KubeVirt node used in kubevirt networking service.
 */
public interface KubevirtNode {

    /**
     * Lists of kubernetes node types.
     */
    enum Type {
        /**
         * Signifies that this is a kubevirt master node.
         */
        MASTER,

        /**
         * Signifies that this is a kubevirt worker node.
         */
        WORKER,
    }

    /**
     * Returns cluster name of the node.
     *
     * @return cluster name
     */
    String clusterName();

    /**
     * Returns hostname of the node.
     *
     * @return hostname
     */
    String hostname();

    /**
     * Returns the type of the node.
     *
     * @return node type
     */
    KubevirtNode.Type type();

    /**
     * Returns the OVSDB device ID of the node.
     *
     * @return ovsdb device id
     */
    DeviceId ovsdb();

    /**
     * Returns the device ID of the integration bridge at the node.
     *
     * @return device id
     */
    DeviceId intgBridge();

    /**
     * Returns the device ID of the tunnel bridge at the node.
     *
     * @return device id
     */
    DeviceId tunBridge();

    /**
     * Returns the management network IP address of the node.
     *
     * @return ip address
     */
    IpAddress managementIp();

    /**
     * Returns the data network IP address used for tunneling.
     *
     * @return ip address; null if tunnel mode is not enabled
     */
    IpAddress dataIp();

    /**
     * Returns the initialization state of the node.
     *
     * @return node state
     */
    KubevirtNodeState state();

    /**
     * Returns new kubevirt node instance with given state.
     *
     * @param newState updated state
     * @return updated kubevirt node
     */
    KubevirtNode updateState(KubevirtNodeState newState);

    /**
     * Returns new kubevirt node instance with given integration bridge.
     *
     * @param deviceId  integration bridge device ID
     * @return updated kubevirt node
     */
    KubevirtNode updateIntgBridge(DeviceId deviceId);

    /**
     * Returns new kubevirt node instance with given tunnel bridge.
     *
     * @param deviceId  tunnel bridge device ID
     * @return updated kubevirt node
     */
    KubevirtNode updateTunBridge(DeviceId deviceId);

    /**
     * Returns a collection of physical interfaces.
     *
     * @return physical interfaces
     */
    Collection<KubevirtPhyInterface> phyIntfs();

    /**
     * Returns the VXLAN tunnel port.
     *
     * @return VXLAN port number; null if tunnel port does not exist
     */
    PortNumber vxlanPort();

    /**
     * Returns the GRE tunnel port.
     *
     * @return GRE port number; null if the GRE tunnel port does not exist
     */
    PortNumber grePort();

    /**
     * Returns the GENEVE tunnel port number.
     *
     * @return GENEVE port number; null if the GRE tunnel port does not exist
     */
    PortNumber genevePort();

    /**
     * Builder of new node entity.
     */
    interface Builder {
        /**
         * Builds an immutable kubevirt node instance.
         *
         * @return kubevirt node instance
         */
        KubevirtNode build();

        /**
         * Returns kubevirt node builder with supplied cluster name.
         *
         * @param clusterName cluster name
         * @return kubevirt node builder
         */
        KubevirtNode.Builder clusterName(String clusterName);

        /**
         * Returns kubevirt node builder with supplied hostname.
         *
         * @param hostname hostname of the node
         * @return kubevirt node builder
         */
        KubevirtNode.Builder hostname(String hostname);

        /**
         * Returns kubevirt node builder with supplied type.
         *
         * @param type kubevirt node type
         * @return kubevirt node builder
         */
        KubevirtNode.Builder type(KubevirtNode.Type type);

        /**
         * Returns kubevirt node builder with supplied integration bridge name.
         *
         * @param deviceId integration bridge device ID
         * @return kubevirt node builder
         */
        KubevirtNode.Builder intgBridge(DeviceId deviceId);

        /**
         * Returns kubevirt node builder with supplied tunnel bridge name.
         *
         * @param deviceId tunnel bridge device ID
         * @return kubevirt node builder
         */
        KubevirtNode.Builder tunBridge(DeviceId deviceId);

        /**
         * Returns kubevirt node builder with supplied management IP address.
         *
         * @param managementIp management IP address
         * @return kubevirt node builder
         */
        KubevirtNode.Builder managementIp(IpAddress managementIp);

        /**
         * Returns kubevirt node builder with supplied data IP address.
         *
         * @param dataIp data IP address
         * @return kubevirt node builder
         */
        KubevirtNode.Builder dataIp(IpAddress dataIp);

        /**
         * Returns kubevirt node builder with supplied physical interfaces.
         *
         * @param phyIntfs a collection of physical interfaces
         * @return kubevirt node builder
         */
        KubevirtNode.Builder phyIntfs(Collection<KubevirtPhyInterface> phyIntfs);

        /**
         * Returns kubevirt node builder with supplied node state.
         *
         * @param state kubevirt node state
         * @return kubevirt node builder
         */
        KubevirtNode.Builder state(KubevirtNodeState state);
    }
}
