/*
 * Copyright 2015 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.vtnrsc.tunnel;

import org.onosproject.vtnrsc.Subnet;
import org.onosproject.vtnrsc.SubnetId;


/**
 * Service for interacting with the inventory of subnets.
 */
public interface TunnelConfigService {
    /**
     * Returns the subnet with the specified identifier.
     *
     * @param subnetId subnet identifier
     * @return true or false
     */
    boolean exists(SubnetId subnetId);
    /**
     * Returns a collection of the currently known subnets.
     *
     * @return iterable collection of subnets
     */
    Iterable<Subnet> getSubnets();

    /**
     * Returns the subnet with the specified identifier.
     *
     * @param subnetId subnet identifier
     * @return subnet or null if one with the given identifier is not known
     */
    Subnet getSubnet(SubnetId subnetId);
    /**
     * Creates new subnets.
     *
     * @param subnets the iterable collection of subnets
     * @return true  if the identifier subnet has been created right
     */
    boolean createSubnets(Iterable<Subnet> subnets);

    /**
     * Updates existing subnets.
     *
     * @param subnets the iterable collection of subnets
     * @return true if all subnets were updated successfully
     */
    boolean updateSubnets(Iterable<Subnet> subnets);

    /**
     * Administratively removes the specified subnets from the store.
     *
     * @param subnetIds the iterable collection of  subnets identifier
     * @return true if remove identifier subnets successfully
     */
    boolean removeSubnets(Iterable<SubnetId> subnetIds);


}
