/*
 * Copyright 2016 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.tetopology.management.api;

import org.onosproject.net.provider.ProviderService;
import org.onosproject.tetopology.management.api.link.NetworkLink;
import org.onosproject.tetopology.management.api.link.NetworkLinkKey;
import org.onosproject.tetopology.management.api.node.NetworkNode;
import org.onosproject.tetopology.management.api.node.NetworkNodeKey;
import org.onosproject.tetopology.management.api.node.TerminationPoint;
import org.onosproject.tetopology.management.api.node.TerminationPointKey;

/**
 * APIs for Provider to notify Manager about the network topology updates.
 */
public interface TeTopologyProviderService
           extends ProviderService<TeTopologyProvider> {

    /**
     * Signals that a Network has been created/updated.
     *
     * @param network value of the network to be updated
     */
    void networkUpdated(Network network);

    /**
     * Signals that a Network has been removed.
     *
     * @param networkId network id in URI format
     */
    void networkRemoved(KeyId networkId);

    /**
     * Signals that a Link has been created/updated.
     *
     * @param linkKey link id
     * @param link link object to be updated
    */
    void linkUpdated(NetworkLinkKey linkKey, NetworkLink link);

    /**
     * Signals that a Network has been removed.
     *
     * @param linkKey link id
     */
    void linkRemoved(NetworkLinkKey linkKey);

    /**
     * Signals that a Node has been created/updated.
     *
     * @param nodeKey node id
     * @param node node object to be updated
     */
    void nodeUpdated(NetworkNodeKey nodeKey, NetworkNode node);

    /**
     * Signals that a Node has been removed.
     *
     * @param nodeKey node id
     */
    void nodeRemoved(NetworkNodeKey nodeKey);

    /**
     * Signals that a TerminationPoint has been created/updated.
     *
     * @param terminationPointKey termination point id
     * @param terminationPoint termination point object to be updated
     */
    void terminationPointUpdated(TerminationPointKey terminationPointKey,
                                TerminationPoint terminationPoint);

    /**
     * Signals that a TerminationPoint has been removed.
     *
     * @param terminationPointKey termination point id
     */
    void terminationPointRemoved(TerminationPointKey terminationPointKey);

}
