Simple strategy to allow address pairs for virtual IP
[osm/IM.git] / models / yang / vnfd-base.yang
index 9163e33..28a4961 100644 (file)
@@ -1,7 +1,7 @@
-
 /*
  *
  *   Copyright 2017 RIFT.IO Inc
+ *   Copyright 2018-2020 ETSI
  *
  *   Licensed under the Apache License, Version 2.0 (the "License");
  *   you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@
 
 module vnfd-base
 {
-  namespace "http://riftio.com/ns/riftware-1.0/vnfd-base";
+  namespace "urn:etsi:osm:yang:vnfd-base";
   prefix "vnfd-base";
 
   import mano-types {
@@ -62,8 +62,20 @@ module vnfd-base
     }
 
     leaf port-security-enabled {
-      description "Enables the port security for the port";
+      description "Enables the port security for the port.";
       type boolean;
+      default true;
+    }
+
+    leaf port-security-disable-strategy {
+      description "Strategy to disable port security, either Enables the port security for the port.
+                   full                : disable port security in the whole port
+                   allow-address-pairs : allow address pairs for virtual IP (any virtual IP can be configured)";
+      type enumeration {
+        enum full;
+        enum allow-address-pairs;
+      }
+      default full;
     }
   }
 
@@ -94,15 +106,17 @@ module vnfd-base
         description
             "Specifies the type of virtual interface
              between VM and host.
-             VIRTIO          : Use the traditional VIRTIO interface.
+             PARAVIRT        : Use the default paravirtualized interface for the VIM (virtio, vmxnet3, etc.).
+             VIRTIO          : Deprecated! Use the traditional VIRTIO interface.
              PCI-PASSTHROUGH : Use PCI-PASSTHROUGH interface.
              SR-IOV          : Use SR-IOV interface.
              E1000           : Emulate E1000 interface.
              RTL8139         : Emulate RTL8139 interface.
              PCNET           : Emulate PCNET interface.
-             OM-MGMT         : Deprecated! Use VIRTIO instead and set the VNF management interface at vnfd:mgmt-interface:cp";
+             OM-MGMT         : Deprecated! Use PARAVIRT instead and set the VNF management interface at vnfd:mgmt-interface:cp";
 
         type enumeration {
+          enum PARAVIRT;
           enum OM-MGMT;
           enum PCI-PASSTHROUGH;
           enum SR-IOV;
@@ -111,7 +125,7 @@ module vnfd-base
           enum RTL8139;
           enum PCNET;
         }
-        default "VIRTIO";
+        default "PARAVIRT";
       }
 
       leaf vpci {
@@ -173,6 +187,8 @@ module vnfd-base
 
       container vnf-configuration {
         uses manotypes:vca-configuration;
+        uses manotypes:vca-relations;
+        uses manotypes:vca-config-access;
       }
 
       leaf operational-status {
@@ -298,11 +314,12 @@ module vnfd-base
           key "id-ref";
           description "List of internal connection points in this VLD";
           leaf id-ref {
-            description "reference to the internal connection point id";
+            description "Reference to the internal connection point id";
             type leafref {
               path "../../../vdu/internal-connection-point/id";
             }
           }
+
           leaf ip-address {
             description "IP address of the internal connection point";
             type inet:ip-address;
@@ -346,6 +363,19 @@ module vnfd-base
           at the network service level to construct network services.";
 
         uses common-connection-point;
+
+        leaf internal-vld-ref {
+          description
+            "Reference to an internal VLD of the VNF. This field is
+            optional. It allows exposing an internal VLD through a
+            connection point. When building a NS, this VNF CP might be
+            connected to a NS VLD, then both VLDs (the i-VLD of the VNF and the
+            VLD of the NS) will become the same network and the IP profile will
+            be the one configured at NS level.";
+          type leafref {
+            path "../../internal-vld/id";
+          }
+        }
       }
 
       list vdu {
@@ -367,6 +397,16 @@ module vnfd-base
             type string;
         }
 
+        leaf pdu-type {
+          description
+            "Type of PDU. If this field exists, the deployment unit must be
+            understood as a PDU, not as a VDU. This field is used to identify
+            the category of PDU instances to be used at instantiation time. For
+            the instantiation to be successful, there must be available
+            PDU instances of this type in the selected datacenter.";
+          type string;
+        }
+
         leaf count {
           description "Number of instances of VDU";
           type uint64;
@@ -390,7 +430,24 @@ module vnfd-base
         list alarm {
           key "alarm-id";
 
-          uses manotypes:alarm;
+          leaf alarm-id {
+            description
+                  "This field is reserved for the identifier assigned by the VIM provider";
+
+            type string;
+          }
+
+
+          leaf vnf-monitoring-param-ref {
+              description
+                 "Reference to the VNF level monitoring parameter
+                  that is aggregated";
+              type leafref {
+                path "../../monitoring-param/id";
+              }
+          }
+
+          uses manotypes:alarm-properties;
         }
 
         uses manotypes:image-properties;
@@ -416,6 +473,31 @@ module vnfd-base
 
         container vdu-configuration {
           uses manotypes:vca-configuration;
+          uses manotypes:vca-config-access;
+        }
+
+        list monitoring-param {
+          description
+            "List of VDU-related monitoring parameters at NFVI level";
+          key id;
+          leaf id {
+            description "The unique id of the monitoring param at VDU level";
+            type string;
+          }
+
+          leaf nfvi-metric {
+            description "The associated NFVI metric to be monitored";
+            type manotypes:nfvi-metric-type;
+          }
+
+          leaf interface-name-ref {
+            description
+              "Reference to a VDU interface name. Applicable only when the nfvi-metric
+              refers to an interface and not to the VM";
+            type leafref {
+              path "../../interface/name";
+            }
+          }
         }
 
         choice cloud-init-input {
@@ -479,6 +561,14 @@ module vnfd-base
             type uint32;
           }
 
+          leaf mgmt-interface {
+            description
+                "Flag to indicate that this is the mgmt interface
+                to be used for VDU configuration";
+            type boolean;
+            default false;
+          }
+
           leaf type {
             description
                 "Type of the Interface";
@@ -489,12 +579,12 @@ module vnfd-base
 
           leaf mac-address {
             description
-                "MAC address of the interface.
-                Some VNFs require a specific MAC address to be configured
-                in the interface. While this is not recommended at all in
-                NFV environments, this parameter exists to allow those
-                scenarios.
-                This parameter will be likely deprecated in the future.";
+              "MAC address of the interface.
+              Some VNFs require a specific MAC address to be configured
+              in the interface. While this is not recommended at all in
+              NFV environments, this parameter exists to allow those
+              scenarios.
+              This parameter will be likely deprecated in the future.";
             type string;
           }
 
@@ -502,19 +592,19 @@ module vnfd-base
             case internal {
               leaf internal-connection-point-ref {
                 description
-                    "Leaf Ref to the particular internal connection point";
+                  "Leaf Ref to the particular internal connection point";
                 type leafref {
-                   path "../../internal-connection-point/id";
-                 }
+                  path "../../internal-connection-point/id";
+                }
               }
             }
             case external {
               leaf external-connection-point-ref {
                 description
-                    "Leaf Ref to the particular external connection point";
+                  "Leaf Ref to the particular external connection point";
                 type leafref {
-                   path "../../../connection-point/name";
-                 }
+                  path "../../../connection-point/name";
+                }
               }
             }
           }
@@ -535,6 +625,159 @@ module vnfd-base
         }
       }
 
+      list kdu {
+        description "List of K8s Deployment Units";
+        key "name";
+
+        leaf name {
+          description "Unique name for the KDU";
+          type string;
+        }
+
+        leaf description {
+            description "Description of the KDU.";
+            type string;
+        }
+
+        container kdu-configuration {
+          uses manotypes:vca-configuration;
+          uses manotypes:vca-config-access;
+
+          leaf-list blacklist-config-primitive {
+            description
+              "List of blacklisted config primitives from the list of
+              default kdu config primitives";
+
+            type enumeration {
+              enum upgrade;
+              enum rollback;
+            }
+
+          }
+
+        }
+
+        choice kdu-model {
+          description
+            "Indicates the KDU model, either as a helm-chart or as a juju-bundle.";
+
+          case helm-chart {
+            leaf helm-chart {
+              description
+                "Helm chart that models the KDU, in any of the following ways:
+                 - <helm-repo>/<helm-chart>
+                 - <helm-chart folder under k8s_models folder in the package>
+                 - <helm-chart tgz file (w/ or w/o extension) under k8s_models folder in the package>
+                 - <URL_where_to_fetch_chart>
+                ";
+              type string;
+            }
+            leaf helm-version {
+              description
+                "Helm version to use for this helm-chart, v3 by default";
+              type enumeration {
+                enum v2;
+                enum v3;
+              }
+              default v3;
+            }
+          }
+
+          case juju-bundle {
+            leaf juju-bundle {
+              description
+                "Juju bundle that models the KDU, in any of the following ways:
+                 - <juju-repo>/<juju-bundle>
+                 - <juju-bundle folder under k8s_models folder in the package>
+                 - <juju-bundle tgz file (w/ or w/o extension) under k8s_models folder in the package>
+                 - <URL_where_to_fetch_juju_bundle>
+                ";
+              type string;
+            }
+          }
+        }
+
+        list service {
+          description
+            "List of Kubernetes services exposed by the KDU.
+             If empty, all services are assumed to be exposed in the CP associated to the first network
+             in k8s-cluster.nets.";
+          key name;
+
+          leaf name {
+            description "Name of the Kubernetes service exposed by he KDU model";
+            type string;
+          }
+
+          leaf mgmt-service {
+            description
+                "Flag to indicate that this Kubernetes service is a mgmt service
+                to be used for KDU configuration. Defaults to false (if no present).
+                All services with mgmt-service set to true will be passed to the execution
+                environment in charge of the KDU configuration.";
+            type boolean;
+            default false;
+          }
+
+          leaf external-connection-point-ref {
+            description
+              "Leaf Ref to the particular external connection point";
+            type leafref {
+              path "../../../connection-point/name";
+            }
+          }
+
+        }
+
+      }
+
+      container k8s-cluster {
+        leaf-list version {
+          description
+            "List of supported K8s versions.
+            The cluster where the KDUs will be deployed will have to match
+            one of these versions.";
+
+          type string;
+        }
+
+        leaf-list cni {
+          description
+            "List of supported CNI plugins.
+            The cluster where the KDUs will be deployed will have to use
+            one of these CNI plugins.";
+
+          type enumeration {
+            enum calico;
+            enum flannel;
+            enum multus;
+          }
+        }
+
+        list nets {
+          description
+            "List of required networks in the K8s cluster.
+            The cluster where the KDUs will be deployed will have to use
+            one of these CNI plugins.";
+
+          key "id";
+
+          leaf id {
+            description "Internal identifier for the K8s cluster network in this VNF";
+            type string;
+          }
+
+          leaf external-connection-point-ref {
+            description
+              "Leaf Ref to the particular external connection point";
+            type leafref {
+              path "../../../connection-point/name";
+            }
+          }
+
+        }
+      }
+
       list vdu-dependency {
         description
             "List of VDU dependencies.";
@@ -577,7 +820,284 @@ module vnfd-base
         type string;
       }
 
-      uses manotypes:monitoring-param;
+      uses manotypes:http-endpoints;
+
+      list scaling-group-descriptor {
+        description
+            "scaling group descriptor within the VNF.
+             The scaling group defines a group of VDUs,
+             and the ratio of VDUs in the VNF
+             that is used as target for scaling action";
+
+        key "name";
+
+        leaf name {
+          description "Name of this scaling group.";
+          type string;
+        }
+
+        list scaling-policy {
+
+          key "name";
+
+          leaf name {
+            description
+                "Name of the scaling policy";
+            type string;
+          }
+
+          leaf scaling-type {
+            description
+                "Type of scaling";
+            type manotypes:scaling-policy-type;
+          }
+
+          leaf enabled {
+            description
+              "Specifies if the scaling policy can be applied";
+            type boolean;
+            default true;
+          }
+
+          leaf scale-in-operation-type {
+            description
+                "Operation to be applied to check between scaling criterias to
+                 check if the scale in threshold condition has been met.
+                 Defaults to AND";
+            type manotypes:scaling-criteria-operation;
+            default AND;
+          }
+
+          leaf scale-out-operation-type {
+            description
+                "Operation to be applied to check between scaling criterias to
+                 check if the scale out threshold condition has been met.
+                 Defauls to OR";
+            type manotypes:scaling-criteria-operation;
+            default OR;
+          }
+
+          leaf threshold-time {
+            description
+              "The duration for which the criteria must hold true";
+            type uint32;
+            mandatory true;
+          }
+
+          leaf cooldown-time {
+            description
+              "The duration after a scaling-in/scaling-out action has been
+              triggered, for which there will be no further optional";
+            type uint32;
+            mandatory true;
+          }
+
+          list scaling-criteria {
+            description
+                "list of conditions to be met for generating scaling
+                   requests";
+            key "name";
+
+            leaf name {
+              type string;
+            }
+
+            leaf scale-in-threshold {
+              description
+                  "Value below which scale-in requests are generated";
+              type decimal64{
+                fraction-digits 10;
+             }
+            }
+
+            leaf scale-in-relational-operation {
+              description
+                "The relational operator used to compare the monitoring param
+                against the scale-in-threshold.";
+              type manotypes:relational-operation-type;
+              default LE;
+            }
+
+            leaf scale-out-threshold {
+              description
+                  "Value above which scale-out requests are generated";
+              type decimal64{
+                fraction-digits 10;
+             }
+            }
+
+            leaf scale-out-relational-operation {
+              description
+                "The relational operator used to compare the monitoring param
+                against the scale-out-threshold.";
+              type manotypes:relational-operation-type;
+              default GE;
+            }
+
+            leaf vnf-monitoring-param-ref {
+              description
+                 "Reference to the VNF level monitoring parameter
+                  that is aggregated";
+              type leafref {
+                path "../../../../monitoring-param/id";
+              }
+            }
+          }
+        }
+
+        list vdu {
+          description "List of VDUs in this scaling group";
+          key "vdu-id-ref";
+
+          leaf vdu-id-ref {
+            description "Reference to the VDU id";
+            type leafref {
+              path "../../../vdu/id";
+            }
+          }
+
+          leaf count {
+            description
+              "count of this VDU id within this scaling group.
+               The count allows to define the number of instances
+               when a scaling action targets this scaling group";
+            type uint32;
+            default 1;
+          }
+        }
+
+        leaf min-instance-count {
+          description
+            "Minimum instances of the scaling group which are allowed.
+            These instances are created by default when the network service
+            is instantiated.";
+          type uint32;
+          default 0;
+        }
+
+        leaf max-instance-count {
+          description
+            "Maximum instances of this scaling group that are allowed
+             in a single network service. The network service scaling
+             will fail, when the number of service group instances
+             exceed the max-instance-count specified.";
+          type uint32;
+          default 10;
+        }
+
+        list scaling-config-action {
+          description "List of scaling config actions";
+          key "trigger";
+
+          leaf trigger {
+            description "scaling trigger";
+            type manotypes:scaling-trigger;
+          }
+
+          leaf vnf-config-primitive-name-ref {
+            description "Reference to the VNF config primitive";
+            type leafref {
+              path "../../../vnf-configuration/config-primitive/name";
+            }
+          }
+        }
+      }
+
+      list monitoring-param {
+        description
+          "List of monitoring parameters at the network service level";
+        key id;
+        leaf id {
+          type string;
+        }
+
+        leaf name {
+          type string;
+        }
+
+        uses manotypes:monitoring-param-aggregation;
+
+        choice monitoring-type {
+          description
+            "Defines the type of monitoring param to be used:
+              * vdu-monitorin-param:     VDU-related metric (from NFVI)
+              * vnf-metric:              VNF-related metric (from VCA)
+              * vdu-metric:              VDU-related metric (from VCA)
+            ";
+
+          case vdu-monitoring-param {
+            description "VDU-related metric from the infrastructure";
+            container vdu-monitoring-param {
+              leaf vdu-ref {
+                type leafref {
+                  path "../../../vdu/id";
+                }
+              }
+              leaf vdu-monitoring-param-ref {
+                type leafref {
+                  path "../../../vdu[id = current()/../vdu-ref]/monitoring-param/id";
+                }
+              }
+            }
+          }
+
+          case vnf-metric {
+            description "VNF-related metric (from VCA)";
+            container vnf-metric {
+              leaf vnf-metric-name-ref {
+                type leafref {
+                  path "../../../vnf-configuration/metrics/name";
+                }
+              }
+            }
+          }
+
+          case vdu-metric {
+            description "VDU-related metric (from VCA)";
+            container vdu-metric {
+              leaf vdu-ref {
+                type leafref {
+                  path "../../../vdu/id";
+                }
+              }
+              leaf vdu-metric-name-ref {
+                type leafref {
+                  path "../../../vdu[id = current()/../vdu-ref]/vdu-configuration/metrics/name";
+                }
+              }
+            }
+          }
+
+        }
+
+        leaf http-endpoint-ref {
+          type leafref {
+            path "../../http-endpoint/path";
+          }
+        }
+
+        leaf json-query-method {
+          type manotypes:json-query-method;
+          default "NAMEKEY";
+        }
+
+        container json-query-params {
+          leaf json-path {
+            description
+              "The jsonpath to use to extract value from JSON structure";
+            type string;
+          }
+          leaf object-path {
+            description
+              "The objectpath to use to extract value from JSON structure";
+            type string;
+          }
+        }
+
+        uses manotypes:monitoring-param-ui-data;
+        uses manotypes:monitoring-param-value;
+
+      }
 
       list placement-groups {
         description "List of placement groups at VNF level";