/*
 * 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 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 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 a collection of physical interfaces.
     *
     * @return physical interfaces
     */
    Collection<KubevirtPhyInterface> phyIntfs();

    /**
     * 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 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);
    }
}
