/*
 * Copyright 2016-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.tetunnel.api.tunnel.path;

import org.onosproject.tetunnel.api.lsp.TeLspKey;

import java.util.List;

/**
 * Representation of a TE tunnel path.
 */
public interface TePath {

    /**
     * Types of TE path.
     */
    enum Type {
        /**
         * Designates a dynamically computed path.
         */
        DYNAMIC,
        /**
         * Designates a path with explicit route.
         */
        EXPLICIT
    }

    /**
     * Returns type of this TE path.
     *
     * @return type of this TE path
     */
    Type type();

    /**
     * Returns keys of TE LSPs of this TE path.
     *
     * @return list of keys of TE LSPs
     */
    List<TeLspKey> lsps();

    /**
     * Returns specified route of ths (Explicit) TE path.
     *
     * @return list of TE route subobjects.
     */
    List<TeRouteSubobject> explicitRoute();

    /**
     * Returns secondary TE paths of this TE path.
     *
     * @return list of secondary TE paths.
     */
    List<TePath> secondaryPaths();

    //TODO add more attributes here.
}
