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

    import etsi-nfv-vnfd {
        prefix vnfd;
    }

    grouping extended-vip {
        list vip {
            description
              "Paired interfaces from different VDUs that share a Virtual IP";

            key "name";
            leaf name {
                description
                  "Name of the Virtual IP";
                type string;
            }

            list paired-interfaces {
                key "vdu-id-ref";
                leaf vdu-id-ref {
                    description
                      "Reference to the VDU";
                    type leafref {
                        path "/vnfd:vnfd/vnfd:vdu/vnfd:id";
                    }
                }

                leaf interface-ref {
                    description
                      "Reference to the interface";
                    type leafref {
                        path "/vnfd:vnfd/vnfd:vdu/vnfd:int-cpd/vnfd:virtual-network-interface-requirement/vnfd:name";
                    }
                }
            }
        }
    }

    augment "/vnfd:vnfd" {
        uses extended-vip;
    }
}