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

import org.openstack4j.model.network.NetFloatingIP;
import org.openstack4j.model.network.Router;
import org.openstack4j.model.network.RouterInterface;

/**
 * Service for administering the inventory of OpenStack router and floating IP.
 */
public interface OpenstackRouterAdminService extends OpenstackRouterService {

    /**
     * Creates a router with the given information.
     *
     * @param osRouter the new router
     */
    void createRouter(Router osRouter);

    /**
     * Updates the router with the given information.
     *
     * @param osRouter updated router
     */
    void updateRouter(Router osRouter);

    /**
     * Removes the router with the given router ID.
     *
     * @param osRouterId router id
     */
    void removeRouter(String osRouterId);

    // TODO fix the logic adding a router interface to a router
    /**
     * Adds a new interface to the router.
     *
     * @param osRouterIface openstack router interface
     */
    void addRouterInterface(RouterInterface osRouterIface);

    /**
     * Updates the router interface.
     *
     * @param osRouterIface openstack router interface
     */
    void updateRouterInterface(RouterInterface osRouterIface);

    /**
     * Removes the router interface.
     *
     * @param osRouterIfaceId openstack router interface id
     */
    void removeRouterInterface(String osRouterIfaceId);

    /**
     * Creates a floating IP with the given information.
     *
     * @param floatingIP the new floating ip
     */
    void createFloatingIp(NetFloatingIP floatingIP);

    /**
     * Updates the floating IP with the given information.
     *
     * @param floatingIP the updated floating ip
     */
    void updateFloatingIp(NetFloatingIP floatingIP);

    /**
     * Removes the floating IP with the given floating IP ID.
     *
     * @param floatingIpId floating ip id
     */
    void removeFloatingIp(String floatingIpId);

    /**
     * Clears the existing routers and floating IPs.
     */
    void clear();
}
