/*
 * Copyright 2017-present 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.incubator.net.virtual;

import org.onosproject.cluster.NodeId;
import org.onosproject.cluster.RoleInfo;
import org.onosproject.mastership.MastershipEvent;
import org.onosproject.mastership.MastershipStoreDelegate;
import org.onosproject.mastership.MastershipTerm;
import org.onosproject.net.DeviceId;
import org.onosproject.net.MastershipRole;

import java.util.Set;
import java.util.concurrent.CompletableFuture;

/**
 * Manages inventory of mastership roles for devices, across controller
 * instances for virtual networks; not intended for direct use.
 */
public interface VirtualNetworkMastershipStore
        extends VirtualStore<MastershipEvent, MastershipStoreDelegate> {

    // three things to map: NodeId, DeviceId, MastershipRole

    /**
     * Requests role of the local node for the specified device.
     *
     * @param networkId the virtual network identifier
     * @param deviceId  the device identifier
     * @return established or newly negotiated mastership role
     */
    CompletableFuture<MastershipRole> requestRole(NetworkId networkId, DeviceId deviceId);

    /**
     * Returns the role of a device for a specific controller instance.
     *
     * @param networkId virtual network identifier
     * @param nodeId    the instance identifier
     * @param deviceId  the device identifiers
     * @return the role
     */
    MastershipRole getRole(NetworkId networkId, NodeId nodeId, DeviceId deviceId);

    /**
     * Returns the master for a device.
     *
     * @param networkId virtual network identifier
     * @param deviceId  the device identifier
     * @return the instance identifier of the master
     */
    NodeId getMaster(NetworkId networkId, DeviceId deviceId);

    /**
     * Returns the master and backup nodes for a device.
     *
     * @param networkId virtual network identifier
     * @param deviceId  the device identifier
     * @return a RoleInfo containing controller IDs
     */
    RoleInfo getNodes(NetworkId networkId, DeviceId deviceId);

    /**
     * Returns the devices that a controller instance is master of.
     *
     * @param networkId virtual network identifier
     * @param nodeId    the instance identifier
     * @return a set of device identifiers
     */
    Set<DeviceId> getDevices(NetworkId networkId, NodeId nodeId);


    /**
     * Sets a device's role for a specified controller instance.
     *
     * @param networkId virtual network identifier
     * @param nodeId    controller instance identifier
     * @param deviceId  device identifier
     * @return a mastership event
     */
    CompletableFuture<MastershipEvent> setMaster(NetworkId networkId,
                                                 NodeId nodeId, DeviceId deviceId);

    /**
     * Returns the current master and number of past mastership hand-offs
     * (terms) for a device.
     *
     * @param networkId virtual network identifier
     * @param deviceId  the device identifier
     * @return the current master's ID and the term value for device, or null
     */
    MastershipTerm getTermFor(NetworkId networkId, DeviceId deviceId);

    /**
     * Sets a controller instance's mastership role to STANDBY for a device.
     * If the role is MASTER, another controller instance will be selected
     * as a candidate master.
     *
     * @param networkId virtual network identifier
     * @param nodeId    the controller instance identifier
     * @param deviceId  device to revoke mastership role for
     * @return a mastership event
     */
    CompletableFuture<MastershipEvent> setStandby(NetworkId networkId,
                                                  NodeId nodeId, DeviceId deviceId);

    /**
     * Allows a controller instance to give up its current role for a device.
     * If the role is MASTER, another controller instance will be selected
     * as a candidate master.
     *
     * @param networkId virtual network identifier
     * @param nodeId    the controller instance identifier
     * @param deviceId  device to revoke mastership role for
     * @return a mastership event
     */
    CompletableFuture<MastershipEvent> relinquishRole(NetworkId networkId,
                                                      NodeId nodeId, DeviceId deviceId);

    /**
     * Removes all the roles for the specified controller instance.
     * If the role was MASTER, another controller instance will be selected
     * as a candidate master.
     *
     * @param networkId virtual network identifier
     * @param nodeId    the controller instance identifier
     */
    void relinquishAllRole(NetworkId networkId, NodeId nodeId);
}
