/*
  Copyright 2020 Whitestack LLC

  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 ns-vld {
    yang-version 1.1;
    namespace "urn:etsi:osm:yang:augments:ns-vld";
    prefix "ns-vld";

    import etsi-nfv-nsd {
        prefix nsd;
    }

    import ietf-inet-types {
        prefix inet;
    }

    grouping extended-vld {
        container provider-network {
            description
              "Container for the provider network.";
            leaf physical-network {
                description
                  "Name of the physical network on which the provider
                   network is built.";
                type string;
            }

            leaf segmentation_id {
                description
                  "ID of segregated virtual networks";
                type uint32;
            }
        }

        leaf mgmt-network {
            description
              "Flag indicating whether this network is a VIM management network";
            type boolean;
            default false;
        }

        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;
        }
    }

    augment "/nsd:nsd/nsd:nsd/nsd:virtual-link-desc" {
        uses extended-vld;
    }

    grouping deviated-constituent-cpd-id {
        list constituent-cpd-id {
           key "constituent-base-element-id constituent-cpd-id";

           description
             "Describes a connection point on a VNF/PNF or a SAP
              which connects to virtual links instantiated from
              the profile identified in the virtualLinkProfileId
              attribute.";
           reference
             "GS NFV IFA014: Section 6.3.7
              NsVirtualLinkConnectivity information element";

           leaf constituent-base-element-id {
               type leafref {
                   path "../../../nsd:id";
               }
               description
                 "Reference to the profile of an NS constituent.";
               reference
                 "GS NFV IFA014: Section 6.4.8
                  CpdInConstituentElement information element";
           }

           leaf constituent-cpd-id {
               type leafref {
                   path "deref(../../../nsd:vnfd-id)/../nsd:ext-cpd/nsd:id";
               }
               description
                 "A reference to the descriptor of a connection point
                  attached to one of the constituent VNFs and PNFs or to
                  the descriptor of a NS SAP.";
               reference
                 "GS NFV IFA014: Section 6.4.4.2 CpdPool information
                  element";
           }

           leaf-list ip-address {
               description
                 "IP address list assigned to the internal connection point";
                  type inet:ip-address;
           }
       }
    }

    deviation "/nsd:nsd/nsd:nsd/nsd:df/nsd:vnf-profile/nsd:virtual-link-connectivity/nsd:constituent-cpd-id" {
        description
          "Deviation of the list of constituent-cpd-id, because the key must be
           a compound key 'constituent-base-element-id constituent-cpd-id'";
        deviate not-supported;
    }

    augment "/nsd:nsd/nsd:nsd/nsd:df/nsd:vnf-profile/nsd:virtual-link-connectivity" {
        description
          "Augment of nsd:virtual-link-connectivity to define a list of constituent-cpd-id,
           replacing the one in SOL006, with a compound key
           'constituent-base-element-id constituent-cpd-id', and the
           addition of the leaf ip-address for each item in the list.";
        uses deviated-constituent-cpd-id;
    }

}
