/*
 * Copyright 2019-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.k8snode.api;

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

/**
 * Representation of a node used in k8s-networking service.
 */
public interface K8sNode {

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

        /**
         * Signifies that this is a kubernetes minion node.
         */
        MINION
    }

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

    /**
     * Returns the type of the node.
     *
     * @return node type
     */
    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 new kubernetes node instance with given integration bridge.
     *
     * @param deviceId  integration bridge device ID
     * @return updated kubernetes node
     */
    K8sNode updateIntgBridge(DeviceId deviceId);

    /**
     * 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 vxlan mode is not enabled
     */
    IpAddress dataIp();

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

    /**
     * Returns new kubernetes node instance with given state.
     *
     * @param newState updated state
     * @return updated kubernetes node
     */
    K8sNode updateState(K8sNodeState newState);

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

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

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

    /**
     * Returns the host port number.
     *
     * @return host port number; null if the host port does not exist
     */
    PortNumber intBridgePortNum();

    /**
     * Returns the integration bridge's MAC address.
     *
     * @return MAC address; null if the MAC address does not exist
     */
    MacAddress intBridgeMac();

    /**
     * Builder of new node entity.
     */
    interface Builder {

        /**
         * Builds an immutable kubernetes node instance.
         *
         * @return kubernetes node instance
         */
        K8sNode build();

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

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

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

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

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

        /**
         * Returns kubernetes node builder with supplied node state.
         *
         * @param state kubernetes node state
         * @return kubernetes node builder
         */
        Builder state(K8sNodeState state);
    }
}
