
/*
 * 
 *   Copyright 2016 RIFT.IO Inc
 *
 *   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.
 *
 *
 */

module vlr
{
  namespace "urn:ietf:params:xml:ns:yang:nfvo:vlr";
  prefix "vlr";

  import rw-pb-ext {
    prefix "rwpb";
  }

  import ietf-inet-types {
    prefix "inet";
  }

  import ietf-yang-types {
    prefix "yang";
  }

  import mano-types {
    prefix "manotypes";
  }


  revision 2015-09-10 {
    description
      "Initial revision. This YANG file defines
       the Virtual Link Record (VLR)";
    reference
      "Derived from earlier versions of base YANG files";
  }

  container vlr-catalog {
    config false;

    list vlr {
      key "id";
      unique "name";

      leaf id {
        description "Identifier for the VLR.";
        type yang:uuid;
      }

      leaf name {
        description "VLR name.";
        type string;
      }

      leaf nsr-id-ref {
        description 
            "NS instance identifier. 
             This is a leafref /nsr:ns-instance-config/nsr:nsr/nsr:id";
        type yang:uuid;
      }

      leaf vld-ref {
        description
          "Reference to VLD
           /nsr:ns-instance-config/nsr:nsr[nsr:id=../nsr-id-ref]/nsd/vld:vld/vld:id";
        type string;
      }

      leaf res-id {
        description "Identifier for resmgr id mapping";
        type yang:uuid;
      }

      leaf short-name {
        description "Short name to appear as label in the UI";
        type string;
      }

      leaf vendor {
        description "Provider of the VLR.";
        type string;
      }

      leaf description {
        description "Description of the VLR.";
        type string;
      }

      leaf version {
        description "Version of the VLR";
        type string;
      }

      leaf type {
        type manotypes:virtual-link-type;
      }

      leaf root-bandwidth {
        description
            "For ELAN this is the aggregate bandwidth.";
        type uint64;
      }

      leaf leaf-bandwidth {
        description
            "For ELAN this is the bandwidth of branches.";
        type uint64;
      }

      leaf create-time {
        description
          "Creation timestamp of this Virtual Link.
          The timestamp is expressed as seconds 
          since unix epoch - 1970-01-01T00:00:00Z";

        type uint32;
      }

      leaf uptime {
        description
          "Active period of this Virtual Link.
          Uptime is expressed in seconds";

        type uint32;
      }

      leaf network-id {
        description 
            "Identifier for the allocated network resource.";
        type string;
      }

      leaf vim-network-name {
        description
            "Name of network in VIM account. This is used to indicate
            pre-provisioned network name in cloud account.";
        type string;
      }

      // replicate for pnfd container here

      uses manotypes:provider-network;
      uses manotypes:ip-profile-info;
      
      leaf status {
        description
            "Status of the virtual link record.";
        type enumeration {
          enum LINK_UP;
          enum DEGRADED;
          enum LINK_DOWN;
        }
      }
      leaf operational-status {
        description
          "The operational status of the Virtual Link
            init                 : The VL is in init stat.
            vl-alloc-pending     : The VL alloc is pending in VIM
            running              : The VL is up  and running in VM
            vl-terminate-pending : The VL is being terminated in VIM.
            terminated           : The VL is terminated in the VM.
            failed               : The VL instantiation failed in VIM.
          ";

        type enumeration {
          rwpb:enum-type "VlOperationalStatus";
          enum init;
          enum vl-alloc-pending;
          enum running;
          enum vl-terminate-pending;
          enum terminated;
          enum failed;
        }
      }
    }
  }
}

