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

import org.onosproject.event.ListenerService;
import org.onosproject.vtnrsc.PortPair;
import org.onosproject.vtnrsc.PortPairId;
/**
 * Service for interacting with the inventory of port pairs.
 */
public interface PortPairService extends ListenerService<PortPairEvent, PortPairListener> {

    /**
     * Returns if the port pair is existed.
     *
     * @param portPairId port pair identifier
     * @return true or false if one with the given identifier exists.
     */
    boolean exists(PortPairId portPairId);

    /**
     * Returns the number of port pairs known to the system.
     *
     * @return number of port pairs.
     */
    int getPortPairCount();

    /**
     * Returns an iterable collection of the currently known port pairs.
     *
     * @return collection of port pairs.
     */
    Iterable<PortPair> getPortPairs();

    /**
     * Returns the portPair with the given identifier.
     *
     * @param portPairId port pair identifier
     * @return PortPair or null if port pair with the given identifier is not
     *         known.
     */
    PortPair getPortPair(PortPairId portPairId);

    /**
     * Creates a PortPair in the store.
     *
     * @param portPair the port pair to create
     * @return true if given port pair is created successfully.
     */
    boolean createPortPair(PortPair portPair);

    /**
     * Updates the portPair in the store.
     *
     * @param portPair the port pair to update
     * @return true if given port pair is updated successfully.
     */
    boolean updatePortPair(PortPair portPair);

    /**
     * Deletes portPair by given portPairId.
     *
     * @param portPairId id of port pair to remove
     * @return true if the give port pair is deleted successfully.
     */
    boolean removePortPair(PortPairId portPairId);
}
