
/*
 * 
 *   Copyright 2016-2017 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 nsr
{
  namespace "urn:etsi:osm:yang:nsr";
  prefix "nsr";

  import vlr {
    prefix "vlr";
  }

  import nsd-base {
    prefix "nsd-base";
  }

  import project-nsd {
    prefix "project-nsd";
  }

  import project-vnfd {
    prefix "project-vnfd";
  }

  import vnfr {
    prefix "vnfr";
  }

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

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

  import mano-types {
    prefix "manotypes";
  }

  import osm-project {
    prefix "osm-project";
  }

  revision 2017-02-08 {
    description
      "Update model to support projects.";
  }

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

  typedef vnffgr-operational-status {
    type enumeration {
      enum init;
      enum running;
      enum terminate;
      enum terminated;
      enum failed;
    }
  }

  typedef ns-operational-status {
    type enumeration {
      enum init;
      enum vl-init-phase;
      enum vnf-init-phase;
      enum running;
      enum terminate;
      enum vnf-terminate-phase;
      enum vl-terminate-phase;
      enum terminated;
      enum failed;
      enum scaling-out;
      enum scaling-in;
      enum vl-instantiate;
      enum vl-terminate;
    }
  }

  typedef config-states {
    type enumeration {
      enum init;
      enum configuring;
      enum config_not_needed;
      enum configured;
      enum failed;
      enum terminate;
    }
  }

  typedef trigger-type {
    type enumeration {
      enum ns-primitive;
      enum vnf-primitive;
    }
  }

  grouping cloud-config {
    description "List of cloud config parameters";

    list ssh-authorized-key {
      key "key-pair-ref";

      description "List of authorized ssh keys as part of cloud-config";

      leaf key-pair-ref {
        description "A reference to the key pair entry in the global key pair table";
        type leafref {
          path "../../../../key-pair/name";
        }
      }
    }
    list user {
      key "name";
      description "Used to configure the list of public keys to be injected as part
                 of ns instantiation";
      leaf name {
        description "Name of this key pair";
        type string;
      }
      leaf user-info {
        description "The user name's real name";
        type string;
      }
      list ssh-authorized-key {
        key "key-pair-ref";

        description "Used to configure the list of public keys to be injected as part
                        of ns instantiation";

        leaf key-pair-ref {
          description "A reference to the key pair entry in the global key pair table";
          type leafref {
            path "../../../../../key-pair/name";
          }
        }
      }
    }
  }

  augment "/osm-project:project" {
    list key-pair {
      key "name";
      description "Used to configure the list of public keys to be injected as part
                 of ns instantiation";
      leaf name {
        description "Name of this key pair";
        type string;
      }

      leaf key {
        description "Key associated with this key pair";
        type string;
      }
    }
  }

  grouping event-config-primitive {
    leaf seq {
      description
          "Sequence number for the config primitive.";
      type uint64;
    }

    leaf name {
      description
          "Name of the primitive.";
      type string;
      mandatory true;
    }

    leaf user-defined-script {
      description
          "A user defined script.";
      type string;
    }

    list parameter {
      key "name";
      leaf name {
        type string;
      }

      leaf value {
        type string;
      }
    }
  }

  augment "/osm-project:project" {
    container ns-instance-config {

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

        leaf schema-version {
          description "Schema version for the NSR. If unspecified, it assumes v3.0";
          type string;
          default "v3.0";
        }

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

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

        leaf short-name {
          description "NSR short name.";
          type string;
        }

        leaf description {
          description "NSR description.";
          type string;
        }

        leaf admin-status {
          description
            "This is the administrative status of the NS instance";

          type enumeration {
            enum ENABLED;
            enum DISABLED;
          }
        }

        container nsd {
          description "NS descriptor used to instantiate this NS";

          uses nsd-base:nsd-descriptor-common;

          uses project-nsd:nsr-nsd-vld;

          uses project-nsd:nsr-nsd-constituent-vnfd;

          uses project-nsd:nsr-nsd-placement-groups;

          uses project-nsd:nsr-nsd-vnf-dependency;

          uses project-nsd:nsr-nsd-monitoring-param;
        }
        uses ns-instance-config-params;
      }
    }
  }

  grouping ns-instance-config-params-common {
    uses manotypes:input-parameter;

    list scaling-group {
      description "List of ns scaling group instances";
      key "scaling-group-name-ref";

      leaf scaling-group-name-ref {
        description "name of the scaling group
        leafref path ../nsd/scaling-group-descriptor/name";
        type string;
      }

      list instance {
        description "The instance of the scaling group";
        key "id";
        leaf id {
          description "Scaling group instance uuid";
          type uint16;
        }
      }
    }

    list nsd-placement-group-maps {
      description
          "Mapping from mano-placement groups construct from NSD to cloud
           platform placement group construct";

      key "placement-group-ref";

      leaf placement-group-ref {
        description
          "Reference for NSD placement group";
        // type leafref {
        //   path "../../nsd/placement-groups/name";
        // }
        type string;
      }
      uses manotypes:placement-group-input;
    }
  }

  grouping ns-instance-config-params {
    uses ns-instance-config-params-common;

    list vnfd-placement-group-maps {
      description
        "Mapping from mano-placement groups construct from VNFD to cloud
          platform placement group construct";

      key "placement-group-ref vnfd-id-ref";

      leaf vnfd-id-ref {
        description
          "A reference to a vnfd. This is a
          leafref to path:
          ../../../../project-nsd:constituent-vnfd
          + [id = current()/../id-ref]
          + /project-nsd:vnfd-id-ref
          NOTE: An issue with confd is preventing the
          use of xpath. Seems to be an issue with leafref
          to leafref, whose target is in a different module.
          Once that is resolved this will switched to use
          leafref";
        type yang:uuid;
      }

      leaf placement-group-ref {
        description
          "A reference to VNFD placement group";
        type leafref {
          path "../../../../project-vnfd:vnfd-catalog/project-vnfd:vnfd[project-vnfd:id = " +
            "current()/../vnfd-id-ref]/project-vnfd:placement-groups/project-vnfd:name";
        }
      }

      uses manotypes:placement-group-input;
    }

    uses cloud-config;
  }

  grouping vnffgr {

    list vnffgr {
      key "id";

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

      leaf vnffgd-id-ref {
        description "VNFFG descriptor id reference";
        type leafref {
          path "../../../../ns-instance-config/nsr"
            + "[id=current()/../../ns-instance-config-ref]"
            + "/nsd/vnffgd/id";
        }
      }

      leaf vnffgd-name-ref {
        description "VNFFG descriptor name reference";
        type leafref {
            path "../../../../ns-instance-config/nsr"
              + "[id=current()/../../ns-instance-config-ref]"
              + "/nsd/vnffgd"
              + "[id=current()/../vnffgd-id-ref]"
              + "/name";
        }
      }

      leaf sdn-account {
        description
            "The SDN account to use when requesting resources for
            this vnffgr";
        type string;
      }

      leaf cloud-account {
        description "Cloud Account in which NSR is instantiated";
        type string;
      }

      leaf operational-status {
        description
          "The operational status of the VNFFGR instance
            init                : The VNFFGR has just started.
            running             : The VNFFGR is in running state.
            terminate           : The VNFFGR is being terminated.
            terminated          : The VNFFGR is in the terminated state.
            failed              : The VNFFGR instantiation failed
          ";
        type vnffgr-operational-status;
      }

      list rsp {
        key "id";

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

        leaf name {
          description
              "Name for the RSP";
          type string;
        }

        leaf rsp-id {
          description
              "Returned Identifier for the RSP.";
          type yang:uuid;
        }

        leaf vnffgd-rsp-id-ref {
          description
              "Identifier for the VNFFG Descriptor RSP reference";
          type leafref {
            path "../../../../../ns-instance-config/nsr"
              + "[id=current()/../../../ns-instance-config-ref]"
              + "/nsd/vnffgd"
              + "[id=current()/../../vnffgd-id-ref]"
              + "/rsp/id";
          }
        }

        leaf vnffgd-rsp-name-ref {
          description
              "Name for the VNFFG Descriptor RSP reference";
          type leafref {
            path "../../../../../ns-instance-config/nsr"
              + "[id=current()/../../../ns-instance-config-ref]"
              + "/nsd/vnffgd"
              + "[id=current()/../../vnffgd-id-ref]"
              + "/rsp"
              + "[id=current()/../vnffgd-rsp-id-ref]"
              + "/name";
          }
        }

        leaf classifier-name {
          type string;
        }

        leaf path-id {
          description
              "Unique Identifier for the service path";
          type uint32;
        }

        list vnfr-connection-point-ref {
          key "hop-number";
          leaf hop-number {
            description
                "Monotonically increasing number to show service path hop
                order";
            type uint8;
          }
          leaf service-function-type {
            description
                "Type of Service Function.
                NOTE: This needs to map with Service Function Type in ODL to
                support VNFFG. Service Function Type is mandatory param in ODL
                SFC. This is temporarily set to string for ease of use";
            type string;
          }

          leaf member-vnf-index-ref {
            type string;
          }
          leaf vnfd-id-ref {
            description
                "Reference to VNF Descriptor Id";
            type string;
          }
          leaf vnfr-id-ref {
            description
                "A reference to a vnfr id";
                type leafref {
                  path "../../../../../../vnfr:vnfr-catalog/vnfr:vnfr/vnfr:id";
                }
          }
          leaf vnfr-name-ref {
            description
                "A reference to a vnfr name";
                type leafref {
                  path "../../../../../../vnfr:vnfr-catalog/vnfr:vnfr/vnfr:name";
                }
          }
          leaf vnfr-ingress-connection-point-ref {
            description
                "A reference to a vnfr connection point.";
            type leafref {
              path "../../../../../../vnfr:vnfr-catalog/vnfr:vnfr"
                 + "[vnfr:id = current()/../vnfr-id-ref]"
                 + "/vnfr:connection-point/vnfr:name";
            }
          }
          leaf vnfr-egress-connection-point-ref {
            description
                "A reference to a vnfr connection point.";
            type leafref {
              path "../../../../../../vnfr:vnfr-catalog/vnfr:vnfr"
                 + "[vnfr:id = current()/../vnfr-id-ref]"
                 + "/vnfr:connection-point/vnfr:name";
            }
          }
          leaf service-index {
            description
                "Location within the service path";
            type uint8;
          }
          container connection-point-params {
            leaf mgmt-address {
              type inet:ip-address;
            }
            leaf name {
              type string;
            }
            leaf port-id {
              type string;
            }
            leaf vm-id {
              type string;
            }
            leaf address {
              type inet:ip-address;
            }
            leaf port {
              type inet:port-number;
            }
          }

          container service-function-forwarder {
            leaf name {
              description
                  "Service Function Forwarder name";
              type string;
            }
            leaf ip-address {
              description
                  "Data Plane IP Address of the SFF";
              type inet:ip-address;
            }
            leaf port {
              description
                  "Data Plane Port of the SFF";
              type inet:port-number;
            }
          }
        }
      }

      list classifier {
          key "id";

          leaf id {
            description
                "Identifier for the classifier rule.";
            type yang:uuid;
          }
          leaf name {
            description
                "Name of the classifier.";
            type string;
          }
          leaf-list classifier-id {
            description
                "Returned Identifier for the classifier rule.";
            type yang:uuid;
          }
          leaf rsp-id-ref {
            description
                "A reference to the RSP.";
            type leafref {
              path "../../rsp/id";
            }
          }
          leaf rsp-name {
            description
              "Name for the RSP";
            type string;
          }
          leaf vnfr-id-ref {
            description
                "A reference to a vnfr id";
                type leafref {
                  path "../../../../../vnfr:vnfr-catalog/vnfr:vnfr/vnfr:id";
                }
          }
          leaf vnfr-name-ref {
            description
                "A reference to a vnfr name";
                type leafref {
                  path "../../../../../vnfr:vnfr-catalog/vnfr:vnfr/vnfr:name";
                }
          }
          leaf vnfr-connection-point-ref {
            description
                "A reference to a vnfr connection point.";
            type leafref {
              path "../../../../../vnfr:vnfr-catalog/vnfr:vnfr"
                 + "[vnfr:id = current()/../vnfr-id-ref]"
                 + "/vnfr:connection-point/vnfr:name";
            }
          }
          leaf port-id {
            type string;
          }
          leaf vm-id {
            type string;
          }
          leaf ip-address {
            type string;
          }
          leaf sff-name {
            type string;
          }
      }
    }
  }

  augment "/osm-project:project" {
    container ns-instance-opdata {
      config false;

      list nsr {
        key "ns-instance-config-ref";

        leaf ns-instance-config-ref {
          type leafref {
            path "../../../ns-instance-config/nsr/id";
          }
          // type yang:uuid;
        }

        leaf name-ref {
          description "Network service name reference";
          type leafref {
            path "../../../ns-instance-config/nsr" +
              "[id=current()/../ns-instance-config-ref]" +
              "/name";
          }
        }

        leaf nsd-ref {
          description "Network service descriptor id reference";
          type leafref {
            path "../../../ns-instance-config/nsr"
              + "[id=current()/../ns-instance-config-ref]"
              + "/nsd/id";
          }
        }

        leaf nsd-name-ref {
          description "Network service descriptor name reference";
          type leafref {
            path "../../../ns-instance-config/nsr"
              + "[id=current()/../ns-instance-config-ref]"
              + "/nsd/name";
          }
        }

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

          type uint32;
        }

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

          type uint32;
        }

        list connection-point {
          description
            "List for external connection points.
            Each NS has one or more external connection points.
            As the name implies that external connection points
            are used for connecting the NS to other NS or to
            external networks. Each NS exposes these connection
            points to the orchestrator. The orchestrator can
            construct network service chains by connecting the
            connection points between different NS.";

          key "name";
          leaf name {
            description
              "Name of the NS connection point.";
            type string;
          }

          leaf type {
            description
              "Type of the connection point.";
            type manotypes:connection-point-type;
          }
        }

        list vlr {
          key "vlr-ref";
          leaf vlr-ref {
            description
              "Reference to a VLR record in the VLR catalog";
            type leafref {
              path "../../../../vlr:vlr-catalog/vlr:vlr/vlr:id";
            }
          }


          list vnfr-connection-point-ref {
            description
              "A list of references to connection points.";
            key "vnfr-id";

            leaf vnfr-id {
              description "A reference to a vnfr";
              type leafref {
                path "../../../../../vnfr:vnfr-catalog/vnfr:vnfr/vnfr:id";
              }
            }

            leaf connection-point {
              description
                "A reference to a connection point name in a vnfr";
              type leafref {
                path "../../../../../vnfr:vnfr-catalog/vnfr:vnfr"
                  + "[vnfr:id = current()/../vnfr-id]"
                  + "/vnfr:connection-point/vnfr:name";
              }
            }
          }
        }

        list constituent-vnfr-ref {
          description
            "List of VNFRs that are part of this
             network service.";
          key "vnfr-id";

          leaf vnfr-id {
            description
              "Reference to the VNFR id
               This should be a leafref to /vnfr:vnfr-catalog/vnfr:vnfr/vnfr:id
               But due to confd bug (RIFT-9451), changing to string.";
            type string;
          }
        }

        list scaling-group-record {
          description "List of scaling group records";
          key "scaling-group-name-ref";

          leaf scaling-group-name-ref {
            description "name of the scaling group";
            type leafref {
              path "../../../../ns-instance-config/nsr"
                + "[id=current()/../../ns-instance-config-ref]"
                + "/nsd/scaling-group-descriptor/name";
            }
          }

          list instance {
            description "Reference to scaling group instance record";
            key "instance-id";
            leaf instance-id {
              description "Scaling group instance id";
              type uint16;
            }

            leaf is-default {
              description "Flag indicating whether this instance was part of
                default scaling group (and thus undeletable)";
              type boolean;
            }

            leaf op-status {
              description
                "The operational status of the NS instance
                init                : The scaling group has just started.
                vnf-init-phase      : The VNFs in the scaling group are being instantiated.
                running             : The scaling group  is in running state.
                terminate           : The scaling group is being terminated.
                vnf-terminate-phase : The VNFs in the scaling group are being terminated.
                terminated          : The scaling group  is in the terminated state.
                failed              : The scaling group instantiation failed.
              ";

              type enumeration {
                enum init;
                enum vnf-init-phase;
                enum running;
                enum terminate;
                enum vnf-terminate-phase;
                enum terminated;
                enum failed;
              }
            }

            leaf config-status {
              description
                "The configuration status of the scaling group instance
               configuring : At least one of the VNFs in this scaling group instance
                             is in configuring state
               configured  : All the VNFs in this scaling group instance are
                             configured or config-not-needed state
               failed      : Configuring this scaling group instance failed
              ";
              type config-states;
            }

            leaf error-msg {
              description
                "Reason for failure in configuration of this scaling instance";
              type string;
            }

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

              type uint32;
            }

            leaf-list vnfrs {
              description "Reference to VNFR within the scale instance";
              type leafref {
                path "../../../constituent-vnfr-ref/vnfr-id";
              }
            }
          }
        }

        uses vnffgr;

        leaf operational-status {
          description
            "The operational status of the NS instance
            init                : The network service has just started.
            vl-init-phase       : The VLs in the NS are being instantiated.
            vnf-init-phase      : The VNFs in the NS are being instantiated.
            running             : The NS is in running state.
            terminate           : The NS is being terminated.
            vnf-terminate-phase : The NS is terminating the VNFs in the NS.
            vl-terminate-phase  : The NS is terminating the VLs in the NS.
            terminated          : The NS is in the terminated state.
            failed              : The NS instantiation failed.
            scaling-out         : The NS is scaling out
            scaling-in          : The NS is scaling in
            vl-instantiate      : The NS is initiating a new VL
            vl-terminate        : The NS is terminating a VL
          ";

          type ns-operational-status;
        }

        container ns-configuration {
          uses manotypes:vca-configuration;
        }

        leaf config-status {
          description
            "The configuration status of the NS instance
            configuring: At least one of the VNFs in this instance is in configuring state
            configured:  All the VNFs in this NS instance are configured or config-not-needed state
          ";
          type config-states;
        }

        list monitoring-param {
          description
            "List of NS level params.";
          key "id";

          uses manotypes:monitoring-param-value;
          uses manotypes:monitoring-param-ui-data;
          uses manotypes:monitoring-param-aggregation;

          leaf id {
            type string;
          }

          leaf name {
            type string;
          }

          leaf nsd-mon-param-ref {
            description "Reference to the NSD monitoring param descriptor
                       that produced this result";
            // TODO: Fix leafref
            type leafref {
              path "../../../../project-nsd:nsd-catalog/project-nsd:nsd" +
                "[project-nsd:id = current()/../../nsd-ref]" +
                "/project-nsd:monitoring-param/project-nsd:id";
            }
          }

          list vnfr-mon-param-ref {
            description "A list of VNFR monitoring params associated with this monp";
            key "vnfr-id-ref vnfr-mon-param-ref";

            leaf vnfr-id-ref {
              description
                "A reference to a vnfr. This is a
                leafref to path:
                    /vnfr:vnfr-catalog/vnfr:vnfr/vnfr:id";

              type yang:uuid;
            }

            leaf vnfr-mon-param-ref {
              description "A reference to the VNFR monitoring param";
              type leafref {
                path "../../../../../vnfr:vnfr-catalog/vnfr:vnfr"
                  + "[vnfr:id = current()/../vnfr-id-ref]"
                  + "/vnfr:monitoring-param/vnfr:id";
              }
            }
          }
        }

        list config-agent-job {
          key "job-id";

          leaf job-id {
            description "config agent job Identifier for the NS.";
            type uint64;
          }

          leaf job-name {
            description "Config agent job name";
            type string;
          }

          leaf job-status {
            description
              "Job status to be set based on each VNF primitive execution,
               pending  - if at least one VNF is in pending state
                          and remaining VNFs are in success state.
               Success  - if all VNF executions are in success state
               failure  - if one of the VNF executions is failure";
            type enumeration {
              enum pending;
              enum success;
              enum failure;
            }
          }

          leaf triggered-by {
            description "The primitive is triggered from NS or VNF level";
            type trigger-type;
          }

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

            type uint32;
          }

          leaf job-status-details {
            description "Config agent job status details, in case of errors";
            type string;
          }

          uses manotypes:primitive-parameter-value;

          list parameter-group {
            description
              "List of NS Primitive parameter groups";
            key "name";
            leaf name {
              description
                "Name of the parameter.";
              type string;
            }

            uses manotypes:primitive-parameter-value;
          }

          list vnfr {
            key "id";
            leaf id {
              description "Identifier for the VNFR.";
              type yang:uuid;
            }
            leaf vnf-job-status {
              description
                "Job status to be set based on each VNF primitive execution,
                 pending  - if at least one primitive is in pending state
                            and remaining primitives are in success state.
                 Success  - if all primitive executions are in success state
                 failure  - if one of the primitive executions is failure";
              type enumeration {
                enum pending;
                enum success;
                enum failure;
              }
            }

            list primitive {
              key "name";
              leaf name {
                description "the name of the primitive";
                type string;
              }

              uses manotypes:primitive-parameter-value;

              leaf execution-id {
                description "Execution id of the primitive";
                type string;
              }
              leaf execution-status {
                description "status of the Execution";
                type enumeration {
                  enum pending;
                  enum success;
                  enum failure;
                }
              }
              leaf execution-error-details {
                description "Error details if execution-status is failure";
                type string;
              }
            }
          }
        }
      }
    }
  }

  grouping rpc-common {
    uses manotypes:rpc-project-name;

    leaf nsr_id_ref {
      description "Reference to NSR ID ref";
      type leafref {
        path "/osm-project:project[osm-project:name=current()/.." +
          "/nsr:project-name]/nsr:ns-instance-config/nsr:nsr/nsr:id";
      }
      mandatory true;
    }
  }

  rpc get-ns-config-primitive-values {
    description "Get the config primitive parameter values";

    input {
      leaf name {
        description "Name of the NS config primitive group";
        mandatory true;
        type string;
      }

      uses rpc-common;
    }

    output {
      list ns-parameter {
        description "Automatically generated parameter";
        key "name";

        leaf name {
          description "Parameter name which should be pulled from a parameter pool";
          type string;
        }
        leaf value {
          description "Automatically generated value";
          type string;
        }
      }

      list ns-parameter-group {
        description "Automatically generated parameters in parameter group";
        key "name";
        leaf name {
          description "Parameter group name";
          type string;
        }
        list parameter {
          description "Automatically generated group parameter";
          key "name";

          leaf name {
            description "Parameter name which should be pulled from a parameter pool";
            type string;
          }
          leaf value {
            description "Automatically generated value";
            type string;
          }
        }
      }

      list vnf-primitive-group {
        description
            "List of service primitives grouped by VNF.";

        key "member-vnf-index-ref";
        leaf member-vnf-index-ref {
          description
              "Reference to member-vnf within constituent-vnfds";
          type string;
        }

        leaf vnfd-id-ref {
          description
              "A reference to a vnfd. This is a
               leafref to path:
                   ../../../../project-nsd:constituent-vnfd
                   + [project-nsd:id = current()/../project-nsd:id-ref]
                   + /project-nsd:vnfd-id-ref
               NOTE: An issue with confd is preventing the
               use of xpath. Seems to be an issue with leafref
               to leafref, whose target is in a different module.
               Once that is resolved this will switched to use
               leafref";

          type string;
        }

        list primitive {
          key "index";
          leaf index {
            description "Index of this primitive";
            type uint32;
          }

          leaf name {
            description "Name of the primitive associated with a value pool";
            type string;
          }

          list parameter {
            description "Automatically generated parameter";
            key "name";

            leaf name {
              description "Parameter name which should be pulled from a parameter pool";
              type string;
            }
            leaf value {
              description "Automatically generated value";
              type string;
            }
          }
        }
      }
    }
  }

  rpc exec-ns-config-primitive {
    description "Executes a NS config primitive or script";

    input {
      leaf name {
        description "Name of the primitive";
        type string;
      }

      uses rpc-common;

      leaf triggered-by {
        description "The primitive is triggered from NS or VNF level";
        type trigger-type;
        default ns-primitive;
      }

      uses manotypes:primitive-parameter-value;

      list parameter-group {
        description
            "List of NS Primitive parameter groups";
        key "name";
        leaf name {
          description
              "Name of the parameter.";
          type string;
        }

        uses manotypes:primitive-parameter-value;
      }

      list vnf-list {
        description
            "List of VNFs whose primitives are being set.";
        key "member_vnf_index_ref";

        leaf member_vnf_index_ref {
          description "Member VNF index";
          type uint64;
        }

        leaf vnfr-id-ref {
          description
              "A reference to a vnfr. This is a
               leafref to path";
          type yang:uuid;
        }

        list vnf-primitive {
          description
              "List of service primitives supported by the
            configuration agent for this VNF.";
          key "index";

          leaf index {
            description
                "index of the service primitive.";
            type uint32;
          }
          leaf name {
            description
                "Name of the service primitive.";
            type string;
          }

          uses manotypes:primitive-parameter-value;
        }
      }
      leaf user-defined-script {
        description
            "A user defined script.";
        type string;
      }
    }
    output {
      leaf job-id {
        description "Job identifier for this RPC";
        type uint64;
      }

      leaf name {
        description "Name of the service primitive";
        type string;
      }

      uses rpc-common;

      leaf triggered-by {
        description "The primitive is triggered from NS or VNF level";
        type trigger-type;
      }

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

        type uint32;
      }

      leaf job-status-details {
        description "Job status details, in case of any errors";
        type string;
      }

      uses manotypes:primitive-parameter-value;

      list parameter-group {
        description
            "List of NS Primitive parameter groups";
        key "name";
        leaf name {
          description
              "Name of the parameter.";
          type string;
        }

        uses manotypes:primitive-parameter-value;
      }

      list vnf-out-list {
        description
            "List of VNFs whose primitives were set.";
        key "member_vnf_index_ref";

        leaf member_vnf_index_ref {
          description "Member VNF index";
          type uint64;
        }
        leaf vnfr-id-ref {
          description
              "A reference to a vnfr. This is a
               leafref to path";
          type yang:uuid;
        }

        list vnf-out-primitive {
          description
              "List of service primitives supported by the
            configuration agent for this VNF.";
          key "index";

          leaf index {
            description
                "index of the service primitive.";
            type uint32;
          }

          leaf name {
            description
                "Name of the service primitive.";
            type string;
          }

          uses manotypes:primitive-parameter-value;

          leaf execution-id {
            description "Execution id of this primitive";
            type string;
          }

          leaf execution-status {
            description "Status of the execution of this primitive";
            type string;
          }

          leaf execution-error-details {
            description "Error details if execution-status is failed";
            type string;
          }
        }
      }
    }
  }

  rpc exec-scale-in {
    description "Executes scale out request";

    input {
      uses rpc-common;

      leaf scaling-group-name-ref {
        description "name of the scaling group";
        type leafref {
          path "/osm-project:project[osm-project:name=current()/.." +
            "/nsr:project-name]/nsr:ns-instance-config/nsr:nsr" +
            "[nsr:id=current()/../nsr:nsr_id_ref]/nsr:nsd" +
            "/nsr:scaling-group-descriptor/nsr:name";
        }
        mandatory true;
      }

      leaf instance-id {
        description "id of the scaling group";
        type leafref {
          path "/osm-project:project[osm-project:name=current()/.." +
            "/nsr:project-name]/nsr:ns-instance-config/nsr:nsr" +
            "[nsr:id=current()/../nsr:nsr_id_ref]" +
            "/nsr:scaling-group[nsr:scaling-group-name-ref=current()/.." +
            "/nsr:scaling-group-name-ref]/nsr:instance/nsr:id";
        }
        mandatory true;
      }


    }
    output {
      leaf instance-id {
        description "id of the scaling group";
        type uint64;
      }
    }
  }

  rpc exec-scale-out {
    description "Executes scale out request";

    input {
      uses rpc-common;

      leaf scaling-group-name-ref {
        description "name of the scaling group";
        type leafref {
          path "/osm-project:project[osm-project:name=current()/.." +
            "/nsr:project-name]/nsr:ns-instance-config/nsr:nsr" +
            "[nsr:id=current()/../nsr:nsr_id_ref]/nsr:nsd" +
            "/nsr:scaling-group-descriptor/nsr:name";
        }
        mandatory true;
      }

      leaf instance-id {
        description "id of the scaling group";
        type uint64;
      }
    }

    output {
     leaf instance-id {
        description "id of the scaling group";
        type uint64;
      }
    }
  }

  rpc start-network-service {
    description "Start the network service";
    input {
      leaf name {
        mandatory true;
        description "Name of the Network Service";
        type string;
      }

      uses manotypes:rpc-project-name;

      leaf nsd_id_ref {
        description "Reference to NSD ID ref";
        type leafref {
          path "/osm-project:project[osm-project:name=current()/.." +
            "/project-name]/project-nsd:nsd-catalog/project-nsd:nsd/project-nsd:id";
        }
      }
      uses ns-instance-config-params-common;

      list vnfd-placement-group-maps {
        description
          "Mapping from mano-placement groups construct from VNFD to cloud
          platform placement group construct";

        key "placement-group-ref vnfd-id-ref";

        leaf vnfd-id-ref {
          description
            "A reference to a vnfd. This is a
          leafref to path:
          ../../../../project-nsd:constituent-vnfd
          + [id = current()/../project-nsd:id-ref]
          + /project-nsd:vnfd-id-ref
          NOTE: An issue with confd is preventing the
          use of xpath. Seems to be an issue with leafref
          to leafref, whose target is in a different module.
          Once that is resovled this will switched to use
          leafref";
          type yang:uuid;
        }

        leaf placement-group-ref {
          description
            "A reference to VNFD placement group";
          type leafref {
            path "/osm-project:project[osm-project:name=current()/" +
              "../../project-name]/project-vnfd:vnfd-catalog/project-vnfd:vnfd[project-vnfd:id = " +
              "current()/../vnfd-id-ref]/project-vnfd:placement-groups/project-vnfd:name";
          }
        }

        uses manotypes:placement-group-input;

        list ssh-authorized-key {
          key "key-pair-ref";

          description "List of authorized ssh keys as part of cloud-config";

          leaf key-pair-ref {
            description "A reference to the key pair entry in the global key pair table";
            type leafref {
              path "/osm-project:project[osm-project:name=current()/../../../" +
                "project-name]/key-pair/name";
            }
          }
        }

        list user {
          key "name";

          description "List of users to be added through cloud-config";
          leaf name {
            description "Name of the user ";
            type string;
          }
          leaf user-info {
            description "The user name's real name";
            type string;
          }
          list ssh-authorized-key {
            key "key-pair-ref";

            description "Used to configure the list of public keys to be injected as part
                        of ns instantiation";

            leaf key-pair-ref {
              description "A reference to the key pair entry in the global key pair table";
              type leafref {
                path "/osm-project:project[osm-project:name=current()/" +
                  "../../../../project-name]/key-pair/name";
              }
            }
          }
        }
      }
    }

    output {
      leaf nsr-id {
        description "Automatically generated parameter";
        type yang:uuid;
      }
    }
  }
}
