Fix doc config files and dead links
[policy/parent.git] / docs / apex / APEX-PCVS-Example.rst
1 .. This work is licensed under a Creative Commons Attribution 4.0 International License.
2 .. http://creativecommons.org/licenses/by/4.0
3
4 .. _apex-PCVSExample:
5
6 Policy-controlled Video Streaming (pcvs) with APEX
7 **************************************************
8
9 .. contents::
10     :depth: 3
11
12 Introduction
13 ^^^^^^^^^^^^
14
15       .. container:: sectionbody
16
17            .. container:: paragraph
18
19               This module contains several demos for
20               Policy-controlled Video Streaming (PCVS). Each demo
21               defines a policy using AVRO and Javascript (or other
22               scripting languages for the policy logic). To run the
23               demo, a vanilla Ubuntu server with some extra software packages is required:
24
25                .. container:: ulist
26
27                   -  Mininet as network simulator
28
29                   -  Floodlight as SDN controller
30
31                   -  Kafka as messaging system
32
33                   -  Zookeeper for Kafka configuration
34
35                   -  APEX for policy control
36
37 Install Ubuntu Server and SW
38 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
39
40           .. container:: sect1
41
42             .. rubric:: Install Demo
43                :name: install_demo
44
45             .. container:: sectionbody
46
47                .. container:: paragraph
48
49                   Requirements:
50
51                .. container:: ulist
52
53                   -  Ubuntu server: 1.4 GB
54
55                   -  Ubuntu with Xubuntu Desktop, git, Firefox: 2.3 GB
56
57                   -  Ubuntu with all, system updated: 3 GB
58
59                   -  With ZK, Kafka, VLC, Mininet, Floodlight, Python:
60                      4.4 GB
61
62                   -  APEX Build (M2 and built): M2 ~ 2 GB, APEX ~3.5 GB
63
64                   -  APEX install (not build locally): ~ 300 MB
65
66                .. container:: paragraph
67
68                   On a Ubuntu OS (install a stable or LTS server first)
69
70                .. container:: listingblock
71
72                   .. container:: content
73
74                      ::
75
76                         # pre for Ubuntu, tools and X
77                         sudo apt-get  -y install --no-install-recommends software-properties-common
78                         sudo apt-get  -y install --no-install-recommends build-essential
79                         sudo apt-get  -y install --no-install-recommends git
80                         sudo aptitude -y install --no-install-recommends xubuntu-desktop
81                         sudo apt-get  -y install --no-install-recommends firefox
82
83
84                         # install Java
85                         sudo add-apt-repository ppa:webupd8team/java
86                         sudo apt-get update
87                         sudo apt-get -y install --no-install-recommends oracle-java8-installer
88                         java -version
89
90
91                         # reboot system, run system update, then continue
92
93                         # if VBox additions are needed, install and reboot
94                         sudo (cd /usr/local/share; wget https://www.virtualbox.org/download/testcase/VBoxGuestAdditions_5.2.7-120528.iso)
95                         sudo mount /usr/local/share/VBoxGuestAdditions_5.2.7-120528.iso /media/cdrom
96                         sudo (cd /media/cdrom;VBoxLinuxAdditions.run)
97
98
99                         # update apt-get DB
100                         sudo apt-get update
101
102                         # if APEX is build from source, install maven and rpm
103                         sudo apt-get install maven rpm
104
105                         # install ZooKeeper
106                         sudo apt-get install zookeeperd
107
108                         # install Kafka
109                         (cd /tmp;wget http://ftp.heanet.ie/mirrors/www.apache.org/dist/kafka/1.0.0/kafka_2.12-1.0.0.tgz --show-progress)
110                         sudo mkdir /opt/Kafka
111                         sudo tar -xvf /tmp/kafka_2.12-1.0.0.tgz -C /opt/Kafka/
112
113                         # install mininet
114                         cd /usr/local/src
115                         sudo git clone https://github.com/mininet/mininet.git
116                         (cd mininet;util/install.sh -a)
117
118                         # install floodlight, requires ant
119                         sudo apt-get install ant
120                         cd /usr/local/src
121                         sudo wget --no-check-certificate https://github.com/floodlight/floodlight/archive/master.zip
122                         sudo unzip master.zip
123                         cd floodlight-master
124                         sudo ant
125                         sudo mkdir /var/lib/floodlight
126                         sudo chmod 777 /var/lib/floodlight
127
128                         # install python pip
129                         sudo apt-get install python-pip
130
131                         # install kafka-python (need newer version from github)
132                         cd /usr/local/src
133                         sudo git clone https://github.com/dpkp/kafka-python
134                         sudo pip install ./kafka-python
135
136                         # install vlc
137                         sudo apt-get install vlc
138
139                .. container:: paragraph
140
141                   Install APEX either from source or from a distribution
142                   package. See the APEX documentation for details. We
143                   assume that APEX is installed in
144                   ``/opt/ericsson/apex/apex``
145
146                .. container:: paragraph
147
148                   Copy the LinkMonitor file to Kafka-Python
149
150                .. container:: listingblock
151
152                   .. container:: content
153
154                      ::
155
156                         sudo cp /opt/ericsson/apex/apex/examples/scripts/pcvs/vpnsla/LinkMonitor.py /usr/local/src/kafka-python
157
158                .. container:: paragraph
159
160                   Change the Logback configuration in APEX to logic
161                   logging
162
163                .. container:: listingblock
164
165                   .. container:: content
166
167                      ::
168
169                         (cd /opt/ericsson/apex/apex/etc; sudo cp logback-logic.xml logback.xml)
170
171          .. container:: sect1
172
173             .. rubric:: Get the Demo Video
174                :name: get_the_demo_video
175
176             .. container:: sectionbody
177
178                .. container:: ulist
179
180                   -  For all download options of the movie please visit
181                      http://bbb3d.renderfarming.net/download.html
182
183                   -  For lower-res downloads and mirrors see
184                      https://peach.blender.org/download
185
186                .. container:: listingblock
187
188                   .. container:: content
189
190                      ::
191
192                         sudo mkdir /usr/local/src/videos
193
194                .. container:: paragraph
195
196                   Standard 720p (recommended)
197
198                .. container:: listingblock
199
200                   .. container:: content
201
202                      ::
203
204                         (cd /usr/local/src/videos; sudo curl -o big_buck_bunny_480p_surround.avi http://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi)
205
206                .. container:: paragraph
207
208                   Full HD video
209
210                .. container:: listingblock
211
212                   .. container:: content
213
214                      ::
215
216                         (cd videos; sudo curl -o bbb_sunflower_1080p_60fps_normal.mp4 http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_60fps_normal.mp4)
217
218
219
220 VPN SLA Demo
221 ^^^^^^^^^^^^
222
223           .. container:: sect1
224
225             .. container:: sectionbody
226
227                .. container:: paragraph
228
229                   This demo uses a network with several central office
230                   and core switches, over which two VPNs are run. A
231                   customer ``A`` has two location ``A1`` and ``A2`` and
232                   a VPN between them. A customer ``B`` has two location
233                   ``B1`` and ``B2`` and a VPN between them.
234
235                .. container:: imageblock
236
237                   .. container:: content
238
239                      |VPN SLA Architecture|
240
241                .. container:: paragraph
242
243                   The architecture above shows the scenario. The
244                   components are realized in this demo as follows:
245
246                .. container:: ulist
247
248                   -  *CEP / Analytics* - a simple Python script taking
249                      events from Kafka and sending them to APEX
250
251                   -  *APEX / Policy* - the APEX engine running the VPA
252                      SLA policy
253
254                   -  *Controller* - A vanilla Floodlight controller
255                      taking events from the Link Monitor and configuring
256                      Mininet
257
258                   -  *Network* - A network created using Mininet
259
260                .. container:: paragraph
261
262                   The demo requires to start some software (detailed
263                   below). To show actual video streams, we use ``VLC``.
264                   If you do not want to show video streams, but only the
265                   policy, skip the ``VLC`` section.
266
267                .. container:: paragraph
268
269                   All shown scripts are available in a full APEX
270                   installation in
271                   ``$APEX_HOME/examples/scripts/pcvs/vpnsla``.
272
273                .. container:: sect2
274
275                   .. rubric:: Start all Software
276                      :name: start_all_software
277
278                   .. container:: paragraph
279
280                      Create environment variables in a file, say
281                      ``env.sh``. In each new Xterm
282
283                   .. container:: ulist
284
285                      -  Source these environment settings, e.g.
286                         ``. ./env.sh``
287
288                      -  Run the commands below as root (``sudo`` per
289                         command or ``sudo -i`` for interactive mode as
290                         shown below)
291
292                   .. container:: listingblock
293
294                      .. container:: content
295
296                         ::
297
298                            #!/usr/bin/env bash
299
300                            export src_dir=/usr/local/src
301                            export APEX_HOME=/opt/ericsson/apex/apex
302                            export APEX_USER=apexuser
303
304                   .. container:: paragraph
305
306                      In a new Xterm, start Floodlight
307
308                   .. container:: listingblock
309
310                      .. container:: content
311
312                         ::
313
314                            sudo -i
315                            . ./env.sh
316                            cd $src_dir/floodlight-master && java -jar target/floodlight.jar
317
318                   .. container:: paragraph
319
320                      In a new Xterm start Mininet
321
322                   .. container:: listingblock
323
324                      .. container:: content
325
326                         ::
327
328                            sudo -i
329                            . ./env.sh
330                            mn -c && python $APEX_HOME/examples/scripts/pcvs/vpnsla/MininetTopology.py
331
332                   .. container:: paragraph
333
334                      In a new Xterm, start Kafka
335
336                   .. container:: listingblock
337
338                      .. container:: content
339
340                         ::
341
342                            sudo -i
343                            . ./env.sh
344                            /opt/Kafka/kafka_2.12-1.0.0/bin/kafka-server-start.sh /opt/Kafka/kafka_2.12-1.0.0/config/server.properties
345
346                   .. container:: paragraph
347
348                      In a new Xerm start APEX with the Kafka
349                      configuration for this demo
350
351                   .. container:: listingblock
352
353                      .. container:: content
354
355                         ::
356
357                            cd $APEX_HOME
358                            ./bin/apexApps.sh engine -c examples/config/pcvs/vpnsla/kafka2kafka.json
359
360                   .. container:: paragraph
361
362                      In a new Xterm start the Link Monitor. The Link
363                      Monitor has a 30 second sleep to slow down the
364                      demonstration. So the first action of it comes 30
365                      seconds after start. Every new action in 30 second
366                      intervals.
367
368                   .. container:: listingblock
369
370                      .. container:: content
371
372                         ::
373
374                            sudo -i
375                            . ./env.sh
376                            cd $src_dir
377                            xterm -hold -e 'python3 $src_dir/kafka-python/LinkMonitor.py' &
378
379                   .. container:: paragraph
380
381                      Now all software should be started and the demo is
382                      running. The Link Monitor will send link up events,
383                      picked up by APEX which triggers the policy. Since
384                      there is no problem, the policy will do nothing.
385
386                .. container:: sect2
387
388                   .. rubric:: Create 2 Video Streams with VLC
389                      :name: create_2_video_streams_with_vlc
390
391                   .. container:: paragraph
392
393                      In the Mininet console, type ``xterm A1 A2`` and
394                      ``xterm B1 B2`` to open terminals on these nodes.
395
396                   .. container:: paragraph
397
398                      ``A2`` and ``B2`` are the receiving nodes. In these
399                      terminals, run ``vlc-wrapper``. In each opened VLC
400                      window do
401
402                   .. container:: ulist
403
404                      -  Click Media â†’ Open Network Stream
405
406                      -  Give the URL as ``rtp://@:5004``
407
408                   .. container:: paragraph
409
410                      ``A1`` and ``B1`` are the sending nodes (sending
411                      the video stream) In these terminals, run
412                      ``vlc-wrapper``. In each opened VLC window do
413
414                   .. container:: ulist
415
416                      -  Click Media â†’ Stream
417
418                      -  Add the video (from ``/usr/local/src/videos``)
419
420                      -  Click ``Stream``
421
422                      -  Click ``Next``
423
424                      -  Change the destination
425                         ``RTP / MPEG Transport Stream`` and click
426                         ``Add``
427
428                      -  Change the address and type to ``10.0.0.2`` in
429                         ``A1`` and to ``10.0.0.4`` in ``B1``
430
431                      -  Turn off ``Active Transcoding`` (this is
432                         important to minimize CPU load)
433
434                      -  Click ``Next``
435
436                      -  Click ``Stream``
437
438                   .. container:: paragraph
439
440                      The video should be streaming across the network
441                      from ``A1`` to ``A2`` and from ``B1`` to ``B2``. If
442                      the video streams a slow or interrupted the CPU
443                      load is too high. In these cases either try a
444                      better machine or use a different (lower quality)
445                      video stream.
446
447                .. container:: sect2
448
449                   .. rubric:: Take out L09 and let the Policy do it’s
450                      Magic
451                      :name: take_out_l09_and_let_the_policy_do_it_s_magic
452
453                   .. container:: paragraph
454
455                      Now it is time to take out the link ``L09``. This
456                      will be picked up by the Link Monitor, which sends
457                      a new event (L09 DOWN) to the policy. The policy
458                      then will calculate which customer should be
459                      impeded (throttled). This will continue, until SLAs
460                      are violated, then a priority calculation will kick
461                      in (Customer ``A`` is prioritized in the setup).
462
463                   .. container:: paragraph
464
465                      To initiate this, simply type ``link s5 s6 down``
466                      in the Mininet console followed by ``exit``.
467
468                   .. container:: paragraph
469
470                      If you have the video streams running, you will see
471                      one or the other struggeling, depending on the
472                      policy decision.
473
474                .. container:: sect2
475
476                   .. rubric:: Reset the Demo
477                      :name: reset_the_demo
478
479                   .. container:: paragraph
480
481                      If you want to reset the demo, simple stop (in this
482                      order) the following process
483
484                   .. container:: ulist
485
486                      -  Link Monitor
487
488                      -  APEX
489
490                      -  Mininet
491
492                      -  Floodlight
493
494                   .. container:: paragraph
495
496                      Then restart them in this order
497
498                   .. container:: ulist
499
500                      -  Floodlight
501
502                      -  Mininet
503
504                      -  APEX
505
506                      -  Link Monitor
507
508                .. container:: sect2
509
510                   .. rubric:: Monitor the Demo
511                      :name: monitor_the_demo
512
513                   .. container:: paragraph
514
515                      Floodlight and APEX provide REST interfaces for
516                      monitoring.
517
518                   .. container:: ulist
519
520                      -  Floodlight: see `Floodlight
521                         Docs <https://floodlight.atlassian.net/wiki/spaces/floodlightcontroller/pages/40403023/Web+GUI>`__
522                         for details on how to access the monitoring. In
523                         a standard installation as we use here, pointing
524                         browser to the URL
525                         ``http://localhost:8080/ui/pages/index.html``
526                         should work on the same host
527
528 VPN SLA Policy
529 ^^^^^^^^^^^^^^
530
531             .. container:: sectionbody
532
533                .. container:: paragraph
534
535                   The VPN SLA policy is designed as a MEDA policy. The
536                   first state (M = Match) takes the trigger event (a
537                   link up or down) and checks if this is a change to the
538                   known topology. The second state (E = Establish) takes
539                   all available information (trigger event, local
540                   context) and defines what situation we have. The third
541                   state (D = Decide) takes the situation and selects
542                   which algorithm is best to process it. This state can
543                   select between ``none`` (nothing to do), ``solved`` (a
544                   problem is solved now), ``sla`` (compare the current
545                   customer SLA situation and select one to impede), and
546                   ``priority`` (impede non-priority customers). The
547                   fourth and final state (A = Act) selects the right
548                   action for the taken decision and creates the response
549                   event sent to the orchestrator.
550
551                .. container:: paragraph
552
553                   We have added three more policies to set the local
554                   context: one for adding nodes, one for adding edges
555                   (links), and one for adding customers. These policies
556                   do not realize any action, they are only here for
557                   updating the local context. This mechanism is the
558                   fasted way to update local context, and it is
559                   independent of any context plugin.
560
561                .. container:: paragraph
562
563                   The policy uses data defined in Avro, so we have a
564                   number of Avro schema definitions.
565
566 Context Schemas
567 ---------------
568
569          .. container:: sect1
570
571             .. container:: sectionbody
572
573                .. container:: paragraph
574
575                   The context schemas are for the local context. We
576                   model edges and nodes for the topology, customers, and
577                   problems with all information on detected problems.
578
579                   .. container:: ulist
580
581                      -  |avroSchemaEdges_link|
582                      -  |avroSchemaNodes_link|
583                      -  |avroSchemaCustomers_link|
584
585
586 Trigger Schemas
587 ---------------
588
589         .. container:: sect1
590
591             .. container:: sectionbody
592
593                .. container:: paragraph
594
595                   The trigger event provides a status as ``UP`` or
596                   ``DOWN``. To avoid tests for these strings in the
597                   logic, we defined an Avro schema for an enumeration (|avroSchemaLinkStatus_link|).
598                   This does not impact the trigger system (it can still
599                   send the strings), but makes the task logic simpler.
600
601
602
603 Context Logic Nodes
604 -------------------
605
606          .. container:: sect1
607
608             .. container:: sectionbody
609
610                .. container:: paragraph
611
612                   The node context logic simply takes the trigger event
613                   (for context) and creates a new node in the local
614                   context topology (|cntxtNodes_link|).
615
616 Context Logic Edges
617 -------------------
618
619          .. container:: sect1
620
621             .. container:: sectionbody
622
623                .. container:: paragraph
624
625                   The edge context logic simply takes the trigger event
626                   (for context) and creates a new edge in the local
627                   context topology (|cntxtEdges_link|).
628
629
630 Context Logic Customer
631 ----------------------
632
633          .. container:: sect1
634
635             .. container:: sectionbody
636
637                .. container:: paragraph
638
639                   The customer context logic simply takes the trigger
640                   event (for context) and creates a new customer in the
641                   local context topology (|cntxtCustomer_link|).
642
643
644 Logic: Match
645 ------------
646
647          .. container:: sect1
648
649             .. container:: sectionbody
650
651                .. container:: paragraph
652
653                   This is the logic for the match state. It is kept very
654                   simple. Beside taking the trigger event, it also
655                   creates a timestamp. This timestamp is later used for
656                   SLA and downtime calculations as well as for some
657                   performance information of the policy .
658                   Sample |taskMatch_link|
659
660
661 Logic: Policy Establish State
662 -----------------------------
663
664          .. container:: sect1
665
666             .. container:: sectionbody
667
668                .. container:: paragraph
669
670                   This is the logic for the establish state. It is the
671                   most complicated logic, since establishing a situation
672                   for a decision is the most important part of any
673                   policy. First, the policy describes what we find (the
674                   switch block), in terms of 8 normal situations and 1
675                   extreme error case.
676
677                .. container:: paragraph
678
679                   If required, it creates local context information for
680                   the problem (if it is new) or updates it (if the
681                   problem still exists). It also calculates customer SLA
682                   downtime and checks for any SLA violations. Finally,
683                   it creates a situation object.
684                   Sample |taskEstablish_link|
685
686 Logic: Policy Decide State
687 --------------------------
688
689          .. container:: sect1
690
691             .. container:: sectionbody
692
693                .. container:: paragraph
694
695                   The decide state can select between different
696                   algorithms depending on the situation. So it needs a
697                   Task Selection Logic (TSL). This TSL select a task in
698                   the current policy execution (i.e. potentially a
699                   different one per execution).
700                   Sample |tslDecide_Link|
701
702                .. container:: paragraph
703
704                   The actual task logic are then ``none``, ``solved``,
705                   ``sla``, and ``priority``.
706                   Sample task logic are as given below :
707
708                   .. container:: ulist
709
710                      -  |taskDecideNone_link|
711                      -  |taskDecideSolved_Link|
712                      -  |taskDecideSla_link|
713                      -  |taskDecidePriority_Link|
714
715
716 Logic: Policy Act State
717 -----------------------
718
719          .. container:: sect1
720
721             .. container:: sectionbody
722
723                .. container:: paragraph
724
725                   This is the logic for the act state. It is simply
726                   selecting an action, and creating the repsonse event
727                   for the orchestrator (the output of the policy).
728                   Sample |taskAct_link|
729
730 CLI Spec
731 --------
732
733          .. container:: sect1
734
735             .. rubric:: Complete Policy Definition
736                :name: complete_policy_definition
737
738             .. container:: sectionbody
739
740                .. container:: paragraph
741
742                   The complete policy definition is realized using the
743                   APEX CLI Editor. The script below shows the actual
744                   policy specification. All logic and schemas are
745                   included (as macro file).
746                   Sample |vpnsla-apex_link|
747
748
749 Context Events Nodes
750 --------------------
751
752          .. container:: sect1
753
754             .. container:: sectionbody
755
756                .. container:: paragraph
757
758                   The following events create all nodes of the topology.
759
760                   .. container:: ulist
761
762                      -  |ctxtNodesJson_link|
763
764
765 Context Events Edges
766 --------------------
767
768          .. container:: sect1
769
770             .. container:: sectionbody
771
772                .. container:: paragraph
773
774                   The following events create all edges of the topology.
775
776                   .. container:: ulist
777
778                      -  |ctxtEdgesJson_link|
779
780
781 Context Events Customers
782 ------------------------
783
784          .. container:: sect1
785
786             .. container:: sectionbody
787
788                .. container:: paragraph
789
790                   The following events create all customers of the topology.
791
792                   .. container:: ulist
793
794                      -  |ctxtCustomerJson_link|
795
796
797 Trigger Examples
798 ----------------
799
800          .. container:: sect1
801
802             .. container:: sectionbody
803
804                .. container:: paragraph
805
806                   The following events are examples for trigger events
807
808                   .. container:: ulist
809
810                      -  |triggerEdgeJson_link|
811
812 Link Monitor
813 ------------
814
815          .. container:: sect1
816
817             .. container:: sectionbody
818
819                .. container:: paragraph
820
821                   The Link Monitor is a Python script. At startup, it
822                   sends the context events to APEX to initialize the
823                   topology and the customers. Then it takes events from
824                   Kafka and sends them to APEX.
825                   Sample |linkMonitor_link|
826
827 Mininet Topology
828 ----------------
829
830          .. container:: sect1
831
832             .. container:: sectionbody
833
834                .. container:: paragraph
835
836                   The topology is realized using Mininet. This
837                   script is used to establish the topology and to realize
838                   network configurations.
839                   Sample |mininetTopology_link|
840
841
842    .. container::
843       :name: footer-text
844
845       2.3.0-SNAPSHOT
846       Last updated 2020-04-03 16:04:24 IST
847
848
849 .. |VPN SLA Architecture| image:: images/pcvs/vpnsla-arch.png
850
851 .. |avroSchemaEdges_link| raw:: html
852
853   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/org/onap/policy/apex/examples/pcvs/vpnsla/avro/topology-edges.avsc" target="_blank">AVRO Schema Edges</a>
854 .. |avroSchemaNodes_link| raw:: html
855
856   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src//main/resources/org/onap/policy/apex/examples/pcvs/vpnsla/avro/topology-nodes.avsc" target="_blank">AVRO Schema Nodes</a>
857 .. |avroSchemaCustomers_link| raw:: html
858
859   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/org/onap/policy/apex/examples/pcvs/vpnsla/avro/customers.avsc" target="_blank">AVRO Schema Customers</a>
860 .. |avroSchemaLinkStatus_link| raw:: html
861
862   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/org/onap/policy/apex/examples/pcvs/vpnsla/avro/link-status.avsc" target="_blank">AVRO Schema Link Status</a>
863 .. |cntxtNodes_link| raw:: html
864
865   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/org/onap/policy/apex/examples/pcvs/vpnsla/logic/ctxt-nodes.js" target="_blank">Logic Node Context</a>
866 .. |cntxtEdges_link| raw:: html
867
868   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/org/onap/policy/apex/examples/pcvs/vpnsla/logic/ctxt-edges.js" target="_blank">Logic Edge Context</a>
869 .. |cntxtCustomer_link| raw:: html
870
871   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/org/onap/policy/apex/examples/pcvs/vpnsla/logic/ctxt-customer.js" target="_blank">Logic Customer Context</a>
872 .. |taskMatch_link| raw:: html
873
874   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/org/onap/policy/apex/examples/pcvs/vpnsla/logic/task-match.js" target="_blank">Logic Policy Match State</a>
875 .. |taskEstablish_link| raw:: html
876
877   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/org/onap/policy/apex/examples/pcvs/vpnsla/logic/task-establish.js" target="_blank">Logic Policy Establish State</a>
878 .. |tslDecide_Link| raw:: html
879
880   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/org/onap/policy/apex/examples/pcvs/vpnsla/logic/tsl-decide.js" target="_blank">JS Logic Policy Decide State - TSL</a>
881 .. |taskDecideNone_link| raw:: html
882
883   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/org/onap/policy/apex/examples/pcvs/vpnsla/logic/task-decide-none.js" target="_blank">Logic: Decide None</a>
884 .. |taskDecideSolved_Link| raw:: html
885
886   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/org/onap/policy/apex/examples/pcvs/vpnsla/logic/task-decide-solved.js" target="_blank">Logic: Decide Solved</a>
887 .. |taskDecideSla_link| raw:: html
888
889   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/org/onap/policy/apex/examples/pcvs/vpnsla/logic/task-decide-sla.js" target="_blank">Logic: Decide SLA</a>
890 .. |taskDecidePriority_Link| raw:: html
891
892   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/org/onap/policy/apex/examples/pcvs/vpnsla/logic/task-decide-priority.js" target="_blank">Logic: Decide Priority</a>
893 .. |taskAct_link| raw:: html
894
895   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/org/onap/policy/apex/examples/pcvs/vpnsla/logic/task-act.js" target="_blank">Logic Policy Act State</a>
896 .. |vpnsla-apex_link| raw:: html
897
898   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/org/onap/policy/apex/examples/pcvs/vpnsla/vpnsla.apex" target="_blank">APEX VPN SLA Policy Specification</a>
899 .. |ctxtNodesJson_link| raw:: html
900
901   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/examples/events/pcvs/vpnsla/CtxtNodes.json" target="_blank">Context Events Nodes</a>
902 .. |ctxtEdgesJson_link| raw:: html
903
904   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/examples/events/pcvs/vpnsla/CtxtEdges.json" target="_blank">Context Events Edges</a>
905 .. |ctxtCustomerJson_link| raw:: html
906
907   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/examples/events/pcvs/vpnsla/CtxtCustomers.json" target="_blank">Context Events Customers</a>
908 .. |triggerEdgeJson_link| raw:: html
909
910   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/examples/events/pcvs/vpnsla/Trigger_Edge09.json" target="_blank">Trigger Examples</a>
911 .. |linkMonitor_link| raw:: html
912
913   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/examples/scripts/pcvs/vpnsla/LinkMonitor.py" target="_blank">Link Monitor</a>
914 .. |mininetTopology_link| raw:: html
915
916   <a href="https://github.com/onap/policy-apex-pdp/tree/master/examples/examples-pcvs/src/main/resources/examples/scripts/pcvs/vpnsla/MininetTopology.py" target="_blank">Mininet Topology</a>