/*
 * Copyright 2015-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.sfc.installer;

import org.onosproject.net.ConnectPoint;
import org.onosproject.net.NshServicePathId;
import org.onosproject.vtnrsc.FiveTuple;
import org.onosproject.vtnrsc.PortChain;

/**
 * Abstraction of an entity which installs flow classification rules in ovs.
 */
public interface FlowClassifierInstallerService {

    /**
     * Install flow classifier.
     *
     * @param portChain port-chain
     * @param nshSpiId service path index identifier
     * @return connectPoint the network identifier
     */
    ConnectPoint installFlowClassifier(PortChain portChain, NshServicePathId nshSpiId);

    /**
     * Uninstall flow classifier.
     *
     * @param portChain port-chain
     * @param nshSpiId service path index identifier
     * @return connectPoint the network identifier
     */
    ConnectPoint unInstallFlowClassifier(PortChain portChain, NshServicePathId nshSpiId);

    /**
     * Install load balanced flow classifier.
     *
     * @param portChain port-chain
     * @param fiveTuple five tuple packet information
     * @param nshSpiId service path index identifier
     * @return connectPoint the network identifier
     */
    ConnectPoint installLoadBalancedFlowClassifier(PortChain portChain, FiveTuple fiveTuple,
                                                   NshServicePathId nshSpiId);

    /**
     * Uninstall load balanced flow classifier.
     *
     * @param portChain port-chain
     * @param fiveTuple five tuple packet information
     * @param nshSpiId service path index identifier
     * @return connectPoint the network identifier
     */
    ConnectPoint unInstallLoadBalancedFlowClassifier(PortChain portChain, FiveTuple fiveTuple,
                                                     NshServicePathId nshSpiId);
}
