/*
 * Copyright 2016-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.nemo.model.object.node.instance;

import org.onosproject.nemo.model.common.PropertyName;
import org.onosproject.nemo.model.object.property.instance.PropertyValues;

/**
 * Single property's information.
 */
public interface Property {

    /**
     * Returns the primary key of YANG list type.
     *
     * @return the key
     */
    PropertyKey getKey();

    /**
     * Returns a unique name for a kind of property.
     *
     * @return a unique name
     */
    PropertyName getPropertyName();

    /**
     * Returns a value for a kind of property.
     *
     * @return a value of the property
     */
    PropertyValues getPropertyValues();
}