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

import org.onosproject.cluster.NodeId;
import org.onosproject.cluster.RoleInfo;
import org.onosproject.mastership.MastershipEvent;
import org.onosproject.mastership.MastershipInfo;
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 mastership info for a device.
     *
     * @param networkId virtual network identifier
     * @param deviceId  the device identifier
     * @return the mastership info
     */
    MastershipInfo getMastership(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);
}
