6b627b20f1b5d662f7d3e1027f77597ed4d2d46c
[osm/IM.git] / models / yang / vnfd-base.yang
1
2 /*
3  *
4  *   Copyright 2017 RIFT.IO Inc
5  *
6  *   Licensed under the Apache License, Version 2.0 (the "License");
7  *   you may not use this file except in compliance with the License.
8  *   You may obtain a copy of the License at
9  *
10  *       http://www.apache.org/licenses/LICENSE-2.0
11  *
12  *   Unless required by applicable law or agreed to in writing, software
13  *   distributed under the License is distributed on an "AS IS" BASIS,
14  *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  *   See the License for the specific language governing permissions and
16  *   limitations under the License.
17  *
18  *
19  */
20
21 module vnfd-base
22 {
23   namespace "urn:etsi:osm:yang:vnfd-base";
24   prefix "vnfd-base";
25
26   import mano-types {
27     prefix "manotypes";
28   }
29
30   import ietf-inet-types {
31     prefix "inet";
32   }
33
34   revision 2017-02-28 {
35     description
36       "Initial revision. This YANG file defines
37        the common types for Virtual Network Function
38        (VNF) descriptor";
39     reference
40       "Derived from earlier versions of base YANG files";
41   }
42
43   grouping common-connection-point {
44     leaf name {
45       description "Name of the connection point";
46       type string;
47     }
48
49     leaf id {
50       description "Identifier for the internal connection points";
51       type string;
52     }
53
54     leaf short-name {
55       description "Short name to appear as label in the UI";
56       type string;
57     }
58
59     leaf type {
60       description "Type of the connection point.";
61       type manotypes:connection-point-type;
62     }
63
64     leaf port-security-enabled {
65       description "Enables the port security for the port.";
66       type boolean;
67       default true;
68     }
69   }
70
71   typedef interface-type {
72     type enumeration {
73       enum INTERNAL;
74       enum EXTERNAL;
75     }
76   }
77
78   typedef vnf-operational-status {
79     type enumeration {
80       enum init;
81       enum running;
82       enum upgrading;
83       enum terminate;
84       enum terminated;
85       enum failed;
86     }
87   }
88
89   grouping virtual-interface {
90     container virtual-interface {
91       description
92           "Container for the virtual interface properties";
93
94       leaf type {
95         description
96             "Specifies the type of virtual interface
97              between VM and host.
98              PARAVIRT        : Use the default paravirtualized interface for the VIM (virtio, vmxnet3, etc.).
99              VIRTIO          : Deprecated! Use the traditional VIRTIO interface.
100              PCI-PASSTHROUGH : Use PCI-PASSTHROUGH interface.
101              SR-IOV          : Use SR-IOV interface.
102              E1000           : Emulate E1000 interface.
103              RTL8139         : Emulate RTL8139 interface.
104              PCNET           : Emulate PCNET interface.
105              OM-MGMT         : Deprecated! Use PARAVIRT instead and set the VNF management interface at vnfd:mgmt-interface:cp";
106
107         type enumeration {
108           enum PARAVIRT;
109           enum OM-MGMT;
110           enum PCI-PASSTHROUGH;
111           enum SR-IOV;
112           enum VIRTIO;
113           enum E1000;
114           enum RTL8139;
115           enum PCNET;
116         }
117         default "PARAVIRT";
118       }
119
120       leaf vpci {
121         description
122             "Specifies the virtual PCI address. Expressed in
123              the following format dddd:dd:dd.d. For example
124              0000:00:12.0. This information can be used to
125              pass as metadata during the VM creation.";
126         type string;
127       }
128
129       leaf bandwidth {
130         description
131             "Aggregate bandwidth of the NIC.";
132         type uint64;
133       }
134     }
135   }
136
137   grouping vnfd-descriptor {
138       leaf id {
139         description "Identifier for the VNFD.";
140         type string {
141           length "1..63";
142         }
143       }
144
145       leaf name {
146         description "VNFD name.";
147         mandatory true;
148         type string;
149       }
150
151       leaf short-name {
152         description "Short name to appear as label in the UI";
153         type string;
154       }
155
156       leaf vendor {
157         description "Vendor of the VNFD.";
158         type string;
159       }
160
161       leaf logo {
162         description
163             "Vendor logo for the Virtual Network Function";
164         type string;
165       }
166
167       leaf description {
168         description "Description of the VNFD.";
169         type string;
170       }
171
172       leaf version {
173         description "Version of the VNFD";
174         type string;
175       }
176
177       container vnf-configuration {
178         uses manotypes:vca-configuration;
179         uses manotypes:vca-relations;
180         uses manotypes:vca-config-access;
181       }
182
183       leaf operational-status {
184          description
185            "The operational status of the VNF
186              init                : The VNF has just started.
187              running             : The VNF is active in VM
188              upgrading           : The VNF is being upgraded (EXPERIMENTAL)
189              terminate           : The VNF is being terminated
190              terminated          : The VNF is in the terminated state.
191              failed              : The VNF  instantiation failed.
192            ";
193          type vnf-operational-status;
194       }
195
196       container mgmt-interface {
197         description
198             "Interface over which the VNF is managed.";
199
200         choice endpoint-type {
201           description
202               "Indicates the type of management endpoint.";
203
204           case ip {
205             description
206                 "Specifies the static IP address for managing the VNF.";
207             leaf ip-address {
208               type inet:ip-address;
209             }
210           }
211
212           case vdu-id {
213             description
214                 "Use the default management interface on this VDU.";
215             leaf vdu-id {
216               type leafref {
217                 path "../../vdu/id";
218               }
219             }
220           }
221
222           case cp {
223             description
224                 "Use the ip address associated with this connection point. This cp is then considered as management.";
225             leaf cp {
226               type leafref {
227                 path "../../connection-point/name";
228               }
229             }
230           }
231         }
232
233         leaf port {
234           description
235               "Port for the management interface.";
236           type inet:port-number;
237         }
238
239         container dashboard-params {
240           description "Parameters for the VNF dashboard";
241
242           leaf path {
243             description "The HTTP path for the dashboard";
244             type string;
245           }
246
247           leaf https {
248             description "Pick HTTPS instead of HTTP , Default is false";
249             type boolean;
250           }
251
252           leaf port {
253             description "The HTTP port for the dashboard";
254             type inet:port-number;
255           }
256         }
257       }
258
259       list internal-vld {
260         key "id";
261         description
262           "List of Internal Virtual Link Descriptors (VLD).
263           The internal VLD describes the basic topology of
264           the connectivity such as E-LAN, E-Line, E-Tree.
265           between internal VNF components of the system.";
266
267         leaf id {
268           description "Identifier for the VLD";
269           type string;
270         }
271
272         leaf name {
273           description "Name of the internal VLD";
274           type string;
275         }
276
277         leaf short-name {
278           description "Short name to appear as label in the UI";
279           type string;
280         }
281
282         leaf description {
283           type string;
284         }
285
286         leaf type {
287           type manotypes:virtual-link-type;
288         }
289
290         leaf root-bandwidth {
291           description
292               "For ELAN this is the aggregate bandwidth.";
293           type uint64;
294         }
295
296         leaf leaf-bandwidth {
297           description
298               "For ELAN this is the bandwidth of branches.";
299           type uint64;
300         }
301
302         list internal-connection-point {
303           key "id-ref";
304           description "List of internal connection points in this VLD";
305           leaf id-ref {
306             description "Reference to the internal connection point id";
307             type leafref {
308               path "../../../vdu/internal-connection-point/id";
309             }
310           }
311
312           leaf ip-address {
313             description "IP address of the internal connection point";
314             type inet:ip-address;
315           }
316         }
317
318         uses manotypes:provider-network;
319         choice init-params {
320           description "Extra parameters for VLD instantiation";
321
322           case vim-network-ref {
323             leaf vim-network-name {
324               description
325                   "Name of network in VIM account. This is used to indicate
326                     pre-provisioned network name in cloud account.";
327               type string;
328             }
329           }
330
331           case vim-network-profile {
332             leaf ip-profile-ref {
333               description "Named reference to IP-profile object";
334               type string;
335             }
336           }
337
338         }
339       }
340
341       uses manotypes:ip-profile-list;
342
343       list connection-point {
344         key "name";
345         description
346           "List for external connection points. Each VNF has one
347           or more external connection points that connect the VNF
348           to other VNFs or to external networks. Each VNF exposes
349           connection points to the orchestrator, which can construct
350           network services by connecting the connection points
351           between different VNFs. The NFVO will use VLDs and VNFFGs
352           at the network service level to construct network services.";
353
354         uses common-connection-point;
355
356         leaf internal-vld-ref {
357           description
358             "Reference to an internal VLD of the VNF. This field is
359             optional. It allows exposing an internal VLD through a
360             connection point. When building a NS, this VNF CP might be
361             connected to a NS VLD, then both VLDs (the i-VLD of the VNF and the
362             VLD of the NS) will become the same network and the IP profile will
363             be the one configured at NS level.";
364           type leafref {
365             path "../../internal-vld/id";
366           }
367         }
368       }
369
370       list vdu {
371         description "List of Virtual Deployment Units";
372         key "id";
373
374         leaf id {
375           description "Unique id for the VDU";
376           type string;
377         }
378
379         leaf name {
380           description "Unique name for the VDU";
381           type string;
382         }
383
384         leaf description {
385             description "Description of the VDU.";
386             type string;
387         }
388
389         leaf pdu-type {
390           description
391             "Type of PDU. If this field exists, the deployment unit must be
392             understood as a PDU, not as a VDU. This field is used to identify
393             the category of PDU instances to be used at instantiation time. For
394             the instantiation to be successful, there must be available
395             PDU instances of this type in the selected datacenter.";
396           type string;
397         }
398
399         leaf count {
400           description "Number of instances of VDU";
401           type uint64;
402         }
403
404         leaf mgmt-vpci {
405           description
406               "Specifies the virtual PCI address. Expressed in
407              the following format dddd:dd:dd.d. For example
408              0000:00:12.0. This information can be used to
409              pass as metadata during the VM creation.";
410           type string;
411         }
412
413         uses manotypes:vm-flavor;
414         uses manotypes:guest-epa;
415         uses manotypes:vswitch-epa;
416         uses manotypes:hypervisor-epa;
417         uses manotypes:host-epa;
418
419         list alarm {
420           key "alarm-id";
421
422           leaf alarm-id {
423             description
424                   "This field is reserved for the identifier assigned by the VIM provider";
425
426             type string;
427           }
428
429
430           leaf vnf-monitoring-param-ref {
431               description
432                  "Reference to the VNF level monitoring parameter
433                   that is aggregated";
434               type leafref {
435                 path "../../monitoring-param/id";
436               }
437           }
438
439           uses manotypes:alarm-properties;
440         }
441
442         uses manotypes:image-properties;
443
444         list alternative-images {
445           key "vim-type";
446           description
447             "List of alternative images per VIM type.
448             Different images can be used for specific types of VIMs instead
449             of the default image. This allows deployments in sites where the
450             image identifier in the VIM is given by the VIM provider and
451             cannot be modified.
452             If an alternative image is specified for a VIM type, it will prevail
453             over the default image";
454
455           leaf vim-type {
456             description "VIM type: openvim, openstack, vmware, aws, etc.";
457             type string;
458           }
459
460           uses manotypes:image-properties;
461         }
462
463         container vdu-configuration {
464           uses manotypes:vca-configuration;
465           uses manotypes:vca-config-access;
466         }
467
468         list monitoring-param {
469           description
470             "List of VDU-related monitoring parameters at NFVI level";
471           key id;
472           leaf id {
473             description "The unique id of the monitoring param at VDU level";
474             type string;
475           }
476
477           leaf nfvi-metric {
478             description "The associated NFVI metric to be monitored";
479             type manotypes:nfvi-metric-type;
480           }
481
482           leaf interface-name-ref {
483             description
484               "Reference to a VDU interface name. Applicable only when the nfvi-metric
485               refers to an interface and not to the VM";
486             type leafref {
487               path "../../interface/name";
488             }
489           }
490         }
491
492         choice cloud-init-input {
493           description
494             "Indicates how the contents of cloud-init script are provided.
495              There are 2 choices - inline or in a file";
496
497           case inline {
498             leaf cloud-init {
499               description
500                 "Contents of cloud-init script, provided inline, in cloud-config format";
501               type string;
502             }
503           }
504
505           case filename {
506             leaf cloud-init-file {
507               description
508                 "Name of file with contents of cloud-init script in cloud-config format";
509                 type string;
510             }
511           }
512         }
513
514         uses manotypes:supplemental-boot-data;
515
516         list internal-connection-point {
517           key "id";
518           description
519             "List for internal connection points. Each VNFC
520             has zero or more internal connection points.
521             Internal connection points are used for connecting
522             the VNF with components internal to the VNF. If a VNF
523             has only one VNFC, it may not have any internal
524             connection points.";
525
526           uses common-connection-point;
527
528           leaf internal-vld-ref {
529             type leafref {
530               path "../../../internal-vld/id";
531             }
532           }
533         }
534
535         list interface {
536           description
537               "List of Interfaces (external and internal) for the VNF";
538           key name;
539
540           leaf name {
541             description
542                 "Name of the interface. Note that this
543                 name has only local significance to the VDU.";
544             type string;
545           }
546
547           leaf position {
548             description
549                 "Explicit Position of the interface within the list";
550             type uint32;
551           }
552
553           leaf mgmt-interface {
554             description
555                 "Flag to indicate that this is the mgmt interface
556                 to be used for VDU configuration";
557             type boolean;
558             default false;
559           }
560
561           leaf type {
562             description
563                 "Type of the Interface";
564             type interface-type;
565
566             default "EXTERNAL";
567           }
568
569           leaf mac-address {
570             description
571                 "MAC address of the interface.
572                 Some VNFs require a specific MAC address to be configured
573                 in the interface. While this is not recommended at all in
574                 NFV environments, this parameter exists to allow those
575                 scenarios.
576                 This parameter will be likely deprecated in the future.";
577             type string;
578           }
579
580           choice connection-point-type {
581             case internal {
582               leaf internal-connection-point-ref {
583                 description
584                     "Leaf Ref to the particular internal connection point";
585                 type leafref {
586                    path "../../internal-connection-point/id";
587                  }
588               }
589             }
590             case external {
591               leaf external-connection-point-ref {
592                 description
593                     "Leaf Ref to the particular external connection point";
594                 type leafref {
595                    path "../../../connection-point/name";
596                  }
597               }
598             }
599           }
600
601           uses virtual-interface;
602         }
603
604
605         list volumes {
606           key "name";
607
608           leaf name {
609             description "Name of the disk-volumes, e.g. vda, vdb etc";
610             type string;
611           }
612
613           uses manotypes:volume-info;
614         }
615       }
616
617       list vdu-dependency {
618         description
619             "List of VDU dependencies.";
620
621         key vdu-source-ref;
622         leaf vdu-source-ref {
623           type leafref {
624             path "../../vdu/id";
625           }
626         }
627
628         leaf vdu-depends-on-ref {
629           description
630             "Reference to the VDU on which
631             the source VDU depends.";
632           type leafref {
633             path "../../vdu/id";
634           }
635         }
636       }
637
638       leaf service-function-chain {
639         description "Type of node in Service Function Chaining Architecture";
640
641         type enumeration {
642           enum UNAWARE;
643           enum CLASSIFIER;
644           enum SF;
645           enum SFF;
646         }
647         default "UNAWARE";
648       }
649
650       leaf service-function-type {
651         description
652           "Type of Service Function.
653            NOTE: This needs to map with Service Function Type in ODL to
654            support VNFFG. Service Function Type is mandatory param in ODL
655            SFC. This is temporarily set to string for ease of use";
656         type string;
657       }
658
659       uses manotypes:http-endpoints;
660
661       list scaling-group-descriptor {
662         description
663             "scaling group descriptor within the VNF.
664              The scaling group defines a group of VDUs,
665              and the ratio of VDUs in the VNF
666              that is used as target for scaling action";
667
668         key "name";
669
670         leaf name {
671           description "Name of this scaling group.";
672           type string;
673         }
674
675         list scaling-policy {
676
677           key "name";
678
679           leaf name {
680             description
681                 "Name of the scaling policy";
682             type string;
683           }
684
685           leaf scaling-type {
686             description
687                 "Type of scaling";
688             type manotypes:scaling-policy-type;
689           }
690
691           leaf enabled {
692             description
693               "Specifies if the scaling policy can be applied";
694             type boolean;
695             default true;
696           }
697
698           leaf scale-in-operation-type {
699             description
700                 "Operation to be applied to check between scaling criterias to
701                  check if the scale in threshold condition has been met.
702                  Defaults to AND";
703             type manotypes:scaling-criteria-operation;
704             default AND;
705           }
706
707           leaf scale-out-operation-type {
708             description
709                 "Operation to be applied to check between scaling criterias to
710                  check if the scale out threshold condition has been met.
711                  Defauls to OR";
712             type manotypes:scaling-criteria-operation;
713             default OR;
714           }
715
716           leaf threshold-time {
717             description
718               "The duration for which the criteria must hold true";
719             type uint32;
720             mandatory true;
721           }
722
723           leaf cooldown-time {
724             description
725               "The duration after a scaling-in/scaling-out action has been
726               triggered, for which there will be no further optional";
727             type uint32;
728             mandatory true;
729           }
730
731           list scaling-criteria {
732             description
733                 "list of conditions to be met for generating scaling
734                    requests";
735             key "name";
736
737             leaf name {
738               type string;
739             }
740
741             leaf scale-in-threshold {
742               description
743                   "Value below which scale-in requests are generated";
744               type decimal64{
745                 fraction-digits 10;
746              }
747             }
748
749             leaf scale-in-relational-operation {
750               description
751                 "The relational operator used to compare the monitoring param
752                 against the scale-in-threshold.";
753               type manotypes:relational-operation-type;
754               default LE;
755             }
756
757             leaf scale-out-threshold {
758               description
759                   "Value above which scale-out requests are generated";
760               type decimal64{
761                 fraction-digits 10;
762              }
763             }
764
765             leaf scale-out-relational-operation {
766               description
767                 "The relational operator used to compare the monitoring param
768                 against the scale-out-threshold.";
769               type manotypes:relational-operation-type;
770               default GE;
771             }
772
773             leaf vnf-monitoring-param-ref {
774               description
775                  "Reference to the VNF level monitoring parameter
776                   that is aggregated";
777               type leafref {
778                 path "../../../../monitoring-param/id";
779               }
780             }
781           }
782         }
783
784         list vdu {
785           description "List of VDUs in this scaling group";
786           key "vdu-id-ref";
787
788           leaf vdu-id-ref {
789             description "Reference to the VDU id";
790             type leafref {
791               path "../../../vdu/id";
792             }
793           }
794
795           leaf count {
796             description
797               "count of this VDU id within this scaling group.
798                The count allows to define the number of instances
799                when a scaling action targets this scaling group";
800             type uint32;
801             default 1;
802           }
803         }
804
805         leaf min-instance-count {
806           description
807             "Minimum instances of the scaling group which are allowed.
808             These instances are created by default when the network service
809             is instantiated.";
810           type uint32;
811           default 0;
812         }
813
814         leaf max-instance-count {
815           description
816             "Maximum instances of this scaling group that are allowed
817              in a single network service. The network service scaling
818              will fail, when the number of service group instances
819              exceed the max-instance-count specified.";
820           type uint32;
821           default 10;
822         }
823
824         list scaling-config-action {
825           description "List of scaling config actions";
826           key "trigger";
827
828           leaf trigger {
829             description "scaling trigger";
830             type manotypes:scaling-trigger;
831           }
832
833           leaf vnf-config-primitive-name-ref {
834             description "Reference to the VNF config primitive";
835             type leafref {
836               path "../../../vnf-configuration/config-primitive/name";
837             }
838           }
839         }
840       }
841
842       list monitoring-param {
843         description
844           "List of monitoring parameters at the network service level";
845         key id;
846         leaf id {
847           type string;
848         }
849
850         leaf name {
851           type string;
852         }
853
854         uses manotypes:monitoring-param-aggregation;
855
856         choice monitoring-type {
857           description
858             "Defines the type of monitoring param to be used:
859               * vdu-monitorin-param:     VDU-related metric (from NFVI)
860               * vnf-metric:              VNF-related metric (from VCA)
861               * vdu-metric:              VDU-related metric (from VCA)
862             ";
863
864           case vdu-monitoring-param {
865             description "VDU-related metric from the infrastructure";
866             container vdu-monitoring-param {
867               leaf vdu-ref {
868                 type leafref {
869                   path "../../../vdu/id";
870                 }
871               }
872               leaf vdu-monitoring-param-ref {
873                 type leafref {
874                   path "../../../vdu[id = current()/../vdu-ref]/monitoring-param/id";
875                 }
876               }
877             }
878           }
879
880           case vnf-metric {
881             description "VNF-related metric (from VCA)";
882             container vnf-metric {
883               leaf vnf-metric-name-ref {
884                 type leafref {
885                   path "../../../vnf-configuration/metrics/name";
886                 }
887               }
888             }
889           }
890
891           case vdu-metric {
892             description "VDU-related metric (from VCA)";
893             container vdu-metric {
894               leaf vdu-ref {
895                 type leafref {
896                   path "../../../vdu/id";
897                 }
898               }
899               leaf vdu-metric-name-ref {
900                 type leafref {
901                   path "../../../vdu[id = current()/../vdu-ref]/vdu-configuration/metrics/name";
902                 }
903               }
904             }
905           }
906
907         }
908
909         leaf http-endpoint-ref {
910           type leafref {
911             path "../../http-endpoint/path";
912           }
913         }
914
915         leaf json-query-method {
916           type manotypes:json-query-method;
917           default "NAMEKEY";
918         }
919
920         container json-query-params {
921           leaf json-path {
922             description
923               "The jsonpath to use to extract value from JSON structure";
924             type string;
925           }
926           leaf object-path {
927             description
928               "The objectpath to use to extract value from JSON structure";
929             type string;
930           }
931         }
932
933         uses manotypes:monitoring-param-ui-data;
934         uses manotypes:monitoring-param-value;
935
936       }
937
938       list placement-groups {
939         description "List of placement groups at VNF level";
940
941         key "name";
942         uses manotypes:placement-group-info;
943
944         list member-vdus {
945
946           description
947               "List of VDUs that are part of this placement group";
948           key "member-vdu-ref";
949
950           leaf member-vdu-ref {
951             type leafref {
952               path "../../../vdu/id";
953             }
954           }
955         }
956       }
957   }
958 }
959
960 // vim: sw=2