/*
 * Copyright 2016-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.openstacknetworking;

import org.onosproject.net.Host;

import org.onosproject.openstackinterface.OpenstackRouter;
import org.onosproject.openstackinterface.OpenstackRouterInterface;

/**
 * Handles router update requests from OpenStack.
 */
public interface OpenstackRoutingService {

    /**
     * Handles the router create request from OpenStack.
     *
     * @param osRouter router information
     */
    void createRouter(OpenstackRouter osRouter);

    /**
     * Handles the router update request from OpenStack.
     * Update router is called when the name, administrative state, or the external
     * gateway setting is updated. The external gateway update is the only case
     * that openstack routing service cares.
     *
     * @param osRouter router information
     */
    void updateRouter(OpenstackRouter osRouter);

    /**
     * Handles the router remove request from OpenStack.
     *
     * @param osRouterId identifier of the router
     */
    void removeRouter(String osRouterId);

    /**
     * Handles router interface add request from OpenStack.
     *
     * @param osInterface router interface information
     */
    void addRouterInterface(OpenstackRouterInterface osInterface);

    /**
     * Handles router interface remove request from OpenStack.
     *
     * @param osInterface router interface information
     */
    void removeRouterInterface(OpenstackRouterInterface osInterface);

    /**
     * Handles to purge data plane flow of existing VM.
     *
     * @param host VM Host information
     */
    void purgeVmFlow(Host host);

    /**
     * Handles to reinstall data plane flow of existing VM.
     *
     * @param host VM Host information
     */
    void reinstallVmFlow(Host host);
}
