RIFT-14692 : Feedback on nsd.yang comments
[osm/SO.git] / models / plugins / yang / mano-types.yang
1
2 /*
3  * 
4  *   Copyright 2016 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 mano-types
22 {
23   namespace "urn:ietf:params:xml:ns:yang:nfvo:mano-types";
24   prefix "manotypes";
25
26   import ietf-inet-types {
27     prefix "inet";
28   }
29
30   import rw-pb-ext {
31     prefix "rwpb";
32   }
33
34   revision 2015-04-23 {
35     description
36       "Initial revision. This YANG file defines
37        the reusable base types for VNF Management
38        and Orchestration (MANO).";
39     reference
40       "Derived from earlier versions of base YANG files";
41   }
42
43   typedef package-type {
44       description "Type of descriptor being on-boarded";
45       type enumeration {
46         enum NSD;
47         enum VNFD;
48       }
49     }
50
51   typedef parameter-data-type {
52     type enumeration {
53       enum STRING;
54       enum INTEGER;
55       enum BOOLEAN;
56     }
57   }
58
59   grouping primitive-parameter-value {
60     list parameter {
61       description
62           "List of parameters to the configuration primitive.";
63       key "name";
64       leaf name {
65         description
66             "Name of the parameter.";
67         type string;
68       }
69
70       leaf value {
71         description
72             "Value associated with the name.";
73         type string;
74       }
75     }
76   }
77
78   grouping primitive-parameter {
79     leaf name {
80       description
81           "Name of the parameter.";
82       type string;
83     }
84
85     leaf data-type {
86       description
87           "Data type associated with the name.";
88       type manotypes:parameter-data-type;
89     }
90
91     leaf mandatory {
92       description "Is this field mandatory";
93       type boolean;
94       default false;
95     }
96
97     leaf default-value {
98       description "The default value for this field";
99       type string;
100     }
101
102     leaf parameter-pool {
103       description "NSD parameter pool name to use for this parameter";
104       type string;
105     }
106
107     leaf read-only {
108       description
109         "The value should be dimmed by the UI.
110         Only applies to parameters with default values.";
111       type boolean;
112     }
113
114     leaf hidden {
115       description
116         "The value should be hidden by the UI.
117         Only applies to parameters with default values.";
118       type boolean;
119     }
120   }
121   
122   grouping ui-primitive-group {
123     list parameter-group {
124       description
125             "Grouping of parameters which are logically grouped in UI";
126       key "name";
127  
128       leaf name {
129         description
130             "Name of the parameter group";
131         type string;
132       }
133  
134       list parameter {
135         description
136             "List of parameters for the service primitive.";
137         key "name";
138         uses manotypes:primitive-parameter;
139       }
140  
141       leaf mandatory {
142         description "Is this parameter group mandatory";
143         type boolean;
144         default true;
145       }
146     }
147   }
148
149   grouping image-properties {
150     leaf image {
151       description
152             "Image name for the software image.
153              If the image name is found within the VNF package it will
154              be uploaded to all VIM accounts during onboarding process.
155              Otherwise, the image must be added to the VIM account with
156              the same name as entered here.
157             ";
158       type string;
159     }
160
161     leaf image-checksum {
162       description
163             "Image md5sum for the software image.
164             The md5sum, if provided, along with the image name uniquely
165             identifies an image uploaded to the CAL.
166             ";
167       type string;
168     } 
169   }
170   grouping initial-config {
171     leaf seq {
172       description
173           "Sequence number for the configuration primitive.";
174       type uint64;
175     }
176
177     leaf name {
178       description
179           "Name of the configuration primitive.";
180       type string;
181       mandatory "true";
182     }
183
184     leaf user-defined-script {
185       description
186           "A user defined script.";
187       type string;
188     }
189
190     list parameter {
191       key "name";
192       leaf name {
193         type string;
194       }
195
196       leaf value {
197         description "Value of the configuration primitive.";
198         type string;
199       }
200     }
201   }
202
203   grouping vnf-configuration {
204     container vnf-configuration {
205       rwpb:msg-new VnfConfiguration;
206       description
207           "Information about the VNF configuration. Note: 
208            If the NS contains multiple instances of the
209            same VNF, each instance could have a different
210            configuration.";
211
212       choice config-method {
213         description
214             "Defines the configuration method for the VNF.";
215         case netconf {
216           description
217               "Use NETCONF for configuring the VNF.";
218           container netconf {
219             leaf target {
220               description
221                   "Netconf configuration target";
222               type enumeration {
223                 enum running;
224                 enum candidate;
225               }
226             }
227
228             leaf protocol {
229               description
230                   "Protocol to use for NETCONF, such as ssh";
231               type enumeration {
232                 enum None;
233                 enum ssh;
234               }
235             }
236
237             leaf port {
238               description
239                   "Port for the NETCONF server.";
240               type inet:port-number;
241             }
242           }
243         }
244
245         case rest {
246           description
247               "Use REST for configuring the VNF.";
248           container rest {
249             leaf port {
250               description
251                   "Port for the REST server.";
252               type inet:port-number;
253             }
254           }
255         }
256
257         case script {
258           description
259               "Use custom script for configuring the VNF.
260                This script is executed in the context of 
261                Orchestrator (The same system and environment
262                as the Launchpad).";
263           container script {
264             leaf script-type {
265               description
266                   "Script type - currently supported : bash, expect";
267               type enumeration {
268                 enum bash;
269                 enum expect;
270               }
271             }
272           }
273         }
274
275         case juju {
276           description
277             "Configure the VNF through Juju.";
278           container juju {
279             leaf charm {
280               description "Juju charm to use with the VNF.";
281               type string;
282             }
283           }
284         }
285       }
286
287       container config-access {
288         leaf mgmt-ip-address {
289           description
290               "IP address to be used to configure this VNF,
291                optional if it is possible to resolve dynamically.";
292           type inet:ip-address;
293         }
294
295         leaf username {
296           description 
297               "User name for configuration.";
298           type string;
299         }
300
301         leaf password {
302           description 
303               "Password for configuration access authentication.";
304           type string;
305         }
306       }
307
308       container config-attributes {
309         description
310             "Miscellaneous input parameters to be considered
311              while processing the NSD to apply configuration";
312
313         leaf config-priority {
314           description
315               "Configuration priority - order of configuration
316                to be applied to each VNF in this NS. A low
317                number takes precedence over a high number";
318           type uint64;
319         }
320
321         leaf config-delay {
322           description 
323               "Wait (seconds) before applying the configuration to VNF";
324           type uint64;
325         }
326       }
327
328       list service-primitive {
329         rwpb:msg-new ServicePrimitive;
330         description
331           "List of service primitives supported by the
332           configuration agent for this VNF.";
333         key "name";
334
335         leaf name {
336           description
337             "Name of the service primitive.";
338           type string;
339         }
340
341         list parameter {
342           description
343             "List of parameters to the service primitive.";
344           key "name";
345           uses primitive-parameter;
346         }
347       }
348
349       list initial-config-primitive {
350         rwpb:msg-new InitialConfigPrimitive;
351         description
352           "Initial set of configuration primitives.";
353         key "seq";
354         uses initial-config;
355       }
356
357       leaf config-template {
358         description
359             "Configuration template for each VNF";
360         type string;
361       }
362     }
363   } // END - grouping vnf-configuration
364
365   typedef virtual-link-type {
366     description
367         "Type of virtual link
368          ELAN: A multipoint service connecting a set of VNFs
369          // ELINE: For a simple point to point connection
370          //        between a VNF and the existing network.
371          // ETREE: A multipoint service connecting one or
372          //        more roots and a set of leaves, but
373          //        preventing inter-leaf communication.";
374     type enumeration {
375       enum ELAN;
376       // enum ETREE;
377       // enum ELINE;
378     }
379   }
380
381   grouping named-value {
382     leaf name {
383       type string;
384     }
385
386     leaf value {
387       type string;
388     }
389   }
390
391   typedef http-method {
392     description
393       "Type of HTTP operation";
394
395     type enumeration {
396       enum POST;
397       enum PUT;
398       enum GET;
399       enum DELETE;
400       enum OPTIONS;
401       enum PATCH;
402     }
403   }
404
405   typedef api-type {
406     description
407       "Type of API to fetch monitoring parameters";
408
409     type enumeration {
410       enum HTTP;
411       enum NETCONF;
412       enum SOAP;
413     }
414   }
415
416   typedef json-query-method {
417     description
418       "The method to extract a value from a JSON response
419
420        NAMEKEY - Use the name as the key for a non-nested value.
421        JSONPATH - Use jsonpath-rw implementation to extract a value.
422        OBJECTPATH - Use objectpath implementation to extract a value.";
423       type enumeration {
424         enum NAMEKEY;
425         enum JSONPATH;
426         enum OBJECTPATH;
427       }
428   }
429
430   typedef param-value-type {
431     description
432       "The type of the parameter value";
433     type enumeration {
434        enum INT;
435        enum DECIMAL;
436        enum STRING;
437     }
438   }
439
440   typedef connection-point-type {
441     description
442         "Type of connection point
443         VPORT: Virtual Port
444         // VNIC_ADDR: Virtual NIC Address
445         // PNIC_ADDR: Physical NIC Address
446         // PPORT: Physical Port.";
447
448     type enumeration {
449       enum VPORT;
450     }
451   }
452
453   typedef widget-type {
454     description
455         "Type of the widget, typically used by the UI.";
456     type enumeration {
457       enum HISTOGRAM;
458       enum BAR;
459       enum GAUGE;
460       enum SLIDER;
461       enum COUNTER;
462       enum TEXTBOX;
463     }
464   }
465
466   typedef cpu-feature-type {
467     description
468         "Enumeration for CPU features.
469
470          AES: CPU supports advanced instruction set for
471          AES (Advanced Encryption Standard).
472
473          CAT: Cache Allocation Technology (CAT) allows
474          an Operating System, Hypervisor, or similar
475          system management agent to specify the amount
476          of L3 cache (currently the last-level cache
477          in most server and client platforms) space an
478          application can fill (as a hint to hardware
479          functionality, certain features such as power
480          management may override CAT settings).
481
482          CMT: Cache Monitoring Technology (CMT) allows
483          an Operating System, Hypervisor, or similar
484          system management agent to determine the
485          usage of cache based on applications running
486          on the platform. The implementation is
487          directed at L3 cache monitoring (currently
488          the last-level cache in most server and
489          client platforms).
490
491          DDIO: Intel Data Direct I/O (DDIO) enables
492          Ethernet server NICs and controllers talk
493          directly to the processor cache without a
494          detour via system memory. This enumeration
495          specifies if the VM requires a DDIO
496          capable host.";
497
498     type enumeration {
499       enum PREFER_AES;
500       enum REQUIRE_AES;
501       enum PREFER_CAT;
502       enum REQUIRE_CAT;
503       enum PREFER_CMT;
504       enum REQUIRE_CMT;
505       enum PREFER_DDIO;
506       enum REQUIRE_DDIO;
507       enum REQUIRE_VME;
508       enum PREFER_VME;
509       enum REQUIRE_DE;
510       enum PREFER_DE;
511       enum REQUIRE_PSE;
512       enum PREFER_PSE;
513       enum REQUIRE_TSC;
514       enum PREFER_TSC;
515       enum REQUIRE_MSR;
516       enum PREFER_MSR;
517       enum REQUIRE_PAE;
518       enum PREFER_PAE;
519       enum REQUIRE_MCE;
520       enum PREFER_MCE;
521       enum REQUIRE_CX8;
522       enum PREFER_CX8;
523       enum REQUIRE_APIC;
524       enum PREFER_APIC;
525       enum REQUIRE_SEP;
526       enum PREFER_SEP;
527       enum REQUIRE_MTRR;
528       enum PREFER_MTRR;
529       enum REQUIRE_PGE;
530       enum PREFER_PGE;
531       enum REQUIRE_MCA;
532       enum PREFER_MCA;
533       enum REQUIRE_CMOV;
534       enum PREFER_CMOV;
535       enum REQUIRE_PAT;
536       enum PREFER_PAT;
537       enum REQUIRE_PSE36;
538       enum PREFER_PSE36;
539       enum REQUIRE_CLFLUSH;
540       enum PREFER_CLFLUSH;
541       enum REQUIRE_DTS;
542       enum PREFER_DTS;
543       enum REQUIRE_ACPI;
544       enum PREFER_ACPI;
545       enum REQUIRE_MMX;
546       enum PREFER_MMX;
547       enum REQUIRE_FXSR;
548       enum PREFER_FXSR;
549       enum REQUIRE_SSE;
550       enum PREFER_SSE;
551       enum REQUIRE_SSE2;
552       enum PREFER_SSE2;
553       enum REQUIRE_SS;
554       enum PREFER_SS;
555       enum REQUIRE_HT;
556       enum PREFER_HT;
557       enum REQUIRE_TM;
558       enum PREFER_TM;
559       enum REQUIRE_IA64;
560       enum PREFER_IA64;
561       enum REQUIRE_PBE;
562       enum PREFER_PBE;
563       enum REQUIRE_RDTSCP;
564       enum PREFER_RDTSCP;
565       enum REQUIRE_PNI;
566       enum PREFER_PNI;
567       enum REQUIRE_PCLMULQDQ;
568       enum PREFER_PCLMULQDQ;
569       enum REQUIRE_DTES64;
570       enum PREFER_DTES64;
571       enum REQUIRE_MONITOR;
572       enum PREFER_MONITOR;
573       enum REQUIRE_DS_CPL;
574       enum PREFER_DS_CPL;
575       enum REQUIRE_VMX;
576       enum PREFER_VMX;
577       enum REQUIRE_SMX;
578       enum PREFER_SMX;
579       enum REQUIRE_EST;
580       enum PREFER_EST;
581       enum REQUIRE_TM2;
582       enum PREFER_TM2;
583       enum REQUIRE_SSSE3;
584       enum PREFER_SSSE3;
585       enum REQUIRE_CID;
586       enum PREFER_CID;
587       enum REQUIRE_FMA;
588       enum PREFER_FMA;
589       enum REQUIRE_CX16;
590       enum PREFER_CX16;
591       enum REQUIRE_XTPR;
592       enum PREFER_XTPR;
593       enum REQUIRE_PDCM;
594       enum PREFER_PDCM;
595       enum REQUIRE_PCID;
596       enum PREFER_PCID;
597       enum REQUIRE_DCA;
598       enum PREFER_DCA;
599       enum REQUIRE_SSE4_1;
600       enum PREFER_SSE4_1;
601       enum REQUIRE_SSE4_2;
602       enum PREFER_SSE4_2;
603       enum REQUIRE_X2APIC;
604       enum PREFER_X2APIC;
605       enum REQUIRE_MOVBE;
606       enum PREFER_MOVBE;
607       enum REQUIRE_POPCNT;
608       enum PREFER_POPCNT;
609       enum REQUIRE_TSC_DEADLINE_TIMER;
610       enum PREFER_TSC_DEADLINE_TIMER;
611       enum REQUIRE_XSAVE;
612       enum PREFER_XSAVE;
613       enum REQUIRE_AVX;
614       enum PREFER_AVX;
615       enum REQUIRE_F16C;
616       enum PREFER_F16C;
617       enum REQUIRE_RDRAND;
618       enum PREFER_RDRAND;
619       enum REQUIRE_FSGSBASE;
620       enum PREFER_FSGSBASE;
621       enum REQUIRE_BMI1;
622       enum PREFER_BMI1;
623       enum REQUIRE_HLE;
624       enum PREFER_HLE;
625       enum REQUIRE_AVX2;
626       enum PREFER_AVX2;
627       enum REQUIRE_SMEP;
628       enum PREFER_SMEP;
629       enum REQUIRE_BMI2;
630       enum PREFER_BMI2;
631       enum REQUIRE_ERMS;
632       enum PREFER_ERMS;
633       enum REQUIRE_INVPCID;
634       enum PREFER_INVPCID;
635       enum REQUIRE_RTM;
636       enum PREFER_RTM;
637       enum REQUIRE_MPX;
638       enum PREFER_MPX;
639       enum REQUIRE_RDSEED;
640       enum PREFER_RDSEED;
641       enum REQUIRE_ADX;
642       enum PREFER_ADX;
643       enum REQUIRE_SMAP;
644       enum PREFER_SMAP;
645     }
646   }
647
648   grouping vm-flavor {
649     container vm-flavor {
650       leaf vcpu-count {
651         description
652             "Number of VCPUs for the VM.";
653         type uint16;
654       }
655
656       leaf memory-mb {
657         description
658             "Amount of memory in MB.";
659         type uint64;
660       }
661
662       leaf storage-gb {
663         description
664             "Amount of disk space in GB.";
665         type uint64;
666       }
667     }
668   } //grouping vm-flavor
669
670   grouping vswitch-epa {
671     container vswitch-epa {
672       leaf ovs-acceleration {
673         description
674             "Specifies Open vSwitch acceleration mode.
675              MANDATORY: OVS acceleration is required
676              PREFERRED: OVS acceleration is preferred";
677         type enumeration {
678           enum MANDATORY;
679           enum PREFERRED;
680           enum DISABLED;
681         }
682       }
683
684       leaf ovs-offload {
685         description
686             "Specifies Open vSwitch hardware offload mode.
687              MANDATORY: OVS offload is required
688              PREFERRED: OVS offload is preferred";
689         type enumeration {
690           enum MANDATORY;
691           enum PREFERRED;
692           enum DISABLED;
693         }
694       }
695     }
696   }
697
698   grouping hypervisor-epa {
699     container hypervisor-epa {
700       leaf type {
701         description
702             "Specifies the type of hypervisor.
703              KVM: KVM
704              XEN: XEN";
705         type enumeration {
706           enum PREFER_KVM;
707           enum REQUIRE_KVM;
708         }
709       }
710       leaf version {
711         type string;
712       }
713     }
714   }
715
716   grouping host-epa {
717     container host-epa {
718       description "Specifies the host level EPA attributes.";
719       leaf cpu-model {
720         description
721             "Host CPU model. Examples include: SandyBridge,
722              IvyBridge";
723         type enumeration {
724           enum PREFER_WESTMERE;
725           enum REQUIRE_WESTMERE;
726           enum PREFER_SANDYBRIDGE;
727           enum REQUIRE_SANDYBRIDGE;
728           enum PREFER_IVYBRIDGE;
729           enum REQUIRE_IVYBRIDGE;
730           enum PREFER_HASWELL;
731           enum REQUIRE_HASWELL;
732           enum PREFER_BROADWELL;
733           enum REQUIRE_BROADWELL;
734           enum PREFER_NEHALEM;
735           enum REQUIRE_NEHALEM;
736           enum PREFER_PENRYN;
737           enum REQUIRE_PENRYN;
738           enum PREFER_CONROE;
739           enum REQUIRE_CONROE;
740           enum PREFER_CORE2DUO;
741           enum REQUIRE_CORE2DUO;
742         }
743       }
744
745       leaf cpu-arch {
746         description "Host CPU architecture.";
747         type enumeration {
748           enum PREFER_X86;
749           enum REQUIRE_X86;
750           enum PREFER_X86_64;
751           enum REQUIRE_X86_64;
752           enum PREFER_I686;
753           enum REQUIRE_I686;
754           enum PREFER_IA64;
755           enum REQUIRE_IA64;
756           enum PREFER_ARMV7;
757           enum REQUIRE_ARMV7;
758           enum PREFER_ARMV8;
759           enum REQUIRE_ARMV8;
760         }
761       }
762
763       leaf cpu-vendor {
764         description "Host CPU Vendor.";
765         type enumeration {
766           enum PREFER_INTEL;
767           enum REQUIRE_INTEL;
768           enum PREFER_AMD;
769           enum REQUIRE_AMD;
770         }
771       }
772
773       leaf cpu-socket-count {
774         description "Number of sockets on the host.";
775         type uint64;
776       }
777
778       leaf cpu-core-count {
779         description "Number of cores on the host.";
780         type uint64;
781       }
782
783       leaf cpu-core-thread-count {
784         description "Number of threads per cores on the host.";
785         type uint64;
786       }
787       
788       list cpu-feature {
789         key "feature";
790         description "List of CPU features.";
791         leaf feature {
792           description "CPU feature.";
793           type cpu-feature-type;
794         }
795       }
796
797       
798       leaf om-cpu-model-string {
799         description "OpenMANO CPU model string";
800         type string;
801       }
802
803       list om-cpu-feature {
804         key "feature";
805         description "List of OpenMANO CPU features";
806         leaf feature {
807           description "CPU feature";
808           type string;
809         }
810       }
811     }
812   }
813
814   grouping guest-epa {
815     description "EPA attributes for the guest";
816     container guest-epa {
817       leaf trusted-execution {
818         description "This VM should be allocated from trusted pool";
819         type boolean;
820       }
821
822       leaf mempage-size {
823         description
824             "Memory page allocation size. If a VM requires
825              hugepages, it should choose LARGE or SIZE_2MB
826              or SIZE_1GB. If the VM prefers hugepages it
827              should choose PREFER_LARGE.
828              LARGE        : Require hugepages (either 2MB or 1GB)
829              SMALL        : Doesn't require hugepages
830              SIZE_2MB     : Requires 2MB hugepages
831              SIZE_1GB     : Requires 1GB hugepages
832              PREFER_LARGE : Application prefers hugepages";
833         type enumeration {
834           enum LARGE;
835           enum SMALL;
836           enum SIZE_2MB;
837           enum SIZE_1GB;
838           enum PREFER_LARGE;
839         }
840       }
841
842       leaf cpu-pinning-policy {
843         description
844             "CPU pinning policy describes association
845              between virtual CPUs in guest and the
846              physical CPUs in the host.
847              DEDICATED : Virtual CPUs are pinned to
848                          physical CPUs
849              SHARED    : Multiple VMs may share the
850                          same physical CPUs.
851              ANY       : Any policy is acceptable for the VM";
852         type enumeration {
853           enum DEDICATED;
854           enum SHARED;
855           enum ANY;
856         }
857         default "ANY";
858       }
859
860       leaf cpu-thread-pinning-policy {
861           description
862             "CPU thread pinning policy describes how to
863              place the guest CPUs when the host supports
864              hyper threads:
865              AVOID   : Avoids placing a guest on a host
866                        with threads.
867              SEPARATE: Places vCPUs on separate cores,
868                        and avoids placing two vCPUs on
869                        two threads of same core.
870              ISOLATE : Places each vCPU on a different core,
871                        and places no vCPUs from a different
872                        guest on the same core.
873              PREFER  : Attempts to place vCPUs on threads
874                        of the same core.";
875         type enumeration {
876           enum AVOID;
877           enum SEPARATE;
878           enum ISOLATE;
879           enum PREFER;
880         }
881       }
882
883       list pcie-device {
884         description
885             "List of pcie passthrough devices.";
886         key device-id;
887         leaf device-id {
888           description
889               "Device identifier.";
890           type string;
891         }
892         leaf count {
893           description
894               "Number of devices to attach to the VM.";
895           type uint64;
896         }
897       }
898
899       choice numa-policy {
900         case numa-unaware {
901           leaf numa-unaware {
902             type empty;
903           }
904         }
905
906         case numa-aware {
907           container numa-node-policy {
908             description
909                 "This policy defines NUMA topology of the
910                  guest. Specifically identifies if the guest
911                  should be run on a host with one NUMA
912                  node or multiple NUMA nodes. As an example
913                  a guest might need 8 VCPUs and 4 GB of
914                  memory. However, it might need the VCPUs
915                  and memory distributed across multiple
916                  NUMA nodes. In this scenario, NUMA node
917                  1 could run with 6 VCPUs and 3GB, and
918                  NUMA node 2 could run with 2 VCPUs and
919                  1GB.";
920
921             leaf node-cnt {
922               description
923                   "The number of NUMA nodes to expose to the VM.";
924               type uint16;
925             }
926
927             leaf mem-policy {
928               description
929                   "This policy specifies how the memory should
930                    be allocated in a multi-node scenario.
931                    STRICT    : The memory must be allocated
932                                strictly from the memory attached
933                                to the NUMA node.
934                    PREFERRED : The memory should be allocated
935                                preferentially from the memory
936                                attached to the NUMA node";
937               type enumeration {
938                 enum STRICT;
939                 enum PREFERRED;
940               }
941             }
942
943            list node {
944               key id;
945               leaf id {
946                 description
947                     "NUMA node identification. Typically
948                      it's 0 or 1";
949                 type uint64;
950               }
951
952               list vcpu {
953                 key "id";
954                 description
955                     "List of VCPUs to allocate on
956                      this NUMA node.";
957                 leaf id {
958                   type uint64;
959                   description "List of VCPUs ids to allocate on
960                                this NUMA node";
961                 }
962               }
963
964               leaf memory-mb {
965                 description
966                     "Memory size expressed in MB
967                      for this NUMA node.";
968                 type uint64;
969               }
970
971               choice om-numa-type {
972                 description
973                     "OpenMANO Numa type selection";
974
975                 case cores {
976                   leaf num-cores {
977                     type uint8;
978                   }
979                 }
980
981                 case paired-threads {
982                   container paired-threads {
983                     leaf num-paired-threads {
984                       type uint8;
985                     }
986
987                     list paired-thread-ids {
988                       description
989                           "List of thread pairs to use in case of paired-thread NUMA";
990                       max-elements 16;
991                       key thread-a;
992
993                       leaf thread-a {
994                           type uint8;
995                       }
996
997                       leaf thread-b {
998                           type uint8;
999                       }
1000                     }
1001                   }
1002                 }
1003                 case threads {
1004                   leaf num-threads {
1005                     type uint8;
1006                   }
1007                 }
1008               }
1009             }
1010
1011           }
1012         }
1013       }
1014     }
1015   }
1016
1017   grouping provider-network {
1018     container provider-network {
1019       description "Container for the provider network.";
1020       leaf physical-network {
1021         description
1022             "Name of the physical network on which the provider
1023              network is built.";
1024         type string;
1025       }
1026
1027       leaf overlay-type {
1028         description
1029             "Type of the overlay network.
1030              LOCAL - Provider network implemented in a single compute node
1031              FLAT - Provider network shared by all tenants 
1032              VLAN - Provider network implemented using 802.1Q tagging
1033              VXLAN - Provider networks implemented using RFC 7348
1034              GRE - Provider networks implemented using GRE tunnels";
1035         type enumeration {
1036           enum LOCAL;
1037           enum FLAT;
1038           enum VLAN;
1039           enum VXLAN;
1040           enum GRE;
1041         }
1042       }
1043       leaf segmentation_id {
1044         description
1045             "ID of segregated virtual networks";
1046             type uint32;
1047       }
1048     }
1049   }
1050
1051   grouping monitoring-param {
1052     list http-endpoint {
1053       description
1054           "List of http endpoints to be used by monitoring params";
1055       key path;
1056
1057       leaf path {
1058         description "The HTTP path on the management server";
1059         type string;
1060       }
1061
1062       leaf https {
1063         description "Pick HTTPS instead of HTTP , Default is false";
1064         type boolean;
1065         default "false";
1066       }
1067
1068       leaf port {
1069         description "The HTTP port to connect to";
1070         type inet:port-number;
1071       }
1072
1073       leaf username {
1074         description "The HTTP basic auth username";
1075         type string;
1076       }
1077
1078       leaf password {
1079         description "The HTTP basic auth password";
1080         type string;
1081       }
1082
1083       leaf polling-interval-secs {
1084         description "The HTTP polling interval in seconds";
1085         type uint8;
1086         default 2;
1087       }
1088
1089       leaf method {
1090         description
1091           "Method that the URI should perform.
1092            Deafult action is GET.";
1093
1094         type manotypes:http-method;
1095         default "GET";
1096       }
1097
1098       list headers {
1099         description "Custom HTTP headers to put on HTTP request";
1100         key key;
1101         leaf key{
1102           description "HTTP header key";
1103           type string;
1104         }
1105
1106         leaf value{
1107           description "HTTP header value";
1108           type string;
1109         }
1110       }
1111     }
1112
1113     list monitoring-param {
1114       description
1115           "List of monitoring parameters at the network service level";
1116       key id;
1117       leaf id {
1118         type string;
1119       }
1120
1121       leaf name {
1122         type string;
1123       }
1124
1125       leaf http-endpoint-ref {
1126         type leafref {
1127           path "../../http-endpoint/path";
1128         }
1129       }
1130
1131       leaf json-query-method {
1132         type json-query-method;
1133         default "NAMEKEY";
1134       }
1135
1136       container json-query-params {
1137         leaf json-path {
1138           description
1139             "The jsonpath to use to extract value from JSON structure";
1140           type string;
1141         }
1142         leaf object-path {
1143           description
1144             "The objectpath to use to extract value from JSON structure";
1145           type string;
1146         }
1147       }
1148
1149       uses monitoring-param-ui-data;
1150       uses monitoring-param-value;
1151
1152     }
1153   }
1154
1155   grouping monitoring-param-aggregation {
1156     typedef aggregation-type {
1157       description "aggregation-type";
1158       type enumeration {
1159         enum AVERAGE;
1160         enum MINIMUM;
1161         enum MAXIMUM;
1162         enum COUNT;
1163         enum SUM;
1164       }
1165     }
1166
1167     leaf aggregation-type {
1168       type aggregation-type;
1169     }
1170   }
1171
1172   grouping monitoring-param-ui-data {
1173       leaf description {
1174         type string;
1175       }
1176
1177       leaf group-tag {
1178         description "A tag to group monitoring parameters";
1179         type string;
1180       }
1181
1182
1183       leaf widget-type {
1184         description "Defines the UI Display variant of measured counters.";
1185         type manotypes:widget-type;
1186       }
1187
1188       leaf units {
1189         description "Measured Counter Units (e.g., Packets, Kbps, Mbps, etc.)";
1190         type string;
1191       }
1192   }
1193
1194   grouping monitoring-param-value {
1195       leaf value-type {
1196         type param-value-type;
1197         default "INT";
1198       }
1199
1200       container numeric-constraints {
1201         leaf min-value {
1202           description
1203               "Minimum value for the parameter";
1204           type uint64;
1205         }
1206         leaf max-value {
1207           description
1208               "Maximum value for the parameter";
1209           type uint64;
1210         }
1211       }
1212
1213       container text-constraints {
1214         leaf min-length {
1215           description
1216               "Minimum string length for the parameter";
1217           type uint8;
1218         }
1219         leaf max-length {
1220           description
1221               "Maximum string length for the parameter";
1222           type uint8;
1223         }
1224       }
1225
1226       leaf value-integer {
1227         description
1228             "Current value for an integer parameter";
1229         type int64;
1230       }
1231
1232       leaf value-decimal {
1233         description
1234             "Current value for a decimal parameter";
1235         type decimal64 {
1236           fraction-digits 4;
1237         }
1238       }
1239
1240       leaf value-string {
1241         description
1242             "Current value for a string parameter";
1243         type string;
1244       }
1245   }
1246
1247   grouping control-param {
1248     list control-param {
1249       description
1250           "List of control parameters to manage and
1251            update the running configuration of the VNF";
1252       key id;
1253
1254       leaf id {
1255         description "Identifier for control parameter";
1256         type string;
1257       }
1258
1259       leaf name {
1260         description "Name of a control parameter";
1261         type string;
1262       }
1263
1264       leaf description {
1265         description "A description of the control parameter";
1266         type string;
1267       }
1268
1269       leaf group-tag {
1270         description "A tag to group control parameters";
1271         type string;
1272       }
1273
1274       leaf min-value {
1275         description
1276             "Minimum value for the parameter";
1277         type uint64;
1278       }
1279
1280       leaf max-value {
1281         description
1282             "Maximum value for the parameter";
1283         type uint64;
1284       }
1285
1286       leaf current-value {
1287         description
1288             "Current value for the parameter";
1289         type uint64;
1290       }
1291
1292       leaf step-value {
1293         description
1294             "Step value for the parameter";
1295         type uint64;
1296       }
1297
1298       leaf units {
1299         type string;
1300       }
1301
1302       leaf widget-type {
1303         type manotypes:widget-type;
1304       }
1305
1306       leaf url {
1307         description
1308           "This is the URL where the operation should be performed.";
1309
1310         type inet:uri;
1311       }
1312
1313       leaf method {
1314         description
1315           "Method that the URI should perform.
1316            Default Action is POST";
1317
1318         type manotypes:http-method;
1319         default "POST";
1320       }
1321
1322       leaf payload {
1323         description
1324           "This is the operation payload or payload template as stringified
1325            JSON. This field provides the data  to be sent for this operation
1326            call";
1327
1328         type string;
1329       }
1330     }
1331   }
1332
1333   grouping action-param {
1334     list action-param {
1335       description
1336           "List of action parameters to
1337            control VNF";
1338       key id;
1339       leaf id {
1340         type string;
1341       }
1342
1343       leaf name {
1344         type string;
1345       }
1346
1347       leaf description {
1348         type string;
1349       }
1350
1351       leaf group-tag {
1352         description "A tag to group monitoring parameter";
1353         type string;
1354       }
1355
1356       leaf url {
1357         description
1358           "This is the URL where to perform the operation";
1359         type inet:uri;
1360       }
1361
1362       leaf method {
1363         description
1364           "This is the method to be performed at the uri.
1365            POST by default for action";
1366
1367         type manotypes:http-method;
1368         default "POST";
1369       }
1370
1371       leaf payload {
1372         description
1373           "This is the operation payload or payload template to be sent in
1374            the data for this operation call";
1375
1376         type string;
1377       }
1378     }
1379   }
1380
1381   grouping input-parameter {
1382     description "List of input parameters that can be specified when instantiating a network service.";
1383
1384     list input-parameter {
1385       description
1386           "List of input parameters";
1387
1388       key xpath;
1389
1390
1391       leaf xpath {
1392         description
1393           "An xpath that specfies which element in a descriptor is to be
1394           modified.";
1395         type string;
1396       }
1397
1398       leaf value {
1399         description
1400           "The value that the element specified by the xpath should take when a
1401           record is created.";
1402         type string;
1403       }
1404     }
1405   }
1406
1407   grouping input-parameter-xpath {
1408     list input-parameter-xpath {
1409       description
1410           "List of xpaths to parameters inside the NSD
1411            the can be customized during the instantiation.";
1412
1413       key "xpath";
1414       leaf xpath {
1415         description
1416             "An xpath that specifies the element in a descriptor.";
1417         type string;
1418       }
1419
1420       leaf label {
1421         description "A descriptive string";
1422         type string;
1423       }
1424
1425       leaf default-value {
1426         description "/nsd:nsd-catalog/nsd:nsd/nsd:vendor";
1427         type string;
1428       }
1429     }
1430   }
1431
1432   grouping nfvi-metrics {
1433     container vcpu {
1434       leaf label {
1435         description
1436           "Label to show in UI";
1437         type string;
1438         default "VCPU";
1439       }
1440
1441       leaf total {
1442         description
1443           "The total number of VCPUs available.";
1444         type uint64;
1445       }
1446
1447       leaf utilization {
1448         description
1449           "The VCPU utilization (percentage).";
1450         type decimal64 {
1451           fraction-digits 2;
1452           range "0 .. 100";
1453         }
1454       }
1455     }
1456
1457     container memory {
1458       leaf label {
1459         description
1460           "Label to show in UI";
1461         type string;
1462         default "MEMORY";
1463       }
1464
1465       leaf used {
1466         description
1467           "The amount of memory (bytes) currently in use.";
1468         type uint64;
1469       }
1470
1471       leaf total {
1472         description
1473           "The amount of memory (bytes) available.";
1474         type uint64;
1475       }
1476
1477       leaf utilization {
1478         description
1479           "The memory utilization (percentage).";
1480         type decimal64 {
1481           fraction-digits 2;
1482           range "0 .. 100";
1483         }
1484       }
1485     }
1486
1487     container storage {
1488       leaf label {
1489         description
1490           "Label to show in UI";
1491         type string;
1492         default "STORAGE";
1493       }
1494
1495       leaf used {
1496         description
1497           "The amount of storage (bytes) currently in use.";
1498         type uint64;
1499       }
1500
1501       leaf total {
1502         description
1503           "The amount of storage (bytes) available.";
1504         type uint64;
1505       }
1506
1507       leaf utilization {
1508         description
1509           "The storage utilization (percentage).";
1510         type decimal64 {
1511           fraction-digits 2;
1512           range "0 .. 100";
1513         }
1514       }
1515     }
1516
1517     container external-ports {
1518       leaf label {
1519         description
1520           "Label to show in UI";
1521         type string;
1522         default "EXTERNAL PORTS";
1523       }
1524
1525       leaf total {
1526         description
1527           "The total number of external ports.";
1528         type uint64;
1529       }
1530     }
1531
1532     container internal-ports {
1533       leaf label {
1534         description
1535           "Label to show in UI";
1536         type string;
1537         default "INTERNAL PORTS";
1538       }
1539
1540       leaf total {
1541         description
1542           "The total number of internal ports.";
1543         type uint64;
1544       }
1545     }
1546
1547     container network {
1548       leaf label {
1549         description
1550           "Label to show in UI";
1551         type string;
1552         default "NETWORK TRAFFIC";
1553       }
1554
1555       container incoming {
1556         leaf label {
1557           description
1558             "Label to show in UI";
1559           type string;
1560           default "INCOMING NETWORK TRAFFIC";
1561         }
1562
1563         leaf bytes {
1564           description
1565             "The cumulative number of incoming bytes.";
1566           type uint64;
1567         }
1568
1569         leaf packets {
1570           description
1571             "The cumulative number of incoming packets.";
1572           type uint64;
1573         }
1574
1575         leaf byte-rate {
1576           description
1577             "The current incoming byte-rate (bytes per second).";
1578           type decimal64 {
1579             fraction-digits 2;
1580           }
1581         }
1582
1583         leaf packet-rate {
1584           description
1585             "The current incoming packet (packets per second).";
1586           type decimal64 {
1587             fraction-digits 2;
1588           }
1589         }
1590       }
1591
1592       container outgoing {
1593         leaf label {
1594           description
1595             "Label to show in UI";
1596           type string;
1597           default "OUTGOING NETWORK TRAFFIC";
1598         }
1599
1600         leaf bytes {
1601           description
1602             "The cumulative number of outgoing bytes.";
1603           type uint64;
1604         }
1605
1606         leaf packets {
1607           description
1608             "The cumulative number of outgoing packets.";
1609           type uint64;
1610         }
1611
1612         leaf byte-rate {
1613           description
1614             "The current outgoing byte-rate (bytes per second).";
1615           type decimal64 {
1616             fraction-digits 2;
1617           }
1618         }
1619
1620         leaf packet-rate {
1621           description
1622             "The current outgoing packet (packets per second).";
1623           type decimal64 {
1624             fraction-digits 2;
1625           }
1626         }
1627       }
1628     }
1629   }
1630
1631   typedef alarm-severity-type {
1632     description "An indication of the importance or urgency of the alarm";
1633     type enumeration {
1634       enum LOW;
1635       enum MODERATE;
1636       enum CRITICAL;
1637     }
1638   }
1639
1640   typedef alarm-metric-type {
1641     description "The type of metrics to register the alarm for";
1642     type enumeration {
1643       enum CPU_UTILIZATION;
1644       enum MEMORY_UTILIZATION;
1645       enum STORAGE_UTILIZATION;
1646     }
1647   }
1648
1649   typedef alarm-statistic-type {
1650     description
1651         "Statistic type to use to determine threshold crossing
1652          for an alarm.";
1653     type enumeration {
1654       enum AVERAGE;
1655       enum MINIMUM;
1656       enum MAXIMUM;
1657       enum COUNT;
1658       enum SUM;
1659     }
1660   }
1661
1662   typedef alarm-operation-type {
1663     description
1664         "The relational operator used to define whether an alarm
1665         should be triggered in certain scenarios, such as if the
1666         metric statistic goes above or below a specified value.";
1667     type enumeration {
1668       enum GE; // greater than or equal
1669       enum LE; // less than or equal
1670       enum GT; // greater than
1671       enum LT; // less than
1672       enum EQ; // equal
1673     }
1674   }
1675
1676   grouping alarm {
1677     leaf alarm-id {
1678       description
1679           "This field is reserved for the identifier assigned by the VIM provider";
1680
1681       type string;
1682     }
1683
1684     leaf name {
1685       description "A human readable string to identify the alarm";
1686       type string;
1687     }
1688
1689     leaf description {
1690       description "A description of this alarm";
1691       type string;
1692     }
1693
1694     leaf vdur-id {
1695       description
1696           "The identifier of the VDUR that the alarm is associated with";
1697       type string;
1698     }
1699
1700     container actions {
1701       list ok {
1702         key "url";
1703         leaf url {
1704           type string;
1705         }
1706       }
1707
1708       list insufficient-data {
1709         key "url";
1710         leaf url {
1711           type string;
1712         }
1713       }
1714
1715       list alarm {
1716         key "url";
1717         leaf url {
1718           type string;
1719         }
1720       }
1721     }
1722
1723     leaf repeat {
1724       description
1725           "This flag indicates whether the alarm should be repeatedly emitted
1726           while the associated threshold has been crossed.";
1727
1728       type boolean;
1729       default true;
1730     }
1731
1732     leaf enabled {
1733       description
1734           "This flag indicates whether the alarm has been enabled or
1735           disabled.";
1736
1737       type boolean;
1738       default true;
1739     }
1740
1741     leaf severity {
1742       description "A measure of the importance or urgency of the alarm";
1743       type alarm-severity-type;
1744     }
1745
1746     leaf metric {
1747       description "The metric to be tracked by this alarm.";
1748       type alarm-metric-type;
1749     }
1750
1751     leaf statistic {
1752       description "The type of metric statistic that is tracked by this alarm";
1753       type alarm-statistic-type;
1754     }
1755
1756     leaf operation {
1757       description
1758           "The relational operator used to define whether an alarm should be
1759            triggered in certain scenarios, such as if the metric statistic 
1760            goes above or below a specified value.";
1761       type alarm-operation-type;
1762     }
1763
1764     leaf value {
1765       description
1766           "This value defines the threshold that, if crossed, will trigger
1767           the alarm.";
1768       type decimal64 {
1769         fraction-digits 4;
1770       }
1771     }
1772
1773     leaf period {
1774       description
1775           "The period defines the length of time (seconds) that the metric
1776           data are collected over in oreder to evaluate the chosen
1777           statistic.";
1778       type uint32;
1779     }
1780
1781     leaf evaluations {
1782       description
1783           "Defines the length of time (seconds) in which metric data are
1784            collected in order to evaluate the chosen statistic.";
1785       type uint32;
1786     }
1787   }
1788
1789   typedef cloud-account-type {
1790     description "VIM account type";
1791     type enumeration {
1792       enum aws;
1793       enum cloudsim;
1794       enum cloudsim_proxy;
1795       enum mock;
1796       enum openmano;
1797       enum openstack;
1798       enum vsphere;
1799       enum openvim;
1800     }
1801   }
1802   
1803   grouping host-aggregate {
1804     list host-aggregate {
1805       description "Name of the Host Aggregate";
1806       key "metadata-key";
1807       
1808       leaf metadata-key {
1809         description
1810             "Name of the additional information attached to the host-aggregate";
1811         type string;
1812       }
1813       leaf metadata-value {
1814         description
1815             "Value of the corresponding metadata-key";
1816         type string;
1817       }
1818     }
1819   }
1820   
1821   grouping placement-group-input {
1822     leaf cloud-type {
1823       type manotypes:cloud-account-type;
1824     }
1825     choice cloud-provider {
1826       case openstack {           
1827         container availability-zone {
1828           description "Name of the Availability Zone";
1829           leaf name {
1830             type string;
1831           }
1832         }
1833         container server-group {
1834           description "Name of the Affinity/Anti-Affinity Server Group";
1835           leaf name {
1836             type string;
1837           }
1838         }
1839         uses host-aggregate;
1840       }
1841       case aws {
1842         leaf aws-construct {
1843           type empty;
1844         }
1845       }
1846       case openmano {
1847         leaf openmano-construct {
1848           type empty;
1849         }        
1850       }
1851       case vsphere {
1852         leaf vsphere-construct {
1853           type empty;
1854         }
1855       }
1856       case mock {
1857         leaf mock-construct {
1858           type empty;
1859         }
1860       }
1861       case cloudsim {
1862         leaf cloudsim-construct {
1863           type empty;
1864         }
1865       }
1866     }
1867   }
1868   
1869   grouping placement-group-info {
1870     description "";
1871
1872     leaf name {
1873       description
1874           "Place group construct to define the compute resource placement strategy
1875            in cloud environment";
1876       type string;
1877     }
1878
1879     leaf requirement {
1880       description "This is free text space used to describe the intent/rationale
1881                    behind this placement group. This is for human consumption only";
1882       type string;
1883     }
1884     
1885     leaf strategy {
1886       description
1887           "Strategy associated with this placement group
1888              Following values are possible
1889                - COLOCATION: Colocation strategy imply intent to share the physical
1890                              infrastructure (hypervisor/network) among all members
1891                              of this group.
1892                - ISOLATION: Isolation strategy imply intent to not share the physical
1893                             infrastructure (hypervisor/network) among the members
1894                             of this group.
1895              ";
1896       type enumeration {
1897         enum COLOCATION;
1898         enum ISOLATION;
1899       }
1900       default "COLOCATION";
1901     }
1902   }
1903
1904   grouping ip-profile-info {
1905     description "Grouping for IP-Profile";
1906     container ip-profile-params {
1907       
1908       leaf ip-version {
1909         type inet:ip-version;
1910         default ipv4;
1911       }
1912
1913       leaf subnet-address {
1914         description "Subnet IP prefix associated with IP Profile";
1915         type inet:ip-prefix;
1916       }
1917
1918       leaf gateway-address {
1919         description "IP Address of the default gateway associated with IP Profile";
1920         type inet:ip-address;
1921       }
1922
1923       leaf security-group {
1924         description "Name of the security group";
1925         type string;
1926       }
1927
1928       list dns-server {
1929         key "address";
1930         leaf address {
1931                                         description "List of DNS Servers associated with IP Profile";
1932                                         type inet:ip-address;
1933         }
1934       }
1935
1936       container dhcp-params {  
1937         leaf enabled {
1938           description "This flag indicates if DHCP is enabled or not";
1939           type boolean;
1940           default true;
1941         }
1942
1943         leaf start-address {
1944           description "Start IP address of the IP-Address range associated with DHCP domain";
1945           type inet:ip-address;
1946         }
1947
1948         leaf count {
1949           description "Size of the DHCP pool associated with DHCP domain";
1950           type uint32;
1951         }
1952       }
1953
1954       leaf subnet-prefix-pool {
1955         description "VIM Specific reference to pre-created subnet prefix";
1956         type string;
1957       }
1958     }
1959   }
1960
1961   grouping ip-profile-list {
1962     list ip-profiles {
1963       description
1964           "List of IP Profiles.
1965              IP Profile describes the IP characteristics for the Virtual-Link";
1966     
1967       key "name";
1968
1969       leaf name {
1970         description "Name of the IP-Profile";
1971         type string;
1972       }
1973       
1974       leaf description {
1975         description "Description for IP profile";
1976         type string;
1977       }
1978       
1979       uses ip-profile-info;
1980     }
1981   }
1982
1983   grouping config-file {
1984     description "Grouping for files needed to be mounted into an additional drive";
1985     list config-file {
1986       description
1987           "List of configuration files to be written on an additional drive";
1988       key "source";
1989       leaf source {
1990         description "Name of the configuration file";
1991         type string;
1992       }
1993       leaf dest {
1994         description "Full path of the destination in the guest";
1995         type string;
1996       }
1997     }
1998   }
1999
2000   grouping supplemental-boot-data {
2001     description "Grouping for custom vim data";
2002     container supplemental-boot-data {
2003       uses manotypes:config-file;
2004       leaf boot-data-drive {
2005         description "Some VIMs implement additional drives to host config-files or meta-data";
2006         type boolean;
2007         default false;
2008       } 
2009     }
2010   }
2011
2012   grouping volume-info {
2013     description "Grouping for Volume-info";
2014
2015     leaf description {
2016       description "Description for Volume";
2017       type string;
2018     }
2019
2020     leaf size {
2021       description "Size of disk in GB";
2022       type uint64;
2023     }
2024
2025     choice volume-source {
2026       description
2027             "Defines the source of the volume. Possible options are
2028              1. Ephemeral -- Empty disk
2029              2. Image     -- Refer to image to be used for volume
2030              3. Volume    -- Reference of pre-existing volume to be used
2031             ";
2032
2033       case ephemeral {
2034         leaf ephemeral {
2035           type empty;
2036         }
2037       }
2038
2039       case image {
2040         uses image-properties;
2041       }
2042
2043     }
2044
2045     leaf device-bus {
2046       description "Type of disk-bus on which this disk is exposed to guest";
2047       type enumeration {
2048         enum ide;
2049         enum usb;
2050         enum virtio;
2051         enum scsi;
2052       }
2053     }
2054
2055     leaf device-type {
2056       description "The type of device as exposed to guest";
2057       type enumeration {
2058           enum disk;
2059           enum cdrom;
2060           enum floppy;
2061           enum lun;
2062       }
2063     }
2064
2065   }
2066 }