/*
 *
 *   Copyright 2018 CTTC
 *   Copyright 2018 Telefonica Investigacion y Desarrollo S.A.U.
 *
 *   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 instantiation-parameters {
  //header information
  yang-version 1;
  namespace "urn:etsi:osm:yang:instantiation-parameters";
  prefix "instantiation-parameters";
  
  import nsd {
    prefix "nsd";
  }

  import vnfd {
    prefix "vnfd";
  }

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

  import ietf-yang-types {
    prefix "ietf-yang";
  }
  
  //revision history
  revision 2018-09-14 {
    description "Initial version";
  }

  grouping ns_params {
    leaf vimAccountId {
      mandatory true;
      type string;
    }
    leaf ssh_keys {
      type string;
    }
    list vnf {
      key "member-vnf-index";
      uses vnf_params;
    }
    list vld {
      key "name";
      uses vld_params;
    }
  }

  grouping vnf_params {
    leaf member-vnf-index{
      mandatory true;
      type string;
    }
    leaf vimAccountId {
      type string;
    }
    list vdu {
      key "id";
      uses vdu_params;
    }
    list internal-vld {
      key "name";
      uses internal_vld_params;
    }
  }

  grouping vld_common_params {
    leaf name {
      type string;
    }
    leaf vim-network-name {
      type string;
    }
    container ip-profile {
      uses ip-profile-update-schema;
    }
  }

  grouping vld_params {
    uses vld_common_params;
    list vnfd-connection-point-ref {
      key "member-vnf-index-ref vnfd-connection-point-ref";
      leaf member-vnf-index-ref {
        type leafref {
            //path "../../../vnf/member-vnf-index";
            path "/nsd:nsd-catalog/nsd:nsd/nsd:constituent-vnfd/nsd:member-vnf-index";
        }
      }
      leaf vnfd-connection-point-ref {
        type leafref {
          path "/vnfd:vnfd-catalog/vnfd:vnfd/vnfd:connection-point/vnfd:name";
        }
      }
      leaf ip-address{
        type inet:ip-address;
      }
    }
  }

  grouping vdu_params {
    leaf id {
      mandatory true;
      type string;
    }
    list volume {
      key "name";
      leaf name {
        mandatory true;
        type string;
      }
      leaf vim-volume-id {
        mandatory true;
        type string;
      }
    }
    list interface {
      key "name";
      leaf name {
        mandatory true;
        type string;
      }
      leaf ip-address {
        type inet:ip-address;
      }
      leaf mac-address {
        type ietf-yang:mac-address;
      }
      leaf floating-ip-required {
        type boolean;
      }
    }
  }

  grouping internal_vld_params {
    leaf name {
      mandatory true;
      type string;
    }
    leaf vim-network-name {
      type string; 
    }
    container ip-profile {
      uses ip-profile-update-schema;
    }
    list internal-connection-point {
      key "id-ref";
      leaf id-ref {
        mandatory true;
        type string;
      }
      leaf ip-address{
        type inet:ip-address;
      }
    }
  }

  grouping ip-profile-update-schema { //each leaf/list is either null or something
    leaf ip-version {
      type inet:ip-version;
    }
    leaf subnet-address {
      type inet:ip-prefix;
    }
    leaf gateway-address {
      type inet:ip-address;
    }
    list dns-server {
      key "address";
      leaf address {
        mandatory true;
        type inet:ip-address;
      }
    }
    container dhcp-params {
      leaf enabled {
        type boolean;
      }
      leaf count {
        type uint8; // >=1
      }
      leaf start-address {
        type inet:ip-address;
      }
    }
  }

}
