/*
 * 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.net.statistic;

import org.onosproject.net.ConnectPoint;
import org.onosproject.net.flow.FlowEntry;
import org.onosproject.net.flow.FlowRule;

import java.util.Set;

/**
 * Flow Store to house the computed statistics.
 */
public interface FlowStatisticStore {
    /**
     * Remove entries associated with this rule.
     *
     * @param rule {@link org.onosproject.net.flow.FlowRule}
     */
    void removeFlowStatistic(FlowRule rule);

    /**
     * Adds a flow stats observation for a flow rule. The previous flow will be removed.
     *
     * @param rule a {@link org.onosproject.net.flow.FlowEntry}
     */
    void addFlowStatistic(FlowEntry rule);

    /**
     * Updates a stats observation for a flow rule. The old flow stats will be moved to previous stats.
     *
     * @param rule a {@link org.onosproject.net.flow.FlowEntry}
     */
    void updateFlowStatistic(FlowEntry rule);

    /**
     * Fetches the current observed flow stats values.
     *
     * @param connectPoint the port to fetch information for
     * @return set of current flow rules
     */
    Set<FlowEntry> getCurrentFlowStatistic(ConnectPoint connectPoint);

    /**
     * Fetches the current observed flow stats values.
     *
     * @param connectPoint the port to fetch information for
     * @return set of current values
     */
    Set<FlowEntry> getPreviousFlowStatistic(ConnectPoint connectPoint);
}
