From 16af08c3179f70226c2012210c9548a108d467f8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 16:55:48 +0000 Subject: [PATCH] Deployed dddf309 with MkDocs version: 1.5.3 --- .nojekyll | 0 404.html | 1259 ++++ about/collectors/index.html | 1403 ++++ about/index.html | 1400 ++++ about/infrastructure/index.html | 1456 ++++ about/processors/index.html | 1398 ++++ arango/example-queries-2/index.html | 1771 +++++ assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.8fd75fb4.min.js | 29 + assets/javascripts/bundle.8fd75fb4.min.js.map | 7 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.el.min.js | 1 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.he.min.js | 1 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.b8dbb3d2.min.js | 42 + .../workers/search.b8dbb3d2.min.js.map | 7 + assets/stylesheets/main.7e359304.min.css | 1 + assets/stylesheets/main.7e359304.min.css.map | 1 + assets/stylesheets/palette.06af60db.min.css | 1 + .../stylesheets/palette.06af60db.min.css.map | 1 + development/contributing/index.html | 1288 ++++ development/images/index.html | 1439 ++++ development/index.html | 1339 ++++ development/minimal/index.html | 1369 ++++ device-config/index.html | 1348 ++++ device-config/xr-config/index.html | 1646 ++++ diagrams/k8s_diagram.graffle | Bin 0 -> 13838 bytes img/BGP-LS-and-BMP.png | Bin 0 -> 126000 bytes img/jalapeno.png | Bin 0 -> 19021 bytes img/jalapeno_architecture.png | Bin 0 -> 84632 bytes img/topology.png | Bin 0 -> 225533 bytes includes/abbreviations/index.html | 1281 ++++ index.html | 1389 ++++ install/gettingstarted/index.html | 1351 ++++ install/jalapeno/index.html | 1505 ++++ install/kubernetes/index.html | 1658 ++++ install/prerequisites/index.html | 1362 ++++ resources/arangodb/index.html | 1448 ++++ resources/index.html | 1346 ++++ resources/influxdb/index.html | 1439 ++++ search/search_index.json | 1 + sitemap.xml | 133 + sitemap.xml.gz | Bin 0 -> 422 bytes usage/api/index.html | 1349 ++++ usage/arangodb/index.html | 1426 ++++ usage/grafana/index.html | 1432 ++++ usage/index.html | 1342 ++++ usage/influxdb/index.html | 1416 ++++ usage/kafka/index.html | 1432 ++++ 79 files changed, 45716 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 about/collectors/index.html create mode 100644 about/index.html create mode 100644 about/infrastructure/index.html create mode 100644 about/processors/index.html create mode 100644 arango/example-queries-2/index.html create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.8fd75fb4.min.js create mode 100644 assets/javascripts/bundle.8fd75fb4.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.el.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.he.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.b8dbb3d2.min.js create mode 100644 assets/javascripts/workers/search.b8dbb3d2.min.js.map create mode 100644 assets/stylesheets/main.7e359304.min.css create mode 100644 assets/stylesheets/main.7e359304.min.css.map create mode 100644 assets/stylesheets/palette.06af60db.min.css create mode 100644 assets/stylesheets/palette.06af60db.min.css.map create mode 100644 development/contributing/index.html create mode 100644 development/images/index.html create mode 100644 development/index.html create mode 100644 development/minimal/index.html create mode 100644 device-config/index.html create mode 100644 device-config/xr-config/index.html create mode 100644 diagrams/k8s_diagram.graffle create mode 100644 img/BGP-LS-and-BMP.png create mode 100644 img/jalapeno.png create mode 100644 img/jalapeno_architecture.png create mode 100644 img/topology.png create mode 100644 includes/abbreviations/index.html create mode 100644 index.html create mode 100644 install/gettingstarted/index.html create mode 100644 install/jalapeno/index.html create mode 100644 install/kubernetes/index.html create mode 100644 install/prerequisites/index.html create mode 100644 resources/arangodb/index.html create mode 100644 resources/index.html create mode 100644 resources/influxdb/index.html create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz create mode 100644 usage/api/index.html create mode 100644 usage/arangodb/index.html create mode 100644 usage/grafana/index.html create mode 100644 usage/index.html create mode 100644 usage/influxdb/index.html create mode 100644 usage/kafka/index.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..dafa68af --- /dev/null +++ b/404.html @@ -0,0 +1,1259 @@ + + + +
+ + + + + + + + + + + + + + + + +Jalapeno Collectors are responsible for collecting topology and performance data from the network.
+Any Jalapeno infrastructure component that brings data into the Jalapeno cluster from the network is considered a Collector.
+To collect topology-related data, Jalapeno currently uses the golang implementation of OpenBMP, or "GoBMP". Devices can be configured to send BMP data to the cluster via the GoBMP Collector, which is deployed as a StatefulSet
in Kubernetes. Inside the /install/collectors/gobmp
directory, the gobmp-collector.yaml
file defines the pod to be built using the latest GoBMP image.
Thus, Jalapeno has a GoBMP Collector pod running in the cluster that serves as the ingress point for all topology data from the devices. Once the data arrives from the network to the GoBMP pod, the data is then forwarded to Kafka for the next level of data processing (see Processors).
+You can learn more about GoBMP and the way GoBMP organizes topology data here.
+To collect performance-related data, Jalapeno uses Telegraf.
+Devices are configured to send telemetry data to the cluster via the Telegraf-Ingress Collector, which is deployed as a Deployment in Kubernetes. Inside the /install/collectors/telegraf-ingress
directory, the telegraf_ingress_dp.yaml
file defines the pod to be built using the latest Telegraf image, and then loads its configuration from the telegraf_ingress_cfg.yaml
file.
Thus, Jalapeno has an Telegraf-Ingress Collector pod running in the cluster that serves as the ingress point for all performance data from the devices. As defined in the telegraf_ingress_cfg.yaml
file, the data is then forwarded to Kafka into the jalapeno.telemetry
topic, which can be queried by Jalapeno's performance processors (see Processors).
Note
+This collector is called Telegraf-Ingress specifically because there is also a Telegraf-Egress processor. The egress processor forwards the data from Kafka to InfluxDB further down Jalapeno's data pipeline.
+This section contains details about the overall design of Jalapeno, including notes about the different components of the project.
+The diagram below provides an general idea of the architecture behind the project & intended interaction between components. Within the pages of this section, We'll dive into each of these components separately to describe their functions.
+ +++SDN is a Database Problem
+
At the heart of Jalapeno is the concept that all SDN use cases are really virtual topologies whose type and characteristics are driven by dataplane encapsulations and other meta data. Thus, we see SDN as database problem. With this framework in mind, Jalapeno has the theoretical ability to address any kind of virtual topology use case.
+For example:
+For this project, we define the following goals:
+Jalapeno is comprised of a series of microservices which can be summarized as:
+API-GW - expose Jalapeno's virtual topology data for application consumption (API-GW is under construction)
+SR-Apps - mini-applications that mine the graph and time-series databases for the label stack or SRv6 SRH data needed to execute topology or traffic engineering use cases. Each SR-App should have its own API to field client requests for Segment Routing network services.
+Jalapeno's kubernetes architecture make it inherently extensible. We imagine the number of collectors, graphDB virtual topology use cases, and SR-Apps to expand significantly as our community grows.
+In an example use case, an end user or application would like to send their backup/background traffic to its destination via the least utilized path. The intent would be to preserve more capacity on the routing protocol's chosen best path. Jalapeno responds to the request with a segment routing label stack that, when appended to outbound packets, will steer traffic over the least utilized path. The app then re-queries Jalapeno every 10 seconds and updates the SR label stack should the least utilized path change.
+The key to developing and supporting virtual topology use cases is the programmatic acquisition of topology data. Traditional SDN-TE platforms focus on Internal-TE and therefore leverage BGP-LS. With Jalapeno we wish to eventually support all the above categories of use case, and therefore we use BGP Monitoring Protocol (BMP) and leverage the GoBMP collector.
+BMP provides a superset of topology data, including:
+Jalapeno has the following components that create its infrastructure: Kafka, ArangoDB, InfluxDB, Grafana, and Telegraf.
+All infrastructure components reside in the Jalapeno Kubernetes cluster and are deployed using the /install/infra/deploy_infrastructure.sh
script.
Each Jalapeno infrastructure component defines its deployment in the respective YAML files. These files allow for the configuration of services, deployments, config-maps, node-ports and other Kubernetes components.
+Kafka is Jalapeno's message bus and core data handler.
+Jalapeno's Kafka instance handles two main types of data: OpenBMP data (topology information) and telemetry data (network metrics). Jalapeno Processors are responsible for reading and restructuring the data, and for inferring relevant metrics from the data.
+OpenBMP data is organized into Kakfa topics such as openbmp.parsed.peer
and openbmp.parsed.ls_node
. These topics are further parsed to create representations of the network topology using the Topology Processor.
Telemetry data is collected in the openbmp.telemetry
topic. Data in this topic is pushed into Telegraf (a telemetry consumer), and onwards into InfluxDB.
Kafka is deployed using kubectl
, as seen in the deploy_infrastructure.sh
script. The configurations for Kafka's deployment are in the YAML files in the jalapeno/infra/kafka/
directory.
ArangoDB is Jalapeno's graph database.
+Jalapeno Processors parse through data in Kafka, then create various collections in ArangoDB. These collections represent both the network's topology and its current state. For example, the Topology Processor parses OpenBMP messages that have been streamed to Kafka and builds out collections such as "LSNode" and "L3VPNPrefix" in Jalapeno's ArangoDB instance. These collections, in conjunction with ArangoDBs rapid graphical traversals and calculations, make it easy to determine the lowest-latency path, etc.
+ArangoDB also houses the most interactive aspects of Jalapeno. Processors for Bandwidth and Latency upsert their scores here. Clients can run queries to generate label stacks for their desired network optimization attribute.
+ArangoDB is deployed using kubectl
, as seen in the deploy_infrastructure.sh
script. The configurations for ArangoDB's deployment are in the YAML files in the jalapeno/infra/arangodb/
directory.
To access ArangoDB's UI, log in at <server_ip>:30852
, using credentials root/jalapeno
. In the list of DBs, select jalapeno
.
InfluxDB is Jalapeno's time-series database.
+Telemetry data is parsed and passed from Kafka into InfluxDB using a telemetry consumer (Telegraf).
+The data stored in InfluxDB can be queried by Processors and by the ArangoDB Jalapeno API. These queries construct and derive relevant metrics. For example, a processor could generate rolling-averages of bytes sent out of a router's interface, which would be used to simulate link utilization.
+Using InfluxDB as a historical data-store, Jalapeno Processors can also infer trends based on historical analysis. Processors and even applications can determine whether instantaneous measurements are extreme anomalies, and can enable requests for any number of threshold-based reactions.
+InfluxDB is deployed using kubectl
, as seen in the deploy_infrastructure.sh
script. The configurations for InfluxDB's deployment are in the YAML files in the jalapeno/infra/influxdb/
directory.
To access InfluxDB via Kubernetes, enter the pod's terminal and run:
+influx
+auth root jalapeno
+use mdt_db
+show series
+
Grafana is Jalapeno's visual dashboard and metric visualization tool.
+Loaded with InfluxDB as its data-source, Grafana has various graphical representations of the network, including historical bandwidth usage, historical latency metrics, and more.
+Grafana is deployed using kubectl
, as seen in the deploy_infrastructure.sh
script. The configurations for Grafana's deployment are in the various YAML files in the jalapeno/infra/grafana/
directory.
To access Grafana's UI, log in at <server_ip>:30300
, using credentials root/jalapeno
.
Telegraf is a telemetry consumer and forwarder.
+Within the Jalapeno infrastructure, the Telegraf-Egress deployment of Telegraf consumes data from Kafka and forwards this data to InfluxDB.
+Telegraf-Egress is deployed using kubectl
, as seen in the deploy_infrastructure.sh
script. The configurations for the Pipeline deployments are in the various YAML files in the jalapeno/infra/telegraf-egress/
directory.
Note
+There exists another Telegraf instance (Telegraf-Ingress) that is part of Jalapeno's Collectors. The ingress instance consumes data from devices directly before forwarding the data to Kafka.
+Jalapeno's Data Processors are responsible for organizing, parsing, and analysing network topology and performance data.
+Any Jalapeno Infrastructure component with data is considered a source for a Processor.
+BGP speakers send BMP data feeds to GoBMP, which then passes the data to Kafka. The Topology Processor subscribes to Kafka's BMP topics in order to create topology representations in ArangoDB.
+Collections created using this service are considered base-collections. These base-collections have no inference of relationships between network elements, or of any metrics - they are organized collections of individual GoBMP messages.
+For example, the Topology processor creates the LSNode collection and the LSLink collection directly from GoBMP BGP-LS message data.
+The configuration for topology deployment is in "topology_dp.yaml" in the topology directory.
+Currently the project is bundled with a limited set of processors. However, other processors can be found in this repository which may offer additional functionality to Jalapeno.
+ + + + + + + + + + + + + +for v, e in outbound shortest_path 'sr_node/2_0_0_0000.0000.0025' TO 'unicast_prefix_v4/10.10.3.0_24_10.0.0.29' sr_topology return { prefix: v.prefix, name: v.name, sid: e.srv6_sid, latency: e.latency }
+for v, e in outbound shortest_path 'sr_node/2_0_0_0000.0000.0025' to 'unicast_prefix_v4/10.10.3.0_24_10.0.0.29' sr_topology OPTIONS {weightAttribute: 'latency' } return { prefix: v.prefix, name: v.name, sid: e.srv6_sid, latency: e.latency }
+for v, e, p IN 1..6 outbound 'sr_node/2_0_0_0000.0000.0025' sr_topology OPTIONS {uniqueVertices: "path", bfs: true} FILTER v._id == 'unicast_prefix_v4/10.10.3.0_24_10.0.0.29' return { path: p.edges[].remote_node_name, sid: p.edges[].srv6_sid, country_list: p.edges[].country_codes[], latency: sum(p.edges[].latency), percent_util_out: avg(p.edges[].percent_util_out)}
+for v, e in outbound shortest_path 'sr_node/2_0_0_0000.0000.0025' to 'unicast_prefix_v4/10.10.3.0_24_10.0.0.29' sr_topology OPTIONS {weightAttribute: 'latency' } return { prefix: v.prefix, name: v.name, sid: e.srv6_sid, latency: e.latency, cc: e.country_codes }
+for p in outbound k_shortest_paths 'sr_node/2_0_0_0000.0000.0025' to 'unicast_prefix_v4/10.10.3.0_24_10.0.0.29' sr_topology filter p.edges[].country_codes !like "%FRA%" return { path: p.edges[].remote_node_name, sid: p.edges[].srv6_sid, country_list: p.edges[].country_codes[], latency: sum(p.edges[].latency), percent_util_out: avg(p.edges[*].percent_util_out)}
+Basic queries
+for l in ls_srv6_sid_edge return l +for l in ls_prefix return l +for l in ls_node_edge return l +for l in ls_node_edge return l +for l in ls_node_edge filter l.protocol_id == 7 return l._key +for p in unicast_prefix_v4 filter p._key == "10.71.8.0_22_10.71.0.1" return p +FOR d IN peer filter d.remote_bgp_id == "10.0.0.71" filter d.remote_ip == "10.71.0.1" return d
+for l in UnicastPrefixV4 filter l.peer_ip == "10.2.2.3" return { UnicastPrefixV4: l, LSLink: (for s in LSLink filter s.remote_link_ip == "10.2.2.3"return s)}
+for u in UnicastPrefixV4 for l in LSLink filter u.peer_ip == l.remote_link_ip filter u.peer_ip == "10.71.1.1" return {u: u._id, l: l.remote_link_ip}
+FOR d IN peer filter d.remote_ip == "10.71.0.1" FOR l in ls_link filter d.remote_ip == l.remote_link_ip return d
+for d in peer filter d.remote_ip == "10.1.40.3" for l in ls_link filter d.remote_ip == l.remote_link_ip return { d, l }
+//FOR v, e, p IN 1..10 ANY "ls_node/2_0_0_0000.0000.0019" lsv4_edge + //FILTER v._id == "ls_node/2_0_0_0000.0000.0009" + // FILTER v._id == "unicast_prefix_v4/10.71.2.0_24_10.71.0.1" + //FILTER e.mt_id_tlv.mt_id == null + //RETURN CONCAT_SEPARATOR(" -> ", [p.vertices[]._key, p.vertices[].router_id, p.edges[*]._key])
+for u in unicast_prefix_v4 return u._key
+for v, e in outbound 'ls_node/2_0_0_0000.0000.0002' GRAPH ls_node return [v._key, e._key]
+//for d in ls_link filter d.mt_id_tlv.mt_id != 2 return d._key
+//for v, e in outbound shortest_path 'LSNode/2_0_0_0000.0000.0017' TO 'UnicastPrefixV4/10.71.2.0_24_10.71.0.1' LSNode_Edge filter e.mt_id != 2 return e
+//for v, e in outbound shortest_path 'ls_node/2_0_0_0000.0000.0017' TO 'unicast_prefix_v4/10.71.2.0_24_10.71.0.1' ls_node_edge filter e.mt_id != 2 return {node: v._key, link: e._key, latency: e.link_latency, asn: v.asn, local_asn: v.local_asn, remote_asn: v.remote_asn }
+//for v, e in outbound shortest_path 'ls_node/2_0_0_0000.0000.0017' TO 'unicast_prefix_v4/10.71.2.0_24_10.71.0.1' ls_node_edge OPTIONS {weightAttribute: 'link_latency' } filter e.mt_id != 2 return { node: v._key, link: e._key, latency: e.link_latency }
+//for l in ls_link filter l.protocol_id == 7 && l.peer_asn == 100000 && l.remote_link_ip == "10.73.0.1" return { epe_sid: l.peer_node_sid.prefix_sid }
+//for l in ls_link filter l.protocol_id == 7 && l.peer_asn == 100000 && l.remote_link_ip == "10.73.0.1" return { epe_sid: l.peer_node_sid.sid } +//for l in ls_link filter l.protocol_id == 7 return l.peer_node_sid.sid//&& l.remote_link_ip == "10.73.0.1" return l +//for l in ls_link filter l._key == "7_0_0_46489_10.0.0.43_10.73.0.0_10.0.0.73_10.73.0.1" return l +//for l in ls_link filter l.protocol_id == 7 return [l._key, l.remote_link_ip, l.peer_node_sid.sid]
+//for l in lsv4_edge return [l._key, l.link_latency] +//FOR p in lsv4_edge filter p._key == "2_0_0_0_0000.0000.0004_10.1.1.65_0000.0000.0007_10.1.1.64" UPDATE p with { link_latency: 50 } in lsv4_edge
+//for v, e in outbound shortest_path 'ls_node/2_0_0_0000.0000.0017' TO 'unicast_prefix_v4/10.71.2.0_24_10.71.0.1' lsv4_edge filter e.mt_id != 2 return {node: v._key, link: e._key, latency: e.link_latency, asn: v.asn, local_asn: v.local_asn, remote_asn: v.remote_asn }
+for l in l3vpn_v4_prefix filter l.base_attrs.ext_community_list like "%100:100%" return l//.base_attrs.ext_community_list +//for l in l3vpn_v4 SEARCH l.base_attrs.ext_community_list == "rt=100:100" filter l.base_attrs.local_pref != null return l//for d in l3vpn_v4 filter d.nexthop == "10.0.0.9" return d._key//filter l.nexthop == "10.0.0.9" return l
+//for l in ls_node filter l.igp_router_id == "0000.0000.0021" return l._id +//for l in unicast_prefix_v4 filter l.prefix =="10.10.21.0" return l._id
+//for l in ls_node for u in unicast_prefix_v4 filter u._key == "10.10.3.0_24_10.0.0.3" filter l.igp_router_id == "0000.0000.0003" INSERT { _from: l._id, _to: u._id, _key: "10.10.3.0_24_10.0.0.3" } INTO lsv4_edge
+//for l in lsv4_edge filter l._key == "10.10.3.0_24_10.0.0.3" return l
+//for l in lsv4_edge filter l._key == "10.10.3.0_24_10.0.0.3" UPDATE l with { prefix: "10.10.3.0", prefix_len: 24, nexthop: "10.0.0.3", labels: 24031 } in lsv4_edge
+//FOR v, e, p IN 1..16 OUTBOUND 'ls_node/2_0_0_0000.0000.0019' lsv4_edge OPTIONS {uniqueVertices: "path", bfs: true} FILTER v._id == 'unicast_prefix_v4/10.10.21.0_24_10.0.0.21' RETURN p.edges[*].remote_igp_id//._to
+//for l in ls_srv6_sid filter l.igp_router_id == "0000.0000.0018" for m in ls_srv6_sid filter m.igp_router_id == "0000.0000.0017" for n in ls_srv6_sid filter n.igp_router_id == "0000.0000.0016" for o in ls_srv6_sid filter o.igp_router_id == "0000.0000.0021" return [l.srv6_sid, m.srv6_sid, n.srv6_sid, o.srv6_sid]
+//for l in ls_node insert l in ls_node_meta options { ignoreErrors: true }
+//for l in ls_node filter l.igp_router_id == "0000.0000.0001" return l
+//for l in ls_prefix filter l.prefix_attr_tlvs.ls_prefix_sid != null return l
+//for l in RT_L3VPNV4 return l
+//for l in lsv4_edge return l
+//for l in lsv4_edge filter l.protocol_id == 7 return l
+//for l in lsv4_edge filter l._to like "%0009%" return l._key
+//for l in lsv4_edge UPDATE l with { link_latency: 10 } in lsv4_edge
+//for l in lsv4_edge filter l._key =="10.71.4.0_23_10.72.0.1" UPDATE l with { link_latency: 10 } in lsv4_edge
+//for l in lsv4_edge filter l._key == "13400517" UPDATE l with { link_latency: 5 } in lsv4_edge
+//for l in lsv4_edge filter l._key == "2_0_0_0_0000.0000.0018_10.1.1.48_0000.0000.0022_10.1.1.49" UPDATE l with { link_latency: 90 } in lsv4_edge
+//for l in lsv4_edge filter l._key == "2_0_0_0_0000.0000.0017_10.1.1.45_0000.0000.0016_10.1.1.44" UPDATE l with { link_latency: 90 } in lsv4_edge
+//for l in lsv4_edge filter l._key == "2_0_0_0_0000.0000.0020_10.1.1.7_0000.0000.0009_10.1.1.6" UPDATE l with { link_latency: 5 } in lsv4_edge
+//for l in lsv4_edge filter l._key like "%0019%" return { key: l._key, latency: l.link_latency }
+//for l in lsv4_edge return { key: l._key, latency: l.link_latency }
+//for v, e in outbound shortest_path 'ls_node/2_0_0_0000.0000.0019' TO 'unicast_prefix_v4/10.71.2.0_24_10.71.0.1' lsv4_edge OPTIONS {weightAttribute: 'link_latency' } filter e.mt_id != 2 return { node: v._key, link: e._key, latency: e.link_latency }
+//for l in lsv4_edge filter l._from == "ls_prefix/2_0_0_0_0_10.0.0.7_32_0000.0000.0007" return l +//for l in l3vpn_v4_prefix_edge return l._from +//for l in ls_srv6_sid_edge return l +//for l in ls_prefix return l +//for l in LSNode_Edge return l +//FOR d IN peer filter d.remote_bgp_id == "10.0.0.71" filter d.remote_ip == "10.71.0.1" return d +//for l in ls_node_edge return l +//for l in ls_node_edge return l//filter l.protocol_id == 7 return l//l.link_latency == 50 return l._key +//for l in L3Underlay_Edge return l
+//FOR n in LSPrefix FILTER n.prefix == "10.0.0.6" RETURN n.prefix_attr_tlvs.ls_prefix_sid[*].prefix_sid
+//for p in unicast_prefix_v4 filter p._key == "10.71.8.0_22_10.71.0.1" return p
+//for l in epe_link return { key: l._key, latency: l.link_latency }
+//FOR p in epe_link FILTER p._key == "7_0_0_100000_10.0.0.7_10.71.1.0_10.0.0.71_10.71.1.1" UPDATE p with { link_latency: 60 } in epe_link
+//FOR p in epe_link UPDATE p with { link_latency: 20 } in epe_link
+//for l in UnicastPrefixV4 + // filter l.peer_ip == "10.2.2.3" + //return { UnicastPrefixV4: l, + // LSLink: (for s in LSLink + // filter s.remote_link_ip == "10.2.2.3" + // return s) + // }
+//for u in UnicastPrefixV4 for l in LSLink filter u.peer_ip == l.remote_link_ip filter u.peer_ip == "10.71.1.1" return {u: u._id, l: l.remote_link_ip}
+//FOR d IN peer filter d.remote_ip == "10.71.0.1" FOR l in ls_link filter d.remote_ip == l.remote_link_ip return d
+//for l in LSNode_Edge return l//filter l._from == "Peer/10.0.0.72_10.72.0.1" return l
+//FOR d IN Peer filter d.remote_ip == "10.71.1.1" FOR l in LSLink filter d.remote_ip == l.remote_link_ip return { d, l }
+//for l in UnicastPrefixV4 //filter l.peer_ip == "10.71.1.1" return l +//for s in LSLink filter l.peer_ip == s.remote_link_ip +//return {l, s}
+//for l in UnicastPrefixV4 filter l._key == "10.0.0.35_32_10.2.2.3" return l
+//FOR d IN UnicastPrefixV4 FOR l in LSLink filter d.peer_ip == l.remote_link_ip filter d.peer_ip == "10.72.0.1" return d._key
+//for d in LSLink for l in UnicastPrefixV4 filter l.prefix == "10.0.0.35" filter d.remote_link_ip == l.peer_ip return d._key
+//for l in LSLink filter l.protocol_id ==7 return l
+//FOR d IN LSNode filter d.router_id == "10.0.0.7" filter d.domain_id == 0 return d
+//RETURN LENGTH(FOR v IN OUTBOUND SHORTEST_PATH 'LSNode/2_0_0_0000.0000.0017' TO 'UnicastPrefixV4/10.71.2.0_24_10.71.0.1' LSNode_Edge Return v)
+//FOR v, e, p IN 1..6 OUTBOUND 'ls_node/2_0_0_0000.0000.0019' lsv4_edge FILTER v._id == 'unicast_prefix_v4/10.10.21.0_24_10.0.0.21' RETURN CONCAT_SEPARATOR(" -> ", [p.vertices[]._key, p.edges[].epe_peer])
+//FOR v, e, p IN 1..10 ANY "ls_node/2_0_0_0000.0000.0019" lsv4_edge + //FILTER v._id == "ls_node/2_0_0_0000.0000.0009" + // FILTER v._id == "unicast_prefix_v4/10.71.2.0_24_10.71.0.1" + //FILTER e.mt_id_tlv.mt_id == null + //RETURN CONCAT_SEPARATOR(" -> ", [p.vertices[]._key, p.vertices[].router_id, p.edges[*]._key])
+//for u in unicast_prefix_v4 return u._key +//for v, e in outbound shortest_path 'ls_node/2_0_0_0000.0000.0017' TO 'unicast_prefix_v4/10.71.2.0_24_10.71.0.1' ls_node_edge return [v._key, e._key]
+//for v, e in outbound shortest_path 'ls_node/2_0_0_0000.0000.0017' TO 'unicast_prefix_v4/10.71.2.0_24_10.71.0.1' lsv4_edge return [v._key, e._key]
+//for v, e in outbound 'ls_node/2_0_0_0000.0000.0002' GRAPH ls_node return [v._key, e._key]
+//for d in ls_link filter d.mt_id_tlv.mt_id != 2 return d._key
+//FOR p in LSNode_Edge filter p._key == "2_0_0_0_0000.0000.0004_10.1.1.21_0000.0000.0003_10.1.1.20" UPDATE p with { link_latency: 20 } in LSNode_Edge
+//for l in LSNode_Edge return l //filter l._key == "2_0_0_0_0000.0000.0004_10.1.1.65_0000.0000.0007_10.1.1.64" return l
+//for v, e in outbound shortest_path 'LSNode/2_0_0_0000.0000.0017' TO 'UnicastPrefixV4/10.71.2.0_24_10.71.0.1' LSNode_Edge filter e.mt_id != 2 return e
+//for v, e in outbound shortest_path 'ls_node/2_0_0_0000.0000.0017' TO 'unicast_prefix_v4/10.71.2.0_24_10.71.0.1' ls_node_edge filter e.mt_id != 2 return {node: v._key, link: e._key, latency: e.link_latency, asn: v.asn, local_asn: v.local_asn, remote_asn: v.remote_asn }
+//for v, e in outbound shortest_path 'ls_node/2_0_0_0000.0000.0017' TO 'unicast_prefix_v4/10.71.2.0_24_10.71.0.1' ls_node_edge OPTIONS {weightAttribute: 'link_latency' } filter e.mt_id != 2 return { node: v._key, link: e._key, latency: e.link_latency }
+//for l in ls_link filter l.protocol_id == 7 && l.peer_asn == 100000 && l.remote_link_ip == "10.73.0.1" return { epe_sid: l.peer_node_sid.prefix_sid }
+//for l in ls_link filter l.protocol_id == 7 && l.peer_asn == 100000 && l.remote_link_ip == "10.73.0.1" return { epe_sid: l.peer_node_sid.sid } +//for l in ls_link filter l.protocol_id == 7 return l.peer_node_sid.sid//&& l.remote_link_ip == "10.73.0.1" return l +//for l in ls_link filter l._key == "7_0_0_46489_10.0.0.43_10.73.0.0_10.0.0.73_10.73.0.1" return l +//for l in ls_link filter l.protocol_id == 7 return [l._key, l.remote_link_ip, l.peer_node_sid.sid]
+//for l in lsv4_edge return [l._key, l.link_latency] +//FOR p in lsv4_edge filter p._key == "2_0_0_0_0000.0000.0004_10.1.1.65_0000.0000.0007_10.1.1.64" UPDATE p with { link_latency: 50 } in lsv4_edge
+//for v, e in outbound shortest_path 'ls_node/2_0_0_0000.0000.0017' TO 'unicast_prefix_v4/10.71.2.0_24_10.71.0.1' lsv4_edge filter e.mt_id != 2 return {node: v._key, link: e._key, latency: e.link_latency, asn: v.asn, local_asn: v.local_asn, remote_asn: v.remote_asn }
+//for l in l3vpn_v4_prefix return l.base_attrs.ext_community_list +//for l in l3vpn_v4 SEARCH l.base_attrs.ext_community_list == "rt=100:100" filter l.base_attrs.local_pref != null return l//for d in l3vpn_v4 filter d.nexthop == "10.0.0.9" return d._key//filter l.nexthop == "10.0.0.9" return l
+//for l in ls_node filter l.igp_router_id == "0000.0000.0021" return l._id +//for l in unicast_prefix_v4 filter l.prefix =="10.10.21.0" return l._id
+//for l in ls_node for u in unicast_prefix_v4 filter u._key == "10.10.3.0_24_10.0.0.3" filter l.igp_router_id == "0000.0000.0003" INSERT { _from: l._id, _to: u._id, _key: "10.10.3.0_24_10.0.0.3" } INTO lsv4_edge
+//for l in lsv4_edge filter l._key == "10.10.3.0_24_10.0.0.3" return l
+//for l in lsv4_edge filter l._key == "10.10.3.0_24_10.0.0.3" UPDATE l with { prefix: "10.10.3.0", prefix_len: 24, nexthop: "10.0.0.3", labels: 24031 } in lsv4_edge
+FOR v, e, p IN 1..16 OUTBOUND 'ls_node/2_0_0_0000.0000.0019' lsv4_edge + OPTIONS {uniqueVertices: "path", bfs: true} + FILTER v._id == 'unicast_prefix_v4/10.10.21.0_24_10.0.0.21' + FILTER v. + RETURN p.edges[]._to //CONCAT_SEPARATOR(" -> ", [p.vertices[]._key, p.edges[*].epe_peer])
+//for l in ipv4_edge return l._to +//for l in lsv4_edge return l +//for l in lsv4_edge return l filter l.protocol_id == 7 filter l.local_link_ip LIKE "%:%" return l +//for l in lsv4_edge filter l.protocol_id == 7 return l._key +//for l in lsv4_edge filter l._key == "2_0_0_0_0000.0000.0010_0.0.0.20_0000.0000.0014_0.0.0.18" return l
+//for l in lsv4_edge filter l.prefix like "128.107.20.0" return { To: l._to, latency: l.link_latency }
+//for l in lsv4_edge filter l.protocol_id == 2 or l.origin_as == 11404 return l
+//for l in unicast_prefix_v4 COLLECT WITH COUNT INTO length RETURN { v4: length } +//for l in unicast_prefix_v4 filter l.nexthop =="198.62.154.19" COLLECT WITH COUNT INTO length RETURN {v4: length}
+//for l in lsv4_edge filter l.prefix == "128.107.20.0" return l//update l with { link_latency: 25 } in lsv4_edge
+//for l in lsv4_edge COLLECT WITH COUNT INTO length RETURN length
+//for l in lsv4_edge filter l.prefix LIKE "128.107.0%" return l
+//for l in ls_link filter l.protocol_id == 7 return l
+//for l in ls_node_edge return l
+//FOR p in lsv4_edge filter p.protocol_id == 7 UPDATE p with { link_latency: 10 } in lsv4_edge +//FOR p in lsv4_edge filter p._key == "7_0_0_65000_10.0.0.14_198.62.154.18_10.0.0.15_198.62.154.19" UPDATE p with { link_latency: 25 } in lsv4_edge
+//for l in lsv4_edge return [l._key, l.link_latency] +//FOR p in lsv4_edge filter p._key == "2_0_0_0_0000.0000.0010_10.1.1.0_0000.0000.0014_10.1.1.1" UPDATE p with { link_latency: 50 } in lsv4_edge
+//for v, e in outbound shortest_path "ls_node/2_0_0_0000.0000.0008" TO "unicast_prefix_v4/128.107.20.0_23_198.62.154.19" lsv4_edge OPTIONS { weightAttribute: 'link_latency' } filter e.mt_id != 2 return { node: v._key, link: e._key, latency: e.link_latency, asn: v.asn, local_asn: v.local_asn, remote_asn: v.remote_asn, adj_sid: e.peer_node_sid.sid }
+//for v, e in outbound shortest_path "ls_node/2_0_0_0000.0000.0008" TO LIKE("unicast_prefix_v4/128.107.20.0_23_198.62.154.%") lsv4_edge OPTIONS { weightAttribute: 'link_latency' } filter e.mt_id != 2 return { node: v._key, link: e._key, latency: e.link_latency, asn: v.asn, local_asn: v.local_asn, remote_asn: v.remote_asn, adj_sid: e.peer_node_sid.sid }
+//for v, e in outbound shortest_path "ls_node/2_0_0_0000.0000.0008" TO "unicast_prefix_v4/103.107.187.0_24_198.62.154.1" lsv4_edge return {vertex: v._key, edge: e._key }
+//for l in ls_node filter l._key == "10.0.0.1_198.62.154.1"
+//for p in peer filter p._key == "10.0.0.1_198.62.154.1" return p
//for l in ls_node filter l._key == "2_0_0_0000.0000.0010" return l.router_id
+//for l in ls_prefix filter l.prefix == "10.0.0.12" filter l.protocol_id == 2 RETURN l.prefix_attr_tlvs.ls_prefix_sid[0].prefix_sid
+//for n in ls_node filter n._key == "2_0_0_0000.0000.0012" RETURN { prefix: n.router_id, srgb_start: n.ls_sr_capabilities.sr_capability_subtlv[*].sid }
+//for l in ls_node_edge return l
+//for l in lsv4_edge return l
+//for l in lsv4_edge filter l.origin_as == 11404 return l
+//for l in lsv4_edge filter l.protocol_id == 2 or l.origin_as == 11404 return l
+//for l in lsv4_edge filter l.prefix LIKE "128.107.0%" return l
+//for l in ls_link filter l.protocol_id == 7 return l
+//for l in ls_node_edge return l._key
+//FOR p in lsv4_edge UPDATE p with { link_latency: 10 } in lsv4_edge
+//for l in ls_node_edge return l//filter l.protocol_id == 7 return l//l.link_latency == 50 return l._key +//for l in lsv4_edge return l +//for l in l3vpn_v4_prefix_edge return l._from +//for l in ls_srv6_sid_edge return l +//for l in ls_prefix return l +//for l in LSNode_Edge return l +//FOR d IN peer return d
+//for l in L3Underlay_Edge return l
+//FOR n in LSPrefix FILTER n.prefix == "10.0.0.6" RETURN n.prefix_attr_tlvs.ls_prefix_sid[*].prefix_sid
+//for l in LSLink filter l.protocol_id == 7 return l +//for p in UnicastPrefixV4 filter p.peer_ip == "10.71.0.1" return p
+//for l in epe_link return { key: l._key, latency: l.link_latency }
+//FOR p in epe_link FILTER p._key == "7_0_0_100000_10.0.0.7_10.71.1.0_10.0.0.71_10.71.1.1" UPDATE p with { link_latency: 60 } in epe_link
+//FOR p in epe_link UPDATE p with { link_latency: 20 } in epe_link
+//for l in UnicastPrefixV4 + // filter l.peer_ip == "10.2.2.3" + //return { UnicastPrefixV4: l, + // LSLink: (for s in LSLink + // filter s.remote_link_ip == "10.2.2.3" + // return s) + // }
+//for u in UnicastPrefixV4 for l in LSLink filter u.peer_ip == l.remote_link_ip filter u.peer_ip == "10.71.1.1" return {u: u._id, l: l.remote_link_ip}
+//FOR d IN peer filter d.remote_ip == "10.71.0.1" FOR l in ls_link filter d.remote_ip == l.remote_link_ip return d
+//for l in LSNode_Edge return l//filter l._from == "Peer/10.0.0.72_10.72.0.1" return l
+//FOR d IN Peer filter d.remote_ip == "10.71.1.1" FOR l in LSLink filter d.remote_ip == l.remote_link_ip return { d, l }
+//for l in UnicastPrefixV4 //filter l.peer_ip == "10.71.1.1" return l +//for s in LSLink filter l.peer_ip == s.remote_link_ip +//return {l, s}
+//for l in UnicastPrefixV4 filter l._key == "10.0.0.35_32_10.2.2.3" return l
+//FOR d IN UnicastPrefixV4 FOR l in LSLink filter d.peer_ip == l.remote_link_ip filter d.peer_ip == "10.72.0.1" return d._key
+//for d in LSLink for l in UnicastPrefixV4 filter l.prefix == "10.0.0.35" filter d.remote_link_ip == l.peer_ip return d._key
+//for l in LSLink filter l.protocol_id ==7 return l
+//FOR d IN LSNode filter d.router_id == "10.0.0.7" filter d.domain_id == 0 return d
+//RETURN LENGTH(FOR v IN OUTBOUND SHORTEST_PATH 'LSNode/2_0_0_0000.0000.0017' TO 'UnicastPrefixV4/10.71.2.0_24_10.71.0.1' LSNode_Edge Return v)
+//FOR v, e, p IN 4..5 ANY 'LSNode/2_0_0_0000.0000.0001' LSNode_Edge FILTER v._id == 'UnicastPrefixV4/72.72.1.0_24_10.71.0.1' RETURN CONCAT_SEPARATOR(" -> ", [p.vertices[]._key, p.edges[].epe_peer])
+//FOR v, e, p IN 1..3 ANY "LSNode/2_0_0_0000.0000.0004" LSNode_Edge +// FILTER v._id == "LSNode/2_0_0_0000.0000.0002" +// FILTER e.mt_id_tlv.mt_id == null +// RETURN CONCAT_SEPARATOR(" -> ", [p.vertices[]._key, p.vertices[].router_id, p.edges[*]._key])
+//for u in unicast_prefix_v4 return u._key +//for v, e in outbound shortest_path 'ls_node/2_0_0_0000.0000.0017' TO 'unicast_prefix_v4/10.71.2.0_24_10.71.0.1' ls_node_edge return [v._key, e._key]
+//for v, e in outbound shortest_path 'ls_node/2_0_0_0000.0000.0017' TO 'unicast_prefix_v4/10.71.2.0_24_10.71.0.1' lsv4_edge return [v._key, e._key]
+//for v, e in outbound 'ls_node/2_0_0_0000.0000.0002' GRAPH ls_node return [v._key, e._key]
+//for d in ls_link filter d.mt_id_tlv.mt_id != 2 return d._key
+//FOR p in LSNode_Edge filter p._key == "2_0_0_0_0000.0000.0004_10.1.1.21_0000.0000.0003_10.1.1.20" UPDATE p with { link_latency: 20 } in LSNode_Edge
+//for l in LSNode_Edge return l //filter l._key == "2_0_0_0_0000.0000.0004_10.1.1.65_0000.0000.0007_10.1.1.64" return l
+//for v, e in outbound shortest_path 'LSNode/2_0_0_0000.0000.0017' TO 'UnicastPrefixV4/10.71.2.0_24_10.71.0.1' LSNode_Edge filter e.mt_id != 2 return e
+//for v, e in outbound shortest_path 'ls_node/2_0_0_0000.0000.0017' TO 'unicast_prefix_v4/10.71.2.0_24_10.71.0.1' ls_node_edge filter e.mt_id != 2 return {node: v._key, link: e._key, latency: e.link_latency, asn: v.asn, local_asn: v.local_asn, remote_asn: v.remote_asn }
+//for v, e in outbound shortest_path 'ls_node/2_0_0_0000.0000.0017' TO 'unicast_prefix_v4/10.71.2.0_24_10.71.0.1' ls_node_edge OPTIONS {weightAttribute: 'link_latency' } filter e.mt_id != 2 return { node: v._key, link: e._key, latency: e.link_latency }
+//for l in ls_link filter l.protocol_id == 7 && l.peer_asn == 100000 && l.remote_link_ip == "10.73.0.1" return { epe_sid: l.peer_node_sid.prefix_sid }
+//for l in ls_link filter l.protocol_id == 7 && l.peer_asn == 100000 && l.remote_link_ip == "10.73.0.1" return { epe_sid: l.peer_node_sid.sid } +//for l in ls_link filter l.protocol_id == 7 return l.peer_node_sid.sid//&& l.remote_link_ip == "10.73.0.1" return l +//for l in ls_link filter l._key == "7_0_0_46489_10.0.0.43_10.73.0.0_10.0.0.73_10.73.0.1" return l +//for l in ls_link filter l.protocol_id == 7 return [l._key, l.remote_link_ip, l.peer_node_sid.sid]
+//FOR p in lsv4_edge UPDATE p with { link_latency: 10 } in lsv4_edge +//for l in lsv4_edge return [l._key, l.link_latency] +//FOR p in lsv4_edge filter p._key == "2_0_0_0_0000.0000.0004_10.1.1.65_0000.0000.0007_10.1.1.64" UPDATE p with { link_latency: 50 } in lsv4_edge
+//for v, e in outbound shortest_path 'ls_node/2_0_0_0000.0000.0017' TO 'unicast_prefix_v4/10.71.2.0_24_10.71.0.1' lsv4_edge filter e.mt_id != 2 return {node: v._key, link: e._key, latency: e.link_latency, asn: v.asn, local_asn: v.local_asn, remote_asn: v.remote_asn }
+//for v, e in outbound shortest_path 'ls_node/2_0_0_0000.0000.0017' TO 'unicast_prefix_v4/10.71.2.0_24_10.71.0.1' lsv4_edge OPTIONS {weightAttribute: 'link_latency' } filter e.mt_id != 2 return { node: v._key, link: e._key, latency: e.link_latency }
+//for l in l3vpn_v4_prefix return l.base_attrs.ext_community_list +for l in l3vpn_v4 SEARCH l.base_attrs.ext_community_list == "rt=100:100" filter l.base_attrs.local_pref != null return l//for d in l3vpn_v4 filter d.nexthop == "10.0.0.9" return d._key//filter l.nexthop == "10.0.0.9" return l
+//for l in topology_nodes_Edge return l
+//for l in LSNode_Edge filter l.link_latency == 50 return l._key
+//for l in L3Underlay_Edge return l
+//FOR n in LSPrefix FILTER n.prefix == "10.0.0.6" RETURN n.prefix_attr_tlvs.ls_prefix_sid[*].prefix_sid
+//for l in LSLink filter l.protocol_id == 7 return l +//for p in UnicastPrefixV4 filter p.peer_ip == "10.71.0.1" return p
+//for l in EPELink return { key: l._key, latency: l.link_latency }
+//FOR p in EPELink FILTER p._key == "7_0_0_100000_10.0.0.7_10.71.1.0_10.0.0.71_10.71.1.1" UPDATE p with { link_latency: 20 } in EPELink
+//for l in UnicastPrefixV4 + // filter l.peer_ip == "10.2.2.3" + //return { UnicastPrefixV4: l, + // LSLink: (for s in LSLink + // filter s.remote_link_ip == "10.2.2.3" + // return s) + // }
+//for u in UnicastPrefixV4 for l in LSLink filter u.peer_ip == l.remote_link_ip filter u.peer_ip == "10.71.1.1" return {u: u._id, l: l.remote_link_ip}
+//for l in LSNode_Edge return l//filter l._from == "Peer/10.0.0.72_10.72.0.1" return l
+//FOR d IN Peer filter d.remote_ip == "10.71.1.1" FOR l in LSLink filter d.remote_ip == l.remote_link_ip return { d, l }
+//for l in UnicastPrefixV4 //filter l.peer_ip == "10.71.1.1" return l +//for s in LSLink filter l.peer_ip == s.remote_link_ip +//return {l, s}
+//for l in UnicastPrefixV4 filter l._key == "10.0.0.35_32_10.2.2.3" return l
+//FOR d IN UnicastPrefixV4 FOR l in LSLink filter d.peer_ip == l.remote_link_ip filter d.peer_ip == "10.72.0.1" return d._key
+//for d in LSLink for l in UnicastPrefixV4 filter l.prefix == "10.0.0.35" filter d.remote_link_ip == l.peer_ip return d._key
+//for l in LSLink filter l.protocol_id ==7 return l
+//FOR d IN LSNode filter d.router_id == "10.0.0.7" filter d.domain_id == 0 return d
+//RETURN LENGTH(FOR v IN OUTBOUND SHORTEST_PATH 'LSNode/2_0_0_0000.0000.0017' TO 'UnicastPrefixV4/10.71.2.0_24_10.71.0.1' LSNode_Edge Return v)
+//FOR v, e, p IN 4..5 ANY 'LSNode/2_0_0_0000.0000.0001' LSNode_Edge FILTER v._id == 'UnicastPrefixV4/72.72.1.0_24_10.71.0.1' RETURN CONCAT_SEPARATOR(" -> ", [p.vertices[]._key, p.edges[].epe_peer])
+//FOR v, e, p IN 1..3 ANY "LSNode/2_0_0_0000.0000.0004" LSNode_Edge +// FILTER v._id == "LSNode/2_0_0_0000.0000.0002" +// FILTER e.mt_id_tlv.mt_id == null +// RETURN CONCAT_SEPARATOR(" -> ", [p.vertices[]._key, p.vertices[].router_id, p.edges[*]._key])
+//for v, e in outbound shortest_path 'LSNode/2_0_0_0000.0000.0017' TO 'UnicastPrefixV4/10.71.2.0_24_10.71.0.1' LSNode_Edge return [v._key, e._key]
+for v, e in outbound 'LSNode/2_0_0_0000.0000.0017' GRAPH Peer return [v._key, e._key]
+//FOR p in LSNode_Edge filter p._key == "2_0_0_0_0000.0000.0004_10.1.1.21_0000.0000.0003_10.1.1.20" UPDATE p with { link_latency: 20 } in LSNode_Edge
+//for l in LSNode_Edge return l //filter l._key == "2_0_0_0_0000.0000.0004_10.1.1.65_0000.0000.0007_10.1.1.64" return l
+//for v, e in outbound shortest_path 'LSNode/2_0_0_0000.0000.0017' TO 'UnicastPrefixV4/10.71.2.0_24_10.71.0.1' LSNode_Edge filter e.mt_id != 2 return e
+//for v, e in outbound shortest_path 'LSNode/2_0_0_0000.0000.0017' TO 'UnicastPrefixV4/10.71.2.0_24_10.71.0.1' LSNode_Edge filter e.mt_id != 2 return {node: v._key, link: e._key, latency: e.link_latency, asn: v.asn, local_asn: v.local_asn, remote_asn: v.remote_asn }
+//for v, e in outbound shortest_path 'LSNode/2_0_0_0000.0000.0017' TO 'UnicastPrefixV4/10.71.2.0_24_10.71.0.1' LSNode_Edge OPTIONS {weightAttribute: 'link_latency' } filter e.mt_id != 2 return { node: v._key, link: e._key, latency: e.link_latency }
+//FOR p IN OUTBOUND K_SHORTEST_PATHS 'LSNode/2_0_0_0000.0000.0017' TO 'UnicastPrefixV4/10.71.2.0_24_10.71.0.1' + //LSNode_Edge + // LIMIT 4 + //RETURN { + // nodes: p.vertices[]._key, + //latencies: p.edges[].link_latency, + //totalLatency: SUM(p.edges[*].link_latency) + //}
+//for l in topology_nodes_Edge return l
+//for l in LSNode_Edge return l
+//for l in LSNode return l
+//for l in UnicastPrefixV4 return l //filter l.router_ip == "10.71.1.0" return l
+//for l in L3Underlay_Edge return l
+//FOR n in LSPrefix FILTER n.prefix == "10.0.0.6" RETURN n.prefix_attr_tlvs.ls_prefix_sid[*].prefix_sid
+//for l in LSLink filter l.protocol_id == 7 return l +//for p in UnicastPrefixV4 filter p.peer_ip == "10.71.0.1" return p
+//for l in EPELink return { key: l._key, latency: l.link_latency }
+//FOR p in EPELink FILTER p._key == "7_0_0_100000_10.0.0.7_10.71.1.0_10.0.0.71_10.71.1.1" UPDATE p with { link_latency: 20 } in EPELink
+//for l in UnicastPrefixV4 + // filter l.peer_ip == "10.2.2.3" + //return { UnicastPrefixV4: l, + // LSLink: (for s in LSLink + // filter s.remote_link_ip == "10.2.2.3" + // return s) + // }
+//for u in UnicastPrefixV4 for l in LSLink filter u.peer_ip == l.remote_link_ip filter u.peer_ip == "10.71.1.1" return {u: u._id, l: l.remote_link_ip}
+//for l in LSNode_Edge return l//filter l._from == "Peer/10.0.0.72_10.72.0.1" return l
+//FOR d IN Peer filter d.remote_ip == "10.71.1.1" FOR l in LSLink filter d.remote_ip == l.remote_link_ip return { d, l }
+FOR d IN UnicastPrefixV4 FOR l in LSLink filter d.peer_ip == l.remote_link_ip filter d.peer_ip == "10.72.0.1" return d._key
+Queries +for e in L3VPN_Topology filter e.RD == "100:100" return e
+for e in L3VPN_Topology filter e.RD == "101:101" and e.RouterID == e.SrcIP return e
+FOR L3VPN_Topology IN L3VPN_Topology + RETURN L3VPN_Topology
+FOR LSLink IN LSLink + RETURN LSLink
+RETURN LENGTH( +FOR v IN OUTBOUND +SHORTEST_PATH 'LSNode/2_0_0_0000.0000.0007' TO 'LSNode/2_0_0_0000.0000.0019' LSNode_Edge + Return v +)
+Clear a collection: +FOR u IN EPEExternalPrefix + REMOVE u IN EPEExternalPrefix
+RETURN LENGTH( +FOR v IN OUTBOUND +SHORTEST_PATH 'LSNode/172.31.101.1' TO 'LSNode/172.31.101.6' LS_Topology + Return v +)
+Wow +FOR prefix in LSPrefix +FILTER prefix.mt_id_tlv.mt_id == 2 +FILTER LENGTH(prefix.srv6_locator) +SORT prefix.prefix, prefix.igp_router_id, prefix.protocol_id +RETURN { proto: prefix.protocol_id, router: prefix.igp_router_id, loc: prefix.srv6_locator, attrs: prefix.prefix_attr_flags, prefix: CONCAT(prefix.prefix, "/", prefix.prefix_len)}
+FOR v, e, p IN 1..6 OUTBOUND "LSNode/172.31.101.1" LS_Topology + FILTER v._id == "LSNode/172.31.101.6" + RETURN { "RouterID": p.vertices[].RouterID, "PrefixSID": p.edges[].RemotePrefixSID, "AdjSID": p.edges[].AdjacencySID, "Util": p.edges[].Out_Octets }
+FOR v, e, p IN 3..3 OUTBOUND "LSNode/172.31.101.1" LS_Topology + FILTER v._id == "LSNode/172.31.101.6" + RETURN CONCAT_SEPARATOR(" -> ", p.vertices[*].RouterID)
+FOR v, e, p IN 1..6 OUTBOUND "LSNode/172.31.101.1" LS_Topology + FILTER v._id == "LSNode/172.31.101.6" + RETURN { "RouterID": p.vertices[].RouterID, "PrefixSID": p.edges[].RemotePrefixSID, "Via": e.ToInterfaceIP, "Tx_bytes": e.Out_Octets }
+FOR v, e IN OUTBOUND SHORTEST_PATH 'LSNode/172.31.101.1' TO 'LSNode/172.31.101.6' LS_Topology + OPTIONS {weightAttribute: 'PercentUtilOutbound'} + RETURN {v, e}
+FOR v, e, p IN 3..3 OUTBOUND "LSNode/172.31.101.1" LS_Topology + FILTER v._id == "LSNode/172.31.101.6" + RETURN { "RouterID": p.vertices[].RouterID, "Via": p.edges[].ToInterfaceIP }
+Steering queries:
+// Full Topology +//for d in LSNode_Edge filter d._key == "2_0_0_0_0000.0000.0018_10.1.1.2_0000.0000.0020_10.1.1.3" return d +//for d in LSNode_Edge filter d._key == "2_0_0_0_0000.0000.0020_10.1.1.3_0000.0000.0018_10.1.1.2" return d +//for d in LSNode_Edge return d
+//for d in LSPrefix_Edge return d +//for d in LSLink return [d._key, d.igp_router_id] +//for d in Node return d +//FOR d IN LSLink filter d.igp_router_id == null filter d.domain_id == 0 filter d.protocol_id == 7 return d +//for d in UnicastPrefixV6 filter d.prefix == "2001:19d0:600::" return d +//for d in UnicastPrefixV4 filter d.prefix == "1.0.4.0" return d +//for d in UnicastPrefixV6 filter d.prefix == "2001:420:ffff::116" return d
+//FOR d IN LSLink filter d.protocol_id != 7 return d._key
+//for d in LSPrefix filter d.prefix == "2001:420:ffff:1013::2" return d
+Hop Count +//RETURN LENGTH (FOR v IN ANY SHORTEST_PATH "LSNode/2_0_0_0000.0000.0007" TO "LSNode/2_0_0_0000.0000.0019" LSNode_Edge RETURN v)
+// All Paths +//FOR v, e, p IN 5..5 ANY "Node/10.2.1.0" LSNode_Edge FILTER v._id == "Node/198.62.154.19" RETURN CONCAT_SEPARATOR(" -> ", [p.vertices[]._key, p.vertices[].router_id])
+//FOR v, e, p IN 4..4 ANY "LSNode/2_0_0_0000.0000.0007" LSNode_Edge FILTER e.mt_id_tlv != null FILTER v._id == "LSNode/2_0_0_0000.0000.0019" RETURN CONCAT_SEPARATOR(" -> ", [p.vertices[]._key, p.vertices[].router_id, p.edges[*]._key])
+//FOR v, e, p IN 1..3 ANY "LSNode/2_0_0_0000.0000.0007" LSNode_Edge + //FILTER v._id == "LSNode/2_0_0_0000.0000.0019" + // FILTER e.mt_id_tlv.mt_id == null + //RETURN CONCAT_SEPARATOR(" -> ", [p.vertices[]._key, p.vertices[].router_id, p.edges[*]._key])
+//FOR v, e, p IN 1..3 ANY "LSNode/2_0_0_0000.0000.0007" LSNode_Edge +// FILTER v._id == "LSNode/2_0_0_0000.0000.0019" +// FILTER p.edges[].mtid ALL == 2 +// RETURN { vertices: p.vertices[]._key, edges: p.edges[]._key, mtid: p.edges[].mtid }
+FOR p in LSPrefix + filter p.igp_router_id == "0000.0000.0009" and p.prefix_metric == null + return [p._key, p.igp_router_id, p.prefix, p.ls_prefix_sid]
+// Prefix SIDs +//FOR d in LSPrefix filter d.igp_router_id == "0000.0000.0003" filter d.prefix == "10.0.0.3" return [d.ls_prefix_sid]
+//FOR d in LSPrefix filter d.igp_router_id == "0000.0000.0018" filter d.prefix == "10.0.0.12" return [d.ls_prefix_sid]
+//FOR d IN LSLink filter d.protocol_id == 7 RETURN d +//FOR d in Node filter d.remote_bgp_id == "10.0.0.15" filter d.remote_ip == "198.62.154.17" return d
+//for l in LSv4_Topology return l
+//RETURN LENGTH( +//FOR v IN OUTBOUND +//SHORTEST_PATH 'LSNode/0000.0000.0007' to 'LSNode/0000.0000.0020' LSv4_Topology +// Return v +// )
+//for e in LSv4_Topology filter e._key == "0000.0000.0022_0.0.0.0_6_0000.0000.0003_0.0.0.0_11" +//return e
+//for l in LSSRv6SID return l
+for p in EPEPrefix filter p.Prefix == "152.89.60.0" + return p
+//for n in LSNode filter n.igp_router_id == "0000.0000.0008" and n.protocol_id == 2 +// return n
+//for l in LSNode_Edge return l
+//for l in LSNode return l._key
+//for l in LSNode return l
+//for l in LSSRv6SID_Edge return l
+//for l in LSPrefix_Edge return l
+//for l in LSLink filter l._key == "7_0_0_64032_10.0.0.32_10.0.32.1_10.0.0.1_10.0.32.0" return l
+for l in LSLink filter l.protocol_id == 7 return l
+//for l in lldp_nodes_Edge return l
+//for l in L3VPNV4_Prefix filter l._key == "10.0.0.7:1_172.16.7.0_32" return l
+//for l in LSPrefix filter l.prefix == "10.0.0.7" return l.prefix_attr_tlvs.ls_prefix_sid
+//for l in LSNode filter l.router_id == "10.0.0.7" return l.ls_sr_capabilities
+//for u in UnicastPrefixV4 filter u.nexthop == "10.73.1.1" return u._key
+//for u in UnicastPrefixV4 filter u.nexthop == "10.73.0.1" return {prefix: u.prefix, length: u.prefix_len }
+//for l in LSLink filter l.protocol_id == 7 && l.area_id == "46489" return { key: l._key, local_link_ip: l.local_link_ip, epe_sid: l.peer_node_sid.prefix_sid }
+old
+Graph traversal +* lowest latency + * list the lowest cost path(s) + * is one of these paths lowest latency? + * if so, use prefix-sid + * if not, use prefix-sid of connecting node on lowest-latency path (ie, node on lowest latency path with lowest cost to destination +* least utilized + * source SEA, dest NYC + * is least utilized also one of the lowest cost paths? + * yes: use prefix-sid of connecting node on least-utilized path + dest prefix-sid + * no: use prefix-sid of connecting node with lowest cost to dest and on L-U-path + dest prefix-sid
+multiple databases +collections are equivalent to sql tables
+Queries +See what interface = what label: +for v in LinkEdgesV4 +filter v.Label == "24005" +return v +Shortest latency: +RETURN FLATTEN( + FOR v,e IN OUTBOUND SHORTEST_PATH 'Routers/10.1.1.0' TO 'Prefixes/10.11.0.0_24' + GRAPH "topology" + OPTIONS {weightAttribute: 'Latency', defaultWeight: 60} + RETURN [e.Label, v.Label] +) +Shortest latency: +FOR v,e IN OUTBOUND SHORTEST_PATH 'Routers/10.1.1.1' TO 'Prefixes/10.11.0.0_24' GRAPH 'topology' OPTIONS {weightAttribute: "Latency", defaultWeight: 1000} return e.Label +Get all prefix edges: +for r in PrefixEdges +filter r.Latency != null +and r._to == "Prefixes/10.11.0.0_24" +return r
+Lots of example queries
+//for l in LSv4_Topology return l
+//RETURN LENGTH( +//FOR v IN OUTBOUND +//SHORTEST_PATH 'LSNode/2_0__0000.0000.0004' to 'LSNode/2_0__0000.0000.0020' LSv4_Topology +// Return v +// )
+//for e in LSv4_Topology filter e._key == "0000.0000.0022_0.0.0.0_6_0000.0000.0003_0.0.0.0_11" +//return e
+//for l in LSSRv6SID return l
+//for p in UnicastPrefix filter p.prefix == "1.0.4.0" +// return p
+//for n in LSNode filter n.igp_router_id == "0000.0000.0008" and n.protocol_id == 2 +// return n
+//for l in LSv6_Topology return l +//for l in LSNode return l.srgb_start +//for l in L3VPNPrefix return l +//for l in LSLinkEdge return l._key +//for l in LSLinkEdge filter l.local_igp_id =="0000.0000.0008" return l
+//FOR l in LSNode filter l._key == "2_0_0000.0000.0007" return l.srgb_start
+//FOR n in LSNode RETURN n.name
+//FOR l in LSv4_Topology return l._key +//FOR l in LSLinkV1 filter l._key not in @lsv4_topology_keys return l._key +//FOR l in LSv4_Topology filter l._key == "2_0_0000.0000.0022_10.1.1.4_0_0000.0000.0019_10.1.1.5_0" RETURN { key: l._key }
+//FOR l in LSPrefixV1 filter l.igp_router_id == "0000.0000.0022" and l.prefix_sid != null for z in l.prefix_sid filter z.algo == 0 return {"prefix": l.prefix, "length": l.length, "flags": z.flags, "sid_index": z.prefix_sid}
+//FOR l in LSPrefixV1 filter l.igp_router_id == "0000.0000.0022" return {"prefix": l.prefix, "length": l.length, "flags": l.flags, "sid_index": l.prefix_sid}
+FOR l in LSv4_Topology filter l._key == "2_0_0000.0000.0022_0.0.0.0_6_0000.0000.0003_0.0.0.0_11" return {"local_igp_id": l.local_igp_id}
+//for l in LSv4_Topology return l
+//RETURN LENGTH( +//FOR v IN OUTBOUND +//SHORTEST_PATH 'LSNodeDemo/0000.0000.0006' TO 'LSNodeDemo/0000.0000.0019' LSv4_Topology +// Return v +//)
+//FOR v, e, p IN 3..3 OUTBOUND "LSNodeDemo/0000.0000.0006" LSv4_Topology +// FILTER v._id == "LSNodeDemo/0000.0000.0019" +// RETURN CONCAT_SEPARATOR(" -> ", p.vertices[*].router_id)
+FOR v, e IN OUTBOUND SHORTEST_PATH 'LSNodeDemo/0000.0000.0007' TO 'LSNodeDemo/0000.0000.0019' LSv4_Topology + OPTIONS {weightAttribute: 'Percent_Util_Outbound'} + FILTER e != null + RETURN [v.router_id, e.remote_prefix_sid]
+//FOR p IN OUTBOUND K_SHORTEST_PATHS 'LSNodeDemo/0000.0000.0007' TO 'LSNodeDemo/0000.0000.0019' LSv4_Topology +//LIMIT 3 +//RETURN p
+//FOR v, e IN OUTBOUND +//SHORTEST_PATH 'LSNodeDemo/0000.0000.0006' TO 'LSNodeDemo/0000.0000.0019' LSv4_Topology +// FILTER v.router_id != "10.0.0.9" +// Return [v.router_id, e.remote_prefix_sid]
+//FOR v,e IN +// OUTBOUND SHORTEST_PATH "LSNodeDemo/0000.0000.0006" TO "LSNodeDemo/0000.0000.0019" GRAPH "LSv4" +// RETURN [v.router_id, e.remote_prefix_sid]
+//FOR path IN +// OUTBOUND K_SHORTEST_PATHS "LSNodeDemo/0000.0000.0006" TO "LSNodeDemo/0000.0000.0019" GRAPH "LSv4" +//LIMIT 1 +//RETURN path
+ + + + + + + + + + + + + +{"use strict";/*!
+ * escape-html
+ * Copyright(c) 2012-2013 TJ Holowaychuk
+ * Copyright(c) 2015 Andreas Lubbe
+ * Copyright(c) 2015 Tiancheng "Timothy" Gu
+ * MIT Licensed
+ */var Va=/["'&<>]/;qn.exports=za;function za(e){var t=""+e,r=Va.exec(t);if(!r)return t;var o,n="",i=0,s=0;for(i=r.index;i