blob: 917b99771b7d2c87f58f08ed9872f041150c9c76 [file] [log] [blame]
Chris Donley85ed8842018-07-24 14:08:41 -07001.. This work is licensed under a Creative Commons Attribution 4.0 International License.
2.. http://creativecommons.org/licenses/by/4.0
3.. Copyright 2017 AT&T Intellectual Property, All rights reserved
4.. Copyright 2017-2018 Huawei Technologies Co., Ltd.
5
6==========================
7VES Event Registration 2.0
8==========================
9
10.. contents:: Table of Contents
11
12Introduction
13============
14
15This document specifies a YAML format for the registration of VES
16Events. The YAML format enables both human designers and applications to
17parse and understand the fields that will be sent by event sources in
18conjunction with specific types of events, which are identified by their
19eventNames.
20
21The semantics of the YAML format are easily extensible to accommodate
22processing needs that may arise in the future. Among the types of
23information specified in the YAML are field optionality, restrictions on
24field values, and event handling recommendations and requirements.
25
26This document should be read in conjunction with the VES Event Listener
27service specification, which defines the Common Event Format and
28introduces the concept of specific types of events, identified by
29eventNames.
30
31Audience
32--------
33
34This document is intended to support the following groups:
35
36- VNF Vendors
37
38- Service Provider (e.g., AT&T) Teams responsible for deploying VNFs
39 within their infrastructure
40
41VNF vendors will provide a YAML file to the Service Provider that
42describes the events that their VNFs generate. Using the semantics and
43syntax supported by YAML, vendors will indicate specific conditions that
44may arise, and recommend actions that should be taken at specific
45thresholds, or if specific conditions repeat within a specified time
46interval.
47
48Based on the vendors recommendations, the Service Provider may create
49another YAML, which finalizes their engineering rules for the processing
50of the vendors events. The Service Provider may alter the threshold
51levels recommended by the vendor, and may modify and more clearly
52specify actions that should be taken when specified conditions arise.
53The Service Provided-created version of the YAML will be distributed to
54Service Provider applications at design time.
55
56Goal
57----
58
59The goal of the YAML is to completely describe the processing of VNF
60events in a way that can be compiled or interpreted by applications
61across a Service Providers infrastructure.
62
63Relation to the Common Event Format
64-----------------------------------
65
66The Common Event Format described in the VES Event Listener service
67specification defines the structure of VES events including optional
68fields that may be provided.
69
70Specific eventNames registered by the YAML (e.g., an InvalidLicense
71fault), may require that certain fields, which are optional in the
72Common Event Format, be present when events with that eventName are
73published. For example, a fault eventName which communicates an
74InvalidLicense condition, may be registered to require that the
75configured licenseKey be provided as a name-value pair in the Common
76Event Formats additionalFields structure, within the faultFields
77block. Anytime an InvalidLicense fault event is detected, designers,
78applications and microservices across the Service Providers
79infrastructure can count on that name-value pair being present.
80
81The YAML registration may also restrict ranges or enumerations defined
82in the Common Event Format. For example, eventSeverity is an enumerated
83string within the Common Event Format with several values ranging from
84NORMAL to CRITICAL’. The YAML registration for a particular eventName
85may require that it always be sent with eventSeverity set to a single
86value (e.g., MINOR’), or to a subset of the possible enumerated values
87allowed by the Common Event Format (e.g., MINOR or NORMAL’).
88
89Relation to Service Design and Creation
90---------------------------------------
91
92Event registration for a VNF (or other event source) is provided to the
93Service Providers Service Creation and Design Environment (e.g., SDC)
94as a set of two YAML files consisting of the vendor recommendation YAML
95and (optionally) the final Service Provider YAML. These YAML files
96describe all the eventNames that that VNF (or other event source)
97generates.
98
99Once their events are registered, the Service Creation and Design
100Environment can then list the registered eventNames (e.g., as a drop
101down list), for each VNF or other event source (e.g., a service), and
102enable designers to study the YAML registrations for specific
103eventNames. YAML registrations are both human readable and machine
104readable.
105
106The final Service Provider YAML is a type of Service Design and Creation
107artifact’, which can be distributed to Service Provider applications at
108design time: notably, to applications involved in the collection and
109processing of VNF events. It can be parsed by those applications so they
110can support the receipt and processing of VNF events, without the need
111for any manual, VNF-specific development.
112
113YAML Files
114==========
115
116YAML Specification Conformance
117------------------------------
118
119YAML files should conform to version 1.2 of the YAML specification
120available at: http://yaml.org/spec/1.2/spec.html.
121
122Filename
123--------
124
125YAML file names should conform to the following naming convention:
126
127 {NamingCode}_{ModelType}_{v#}_{AdditionalInfo}.yml
128
129The NamingCode identifies the entity, whose events are being registered
130in the yaml, with a naming code that was established in the Service
131Providers Service Design and Creation Environment (SDC). Example Naming
132codes are:
133
134- tbcx
135
136- sgsn-mme
137
138The ModelType describes the type of entity whose events are being
139registered. It consists of values like:
140
141- service
142
143- vfModule
144
145- vnf
146
147- vnfc
148
149The ‘#’ should be replaced with the current numbered version of the
150file. Note that ‘#’ can be an integer or a number of the form x.y or
151x.y.z (where x is the major number, y is the minor number and z is the
152patch number)
153
154Additional descriptive info may be added after the version information
155
156Example file name:
157
158- vIsbcSsc_vnfc_v1.yml
159
160File Structure
161--------------
162
163Each eventType is registered as a distinct YAML document’.
164
165YAML files consist of a series of YAML documents delimited by ‘---‘ and
166‘…’ for example:
167
168 ---
169
170 # Event Registration for eventName ‘name1’
171
172 # details omitted
173
174 ...
175
176 ---
177
178 # Event Registration for eventName ‘name2’
179
180 # details omitted
181
182 ...
183
184 ---
185
186 # Event Registration for eventName ‘name3’
187
188 # details omitted
189
190 ...
191
192YAML Syntax and Semantics
193=========================
194
195YAML registration documents show each relevant VES Common Event Model
196object and field (i.e., each element) for the eventName being
197registered, including any extensible fields (e.g., specific name-value
198pairs).
199
200Qualifiers
201----------
202
203Each object or field name in the eventName being registered is followed
204by a qualifier’, which consists of a colon and two curly braces, for
205example:
206
207 objectOrFieldName: { }”
208
209The curly braces contain meta-information about that object or field
210name (also known as the element’), such as whether it is required to be
211present, what values it may have, what handling it should trigger, etc
212
213Semantics have been defined for the following types of meta-information
214within the curly braces:
215
216Action
217~~~~~~
218
219The action keyword may be applied to field values or to the event as a
220whole. The action keyword specifies a set of actions that should be
221taken if a specified trigger occurs. For example, the action keyword
222may specify that a threshold crossing alert (i.e., tca) be generated,
223and/or that a specific microservice handler be invoked, and/or that a
224specific named-condition be asserted. In the Rules section of the YAML
225file, tcas and microservices may be defined on individual
226named-conditions or on logical combinations of named-conditions.
227
228The action:’ keyword is followed by five values in square brackets. The
229first two values communicate the trigger, and the last three values
230communicate the actions to be taken if that trigger occurs:
231
2321. The first value conveys the trigger level. If the field on which the
233 action is defined reaches or passes through that level, then the
234 trigger fires. If a specific level is not important to the
235 recommended action, the any keyword may be used as the first value.
236 (Note: any is often used when an action is defined on the event
237 structure as a whole).
238
2392. The second value indicates the direction of traversal of the level
240 specified in the first value. The second value may be up’, down’,
241 at or any’. any is used if the direction of traversal is not
242 important. at implies that it traversed (or exactly attained) the
243 trigger level but it doesnt matter if the traversal was in the up
244 direction or down direction. Note: If up’, down or at are used,
245 the implication is that the microservices processing the events
246 within the service provider are maintaining state (e.g., to know that
247 a measurement field traversed a trigger level in an up direction,
248 the microservice would have to know that the field was previously
249 below the trigger level). When initially implementing support for
250 YAML actions, a service provider may choose to use and interpret
251 these keywords in a simpler way to eliminate the need to handle
252 state. Specifically, they may choose to define and interpret all up
253 guidance to mean at the indicated trigger level or greater’, and
254 they may choose to define and interpret all down guidance to mean
255 at the indicated trigger level or lower’.
256
2573. The third value optionally names the condition that has been attained
258 when the triggers fires (e.g., invalidLicence or
259 capacityExhaustion’). Named-conditions should be expressed in camel
260 case with no underscores, hyphens or spaces and with the first letter
261 in lowercase. In the Rules section of the YAML file, named-conditions
262 may be used to specify events that should be generated and/or
263 microservices that should be invoked. If it is not important to name
264 a condition, then the string null (without the quotes) must be used
265 as the third value.
266
2674. The fourth value recommends a specific microservice (e.g., rebootVm
268 or rebuildVnf’) supported by the Service Provider, be invoked if the
269 trigger is attained. Design time processing of the YAML by the
270 service provider can use these directives to automatically establish
271 policies and configure flows that need to be in place to support the
272 recommended runtime behavior.
273
274..
275
276 If a vendor wants to recommend an action, it can either work with the
277 service provider to identify and specify microservices that the
278 service provider support, or, the vendor may simply indicate and
279 recommend a generic microservice function by prefixing RECO-’ in
280 front of the microservice name, which should be expressed in upper
281 camel case with no underscores, hyphens or spaces.
282
283 A fourth value must be provided. If not needed, the string null
284 (without the quotes) must be used.
285
2865. The fifth value indicates a specific named event (e.g., a TCA) that
287 should be generated if the trigger occurs. This field must be
288 provided as a VES eventName or, if not needed, as the string null
289 (without the quotes).
290
291..
292
293 When an event is specified, a YAML registration for that eventName
294 should be added to the event registrations within the YAML file.
295
296Examples:
297
298- event: { action: [ any, any, null, rebootVm, null ] }
299
300..
301
302 # whenever the above event occurs, the VM should be rebooted
303
304- fieldname: { action: [ 80, up, null, null, tcaUpEventName ], action:
305 [ 60, down, overcapacity, null, null ] }
306
307..
308
309 # when the value of fieldname crosses 80 in an up direction,
310 tcaUpEventName
311
312 should be published; if the fieldname crosses 60 in a down direction
313 an
314
315 overCapacity named-condition is asserted.
316
317AggregationRole
318~~~~~~~~~~~~~~~
319
320The aggregationRole keyword is applied to a keyValuePair.
321
322AggregationRole may be set to one of the following:
323
324- counter
325
326- index
327
328- reference
329
330If needed, the aggergationRole setting tells the receiving event
331processor how to aggregate the extensible keyValuePair data. Data
332aggregation may use a combination of index and reference data fields
333as aggregation keys while applying aggregation formulas, such as
334summation or average on the counter fields.
335
336Example 1:
337
338 Interpretation of the below: If additionalMeasurements is supplied,
339 it must have key name1 and name1s value should be interpreted as an
340 index:
341
342- additionalMeasurements: {presence: optional, structure: {
343
344..
345
346 keyValuePair: {presence: required, structure: {
347
348 key: {presence: required, value: name1},
349
350 value: {presence: required, aggregationRole: index }
351
352 }},
353
354 . . .
355
356 }}
357
358Example 2:
359
360- Lets say a vnf wants to send the following TunnelTraffic fields
361 through a VES arrayOfNamedHashMap structure (specifically through
362 additionalMeasurements in the VES measurementField block):
363
364+-------------+-------------+-------------+-------------+-------------+
365| Tunnel Name | Tunnel Type | Total | Total | Total |
366| | | Output | Output | Output |
367| | | Bytes | Packets | Errors |
368+=============+=============+=============+=============+=============+
369| ST6WA21CRS: | PRIMARY | 2457205 | 21505 | 0 |
370| TUNNEL-TE40 | | | | |
371| 018 | | | | |
372+-------------+-------------+-------------+-------------+-------------+
373| ST6WA21CRS: | PRIMARY | 46677 | 220 | 0 |
374| TUNNEL-TE10 | | | | |
375| 29 | | | | |
376+-------------+-------------+-------------+-------------+-------------+
377| ST6WA21CRS: | PRIMARY | 80346 | 577 | 0 |
378| TUNNEL-TE10 | | | | |
379| 28 | | | | |
380+-------------+-------------+-------------+-------------+-------------+
381
382- Tunnel Name is an index, Tunnel Type is reference data and the other
383 three columns are counters
384
385- The first three columns would be sent through VES as follows:
386
387additionalMeasurements: { presence: required, isHomogeneous: true,
388array: [
389
390namedHashMap: { presence: required, structure: {
391
392name: { presence: required, value: "TunnelTraffic" },
393
394hashMap: { presence: required, array: [
395
396keyValuePair: { presence: required, aggregationRole: index, structure: {
397
398key: { presence: required, value: TunnelName },
399
400value: { presence: required }
401
402}},
403
404keyValuePair: { presence: required, aggregationRole: reference,
405structure: {
406
407key: { presence: required, value: TunnelType },
408
409value: { presence: required }
410
411}},
412
413keyValuePair: { presence: required, aggregationRole: counter, structure:
414{
415
416key: { presence: required, value: TotalOutputBytes },
417
418value: { presence: required, castTo: integer }
419
420}}
421
422]}
423
424}}
425
426]}
427
428Array
429~~~~~
430
431The array keyword indicates that the element is an array; array:’ is
432following by square brackets which contain the elements of the array.
433Note that unlike JSON itself, the YAML registration will explicitly
434declare the array elements and will not communicate them anonymously.
435
436Examples:
437
438- element: { array: [
439
440..
441
442 firstArrayElement: { },
443
444 secondArrayElement: { }
445
446 ] }
447
448CastTo
449~~~~~~
450
451The castTo keyword is applied to value keywords. It tells the
452receiving event processor to cast the supplied value from its standard
453VES datatype (typically a string) to some other datatype. If not
454supplied the implication is the standard VES datatype applies.
455
456A value may be castTo one and only one of the following data types:
457
458- boolean
459
460- integer
461
462- number (note: this supports decimal values as well as integral
463 values)
464
465- string
466
467Example:
468
469- fieldname: { value: [ x, y, z ], castTo: number } # only values ‘x’,
470 y’, or z allowed
471
472..
473
474 # each must be cast to a number
475
476- additionalMeasurements: {presence: optional, structure: {
477
478..
479
480 keyValuePair: {presence: required, structure: { # if
481 additionalMeasurements is
482
483 key: {presence: required, value: name1}, # supplied, it must have key
484 name1
485
486 value: {presence: required, castTo: integer} # its value must be cast
487 to integer
488
489 }}
490
491 }}
492
493 For another example, see the second example under AggregationRole.
494
495Default
496~~~~~~~
497
498The default keyword specifies a default field value. Note: the default
499value must be within the range or enumeration of acceptable values.
500
501Examples:
502
503- fieldname: { range: [ 1, unbounded ], default: 5 }
504
505- fieldname: { value: [ red, white, blue ], default: blue }
506
507HeartbeatAction
508~~~~~~~~~~~~~~~
509
510The heartbeatAction keyword is provided on the event objectName for
511heartbeat events only. It provides design time guidance to the service
512providers heartbeat processing applications (i.e., their watchdog
513timers). The syntax and semantics of the heartbeatAction keyword are
514similar to the action keyword except the trigger is specified by the
515first field only instead of the first two fields. When the
516heartbeatAction keyword is indicated, the first field is an integer
517indicating the number of successively missed heartbeat events. Should
518that trigger occur, the remaining fields have the same order, meaning
519and optionality as those described for the action keyword.
520
521Examples:
522
523- event: { heartbeatAction: [ 3, vnfDown, RECO-rebootVnf, tcaEventName
524 ] }
525
526..
527
528 # whenever the above event occurs, a vnfDown condition is asserted
529 and the vnf should be rebooted, plus the indicated tca should be
530 generated.
531
532isHomogeneous
533~~~~~~~~~~~~~
534
535The isHomogeneous keyword is applied to fields containing
536arrayOfNamedHashMap. It lets the receiving event processor know whether
537each namedHashMap in the arrayOfNamedHashMap conveys the same data
538structure or whether convey different data structures.
539
540isHomogeneous may be set to one of the following (note that lowercase
541letters only should be used):
542
543- true
544
545- false
546
547Example: The second example for the AggregationRole keyword, shows how
548isHomogeneous is used. In that example, the implication is that all
549namedHashMapssent through additionalMeasurements would convey
550TunnelTraffic data sets and thus the receiving event processor could
551convert all the data within additionalMeasurements into a single table.
552
553On the other hand, if isHomogeneous had been set to false’, that would
554tell the receiving event processor that different types of data are
555being conveyed through additionalMeasurements (e.g., maybe TunnelTraffic
556data is sent in some namedHashMaps while QosReport data is sent in other
557namedHashMaps) and the receiving event processor would have to process
558it accordingly.
559
560key
561~~~
562
563The key keyword describes a specific key as part of a key-value pair
564that may be sent within a keyValuePair keyword (see keyValuePair
565keyword for more explanation and examples).
566
567keyValuePair
568~~~~~~~~~~~~
569
570The keyValuePair keyword describes a specific key-value pair that may
571be sent within a hashMap structure (i.e., a VES field with the hashMap
572datatype) or a keyValuePairString structure (see the keyValuePairString
573keyword for more information).
574
575Within keyValuePair is a single key and a single value keyword, each
576of which may be decorated with other keywords specified in this document
577(e.g., with presence’, range and other relevant keywords).
578
579Examples:
580
581- The following specifies an additionalInformation field within VES,
582 which is of type hashMap:
583
584..
585
586 additionalInformation: {presence: optional, structure: {
587
588 keyValuePair: {presence: required, structure: {
589
590 key: {presence: required, value: name1},
591
592 value: {presence: required}
593
594 }},
595
596 keyValuePair: {presence: optional, structure: {
597
598 key: {presence: required, value: name2},
599
600 value: {presence: required}
601
602 }}
603
604 }}
605
606keyValuePairString
607~~~~~~~~~~~~~~~~~~
608
609The keyValuePairString keyword describes the key-value pairs to be
610communicated through a string (e.g., in the VES Syslog Fields
611syslogSData or additionalFields strings). This keyword takes three
612parameters:
613
614- the first parameter specifies the character used to delimit (i.e., to
615 separate) the key-value pairs. If a space is used as a delimiter,
616 it should be communicated within single quotes as ‘; otherwise,
617 the delimiter character should be provided without any quotes.
618
619- The second parameter specifies the characters used to separate the
620 keys and values. If a space is used as a separator, it should be
621 communicated within single quotes as ‘; otherwise, the separator
622 character should be provided without any quotes.
623
624- The third parameter is a sub-keyword (i.e., it is used only within
625 keyValuePairString’) called keyValuePairs: [ ]’. Within the
626 square brackets, a list of keyValuePair keywords can be provided
627 (see the keyValuePair keyword for more information).
628
629Examples:
630
631- The following specifies an additionalFields string which is stuffed
632 with key=value pairs delimited by the pipe (‘|’) symbol as in
633 (“key1=value1|key2=value2|key3=value3…”).
634
635additionalFields: {presence: required, keyValuePairString: {|, =,
636keyValuePairs: [
637
638keyValuePair: {presence: required, structure: {
639
640key: {presence: required, value: someKeyName},
641
642value: {presence: required, range: [0, 100]}
643
644} },
645
646keyValuePair: {presence: optional, structure: {
647
648key: {presence: required, value: someOtherKeyName},
649
650value: {presence: required, value [red, white, blue]}
651
652} }
653
654] } }
655
656Presence
657~~~~~~~~
658
659The presence keyword may be defined as required or optional’. If
660not provided, the element is assumed to be optional’.
661
662Examples
663
664- element: { presence: required } # element must be present
665
666- element: { presence: optional } # element is optional
667
668- element: { value: blue } # by omitting a presence definition, the
669
670..
671
672 element is assumed to be optional
673
674Range
675~~~~~
676
677The range keyword applies to fields (i.e., simpleTypes); indicates the
678value of the field is a number within a specified range of values from
679low to high (inclusive of the indicated values). . range:’ is followed
680by two parameters in square brackets:
681
682- the first parameter conveys the minimum value
683
684- the second parameter conveys the maximum value or unbounded
685
686The keyword unbounded is supported to convey an unbounded upper limit.
687Note that the range cannot override any restrictions defined in the VES
688Common Event Format.
689
690Examples:
691
692- fieldname: { range: [ 1, unbounded ] }
693
694- fieldname: { range: [ 0, 3.14 ] }
695
696Structure
697~~~~~~~~~
698
699The structure keyword indicates that the element is a complexType
700(i.e., an object) and is followed by curly braces containing that
701object.
702
703Example:
704
705- objectName: { structure: {
706
707element1: { },
708
709element2: { },
710
711anotherObject: { structure: {
712
713element3: { },
714
715element4: { }
716
717} }
718
719} }
720
721Units
722~~~~~
723
724The units qualifier may be applied to values provided in VES Common
725Event Format extensible field structures. The units qualifier
726communicates the units (e.g., megabytes, seconds, Hz) that the value is
727expressed in. Note: the units should not contain any space characters
728and should be expressed in camel casing (e.g., use numberOfPorts’, not
729number_of_ports nor number of ports’).
730
731Example:
732
733- additionalInformation: { presence: optional, structure: {
734
735keyValuePair: {presence: required, structure: {
736
737key: {presence: required, value: pilotNumberPoolSize},
738
739value: {presence: required, units: megaBytes}
740
741}}
742
743}}
744
745Value
746~~~~~
747
748The value keyword applies to fields (i.e., simpleTypes); indicates a
749single value or an enumeration of possible values. If not provided, it
750is assumed the value will be determined at runtime. Note that the
751declared value cannot be inconsistent with restrictions defined in the
752VES Common Event Format (e.g., it cannot add an enumerated value to an
753enumeration defined in the Common Event Format, but it can subset the
754defined enumerations in the Common Event Format).
755
756Values that are strings containing spaces should always be indicated in
757single quotes.
758
759Examples:
760
761- fieldname: { value: x } # the value is ‘x’
762
763- fieldname: { value: [ x, y, z ] } # the value is either ‘x’, ‘y’, or
764 z
765
766- fieldname: { presence: required } # the value will be provided at
767 runtime
768
769- fieldname: { value: error state } # the value is the string within
770 the single quotes
771
772Complex Conditions
773------------------
774
775Conditions Document
776~~~~~~~~~~~~~~~~~~~
777
778After all events have been defined, the YAML file may provide a YAML
779document delimited by ‘---‘ and ‘…’, which specifies complex conditions
780defined in terms of other conditions, which were asserted in the action
781qualifiers of the preceding event definitions. For example:
782
783 ---
784
785 # Event Registration for eventName ‘name1’
786
787 event: {presence: required, action: [any, any, A, null], structure: {
788
789 # details omitted
790
791 }}
792
793 ...
794
795 ---
796
797 # Event Registration for eventName ‘name2’
798
799 event: {presence: required, structure: {
800
801 commonEventHeader: {presence: required, structure: {
802
803 # details omitted
804
805 }}
806
807 measurementFields: {presence: required, structure: {
808
809cpuUsageArray: {presence: required, array: [
810
811cpuUsage: {presence: required, structure: {
812
813cpuIdentifier: {presence: required},
814
815percentUsage: {presence: required, action: [90, up, B, null]}
816
817}}
818
819]},
820
821# details omitted
822
823 }}
824
825 }}
826
827 ...
828
829 ---
830
831 # Complex Conditions
832
833 conditions: [
834
835 conditionC: { defined in terms of A and B, details omitted },
836
837 conditionD: { defined in terms of A, B and C details omitted }
838
839 ]
840
841 ...
842
843Conditions Syntax and Semantics
844~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
845
846The YAML conditions document begins with the keyword conditions
847followed by a colon and square brackets. Each condition is then defined
848within the square brackets. Commas are used to separate conditions.
849
850Each condition is expressed as follows:
851
852conditionName: *logical expression in terms of other conditions*
853
854Logical Expressions
855~~~~~~~~~~~~~~~~~~~
856
857The following logical operators are supported:
858
859- &&: which is a logical AND
860
861- \||, which is a logical OR
862
863In addition parentheses may be used to group expressions.
864
865Example logical expression:
866
867 (A && B) \|\| (C && D)
868
869Where A, B, C and D are named conditions expressed earlier in the YAML
870file.
871
872Because YAML doesnt support the above operators, the whole expression
873needs to be enclosed in double quotes.
874
875Example for a condition named ConditionP’:
876
877---
878
879conditions: [
880
881conditionP: "B \|\| (C && D)"
882
883]
884
885...
886
887Alternatively, Logical ORs and ANDs can be expressed using a syntax
888defined by `metacpan.org <https://metacpan.org/pod/YAML::Logic>`__ for
889Perl. Using this syntax, the example above looks like this:
890
891---
892
893conditions: [
894
895conditionP: [or, [B, [and, [C, D]]]]
896
897]
898
899...
900
901In the above syntax, both ORs and ANDs are provided as two nested
902arrays, where the outer array consists of two items:
903
904- The desired operator as either or or and
905
906- The inner array which consists of the conditions to be ORd or ANDd
907 together
908
909Note1: more than two conditions may be ord or andd (e.g., B \|\| C
910\|\| D or B && C && D”)
911
912Note2: however expressed by YAML, parsers must be developed to make use
913of the above expressions.
914
915Time Based Qualifiers
916~~~~~~~~~~~~~~~~~~~~~
917
918Time based rules may be established using a timing keyword as follows:
919
920---
921
922conditions: [
923
924PersistentB1: {
925
926timing: {
927
928condition: B,
929
930occurrences: 3,
931
932interval: 300,
933
934units: seconds
935
936}
937
938}
939
940]
941
942...
943
944This means that if condition B occurs 3 (or more) times in 300 seconds
945(e.g., 5 minutes), then condition PersistentB1 has occurred.
946
947Array Item Qualifiers
948~~~~~~~~~~~~~~~~~~~~~
949
950This arrayItems keyword defines conditions evaluated across the items
951in an array. In the example below, the condition is named AnyOfC’:
952
953---
954
955conditions: [
956
957AnyOfC: {
958
959arrayItems: {
960
961condition: C,
962
963arrayItem: measurements.cpuUsageArray.cpuUsage,
964
965scope: anyOf
966
967}
968
969}
970
971]
972
973...
974
975This means that if condition C occurs on any cpuUsage structure within
976the cpuUsageArray, then the condition AnyOfC is in effect.
977
978Note the dotted notation used to convey the path to the arrayItem with
979respect to the encapsulating domain field block.
980
981Scope may have the values anyOf or allOf
982
983Mathematical Expressions
984~~~~~~~~~~~~~~~~~~~~~~~~
985
986Mathematical expressions evaluate to a number, using ‘(‘, ‘)’, ‘+’, ‘-‘,
987‘*’, ‘/’ and variables of the form $variablePath where the variablePath
988is defined with respect to the encapsulating domain field block.
989
990Mathematical expressions are specified as "${mathematicalExpress}".
991Because YAML does not support mathematical operators, the expressions
992must be enclosed within double quotes.
993
994---
995
996conditions: [
997
998PersistentB2: {
999
1000timing: {
1001
1002condition: B,
1003
1004occurrences: 3,
1005
1006interval: "${60 \* $measurements.measurementInterval}",
1007
1008units: seconds
1009
1010}
1011
1012}
1013
1014]
1015
1016...
1017
1018This means that if condition B occurs 3 (or more) times in an interval
1019defined by 60 times the measurementInterval (e.g., if the
1020measurementInterval was expressed in seconds as 5, then this would
1021evaluate to 300), then condition PersistentB2 is in effect.
1022
1023Rules
1024-----
1025
1026Rules Document
1027~~~~~~~~~~~~~~
1028
1029After all events and conditions have been defined, the YAML file may
1030conclude with a final YAML document delimited by ‘---‘ and ‘…’, which
1031defines rules based on the named conditions asserted previously. For
1032example:
1033
1034 ---
1035
1036 # Event Registration for eventName ‘name1’
1037
1038 event: {presence: required, action: [any, any, A, null], structure: {
1039
1040 # details omitted
1041
1042 }}
1043
1044 ...
1045
1046 ---
1047
1048 # Event Registration for eventName ‘name2’
1049
1050 event: {presence: required, structure: {
1051
1052 commonEventHeader: {presence: required, structure: {
1053
1054 # details omitted
1055
1056 }}
1057
1058 measurementFields: {presence: required, structure: {
1059
1060cpuUsageArray: {presence: required, array: [
1061
1062cpuUsage: {presence: required, structure: {
1063
1064cpuIdentifier: {presence: required},
1065
1066percentUsage: {presence: required, action: [90, up, B, null]}
1067
1068}}
1069
1070]},
1071
1072# details omitted
1073
1074 }}
1075
1076 }}
1077
1078 ...
1079
1080 ---
1081
1082 # Complex Conditions
1083
1084 conditions: [
1085
1086 C: { details omitted }
1087
1088 ]
1089
1090 ...
1091
1092 ---
1093
1094 # Rules
1095
1096 rules: [
1097
1098 # defined based on conditions ‘A’, ‘B’ and ‘C’ - details omitted
1099
1100 ]
1101
1102 ...
1103
1104Rules Syntax and Semantics
1105~~~~~~~~~~~~~~~~~~~~~~~~~~
1106
1107The YAML rules document begins with the keyword rules followed by a
1108colon and square brackets. Each rule is then defined within the square
1109brackets (of rules’). Commas are used to separate rule structure.
1110
1111Each rule structure is expressed as follows:
1112
1113rule: {
1114
1115trigger: *logical expression in terms of conditions*,
1116
1117microservices: [ *microservice1, microservice2, microservice3…* ]
1118
1119events: [e*ventName1, eventName2, eventName3…* ],
1120
1121}
1122
1123Notes:
1124
1125- All referenced eventNames should be defined within the YAML.
1126
1127- At least one microservice or event should be specified, and both
1128 microservices and events may be specified.
1129
1130- For information about microservices, see section 3.1.1 bullet number
1131 4.
1132
1133Triggers
1134~~~~~~~~
1135
1136Triggers may be as simple as a named condition, or they may be logical
1137expressions in terms of other conditions using the same syntax as used
1138by the complex conditions described above. For example:
1139
1140rules: [
1141
1142ruleName1: {
1143
1144trigger: A,
1145
1146eventss: [eventName1],
1147
1148microservices: [rebootVm]
1149
1150},
1151
1152ruleName2: {
1153
1154trigger: "B \|\| (C && D)",
1155
1156microservices: [scaleOut]
1157
1158}
1159
1160]
1161
1162Note: when microservices are defined in terms of multiple event
1163conditions, the designer should take care to consider whether the target
1164of the microservice is clear (e.g., which VNF or VM instance to perform
1165the action on). Future versions of this document may provide more
1166clarity.
1167
1168YAML Examples
1169=============
1170
1171An example YAML file is provided below which registers some events for a
1172hypothetical VNF. Note: some of the lines have been manually
1173wrapped/indented to make it easier to read. Please ignore the section
1174breaks that interrupt this single file; they were added to make it
1175easier to rapidly find examples of different types of events.
1176
1177Fault
1178-----
1179
1180---
1181
1182# registration for Fault_vMrf_alarm003
1183
1184# Constants: the values of domain, eventName, priority, vfstatus
1185
1186# , version, alarmCondition, eventSeverity, eventSourceType,
1187
1188# faultFieldsVersion, specificProblem,
1189
1190# Variables (to be supplied at runtime) include: eventId,
1191lastEpochMicrosec,
1192
1193# reportingEntityId, reportingEntityName, sequence, sourceId,
1194sourceName,
1195
1196# startEpochMicrosec
1197
1198event: {presence: required, action: [ any, any, alarm003,
1199RECO-rebuildVnf ],
1200
1201structure: {
1202
1203commonEventHeader: {presence: required, structure: {
1204
1205domain: {presence: required, value: fault},
1206
1207eventName: {presence: required, value: Fault_Vmrf-Nokia_Alarm003},
1208
1209eventId: {presence: required},
1210
1211nfNamingCode: {value: mrfx},
1212
1213priority: {presence: required, value: Medium},
1214
1215reportingEntityId: {presence: required},
1216
1217reportingEntityName: {presence: required},
1218
1219sequence: {presence: required},
1220
1221sourceId: {presence: required},
1222
1223sourceName: {presence: required},
1224
1225startEpochMicrosec: {presence: required},
1226
1227lastEpochMicrosec: {presence: required},
1228
1229timeZoneOffset: {presence: required},
1230
1231version: {presence: required, value: 3.0}
1232
1233}},
1234
1235faultFields: {presence: required, structure: {
1236
1237alarmCondition: {presence: required, value: alarm003},
1238
1239eventSeverity: {presence: required, value: MAJOR},
1240
1241eventSourceType: {presence: required, value: virtualNetworkFunction},
1242
1243faultFieldsVersion: {presence: required, value: 3.0},
1244
1245specificProblem: {presence: required, value: "Configuration file was
1246corrupt or
1247
1248not present"},
1249
1250vfStatus: {presence: required, value: "Requesting Termination"}
1251
1252}}
1253
1254}}
1255
1256...
1257
1258---
1259
1260# registration for clearing Fault_vMrf_alarm003Cleared
1261
1262# Constants: the values of domain, eventName, priority,
1263
1264# , version, alarmCondition, eventSeverity, eventSourceType,
1265
1266# faultFieldsVersion, specificProblem,
1267
1268# Variables (to be supplied at runtime) include: eventId,
1269lastEpochMicrosec,
1270
1271# reportingEntityId, reportingEntityName, sequence, sourceId,
1272
1273# sourceName, startEpochMicrosec, vfStatus
1274
1275event: {presence: required, action: [ any, any, alarm003, Clear ],
1276structure: {
1277
1278commonEventHeader: {presence: required, structure: {
1279
1280domain: {presence: required, value: fault},
1281
1282eventName: {presence: required, value:
1283Fault_Vmrf-Nokia_Alarm003Cleared},
1284
1285eventId: {presence: required},
1286
1287nfNamingCode: {value: mrfx},
1288
1289priority: {presence: required, value: Medium},
1290
1291reportingEntityId: {presence: required},
1292
1293reportingEntityName: {presence: required},
1294
1295sequence: {presence: required},
1296
1297sourceId: {presence: required},
1298
1299sourceName: {presence: required},
1300
1301startEpochMicrosec: {presence: required},
1302
1303lastEpochMicrosec: {presence: required},
1304
1305timeZoneOffset: {presence: required},
1306
1307version: {presence: required, value: 3.0}
1308
1309}},
1310
1311faultFields: {presence: required, structure: {
1312
1313alarmCondition: {presence: required, value: alarm003},
1314
1315eventSeverity: {presence: required, value: NORMAL},
1316
1317eventSourceType: {presence: required, value: virtualNetworkFunction},
1318
1319faultFieldsVersion: {presence: required, value: 3.0},
1320
1321specificProblem: {presence: required, value: "Valid configuration file
1322found"},
1323
1324vfStatus: {presence: required, value: "Requesting Termination"}
1325
1326}}
1327
1328}}
1329
1330...
1331
1332Heartbeat
1333---------
1334
1335---
1336
1337# registration for Heartbeat_vMRF
1338
1339# Constants: the values of domain, eventName, priority, version
1340
1341# Variables (to be supplied at runtime) include: eventId,
1342lastEpochMicrosec,
1343
1344# reportingEntityId, reportingEntityName, sequence, sourceId,
1345sourceName,
1346
1347# startEpochMicrosec
1348
1349event: {presence: required, heartbeatAction: [3, vnfDown,
1350RECO-rebuildVnf],
1351
1352structure: {
1353
1354commonEventHeader: {presence: required, structure: {
1355
1356domain: {presence: required, value: heartbeat},
1357
1358eventName: {presence: required, value: Heartbeat_Vmrf-Nokia},
1359
1360eventId: {presence: required},
1361
1362nfNamingCode: {value: mrfx},
1363
1364priority: {presence: required, value: Normal},
1365
1366reportingEntityId: {presence: required},
1367
1368reportingEntityName: {presence: required},
1369
1370sequence: {presence: required},
1371
1372sourceId: {presence: required},
1373
1374sourceName: {presence: required},
1375
1376startEpochMicrosec: {presence: required},
1377
1378lastEpochMicrosec: {presence: required},
1379
1380timeZoneOffset: {presence: required},
1381
1382version: {presence: required, value: 3.0}
1383
1384}},
1385
1386heartbeatFields: {presence: optional, structure:{
1387
1388        heartbeatFieldsVersion: {presence: required, value: 2.0},
1389
1390        heartbeatInterval: {presence: required, range: [ 15, 300 ],
1391default: 60 }
1392
1393}}
1394
1395}}
1396
1397...
1398
1399Measurements
1400------------
1401
1402To see how additionalMeasurements may be sent in a way that is easy for
1403service providers to process without custom logic, please see the
1404following keywords: aggregationRole, castTo and isHomogeneous. In
1405particular, see the second example under aggergationRole.
1406
1407---
1408
1409# registration for Measurement_vMRF
1410
1411# Constants: the values of domain, eventName, priority, version,
1412
1413# measurementFieldsVersion,
1414additionalMeasurements.namedArrayOfFields.name,
1415
1416# Variables (to be supplied at runtime) include: eventId,
1417reportingEntityName, sequence,
1418
1419# sourceName, start/lastEpochMicrosec, measurementInterval,
1420
1421# concurrentSessions, requestRate, numberOfMediaPortsInUse,
1422
1423# cpuUsageArray.cpuUsage,cpuUsage.cpuIdentifier, cpuUsage.percentUsage,
1424
1425# additionalMeasurements.namedArrayOfFields.arrayOfFields,
1426
1427# vNicPerformance.receivedOctetsAccumulated,
1428
1429# vNicPerformance.transmittedOctetsAccumulated,
1430
1431# vNicPerformance.receivedTotalPacketsAccumulated,
1432
1433# vNicPerformance.transmittedTotalPacketsAccumulated,
1434
1435# vNicPerformance.vNicIdentifier, vNicPerformance.receivedOctetsDelta,
1436
1437# vNicPerformance.receivedTotalPacketsDelta,
1438
1439# vNicPerformance.transmittedOctetsDelta,
1440
1441# vNicPerformance.transmittedTotalPacketsDelta,
1442
1443# vNicPerformance.valuesAreSuspect, memoryUsageArray.memoryUsage,
1444
1445# memoryUsage.memoryConfigured, memoryUsage.vmIdentifier,
1446
1447# memoryUsage.memoryUsed, memoryUsage.memoryFree
1448
1449event: {presence: required, structure: {
1450
1451commonEventHeader: {presence: required, structure: {
1452
1453domain: {presence: required, value: measurement},
1454
1455eventName: {presence: required, value: Measurement_Vmrf-Nokia},
1456
1457eventId: {presence: required},
1458
1459nfNamingCode: {value: mrfx},
1460
1461priority: {presence: required, value: Normal},
1462
1463reportingEntityId: {presence: required},
1464
1465reportingEntityName: {presence: required},
1466
1467sequence: {presence: required},
1468
1469sourceId: {presence: required},
1470
1471sourceName: {presence: required},
1472
1473startEpochMicrosec: {presence: required},
1474
1475lastEpochMicrosec: {presence: required},
1476
1477timeZoneOffset: {presence: required},
1478
1479version: {presence: required, value: 3.0}
1480
1481}},
1482
1483measurementFields: {presence: required, structure: {
1484
1485measurementFieldsVersion: {presence: required, value: 3.0},
1486
1487measurementInterval: {presence: required, range: [ 60, 3600 ], default:
1488300},
1489
1490concurrentSessions: {presence: required, range: [ 0, 100000 ]},
1491
1492requestRate: {presence: required, range: [ 0, 100000 ]},
1493
1494numberOfMediaPortsInUse: {presence: required, range: [ 0, 100000 ]},
1495
1496cpuUsageArray: {presence: required, array: [
1497
1498cpuUsage: {presence: required, structure: {
1499
1500cpuIdentifier: {presence: required},
1501
1502percentUsage: {presence: required, range: [ 0, 100 ],
1503
1504action: [80, up, CpuUsageHigh, RECO-scaleOut],
1505
1506action: [10, down, CpuUsageLow, RECO-scaleIn]}
1507
1508}}
1509
1510]},
1511
1512memoryUsageArray: {presence: required, array: [
1513
1514memoryUsage: {presence: required, structure: {
1515
1516memoryConfigured: {presence: required, value: 33554432},
1517
1518memoryFree: {presence: required, range: [ 0, 33554432 ],
1519
1520action: [100, down, FreeMemLow, RECO-scaleOut],
1521
1522action: [30198989, up, FreeMemHigh, RECO-scaleIn]},
1523
1524memoryUsed: {presence: required, range: [ 0, 33554432 ]},
1525
1526vmIdentifier: {presence: required}
1527
1528}}
1529
1530]},
1531
1532additionalMeasurements: {presence: required, array: [
1533
1534namedHashMap: {presence: required, structure: {
1535
1536name: {presence: required, value: licenseUsage},
1537
1538hashMap: {presence: required, structure: {
1539
1540keyValuePair: {presence: required, structure: {
1541
1542key: {presence: required, value: G711AudioPort},
1543
1544value: {presence: required, range: [ 0, 100000 ],
1545
1546units: numberOfPorts }
1547
1548}},
1549
1550keyValuePair: {presence: required, structure: {
1551
1552key: {presence: required, value: G729AudioPort},
1553
1554value: {presence: required, range: [ 0, 100000 ],
1555
1556units: numberOfPorts }
1557
1558}},
1559
1560keyValuePair: {presence: required, structure: {
1561
1562key: {presence: required, value: G722AudioPort},
1563
1564value: {presence: required, range: [ 0, 100000 ],
1565
1566units: numberOfPorts }
1567
1568}},
1569
1570keyValuePair: {presence: required, structure: {
1571
1572key: {presence: required, value: AMRAudioPort},
1573
1574value: {presence: required, range: [ 0, 100000 ],
1575
1576units: numberOfPorts }
1577
1578}},
1579
1580keyValuePair: {presence: required, structure: {
1581
1582key: {presence: required, value: AMRWBAudioPort},
1583
1584value: {presence: required, range: [ 0, 100000 ],
1585
1586units: numberOfPorts }
1587
1588}},
1589
1590keyValuePair: {presence: required, structure: {
1591
1592key: {presence: required, value: OpusAudioPort},
1593
1594value: {presence: required, range: [ 0, 100000 ],
1595
1596units: numberOfPorts }
1597
1598}},
1599
1600keyValuePair: {presence: required, structure: {
1601
1602key: {presence: required, value: H263VideoPort},
1603
1604value: {presence: required, range: [ 0, 100000 ],
1605
1606units: numberOfPorts }
1607
1608}},
1609
1610keyValuePair: {presence: required, structure: {
1611
1612key: {presence: required, value: H264NonHCVideoPort},
1613
1614value: {presence: required, range: [ 0, 100000 ],
1615
1616units: numberOfPorts }
1617
1618}},
1619
1620keyValuePair: {presence: required, structure: {
1621
1622key: {presence: required, value: H264HCVideoPort},
1623
1624value: {presence: required, range: [ 0, 100000 ],
1625
1626units: numberOfPorts }
1627
1628}},
1629
1630keyValuePair: {presence: required, structure: {
1631
1632key: {presence: required, value: MPEG4VideoPort},
1633
1634value: {presence: required, range: [ 0, 100000 ],
1635
1636units: numberOfPorts }
1637
1638}},
1639
1640keyValuePair: {presence: required, structure: {
1641
1642key: {presence: required, value: VP8NonHCVideoPort},
1643
1644value: {presence: required, range: [ 0, 100000 ],
1645
1646units: numberOfPorts }
1647
1648}},
1649
1650keyValuePair: {presence: required, structure: {
1651
1652key: {presence: required, value: VP8HCVideoPort},
1653
1654value: {presence: required, range: [ 0, 100000 ],
1655
1656units: numberOfPorts }
1657
1658}},
1659
1660keyValuePair: {presence: required, structure: {
1661
1662key: {presence: required, value: PLC},
1663
1664value: {presence: required, range: [ 0, 100000 ],
1665
1666units: numberOfPorts }
1667
1668}},
1669
1670keyValuePair: {presence: required, structure: {
1671
1672key: {presence: required, value: AEC},
1673
1674value: {presence: required, range: [ 0, 100000 ],
1675
1676units: numberOfPorts }
1677
1678}},
1679
1680keyValuePair: {presence: required, structure: {
1681
1682key: {presence: required, value: NR},
1683
1684value: {presence: required, range: [ 0, 100000 ],
1685
1686units: numberOfPorts }
1687
1688}},
1689
1690keyValuePair: {presence: required, structure: {
1691
1692key: {presence: required, value: NG},
1693
1694value: {presence: required, range: [ 0, 100000 ],
1695
1696units: numberOfPorts }
1697
1698}},
1699
1700keyValuePair: {presence: required, structure: {
1701
1702key: {presence: required, value: NLD},
1703
1704value: {presence: required, range: [ 0, 100000 ],
1705
1706units: numberOfPorts }
1707
1708}},
1709
1710keyValuePair: {presence: required, structure: {
1711
1712key: {presence: required, value: G711FaxPort},
1713
1714value: {presence: required, range: [ 0, 100000 ],
1715
1716units: numberOfPorts }
1717
1718}},
1719
1720keyValuePair: {presence: required, structure: {
1721
1722key: {presence: required, value: T38FaxPort},
1723
1724value: {presence: required, range: [ 0, 100000 ],
1725
1726units: numberOfPorts }
1727
1728}},
1729
1730keyValuePair: {presence: required, structure: {
1731
1732key: {presence: required, value: RFactor},
1733
1734value: {presence: required, range: [ 0, 100000 ],
1735
1736units: numberOfPorts }
1737
1738}},
1739
1740keyValuePair: {presence: required, structure: {
1741
1742key: {presence: required, value: T140TextPort},
1743
1744value: {presence: required, range: [ 0, 100000 ],
1745
1746units: numberOfPorts }
1747
1748}},
1749
1750keyValuePair: {presence: required, structure: {
1751
1752key: {presence: required, value: EVSAudioPort},
1753
1754value: {presence: required, range: [ 0, 100000 ],
1755
1756units: numberOfPorts }
1757
1758}}
1759
1760}}
1761
1762}},
1763
1764namedHashMap: {presence: required, structure: {
1765
1766name: {presence: required, value: mediaCoreUtilization},
1767
1768hashMap: {presence: required, structure: {
1769
1770keyValuePair: {presence: required, structure: {
1771
1772key: {presence: required, value: actualAvgAudio},
1773
1774value: {presence: required, range: [ 0, 255 ],
1775
1776action: [80, up, AudioCoreUsageHigh, RECO-scaleOut],
1777
1778action: [10, down, AudioCoreUsageLow, RECO-scaleIn]}
1779
1780}},
1781
1782keyValuePair: {presence: required, structure: {
1783
1784key: {presence: required, value: modelAvgAudio},
1785
1786value: {presence: required, range: [ 0, 100 ],
1787
1788action: [80, up, AudioCoreUsageHigh, RECO-scaleOut],
1789
1790action: [10, down, AudioCoreUsageLow, RECO-scaleIn]}
1791
1792}},
1793
1794keyValuePair: {presence: required, structure: {
1795
1796key: {presence: required, value: actualMaxAudio},
1797
1798value: {presence: required, range: [ 0, 255 ]}
1799
1800}},
1801
1802keyValuePair: {presence: required, structure: {
1803
1804key: {presence: required, value: modelMaxAudio},
1805
1806value: {presence: required, range: [ 0, 100 ]}
1807
1808}},
1809
1810keyValuePair: {presence: required, structure: {
1811
1812key: {presence: required, value: actualAvgVideo},
1813
1814value: {presence: required, range: [ 0, 255 ],
1815
1816action: [80, up, VideoCoreUsageHigh, RECO-scaleOut],
1817
1818action: [10, down, VideoCoreUsageLow, RECO-scaleIn]}
1819
1820}},
1821
1822keyValuePair: {presence: required, structure: {
1823
1824key: {presence: required, value: modelAvgVideo},
1825
1826value: {presence: required, range: [ 0, 100 ],
1827
1828action: [80, up, VideoCoreUsageHigh, RECO-scaleOut],
1829
1830action: [10, down, VideoCoreUsageLow, RECO-scaleIn]}
1831
1832}},
1833
1834keyValuePair: {presence: required, structure: {
1835
1836key: {presence: required, value: actualMaxVideo},
1837
1838value: {presence: required, range: [ 0, 255 ]}
1839
1840}},
1841
1842keyValuePair: {presence: required, structure: {
1843
1844key: {presence: required, value: modelMaxVideo},
1845
1846value: {presence: required, range: [ 0, 100 ]}
1847
1848}},
1849
1850keyValuePair: {presence: required, structure: {
1851
1852key: {presence: required, value: actualAvgHcVideo},
1853
1854value: {presence: required, range: [ 0, 255 ],
1855
1856action: [80, up, HcVideoCoreUsageHigh, RECO-scaleOut],
1857
1858action: [10, down, HcVideoCoreUsageLow, RECO-scaleIn]}
1859
1860}},
1861
1862keyValuePair: {presence: required, structure: {
1863
1864key: {presence: required, value: modelAvgHcVideo},
1865
1866value: {presence: required, range: [ 0, 100 ],
1867
1868action: [80, up, HcVideoCoreUsageHigh, RECO-scaleOut],
1869
1870action: [10, down, HcVideoCoreUsageLow, RECO-scaleIn]}
1871
1872}},
1873
1874keyValuePair: {presence: required, structure: {
1875
1876key: {presence: required, value: actualMaxHcVideo},
1877
1878value: {presence: required, range: [ 0, 255 ]}
1879
1880}},
1881
1882keyValuePair: {presence: required, structure: {
1883
1884key: {presence: required, value: modelMaxHcVideo},
1885
1886value: {presence: required, range: [ 0, 100 ]}
1887
1888}}
1889
1890}}
1891
1892}}
1893
1894]},
1895
1896vNicPerformanceArray: {presence: required, array: [
1897
1898vNicPerformance: {presence: required, structure: {
1899
1900receivedOctetsAccumulated: {presence: required,
1901
1902range: [ 0, 18446744073709551615 ]},
1903
1904receivedTotalPacketsAccumulated: {presence: required,
1905
1906range: [ 0, 18446744073709551615 ]},
1907
1908receivedOctetsDelta: {presence: required},
1909
1910range: [ 0, 18446744073709551615 ],
1911
1912receivedTotalPacketsDelta: {presence: required,
1913
1914range: [ 0, 18446744073709551615 ]},
1915
1916transmittedOctetsDelta: {presence: required,
1917
1918range: [ 0, 18446744073709551615 ]},
1919
1920transmittedOctetsAccumulated: {presence: required,
1921
1922range: [ 0, 18446744073709551615 ]},
1923
1924transmittedTotalPacketsAccumulated: {presence: required,
1925
1926range: [ 0, 18446744073709551615 ]},
1927
1928transmittedTotalPacketsDelta: {presence: required,
1929
1930range: [ 0, 18446744073709551615 ]},
1931
1932valuesAreSuspect: {presence: required, value: [ true, false ]},
1933
1934vNicIdentifier: {presence: required}
1935
1936}}
1937
1938]}
1939
1940}}
1941
1942}}
1943
1944...
1945
1946Mobile Flow
1947-----------
1948
1949---
1950
1951# registration for mobileFlow
1952
1953# Constants: the values of domain, eventName, priority, version
1954
1955#
1956
1957# Variables (to be supplied at runtime) include: eventId,
1958reportingEntityName,
1959
1960# sequence, sourceName, start/lastEpochMicrosec
1961
1962#
1963
1964event: {presence: required, structure: {
1965
1966commonEventHeader: {presence: required, structure: {
1967
1968domain: {presence: required, value: mobileFlow},
1969
1970eventName: {presence: required, value: MobileFlow_Vxyz-Vendor},
1971
1972eventId: {presence: required},
1973
1974nfType: {presence: required, value: sbcx},
1975
1976priority: {presence: required, value: Normal},
1977
1978reportingEntityName: {presence: required},
1979
1980sequence: {presence: required},
1981
1982sourceName: {presence: required},
1983
1984startEpochMicrosec: {presence: required},
1985
1986lastEpochMicrosec: {presence: required},
1987
1988timeZoneOffset: {presence: required},
1989
1990version: {presence: required, value: 3.0}
1991
1992}},
1993
1994mobileFlowFields: {presence: required, structure: {
1995
1996mobileFlowFieldsVersion: {presence: required, value: 3.0},
1997
1998applicationType: {presence: optional},
1999
2000appProtocolType: {presence: optional},
2001
2002appProtocolVersion: {presence: optional},
2003
2004cid: {presence: optional},
2005
2006connectionType: {presence: optional},
2007
2008ecgi: {presence: optional},
2009
2010flowDirection: {presence: required},
2011
2012gtpPerFlowMetrics: {presence: required, structure: {
2013
2014avgBitErrorRate: {presence: required},
2015
2016avgPacketDelayVariation: {presence: required},
2017
2018avgPacketLatency: {presence: required},
2019
2020avgReceiveThroughput: {presence: required},
2021
2022avgTransmitThroughput: {presence: required},
2023
2024durConnectionFailedStatus: {presence: optional},
2025
2026durTunnelFailedStatus: {presence: optional},
2027
2028flowActivatedBy: {presence: optional},
2029
2030flowActivationEpoch: {presence: required},
2031
2032flowActivationMicrosec: {presence: required},
2033
2034flowActivationTime: {presence: optional},
2035
2036flowDeactivatedBy: {presence: optional},
2037
2038flowDeactivationEpoch: {presence: required},
2039
2040flowDeactivationMicrosec: {presence: required},
2041
2042flowDeactivationTime: {presence: required},
2043
2044flowStatus: {presence: required},
2045
2046gtpConnectionStatus: {presence: optional},
2047
2048gtpTunnelStatus: {presence: optional},
2049
2050ipTosCountList: {presence: optional},
2051
2052ipTosList: {presence: optional},
2053
2054largePacketRtt: {presence: optional},
2055
2056largePacketThreshold: {presence: optional},
2057
2058maxPacketDelayVariation: {presence: required},
2059
2060maxReceiveBitRate: {presence: optional},
2061
2062maxTransmitBitRate: {presence: optional},
2063
2064mobileQciCosCountList: {presence: optional},
2065
2066mobileQciCosList: {presence: optional},
2067
2068numActivationFailures: {presence: required},
2069
2070numBitErrors: {presence: required},
2071
2072numBytesReceived: {presence: required},
2073
2074numBytesTransmitted: {presence: required},
2075
2076numDroppedPackets: {presence: required},
2077
2078numGtpEchoFailures: {presence: optional},
2079
2080numGtpTunnelErrors: {presence: optional},
2081
2082numHttpErrors: {presence: optional},
2083
2084numL7BytesReceived: {presence: required},
2085
2086numL7BytesTransmitted: {presence: required},
2087
2088numLostPackets: {presence: required},
2089
2090numOutOfOrderPackets: {presence: required},
2091
2092numPacketErrors: {presence: required},
2093
2094numPacketsReceivedExclRetrans: {presence: required},
2095
2096numPacketsReceivedInclRetrans: {presence: required},
2097
2098numPacketsTransmittedInclRetrans: {presence: required},
2099
2100numRetries: {presence: required},
2101
2102numTimeouts: {presence: required},
2103
2104numTunneledL7BytesReceived: {presence: required},
2105
2106roundTripTime: {presence: required},
2107
2108tcpFlagCountList: {presence: optional},
2109
2110tcpFlagList: {presence: optional},
2111
2112timeToFirstByte: {presence: required}
2113
2114}},
2115
2116gtpProtocolType: {presence: optional},
2117
2118gtpVersion: {presence: optional},
2119
2120httpHeader: {presence: optional},
2121
2122imei: {presence: optional},
2123
2124imsi: {presence: optional},
2125
2126ipProtocolType: {presence: required},
2127
2128ipVersion: {presence: required},
2129
2130lac: {presence: optional},
2131
2132mcc: {presence: optional},
2133
2134mnc: {presence: optional},
2135
2136msisdn: {presence: optional},
2137
2138otherEndpointIpAddress: {presence: required},
2139
2140otherEndpointPort: {presence: required},
2141
2142otherFunctionalRole: {presence: optional},
2143
2144rac: {presence: optional},
2145
2146radioAccessTechnology: {presence: optional},
2147
2148reportingEndpointIpAddr: {presence: required},
2149
2150reportingEndpointPort: {presence: required},
2151
2152sac: {presence: optional},
2153
2154samplingAlgorithm: {presence: optional},
2155
2156tac: {presence: optional},
2157
2158tunnelId: {presence: optional},
2159
2160vlanId: {presence: optional},
2161
2162additionalInformation: {presence: optional, array: [
2163
2164keyValuePair: {presence: required, structure: {
2165
2166key: {presence: required, value: name1},
2167
2168value: {presence: required}
2169
2170}},
2171
2172keyValuePair: {presence: optional, structure: {
2173
2174key: {presence: required, value: name2},
2175
2176value: {presence: required}
2177
2178}}
2179
2180]}
2181
2182}}
2183
2184}}
2185
2186...
2187
2188Sip Signaling
2189-------------
2190
2191---
2192
2193# registration for sipSignaling
2194
2195# Constants: the values of domain, eventName, priority, version
2196
2197#
2198
2199# Variables (to be supplied at runtime) include: eventId,
2200reportingEntityName,
2201
2202# sequence, sourceName, start/lastEpochMicrosec
2203
2204#
2205
2206event: {presence: required, structure: {
2207
2208commonEventHeader: {presence: required, structure: {
2209
2210domain: {presence: required, value: sipSignaling},
2211
2212eventName: {presence: required, value: SipSignaling_Vxyz-Vendor},
2213
2214eventId: {presence: required},
2215
2216nfType: {presence: required, value: sbcx},
2217
2218priority: {presence: required, value: Normal},
2219
2220reportingEntityName: {presence: required},
2221
2222sequence: {presence: required},
2223
2224sourceName: {presence: required},
2225
2226startEpochMicrosec: {presence: required},
2227
2228lastEpochMicrosec: {presence: required},
2229
2230timeZoneOffset: {presence: required},
2231
2232version: {presence: required, value: 3.0}
2233
2234}},
2235
2236sipSignalingFields: {presence: required, structure: {
2237
2238compressedSIP: {presence: optional},
2239
2240correlator: {presence: required},
2241
2242localIpAaddress: {presence: required},
2243
2244localPort: {presence: required},
2245
2246remoteIpAddress: {presence: required},
2247
2248remotePort: {presence: required},
2249
2250sipSignalingFieldsVersion: {presence: required, value: 2.0},
2251
2252summarySip: {presence: optional},
2253
2254vnfVendorNameFields: {presence: required, structure: {
2255
2256vendorName: {presence: required},
2257
2258vfModuleName: {presence: optional},
2259
2260vnfName: {presence: optional}
2261
2262}},
2263
2264additionalInformation: {presence: optional, array: [
2265
2266keyValuePair: {presence: required, structure: {
2267
2268key: {presence: required, value: name1},
2269
2270value: {presence: required}
2271
2272}},
2273
2274keyValuePair: {presence: optional, structure: {
2275
2276key: {presence: required, value: name2},
2277
2278value: {presence: required}
2279
2280}}
2281
2282]}
2283
2284}}
2285
2286}}
2287
2288...
2289
2290Syslog
2291------
2292
2293---
2294
2295# registration for Syslog_vMRF
2296
2297# Constants: the values of domain, eventName, priority,
2298lastEpochMicrosec, version,
2299
2300# syslogFields.syslogFieldsVersion, syslogFields.syslogTag
2301
2302# Variables include: eventId, lastEpochMicrosec, reportingEntityId,
2303reportingEntityName,
2304
2305# sequence, sourceId, sourceName, startEpochMicrosec,
2306
2307# syslogFields.eventSourceHost, syslogFields.eventSourceType,
2308
2309# syslogFields.syslogFacility, syslogFields.syslogMsg
2310
2311event: {presence: required, structure: {
2312
2313commonEventHeader: {presence: required, structure: {
2314
2315domain: {presence: required, value: syslog},
2316
2317eventName: {presence: required, value: Syslog_Vmrf-Nokia},
2318
2319eventId: {presence: required},
2320
2321nfNamingCode: {value: mrfx},
2322
2323priority: {presence: required, value: Normal},
2324
2325reportingEntityId: {presence: required},
2326
2327reportingEntityName: {presence: required},
2328
2329sequence: {presence: required},
2330
2331sourceId: {presence: required},
2332
2333sourceName: {presence: required},
2334
2335startEpochMicrosec: {presence: required},
2336
2337lastEpochMicrosec: {presence: required},
2338
2339timeZoneOffset: {presence: required},
2340
2341version: {presence: required, value: 3.0},
2342
2343}},
2344
2345syslogFields: {presence: required, structure: {
2346
2347eventSourceHost: {presence: required},
2348
2349eventSourceType: {presence: required, value: virtualNetworkFunction},
2350
2351syslogFacility: {presence: required, range: [16, 23]},
2352
2353syslogSev: {presence: required, value: [Emergency, Alert, Critical,
2354Error]},
2355
2356syslogFieldsVersion: {presence: required, value: 3.0},
2357
2358syslogMsg: {presence: required},
2359
2360syslogSData: {presence: required, keyValuePairString: {‘ ‘, =,
2361keyValuePairs: [
2362
2363keyValuePair: {presence: required, structure: {
2364
2365key: {presence: required, value: ATTEST},
2366
2367value: {presence: required}
2368
2369}},
2370
2371keyValuePair: {presence: required, structure: {
2372
2373key: {presence: required, value: DATE_IN},
2374
2375value: {presence: required}
2376
2377}},
2378
2379keyValuePair: {presence: required, structure: {
2380
2381key: {presence: required, value: DATE_OUT},
2382
2383value: {presence: required}
2384
2385}},
2386
2387keyValuePair: {presence: required, structure: {
2388
2389key: {presence: required, value: DEST_IN},
2390
2391value: {presence: required}
2392
2393}},
2394
2395keyValuePair: {presence: required, structure: {
2396
2397key: {presence: required, value: FUNCTION},
2398
2399value: {presence: required}
2400
2401}},
2402
2403keyValuePair: {presence: required, structure: {
2404
2405key: {presence: required, value: ICID},
2406
2407value: {presence: required}
2408
2409}},
2410
2411keyValuePair: {presence: required, structure: {
2412
2413key: {presence: required, value: ORIGID},
2414
2415value: {presence: required}
2416
2417}},
2418
2419keyValuePair: {presence: required, structure: {
2420
2421key: {presence: required, value: ORIG_TN},
2422
2423value: {presence: required}
2424
2425}},
2426
2427keyValuePair: {presence: required, structure: {
2428
2429key: {presence: required, value: SIP_REASON_HEADER},
2430
2431value: {presence: required}
2432
2433}},
2434
2435keyValuePair: {presence: required, structure: {
2436
2437key: {presence: required, value: STATE},
2438
2439value: {presence: required}
2440
2441}},
2442
2443keyValuePair: {presence: required, structure: {
2444
2445key: {presence: required, value: STATUS},
2446
2447value: {presence: required}
2448
2449}},
2450
2451keyValuePair: {presence: required, structure: {
2452
2453key: {presence: required, value: VERSTAT},
2454
2455value: {presence: required}
2456
2457}}
2458
2459]}} }]
2460
2461syslogTag: {presence: required, value: vMRF},
2462
2463additionalFields: {presence: required, keyValuePairString: {|, =,
2464keyValuePairs: [
2465
2466keyValuePair: {presence: required, structure: {
2467
2468key: {presence: required, value: someKeyName},
2469
2470value: {presence: required}
2471
2472}},
2473
2474keyValuePair: {presence: optional, structure: {
2475
2476key: {presence: required, value: someOtherKeyName},
2477
2478value: {presence: required}
2479
2480}}
2481
2482]}}
2483
2484}}
2485
2486}}
2487
2488...
2489
2490Voice Quality
2491-------------
2492
2493---
2494
2495# registration for voiceQuality
2496
2497# Constants: the values of domain, eventName, priority, version
2498
2499#
2500
2501# Variables (to be supplied at runtime) include: eventId,
2502lastEpochMicrosec,
2503
2504# reportingEntityId, reportingEntityName, sequence, sourceId,
2505
2506# sourceName, startEpochMicrosec
2507
2508event: {presence: required, structure: {
2509
2510commonEventHeader: {presence: required, structure: {
2511
2512domain: {presence: required, value: voiceQualityFields},
2513
2514eventName: {presence: required, value: VoiceQuality_Vxyz-Vendor},
2515
2516eventId: {presence: required},
2517
2518nfType: {presence: required, value: sbcx},
2519
2520priority: {presence: required, value: Normal},
2521
2522reportingEntityName: {presence: required},
2523
2524sequence: {presence: required},
2525
2526sourceName: {presence: required},
2527
2528startEpochMicrosec: {presence: required},
2529
2530lastEpochMicrosec: {presence: required},
2531
2532timeZoneOffset: {presence: required},
2533
2534version: {presence: required, value: 3.0}
2535
2536}},
2537
2538voiceQualityFields: {presence: required, structure: {
2539
2540voiceQualityFieldsVersion: {presence: required, value: 2.0},
2541
2542calleeSideCodec: {presence: required},
2543
2544callerSideCodec: {presence: required},
2545
2546correlator: {presence: required},
2547
2548remoteIpAddress: {presence: required},
2549
2550endOfCallVqmSummaries: {presence: required, structure: {
2551
2552adjacencyName: {presence: required},
2553
2554endpointDescription: {presence: required},
2555
2556endpointAverageJitter: {presence: optional},
2557
2558endpointMaxJitter: {presence: optional},
2559
2560endpointRtpOctetsLost: {presence: optional},
2561
2562endpointRtpPacketsLost: {presence: optional},
2563
2564endpointRtpOctetsDiscarded: {presence: optional},
2565
2566endpointRtpOctetsReceived: {presence: optional},
2567
2568endpointRtpOctetsSent: {presence: optional},
2569
2570endpointRtpPacketsDiscarded: {presence: optional},
2571
2572endpointRtpPacketsReceived: {presence: optional},
2573
2574endpointRtpPacketsSent: {presence: optional},
2575
2576localAverageJitter: {presence: optional},
2577
2578localMaxJitter: {presence: optional},
2579
2580localAverageJitterBufferDelay: {presence: optional},
2581
2582localMaxJitterBufferDelay: {presence: optional},
2583
2584localRtpOctetsDiscarded: {presence: optional},
2585
2586localRtpOctetsLost: {presence: optional},
2587
2588localRtpOctetsReceived: {presence: optional},
2589
2590localRtpOctetsSent: {presence: optional},
2591
2592localRtpPacketsDiscarded: {presence: optional},
2593
2594localRtpPacketsLost: {presence: optional},
2595
2596localRtpPacketsReceived: {presence: optional},
2597
2598localRtpPacketsSent: {presence: optional},
2599
2600mosCqe: {presence: optional},
2601
2602oneWayDelay: {presence: optional},
2603
2604packetLossPercent: {presence: optional},
2605
2606rFactor: {presence: optional},
2607
2608roundTripDelay: {presence: optional}
2609
2610}},
2611
2612phoneNumber: {presence: required},
2613
2614midCallRtcp: {presence: required},
2615
2616vendorVnfNameFields: {presence: required, structure: {
2617
2618vendorName: {presence: required},
2619
2620vfModuleName: {presence: optional},
2621
2622vnfName: {presence: optional}
2623
2624}},
2625
2626additionalInformation: {presence: optional, array: [
2627
2628keyValuePair: {presence: required, structure: {
2629
2630key: {presence: required, value: name1},
2631
2632value: {presence: required}
2633
2634}},
2635
2636keyValuePair: {presence: optional, structure: {
2637
2638key: {presence: required, value: name2},
2639
2640value: {presence: required}
2641
2642}}
2643
2644]}
2645
2646}}
2647
2648}}
2649
2650...
2651
2652.. _rules-1:
2653
2654Rules
2655-----
2656
2657---
2658
2659#Rules
2660
2661Rules: [
2662
2663ruleName1: {
2664
2665trigger: "CpuUsageHigh \|\| FreeMemLow \|\| AudioCoreUsageHigh \|\|
2666
2667VideoCoreUsageHigh \|\| HcVideoCoreUsageHigh",
2668
2669microservices: [scaleOut]
2670
2671},
2672
2673ruleName2: {
2674
2675trigger: "CpuUsageLow && FreeMemHigh && AudioCoreUsageLow &&
2676
2677VideoCoreUsageLow && HcVideoCoreUsageLow",
2678
2679microservices: [scaleIn]
2680
2681}
2682
2683]
2684
2685...
2686
2687Appendix: Historical Change Log
2688===============================
2689
2690For the latest changes, see the Change Block just before the Table of
2691Contents.
2692
2693+-----------------------+-----------------------+-----------------------+
2694| Date | Revision | Description |
2695+-----------------------+-----------------------+-----------------------+
2696| 3/15/2017 | 1.0 | This is the initial |
2697| | | release of the VES |
2698| | | Event Registration |
2699| | | document. |
2700+-----------------------+-----------------------+-----------------------+
2701| 3/22/2017 | 1.1 | - Changed the |
2702| | | alert |
2703| | | qualifier to |
2704| | | action and |
2705| | | added support |
2706| | | for conditions |
2707| | | that will |
2708| | | trigger rules. |
2709| | | |
2710| | | - Formatted the |
2711| | | document with |
2712| | | more sections |
2713| | | and |
2714| | | subsections. |
2715| | | |
2716| | | - Defined the syntax |
2717| | | and semantics |
2718| | | for condition |
2719| | | based rules. |
2720| | | |
2721| | | - Fixed the YAML |
2722| | | examples. |
2723+-----------------------+-----------------------+-----------------------+
2724| 3/27/2017 | 1.2 | - Clarified the |
2725| | | audience of the |
2726| | | document and |
2727| | | the |
2728| | | expectations |
2729| | | for vendors. |
2730| | | |
2731| | | - Changed the order |
2732| | | of fields in |
2733| | | the action |
2734| | | keyword. |
2735| | | |
2736| | | - Updated the YAML |
2737| | | examples. |
2738| | | |
2739| | | - Wordsmithed |
2740| | | throughout. |
2741+-----------------------+-----------------------+-----------------------+
2742| 3/31/2017 | 1.3 | - Generalized the |
2743| | | descriptions |
2744| | | from an ASDC, |
2745| | | ECOMP and |
2746| | | AT&T-specific |
2747| | | interaction |
2748| | | with a VNF |
2749| | | vendor, to a |
2750| | | generic Service |
2751| | | Provider |
2752| | | interaction |
2753| | | with a VNF |
2754| | | vendor. |
2755| | | |
2756| | | - Wordsmithed |
2757| | | throughout. |
2758| | | |
2759| | | - Added a default |
2760| | | qualifier |
2761| | | |
2762| | | - Fixed syntax and |
2763| | | semantic |
2764| | | inconsistencies |
2765| | | in the Rules |
2766| | | section |
2767| | | |
2768| | | - Brought all |
2769| | | examples into |
2770| | | compliance with |
2771| | | v5.0 |
2772| | | |
2773| | | - Added a heartbeat |
2774| | | example |
2775| | | |
2776| | | - Modified the |
2777| | | measurement |
2778| | | example |
2779| | | |
2780| | | - Modified the |
2781| | | syslog example |
2782| | | |
2783| | | - Added two complex |
2784| | | rules |
2785+-----------------------+-----------------------+-----------------------+
2786| 4/14/2017 | 1.4 | - Wordsmithed |
2787| | | throughout |
2788| | | |
2789| | | - Action keyword: |
2790| | | clarified use |
2791| | | of up’, down |
2792| | | and at |
2793| | | triggers; |
2794| | | clarified the |
2795| | | specification |
2796| | | and use of |
2797| | | microservices |
2798| | | directives at |
2799| | | design time and |
2800| | | runtime, |
2801| | | clarified the |
2802| | | use of tcas |
2803| | | |
2804| | | - HeartbeatAction |
2805| | | keyword: Added |
2806| | | the |
2807| | | heartbeatAction |
2808| | | keyword |
2809| | | |
2810| | | - Value keyword: |
2811| | | clarified the |
2812| | | communicaton of |
2813| | | strings |
2814| | | containing |
2815| | | spaces. |
2816| | | |
2817| | | - Rules: corrected |
2818| | | the use of |
2819| | | quotes in |
2820| | | examples |
2821| | | |
2822| | | - Examples: added |
2823| | | the |
2824| | | heartbeatAction |
2825| | | keyword on the |
2826| | | heartbeat event |
2827| | | example; also |
2828| | | corrected use |
2829| | | of quotes |
2830| | | throughout. |
2831+-----------------------+-----------------------+-----------------------+
2832| 10/3/2017 | 1.5 | - Back of Cover |
2833| | | Page: updated the |
2834| | | license and |
2835| | | copyright notice |
2836| | | to comply with |
2837| | | ONAP guidelines |
2838| | | |
2839| | | - Section 3.1: Added |
2840| | | a Units |
2841| | | qualifier |
2842| | | |
2843| | | - Examples: updated |
2844| | | the examples to |
2845| | | align with VES |
2846| | | 5.4.1 |
2847+-----------------------+-----------------------+-----------------------+
2848| 10/31/2017 | 1.6 | - Added |
2849| | | KeyValuePairString |
2850| | | keyword to handle |
2851| | | strings which have |
2852| | | delimited |
2853| | | key-value pairs |
2854| | | within them. |
2855| | | |
2856| | | - Updated the syslog |
2857| | | example to show |
2858| | | the use of |
2859| | | KeyValuePairStr |
2860| | | ing |
2861| | | |
2862| | | - Updated the syslog |
2863| | | example to |
2864| | | align syslogSev |
2865| | | with VES 5.4.1 |
2866| | | |
2867| | | - Added examples for |
2868| | | mobile flow, |
2869| | | sip signaling |
2870| | | and voice |
2871| | | quality |
2872| | | |
2873| | | - Added sections |
2874| | | within the |
2875| | | examples to |
2876| | | facilitate |
2877| | | rapid access to |
2878| | | specific types |
2879| | | of example |
2880| | | events |
2881| | | |
2882| | | - Wordsmithed the |
2883| | | Introduction |
2884+-----------------------+-----------------------+-----------------------+