From 4607641006cf467296a3656a2dc9071118432b15 Mon Sep 17 00:00:00 2001
From: Armingol
Date: Thu, 1 Feb 2024 09:03:27 +0100
Subject: [PATCH 01/20] First version ALTO integration
---
deploy/all.sh | 5 +-
deploy/expose_dashboard.sh | 15 +
deploy/tfs.sh | 4 +-
expose_ingress_grpc.sh | 2 +-
index.html | 11 +
index.html.1 | 11 +
index.html.2 | 11 +
install_requirements.sh | 2 +-
launch.sh | 4 +
manifests/altoservice.yaml | 127 ++
manifests/nginx_ingress_http.yaml | 7 +
manifests/servicemonitors.yaml | 29 +
my_deploy.sh | 5 +-
run_tests_docker.sh | 2 +-
scripts/show_logs_alto.sh | 27 +
src/alto/00-alto-light.yaml | 33 +
src/alto/Dockerfile | 34 +
src/alto/alto_light.tar | Bin 0 -> 185929216 bytes
src/alto/docker-compose.yaml | 8 +
src/alto/service/README.md | 153 ++
src/alto/service/__init__.py | 0
src/alto/service/alto_core.py | 454 ++++
src/alto/service/api/web/alto_http.py | 129 ++
src/alto/service/api/web/alto_https.py | 0
src/alto/service/api/web/certs/README.md | 0
src/alto/service/costmap | 1 +
src/alto/service/desuso/api-alto/README.md | 7 +
src/alto/service/desuso/api-alto/app/db.py | 26 +
src/alto/service/desuso/api-alto/app/ext.py | 5 +
.../api-alto/app/maps/api_v0_1/__init__.py | 0
.../api-alto/app/maps/api_v0_1/resources.py | 0
.../api-alto/app/maps/api_v0_1/schemas.py | 0
.../desuso/api-alto/app/maps/models.py | 9 +
src/alto/service/desuso/api_pybatfish.py | 27 +
src/alto/service/desuso/exponsure.py.bk | 128 ++
src/alto/service/desuso/launcher_batfish | 25 +
src/alto/service/desuso/topology_general.py | 338 +++
.../desuso/topology_maps_generator.py.bk | 466 ++++
.../desuso/topology_maps_generator_isis.py | 315 +++
src/alto/service/desuso/zexhibitor_sucio | 104 +
.../emergencia/topology_maps_generator.py | 466 ++++
src/alto/service/exponsure.py | 130 ++
src/alto/service/ietf2_prueba.json | 1952 +++++++++++++++++
src/alto/service/ietf_prueba.json | 1952 +++++++++++++++++
src/alto/service/index.html | 12 +
src/alto/service/kafka_ale/LICENSE | 332 +++
src/alto/service/kafka_ale/NOTICE | 856 ++++++++
src/alto/service/kafka_ale/__int__.py | 2 +
.../kafka_ale/bin/connect-distributed.sh | 45 +
.../kafka_ale/bin/connect-mirror-maker.sh | 45 +
.../kafka_ale/bin/connect-standalone.sh | 0
src/alto/service/kafka_ale/bin/kafka-acls.sh | 17 +
.../bin/kafka-broker-api-versions.sh | 17 +
.../service/kafka_ale/bin/kafka-cluster.sh | 17 +
.../service/kafka_ale/bin/kafka-configs.sh | 17 +
.../kafka_ale/bin/kafka-console-consumer.sh | 21 +
.../kafka_ale/bin/kafka-console-producer.sh | 20 +
.../kafka_ale/bin/kafka-consumer-groups.sh | 17 +
.../kafka_ale/bin/kafka-consumer-perf-test.sh | 20 +
.../kafka_ale/bin/kafka-delegation-tokens.sh | 17 +
.../kafka_ale/bin/kafka-delete-records.sh | 17 +
.../service/kafka_ale/bin/kafka-dump-log.sh | 17 +
.../service/kafka_ale/bin/kafka-features.sh | 17 +
.../kafka_ale/bin/kafka-get-offsets.sh | 17 +
.../kafka_ale/bin/kafka-leader-election.sh | 17 +
.../service/kafka_ale/bin/kafka-log-dirs.sh | 17 +
.../kafka_ale/bin/kafka-metadata-quorum.sh | 17 +
.../kafka_ale/bin/kafka-metadata-shell.sh | 17 +
.../kafka_ale/bin/kafka-mirror-maker.sh | 17 +
.../kafka_ale/bin/kafka-producer-perf-test.sh | 20 +
.../bin/kafka-reassign-partitions.sh | 17 +
.../bin/kafka-replica-verification.sh | 17 +
.../service/kafka_ale/bin/kafka-run-class.sh | 343 +++
.../kafka_ale/bin/kafka-server-start.sh | 44 +
.../kafka_ale/bin/kafka-server-stop.sh | 35 +
.../service/kafka_ale/bin/kafka-storage.sh | 17 +
.../bin/kafka-streams-application-reset.sh | 21 +
.../service/kafka_ale/bin/kafka-topics.sh | 17 +
.../kafka_ale/bin/kafka-transactions.sh | 17 +
.../bin/kafka-verifiable-consumer.sh | 20 +
.../bin/kafka-verifiable-producer.sh | 20 +
src/alto/service/kafka_ale/bin/trogdor.sh | 50 +
.../bin/windows/connect-distributed.bat | 34 +
.../bin/windows/connect-standalone.bat | 34 +
.../kafka_ale/bin/windows/kafka-acls.bat | 17 +
.../bin/windows/kafka-broker-api-versions.bat | 17 +
.../kafka_ale/bin/windows/kafka-configs.bat | 17 +
.../bin/windows/kafka-console-consumer.bat | 20 +
.../bin/windows/kafka-console-producer.bat | 20 +
.../bin/windows/kafka-consumer-groups.bat | 17 +
.../bin/windows/kafka-consumer-perf-test.bat | 20 +
.../bin/windows/kafka-delegation-tokens.bat | 17 +
.../bin/windows/kafka-delete-records.bat | 17 +
.../kafka_ale/bin/windows/kafka-dump-log.bat | 17 +
.../bin/windows/kafka-get-offsets.bat | 17 +
.../bin/windows/kafka-leader-election.bat | 17 +
.../kafka_ale/bin/windows/kafka-log-dirs.bat | 17 +
.../bin/windows/kafka-metatada-quorum.bat | 17 +
.../bin/windows/kafka-mirror-maker.bat | 17 +
.../bin/windows/kafka-producer-perf-test.bat | 20 +
.../bin/windows/kafka-reassign-partitions.bat | 17 +
.../windows/kafka-replica-verification.bat | 17 +
.../kafka_ale/bin/windows/kafka-run-class.bat | 191 ++
.../bin/windows/kafka-server-start.bat | 38 +
.../bin/windows/kafka-server-stop.bat | 18 +
.../kafka_ale/bin/windows/kafka-storage.bat | 17 +
.../kafka-streams-application-reset.bat | 23 +
.../kafka_ale/bin/windows/kafka-topics.bat | 17 +
.../bin/windows/kafka-transactions.bat | 17 +
.../bin/windows/zookeeper-server-start.bat | 30 +
.../bin/windows/zookeeper-server-stop.bat | 17 +
.../kafka_ale/bin/windows/zookeeper-shell.bat | 22 +
.../bin/zookeeper-security-migration.sh | 17 +
.../kafka_ale/bin/zookeeper-server-start.sh | 44 +
.../kafka_ale/bin/zookeeper-server-stop.sh | 35 +
.../service/kafka_ale/bin/zookeeper-shell.sh | 23 +
.../config/connect-console-sink.properties | 19 +
.../config/connect-console-source.properties | 19 +
.../config/connect-distributed.properties | 89 +
.../config/connect-file-sink.properties | 20 +
.../config/connect-file-source.properties | 20 +
.../kafka_ale/config/connect-log4j.properties | 42 +
.../config/connect-mirror-maker.properties | 59 +
.../config/connect-standalone.properties | 41 +
.../kafka_ale/config/consumer.properties | 26 +
.../service/kafka_ale/config/kraft/README.md | 168 ++
.../kafka_ale/config/kraft/broker.properties | 129 ++
.../config/kraft/controller.properties | 122 ++
.../kafka_ale/config/kraft/server.properties | 132 ++
.../service/kafka_ale/config/log4j.properties | 91 +
.../kafka_ale/config/producer.properties | 46 +
.../kafka_ale/config/server.properties | 138 ++
.../kafka_ale/config/tools-log4j.properties | 21 +
.../service/kafka_ale/config/trogdor.conf | 25 +
.../kafka_ale/config/zookeeper.properties | 24 +
src/alto/service/kafka_ale/kafka_api.py | 78 +
src/alto/service/kafka_ale/launcher | 5 +
.../kafka_ale/libs/activation-1.1.1.jar | Bin 0 -> 69409 bytes
.../libs/aopalliance-repackaged-2.6.1.jar | Bin 0 -> 27006 bytes
.../kafka_ale/libs/argparse4j-0.7.0.jar | Bin 0 -> 90347 bytes
.../libs/audience-annotations-0.5.0.jar | Bin 0 -> 20437 bytes
.../kafka_ale/libs/commons-cli-1.4.jar | Bin 0 -> 53820 bytes
.../kafka_ale/libs/commons-lang3-3.12.0.jar | Bin 0 -> 587402 bytes
.../kafka_ale/libs/commons-lang3-3.8.1.jar | Bin 0 -> 501879 bytes
.../kafka_ale/libs/connect-api-3.3.1.jar | Bin 0 -> 102527 bytes
.../connect-basic-auth-extension-3.3.1.jar | Bin 0 -> 17193 bytes
.../kafka_ale/libs/connect-file-3.3.1.jar | Bin 0 -> 15340 bytes
.../kafka_ale/libs/connect-json-3.3.1.jar | Bin 0 -> 32151 bytes
.../kafka_ale/libs/connect-mirror-3.3.1.jar | Bin 0 -> 93766 bytes
.../libs/connect-mirror-client-3.3.1.jar | Bin 0 -> 25733 bytes
.../kafka_ale/libs/connect-runtime-3.3.1.jar | Bin 0 -> 688252 bytes
.../libs/connect-transforms-3.3.1.jar | Bin 0 -> 105558 bytes
.../service/kafka_ale/libs/hk2-api-2.6.1.jar | Bin 0 -> 200223 bytes
.../kafka_ale/libs/hk2-locator-2.6.1.jar | Bin 0 -> 203358 bytes
.../kafka_ale/libs/hk2-utils-2.6.1.jar | Bin 0 -> 131590 bytes
.../libs/jackson-annotations-2.13.3.jar | Bin 0 -> 75714 bytes
.../kafka_ale/libs/jackson-core-2.13.3.jar | Bin 0 -> 374895 bytes
.../libs/jackson-databind-2.13.3.jar | Bin 0 -> 1536542 bytes
.../libs/jackson-dataformat-csv-2.13.3.jar | Bin 0 -> 105640 bytes
.../libs/jackson-datatype-jdk8-2.13.3.jar | Bin 0 -> 34799 bytes
.../libs/jackson-jaxrs-base-2.13.3.jar | Bin 0 -> 31147 bytes
.../jackson-jaxrs-json-provider-2.13.3.jar | Bin 0 -> 15964 bytes
...jackson-module-jaxb-annotations-2.13.3.jar | Bin 0 -> 36460 bytes
.../libs/jackson-module-scala_2.13-2.13.3.jar | Bin 0 -> 461963 bytes
.../libs/jakarta.activation-api-1.2.2.jar | Bin 0 -> 46613 bytes
.../libs/jakarta.annotation-api-1.3.5.jar | Bin 0 -> 25058 bytes
.../kafka_ale/libs/jakarta.inject-2.6.1.jar | Bin 0 -> 18140 bytes
.../libs/jakarta.validation-api-2.0.2.jar | Bin 0 -> 91930 bytes
.../libs/jakarta.ws.rs-api-2.1.6.jar | Bin 0 -> 140376 bytes
.../libs/jakarta.xml.bind-api-2.3.3.jar | Bin 0 -> 115638 bytes
.../kafka_ale/libs/javassist-3.27.0-GA.jar | Bin 0 -> 782774 bytes
.../libs/javax.servlet-api-3.1.0.jar | Bin 0 -> 95806 bytes
.../kafka_ale/libs/javax.ws.rs-api-2.1.1.jar | Bin 0 -> 126898 bytes
.../service/kafka_ale/libs/jaxb-api-2.3.0.jar | Bin 0 -> 125632 bytes
.../kafka_ale/libs/jersey-client-2.34.jar | Bin 0 -> 259090 bytes
.../kafka_ale/libs/jersey-common-2.34.jar | Bin 0 -> 1185133 bytes
.../libs/jersey-container-servlet-2.34.jar | Bin 0 -> 32387 bytes
.../jersey-container-servlet-core-2.34.jar | Bin 0 -> 73405 bytes
.../kafka_ale/libs/jersey-hk2-2.34.jar | Bin 0 -> 76818 bytes
.../kafka_ale/libs/jersey-server-2.34.jar | Bin 0 -> 946794 bytes
.../libs/jetty-client-9.4.48.v20220622.jar | Bin 0 -> 325897 bytes
.../jetty-continuation-9.4.48.v20220622.jar | Bin 0 -> 25380 bytes
.../libs/jetty-http-9.4.48.v20220622.jar | Bin 0 -> 234754 bytes
.../libs/jetty-io-9.4.48.v20220622.jar | Bin 0 -> 183018 bytes
.../libs/jetty-security-9.4.48.v20220622.jar | Bin 0 -> 118511 bytes
.../libs/jetty-server-9.4.48.v20220622.jar | Bin 0 -> 732200 bytes
.../libs/jetty-servlet-9.4.48.v20220622.jar | Bin 0 -> 146081 bytes
.../libs/jetty-servlets-9.4.48.v20220622.jar | Bin 0 -> 107557 bytes
.../libs/jetty-util-9.4.48.v20220622.jar | Bin 0 -> 582975 bytes
.../libs/jetty-util-ajax-9.4.48.v20220622.jar | Bin 0 -> 66654 bytes
.../service/kafka_ale/libs/jline-3.21.0.jar | Bin 0 -> 994664 bytes
.../kafka_ale/libs/jopt-simple-5.0.4.jar | Bin 0 -> 78146 bytes
.../service/kafka_ale/libs/jose4j-0.7.9.jar | Bin 0 -> 275698 bytes
.../kafka_ale/libs/kafka-clients-3.3.1.jar | Bin 0 -> 5011591 bytes
.../libs/kafka-log4j-appender-3.3.1.jar | Bin 0 -> 9625 bytes
.../kafka_ale/libs/kafka-metadata-3.3.1.jar | Bin 0 -> 548075 bytes
.../kafka_ale/libs/kafka-raft-3.3.1.jar | Bin 0 -> 187707 bytes
.../libs/kafka-server-common-3.3.1.jar | Bin 0 -> 55691 bytes
.../kafka_ale/libs/kafka-shell-3.3.1.jar | Bin 0 -> 78699 bytes
.../kafka_ale/libs/kafka-storage-3.3.1.jar | Bin 0 -> 154383 bytes
.../libs/kafka-storage-api-3.3.1.jar | Bin 0 -> 22668 bytes
.../kafka_ale/libs/kafka-streams-3.3.1.jar | Bin 0 -> 1676283 bytes
.../libs/kafka-streams-examples-3.3.1.jar | Bin 0 -> 41035 bytes
.../libs/kafka-streams-scala_2.13-3.3.1.jar | Bin 0 -> 165088 bytes
.../libs/kafka-streams-test-utils-3.3.1.jar | Bin 0 -> 53320 bytes
.../kafka_ale/libs/kafka-tools-3.3.1.jar | Bin 0 -> 127232 bytes
.../kafka_ale/libs/kafka_2.13-3.3.1.jar | Bin 0 -> 5433232 bytes
.../service/kafka_ale/libs/lz4-java-1.8.0.jar | Bin 0 -> 682804 bytes
.../kafka_ale/libs/maven-artifact-3.8.4.jar | Bin 0 -> 58076 bytes
.../kafka_ale/libs/metrics-core-2.2.0.jar | Bin 0 -> 82123 bytes
.../kafka_ale/libs/metrics-core-4.1.12.1.jar | Bin 0 -> 105355 bytes
.../libs/netty-buffer-4.1.78.Final.jar | Bin 0 -> 303739 bytes
.../libs/netty-codec-4.1.78.Final.jar | Bin 0 -> 337010 bytes
.../libs/netty-common-4.1.78.Final.jar | Bin 0 -> 653138 bytes
.../libs/netty-handler-4.1.78.Final.jar | Bin 0 -> 529976 bytes
.../libs/netty-resolver-4.1.78.Final.jar | Bin 0 -> 37779 bytes
.../libs/netty-transport-4.1.78.Final.jar | Bin 0 -> 481388 bytes
...y-transport-classes-epoll-4.1.78.Final.jar | Bin 0 -> 139611 bytes
...ty-transport-native-epoll-4.1.78.Final.jar | Bin 0 -> 5594 bytes
...nsport-native-unix-common-4.1.78.Final.jar | Bin 0 -> 43215 bytes
.../libs/osgi-resource-locator-1.0.3.jar | Bin 0 -> 19479 bytes
.../service/kafka_ale/libs/paranamer-2.8.jar | Bin 0 -> 34654 bytes
.../kafka_ale/libs/plexus-utils-3.3.0.jar | Bin 0 -> 263253 bytes
.../kafka_ale/libs/reflections-0.9.12.jar | Bin 0 -> 105848 bytes
.../kafka_ale/libs/reload4j-1.2.19.jar | Bin 0 -> 334103 bytes
.../kafka_ale/libs/rocksdbjni-6.29.4.1.jar | Bin 0 -> 53333619 bytes
.../scala-collection-compat_2.13-2.6.0.jar | Bin 0 -> 5596 bytes
.../libs/scala-java8-compat_2.13-1.0.2.jar | Bin 0 -> 640088 bytes
.../kafka_ale/libs/scala-library-2.13.8.jar | Bin 0 -> 6003601 bytes
.../libs/scala-logging_2.13-3.9.4.jar | Bin 0 -> 58852 bytes
.../kafka_ale/libs/scala-reflect-2.13.8.jar | Bin 0 -> 3772083 bytes
.../kafka_ale/libs/slf4j-api-1.7.36.jar | Bin 0 -> 41125 bytes
.../kafka_ale/libs/slf4j-reload4j-1.7.36.jar | Bin 0 -> 9824 bytes
.../kafka_ale/libs/snappy-java-1.1.8.4.jar | Bin 0 -> 1970939 bytes
.../libs/swagger-annotations-2.2.0.jar | Bin 0 -> 42096 bytes
.../service/kafka_ale/libs/trogdor-3.3.1.jar | Bin 0 -> 341649 bytes
.../kafka_ale/libs/zookeeper-3.6.3.jar | Bin 0 -> 1254153 bytes
.../kafka_ale/libs/zookeeper-jute-3.6.3.jar | Bin 0 -> 250399 bytes
.../kafka_ale/libs/zstd-jni-1.5.2-1.jar | Bin 0 -> 5885445 bytes
.../service/kafka_ale/licenses/CDDL+GPL-1.1 | 760 +++++++
src/alto/service/kafka_ale/licenses/DWTFYWTPL | 14 +
.../service/kafka_ale/licenses/argparse-MIT | 23 +
.../service/kafka_ale/licenses/classgraph-MIT | 21 +
.../licenses/eclipse-distribution-license-1.0 | 13 +
.../licenses/eclipse-public-license-2.0 | 87 +
.../kafka_ale/licenses/jline-BSD-3-clause | 35 +
.../kafka_ale/licenses/jopt-simple-MIT | 24 +
.../kafka_ale/licenses/paranamer-BSD-3-clause | 29 +
src/alto/service/kafka_ale/licenses/slf4j-MIT | 24 +
.../kafka_ale/licenses/zstd-jni-BSD-2-clause | 26 +
.../site-docs/kafka_2.13-3.3.1-site-docs.tgz | Bin 0 -> 3697773 bytes
src/alto/service/lanzadera.py | 27 +
src/alto/service/modulos/alto_module.py | 247 +++
src/alto/service/modulos/ietf2_prueba.json | 1952 +++++++++++++++++
src/alto/service/modulos/topology_bgp.py | 294 +++
src/alto/service/modulos/topology_ietf.py | 119 +
.../modulos/topology_maps_generator.py | 466 ++++
src/alto/service/pruebas/costmap | 1 +
src/alto/service/realizar_git.sh | 6 +
src/alto/service/requirements.txt | 4 +
src/alto/service/simulador_ietf.py | 46 +
src/alto/service/topology_maps_bgp.py | 466 ++++
src/alto/service/yang_alto.py | 67 +
src/common/Constants.py | 5 +
update_tfs_runtime_env_vars.sh | 2 +-
265 files changed, 16230 insertions(+), 7 deletions(-)
create mode 100644 index.html
create mode 100644 index.html.1
create mode 100644 index.html.2
create mode 100755 launch.sh
create mode 100644 manifests/altoservice.yaml
create mode 100755 scripts/show_logs_alto.sh
create mode 100644 src/alto/00-alto-light.yaml
create mode 100644 src/alto/Dockerfile
create mode 100644 src/alto/alto_light.tar
create mode 100644 src/alto/docker-compose.yaml
create mode 100644 src/alto/service/README.md
create mode 100644 src/alto/service/__init__.py
create mode 100644 src/alto/service/alto_core.py
create mode 100644 src/alto/service/api/web/alto_http.py
create mode 100644 src/alto/service/api/web/alto_https.py
create mode 100644 src/alto/service/api/web/certs/README.md
create mode 100644 src/alto/service/costmap
create mode 100644 src/alto/service/desuso/api-alto/README.md
create mode 100644 src/alto/service/desuso/api-alto/app/db.py
create mode 100644 src/alto/service/desuso/api-alto/app/ext.py
create mode 100644 src/alto/service/desuso/api-alto/app/maps/api_v0_1/__init__.py
create mode 100644 src/alto/service/desuso/api-alto/app/maps/api_v0_1/resources.py
create mode 100644 src/alto/service/desuso/api-alto/app/maps/api_v0_1/schemas.py
create mode 100644 src/alto/service/desuso/api-alto/app/maps/models.py
create mode 100644 src/alto/service/desuso/api_pybatfish.py
create mode 100644 src/alto/service/desuso/exponsure.py.bk
create mode 100644 src/alto/service/desuso/launcher_batfish
create mode 100644 src/alto/service/desuso/topology_general.py
create mode 100644 src/alto/service/desuso/topology_maps_generator.py.bk
create mode 100644 src/alto/service/desuso/topology_maps_generator_isis.py
create mode 100644 src/alto/service/desuso/zexhibitor_sucio
create mode 100644 src/alto/service/emergencia/topology_maps_generator.py
create mode 100644 src/alto/service/exponsure.py
create mode 100644 src/alto/service/ietf2_prueba.json
create mode 100644 src/alto/service/ietf_prueba.json
create mode 100644 src/alto/service/index.html
create mode 100644 src/alto/service/kafka_ale/LICENSE
create mode 100644 src/alto/service/kafka_ale/NOTICE
create mode 100644 src/alto/service/kafka_ale/__int__.py
create mode 100644 src/alto/service/kafka_ale/bin/connect-distributed.sh
create mode 100644 src/alto/service/kafka_ale/bin/connect-mirror-maker.sh
create mode 100644 src/alto/service/kafka_ale/bin/connect-standalone.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-acls.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-broker-api-versions.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-cluster.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-configs.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-console-consumer.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-console-producer.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-consumer-groups.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-consumer-perf-test.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-delegation-tokens.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-delete-records.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-dump-log.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-features.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-get-offsets.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-leader-election.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-log-dirs.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-metadata-quorum.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-metadata-shell.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-mirror-maker.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-producer-perf-test.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-reassign-partitions.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-replica-verification.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-run-class.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-server-start.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-server-stop.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-storage.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-streams-application-reset.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-topics.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-transactions.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-verifiable-consumer.sh
create mode 100644 src/alto/service/kafka_ale/bin/kafka-verifiable-producer.sh
create mode 100644 src/alto/service/kafka_ale/bin/trogdor.sh
create mode 100644 src/alto/service/kafka_ale/bin/windows/connect-distributed.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/connect-standalone.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-acls.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-broker-api-versions.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-configs.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-console-consumer.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-console-producer.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-consumer-groups.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-consumer-perf-test.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-delegation-tokens.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-delete-records.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-dump-log.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-get-offsets.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-leader-election.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-log-dirs.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-metatada-quorum.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-mirror-maker.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-producer-perf-test.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-reassign-partitions.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-replica-verification.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-run-class.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-server-start.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-server-stop.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-storage.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-streams-application-reset.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-topics.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/kafka-transactions.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/zookeeper-server-start.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/zookeeper-server-stop.bat
create mode 100644 src/alto/service/kafka_ale/bin/windows/zookeeper-shell.bat
create mode 100644 src/alto/service/kafka_ale/bin/zookeeper-security-migration.sh
create mode 100644 src/alto/service/kafka_ale/bin/zookeeper-server-start.sh
create mode 100644 src/alto/service/kafka_ale/bin/zookeeper-server-stop.sh
create mode 100644 src/alto/service/kafka_ale/bin/zookeeper-shell.sh
create mode 100644 src/alto/service/kafka_ale/config/connect-console-sink.properties
create mode 100644 src/alto/service/kafka_ale/config/connect-console-source.properties
create mode 100644 src/alto/service/kafka_ale/config/connect-distributed.properties
create mode 100644 src/alto/service/kafka_ale/config/connect-file-sink.properties
create mode 100644 src/alto/service/kafka_ale/config/connect-file-source.properties
create mode 100644 src/alto/service/kafka_ale/config/connect-log4j.properties
create mode 100644 src/alto/service/kafka_ale/config/connect-mirror-maker.properties
create mode 100644 src/alto/service/kafka_ale/config/connect-standalone.properties
create mode 100644 src/alto/service/kafka_ale/config/consumer.properties
create mode 100644 src/alto/service/kafka_ale/config/kraft/README.md
create mode 100644 src/alto/service/kafka_ale/config/kraft/broker.properties
create mode 100644 src/alto/service/kafka_ale/config/kraft/controller.properties
create mode 100644 src/alto/service/kafka_ale/config/kraft/server.properties
create mode 100644 src/alto/service/kafka_ale/config/log4j.properties
create mode 100644 src/alto/service/kafka_ale/config/producer.properties
create mode 100644 src/alto/service/kafka_ale/config/server.properties
create mode 100644 src/alto/service/kafka_ale/config/tools-log4j.properties
create mode 100644 src/alto/service/kafka_ale/config/trogdor.conf
create mode 100644 src/alto/service/kafka_ale/config/zookeeper.properties
create mode 100644 src/alto/service/kafka_ale/kafka_api.py
create mode 100644 src/alto/service/kafka_ale/launcher
create mode 100644 src/alto/service/kafka_ale/libs/activation-1.1.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/aopalliance-repackaged-2.6.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/argparse4j-0.7.0.jar
create mode 100644 src/alto/service/kafka_ale/libs/audience-annotations-0.5.0.jar
create mode 100644 src/alto/service/kafka_ale/libs/commons-cli-1.4.jar
create mode 100644 src/alto/service/kafka_ale/libs/commons-lang3-3.12.0.jar
create mode 100644 src/alto/service/kafka_ale/libs/commons-lang3-3.8.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/connect-api-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/connect-basic-auth-extension-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/connect-file-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/connect-json-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/connect-mirror-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/connect-mirror-client-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/connect-runtime-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/connect-transforms-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/hk2-api-2.6.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/hk2-locator-2.6.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/hk2-utils-2.6.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/jackson-annotations-2.13.3.jar
create mode 100644 src/alto/service/kafka_ale/libs/jackson-core-2.13.3.jar
create mode 100644 src/alto/service/kafka_ale/libs/jackson-databind-2.13.3.jar
create mode 100644 src/alto/service/kafka_ale/libs/jackson-dataformat-csv-2.13.3.jar
create mode 100644 src/alto/service/kafka_ale/libs/jackson-datatype-jdk8-2.13.3.jar
create mode 100644 src/alto/service/kafka_ale/libs/jackson-jaxrs-base-2.13.3.jar
create mode 100644 src/alto/service/kafka_ale/libs/jackson-jaxrs-json-provider-2.13.3.jar
create mode 100644 src/alto/service/kafka_ale/libs/jackson-module-jaxb-annotations-2.13.3.jar
create mode 100644 src/alto/service/kafka_ale/libs/jackson-module-scala_2.13-2.13.3.jar
create mode 100644 src/alto/service/kafka_ale/libs/jakarta.activation-api-1.2.2.jar
create mode 100644 src/alto/service/kafka_ale/libs/jakarta.annotation-api-1.3.5.jar
create mode 100644 src/alto/service/kafka_ale/libs/jakarta.inject-2.6.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/jakarta.validation-api-2.0.2.jar
create mode 100644 src/alto/service/kafka_ale/libs/jakarta.ws.rs-api-2.1.6.jar
create mode 100644 src/alto/service/kafka_ale/libs/jakarta.xml.bind-api-2.3.3.jar
create mode 100644 src/alto/service/kafka_ale/libs/javassist-3.27.0-GA.jar
create mode 100644 src/alto/service/kafka_ale/libs/javax.servlet-api-3.1.0.jar
create mode 100644 src/alto/service/kafka_ale/libs/javax.ws.rs-api-2.1.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/jaxb-api-2.3.0.jar
create mode 100644 src/alto/service/kafka_ale/libs/jersey-client-2.34.jar
create mode 100644 src/alto/service/kafka_ale/libs/jersey-common-2.34.jar
create mode 100644 src/alto/service/kafka_ale/libs/jersey-container-servlet-2.34.jar
create mode 100644 src/alto/service/kafka_ale/libs/jersey-container-servlet-core-2.34.jar
create mode 100644 src/alto/service/kafka_ale/libs/jersey-hk2-2.34.jar
create mode 100644 src/alto/service/kafka_ale/libs/jersey-server-2.34.jar
create mode 100644 src/alto/service/kafka_ale/libs/jetty-client-9.4.48.v20220622.jar
create mode 100644 src/alto/service/kafka_ale/libs/jetty-continuation-9.4.48.v20220622.jar
create mode 100644 src/alto/service/kafka_ale/libs/jetty-http-9.4.48.v20220622.jar
create mode 100644 src/alto/service/kafka_ale/libs/jetty-io-9.4.48.v20220622.jar
create mode 100644 src/alto/service/kafka_ale/libs/jetty-security-9.4.48.v20220622.jar
create mode 100644 src/alto/service/kafka_ale/libs/jetty-server-9.4.48.v20220622.jar
create mode 100644 src/alto/service/kafka_ale/libs/jetty-servlet-9.4.48.v20220622.jar
create mode 100644 src/alto/service/kafka_ale/libs/jetty-servlets-9.4.48.v20220622.jar
create mode 100644 src/alto/service/kafka_ale/libs/jetty-util-9.4.48.v20220622.jar
create mode 100644 src/alto/service/kafka_ale/libs/jetty-util-ajax-9.4.48.v20220622.jar
create mode 100644 src/alto/service/kafka_ale/libs/jline-3.21.0.jar
create mode 100644 src/alto/service/kafka_ale/libs/jopt-simple-5.0.4.jar
create mode 100644 src/alto/service/kafka_ale/libs/jose4j-0.7.9.jar
create mode 100644 src/alto/service/kafka_ale/libs/kafka-clients-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/kafka-log4j-appender-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/kafka-metadata-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/kafka-raft-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/kafka-server-common-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/kafka-shell-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/kafka-storage-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/kafka-storage-api-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/kafka-streams-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/kafka-streams-examples-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/kafka-streams-scala_2.13-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/kafka-streams-test-utils-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/kafka-tools-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/kafka_2.13-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/lz4-java-1.8.0.jar
create mode 100644 src/alto/service/kafka_ale/libs/maven-artifact-3.8.4.jar
create mode 100644 src/alto/service/kafka_ale/libs/metrics-core-2.2.0.jar
create mode 100644 src/alto/service/kafka_ale/libs/metrics-core-4.1.12.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/netty-buffer-4.1.78.Final.jar
create mode 100644 src/alto/service/kafka_ale/libs/netty-codec-4.1.78.Final.jar
create mode 100644 src/alto/service/kafka_ale/libs/netty-common-4.1.78.Final.jar
create mode 100644 src/alto/service/kafka_ale/libs/netty-handler-4.1.78.Final.jar
create mode 100644 src/alto/service/kafka_ale/libs/netty-resolver-4.1.78.Final.jar
create mode 100644 src/alto/service/kafka_ale/libs/netty-transport-4.1.78.Final.jar
create mode 100644 src/alto/service/kafka_ale/libs/netty-transport-classes-epoll-4.1.78.Final.jar
create mode 100644 src/alto/service/kafka_ale/libs/netty-transport-native-epoll-4.1.78.Final.jar
create mode 100644 src/alto/service/kafka_ale/libs/netty-transport-native-unix-common-4.1.78.Final.jar
create mode 100644 src/alto/service/kafka_ale/libs/osgi-resource-locator-1.0.3.jar
create mode 100644 src/alto/service/kafka_ale/libs/paranamer-2.8.jar
create mode 100644 src/alto/service/kafka_ale/libs/plexus-utils-3.3.0.jar
create mode 100644 src/alto/service/kafka_ale/libs/reflections-0.9.12.jar
create mode 100644 src/alto/service/kafka_ale/libs/reload4j-1.2.19.jar
create mode 100644 src/alto/service/kafka_ale/libs/rocksdbjni-6.29.4.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/scala-collection-compat_2.13-2.6.0.jar
create mode 100644 src/alto/service/kafka_ale/libs/scala-java8-compat_2.13-1.0.2.jar
create mode 100644 src/alto/service/kafka_ale/libs/scala-library-2.13.8.jar
create mode 100644 src/alto/service/kafka_ale/libs/scala-logging_2.13-3.9.4.jar
create mode 100644 src/alto/service/kafka_ale/libs/scala-reflect-2.13.8.jar
create mode 100644 src/alto/service/kafka_ale/libs/slf4j-api-1.7.36.jar
create mode 100644 src/alto/service/kafka_ale/libs/slf4j-reload4j-1.7.36.jar
create mode 100644 src/alto/service/kafka_ale/libs/snappy-java-1.1.8.4.jar
create mode 100644 src/alto/service/kafka_ale/libs/swagger-annotations-2.2.0.jar
create mode 100644 src/alto/service/kafka_ale/libs/trogdor-3.3.1.jar
create mode 100644 src/alto/service/kafka_ale/libs/zookeeper-3.6.3.jar
create mode 100644 src/alto/service/kafka_ale/libs/zookeeper-jute-3.6.3.jar
create mode 100644 src/alto/service/kafka_ale/libs/zstd-jni-1.5.2-1.jar
create mode 100644 src/alto/service/kafka_ale/licenses/CDDL+GPL-1.1
create mode 100644 src/alto/service/kafka_ale/licenses/DWTFYWTPL
create mode 100644 src/alto/service/kafka_ale/licenses/argparse-MIT
create mode 100644 src/alto/service/kafka_ale/licenses/classgraph-MIT
create mode 100644 src/alto/service/kafka_ale/licenses/eclipse-distribution-license-1.0
create mode 100644 src/alto/service/kafka_ale/licenses/eclipse-public-license-2.0
create mode 100644 src/alto/service/kafka_ale/licenses/jline-BSD-3-clause
create mode 100644 src/alto/service/kafka_ale/licenses/jopt-simple-MIT
create mode 100644 src/alto/service/kafka_ale/licenses/paranamer-BSD-3-clause
create mode 100644 src/alto/service/kafka_ale/licenses/slf4j-MIT
create mode 100644 src/alto/service/kafka_ale/licenses/zstd-jni-BSD-2-clause
create mode 100644 src/alto/service/kafka_ale/site-docs/kafka_2.13-3.3.1-site-docs.tgz
create mode 100644 src/alto/service/lanzadera.py
create mode 100644 src/alto/service/modulos/alto_module.py
create mode 100644 src/alto/service/modulos/ietf2_prueba.json
create mode 100644 src/alto/service/modulos/topology_bgp.py
create mode 100644 src/alto/service/modulos/topology_ietf.py
create mode 100644 src/alto/service/modulos/topology_maps_generator.py
create mode 100644 src/alto/service/pruebas/costmap
create mode 100644 src/alto/service/realizar_git.sh
create mode 100644 src/alto/service/requirements.txt
create mode 100644 src/alto/service/simulador_ietf.py
create mode 100644 src/alto/service/topology_maps_bgp.py
create mode 100644 src/alto/service/yang_alto.py
diff --git a/deploy/all.sh b/deploy/all.sh
index 25d69b485..7760d9dcd 100755
--- a/deploy/all.sh
+++ b/deploy/all.sh
@@ -27,7 +27,7 @@ export TFS_REGISTRY_IMAGES=${TFS_REGISTRY_IMAGES:-"http://localhost:32000/tfs/"}
# If not already set, set the list of components, separated by spaces, you want to build images for, and deploy.
# By default, only basic components are deployed
-export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device ztp monitoring pathcomp service slice nbi webui load_generator"}
+export TFS_COMPONENTS=${TFS_COMPONENTS:-"alto context device ztp monitoring pathcomp service slice nbi webui load_generator"}
# If not already set, set the tag you want to use for your images.
export TFS_IMAGE_TAG=${TFS_IMAGE_TAG:-"dev"}
@@ -155,6 +155,9 @@ export PROM_EXT_PORT_HTTP=${PROM_EXT_PORT_HTTP:-"9090"}
# If not already set, set the external port Grafana HTTP Dashboards will be exposed to.
export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"}
+#If not already set, set the external port ALTO will be exposed to.
+export ALTO_EXT_PORT_HTTP=${ALTO_EXT_PORT_HTTP:-"5000"}
+
########################################################################################################################
# Automated steps start here
diff --git a/deploy/expose_dashboard.sh b/deploy/expose_dashboard.sh
index 65f715cab..d42a340ac 100755
--- a/deploy/expose_dashboard.sh
+++ b/deploy/expose_dashboard.sh
@@ -24,6 +24,8 @@ export PROM_EXT_PORT_HTTP=${PROM_EXT_PORT_HTTP:-"9090"}
# If not already set, set the external port Grafana HTTP Dashboards will be exposed to.
export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"}
+# If not already set, set the external port ALTO HTTP Dashboards will be exposed to.
+# export ALTO_EXT_PORT_HTTP=${ALTO_EXT_PORT_HTTP:-"5000"}
########################################################################################################################
# Automated steps start here
@@ -55,6 +57,19 @@ function expose_dashboard() {
PATCH='{"spec": {"template": {"spec": {"containers": ['${CONTAINER}']}}}}'
kubectl patch daemonset nginx-ingress-microk8s-controller --namespace ingress --patch "${PATCH}"
echo
+
+ # echo "ALTO Port Mapping"
+ # echo ">>> Expose ALTO HTTP Mgmt GUI port (5000->${ALTO_EXT_PORT_HTTP})"
+ # ALTO_PORT_HTTP=$(kubectl --namespace ${MONITORING_NAMESPACE} get service alto -o 'jsonpath={.spec.ports[?(@.name=="http")].port}')
+ # PATCH='{"data": {"'${ALTO_EXT_PORT_HTTP}'": "'${MONITORING_NAMESPACE}'/alto:'${ALTO_PORT_HTTP}'"}}'
+ # kubectl patch configmap nginx-ingress-tcp-microk8s-conf --namespace ingress --patch "${PATCH}"
+
+ # PORT_MAP='{"containerPort": '${ALTO_EXT_PORT_HTTP}', "hostPort": '${ALTO_EXT_PORT_HTTP}'}'
+ # CONTAINER='{"name": "nginx-ingress-microk8s", "ports": ['${PORT_MAP}']}'
+ # PATCH='{"spec": {"template": {"spec": {"containers": ['${CONTAINER}']}}}}'
+ # kubectl patch daemonset nginx-ingress-microk8s-controller --namespace ingress --patch "${PATCH}"
+ # echo
+
}
if kubectl get namespace ${MONITORING_NAMESPACE} &> /dev/null; then
diff --git a/deploy/tfs.sh b/deploy/tfs.sh
index 5497ab984..41dcdc2a6 100755
--- a/deploy/tfs.sh
+++ b/deploy/tfs.sh
@@ -27,7 +27,7 @@ export TFS_REGISTRY_IMAGES=${TFS_REGISTRY_IMAGES:-"http://localhost:32000/tfs/"}
# If not already set, set the list of components, separated by spaces, you want to build images for, and deploy.
# By default, only basic components are deployed
-export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device ztp monitoring pathcomp service slice nbi webui load_generator"}
+export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device ztp monitoring pathcomp service slice nbi webui load_generator alto"}
# If not already set, set the tag you want to use for your images.
export TFS_IMAGE_TAG=${TFS_IMAGE_TAG:-"dev"}
@@ -114,6 +114,8 @@ export PROM_EXT_PORT_HTTP=${PROM_EXT_PORT_HTTP:-"9090"}
# If not already set, set the external port Grafana HTTP Dashboards will be exposed to.
export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"}
+# If not already set, set the external port ALTO HTTP Dashboards will be exposed to.
+# export ALTO_EXT_PORT_HTTP=${ALTO_EXT_PORT_HTTP:-"5000"}
########################################################################################################################
# Automated steps start here
diff --git a/expose_ingress_grpc.sh b/expose_ingress_grpc.sh
index 4fec2f219..041023606 100755
--- a/expose_ingress_grpc.sh
+++ b/expose_ingress_grpc.sh
@@ -21,7 +21,7 @@
export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"}
# If not already set, set the list of components you want to build images for, and deploy.
-export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device ztp policy service nbi monitoring dbscanserving opticalattackmitigator opticalcentralizedattackdetector l3_attackmitigator l3_centralizedattackdetector webui"}
+export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device ztp policy service nbi monitoring dbscanserving opticalattackmitigator opticalcentralizedattackdetector l3_attackmitigator l3_centralizedattackdetector webui alto"}
########################################################################################################################
# Automated steps start here
diff --git a/index.html b/index.html
new file mode 100644
index 000000000..c5e102354
--- /dev/null
+++ b/index.html
@@ -0,0 +1,11 @@
+
+ ALTO PoC's API
+ Services expossed:
+
+ - All disjunts paths between A & B: /all/<string:a>/<string:b>
+ - Shortest path between A & B: /best/<string:a>/<string:b>
+ - Costs map: /costmap
+ - PIDs map: /networkmap
+ - Filtered Cost map: /costmap/filter/
+
+
\ No newline at end of file
diff --git a/index.html.1 b/index.html.1
new file mode 100644
index 000000000..c5e102354
--- /dev/null
+++ b/index.html.1
@@ -0,0 +1,11 @@
+
+ ALTO PoC's API
+ Services expossed:
+
+ - All disjunts paths between A & B: /all/<string:a>/<string:b>
+ - Shortest path between A & B: /best/<string:a>/<string:b>
+ - Costs map: /costmap
+ - PIDs map: /networkmap
+ - Filtered Cost map: /costmap/filter/
+
+
\ No newline at end of file
diff --git a/index.html.2 b/index.html.2
new file mode 100644
index 000000000..c5e102354
--- /dev/null
+++ b/index.html.2
@@ -0,0 +1,11 @@
+
+ ALTO PoC's API
+ Services expossed:
+
+ - All disjunts paths between A & B: /all/<string:a>/<string:b>
+ - Shortest path between A & B: /best/<string:a>/<string:b>
+ - Costs map: /costmap
+ - PIDs map: /networkmap
+ - Filtered Cost map: /costmap/filter/
+
+
\ No newline at end of file
diff --git a/install_requirements.sh b/install_requirements.sh
index 74db1cb34..701e03d86 100755
--- a/install_requirements.sh
+++ b/install_requirements.sh
@@ -19,7 +19,7 @@
# ztp & policy : implemented in Java
# dlt : under design
# pathcomp : under design
-ALL_COMPONENTS="context device service nbi monitoring webui interdomain slice"
+ALL_COMPONENTS="context device service nbi monitoring webui interdomain slice alto"
ALL_COMPONENTS="${ALL_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector"
ALL_COMPONENTS="${ALL_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector l3_distributedattackdetector"
TFS_COMPONENTS=${TFS_COMPONENTS:-$ALL_COMPONENTS}
diff --git a/launch.sh b/launch.sh
new file mode 100755
index 000000000..b1a158791
--- /dev/null
+++ b/launch.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+source my_deploy.sh
+./deploy/all.sh
+
diff --git a/manifests/altoservice.yaml b/manifests/altoservice.yaml
new file mode 100644
index 000000000..34f645a94
--- /dev/null
+++ b/manifests/altoservice.yaml
@@ -0,0 +1,127 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: altoservice
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: altoservice
+ template:
+ metadata:
+ labels:
+ app: altoservice
+ spec:
+ containers:
+ - name: altoservice
+ image: localhost:32000/tfs/alto:dev #alto_light:lastets
+ ports:
+ - containerPort: 5000
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: altoserviceforwarding
+spec:
+ selector:
+ app: altoservice
+ type: ClusterIP
+ ports:
+ - protocol: TCP
+ name: "maps"
+ port: 5000
+ targetPort: 5000
+
+
+ # type: LoadBalancer
+
+
+
+# apiVersion: apps/v1
+# kind: Deployment
+# metadata:
+# name: altoservice
+# spec:
+# selector:
+# matchLabels:
+# app: altoservice
+# # replicas: 1
+# template:
+# metadata:
+# labels:
+# app: altoservice
+# spec:
+# terminationGracePeriodSeconds: 5
+# containers:
+# - name: server
+# image: alto_light:latest #localhost:32000/tfs/alto
+# ports:
+# - containerPort: 5000
+# - containerPort: 10050
+# - containerPort: 9192
+# env:
+# - name: LOG_LEVEL
+# value: "INFO"
+# # readinessProbe:
+# # exec:
+# # command: ["/bin/grpc_health_probe", "-addr=:10050"]
+# # livenessProbe:
+# # exec:
+# # command: ["/bin/grpc_health_probe", "-addr=:10050"]
+# resources:
+# requests:
+# cpu: 50m
+# memory: 64Mi
+# limits:
+# cpu: 500m
+# memory: 512Mi
+# ---
+# apiVersion: v1
+# kind: Service
+# metadata:
+# name: altoservice
+# labels:
+# app: altoservice
+# spec:
+# type: ClusterIP
+# selector:
+# app: altoservice
+# ports:
+# - name: http
+# protocol: TCP
+# port: 5000
+# targetPort: 5000
+# - name: grpc
+# protocol: TCP
+# port: 10050
+# targetPort: 10050
+# - name: metrics
+# protocol: TCP
+# port: 9192
+# targetPort: 9192
+
+
+# version: '3.1'
+
+# services:
+# docker_alto:
+# image: docker_alto
+# container_name: docker_alto
+# ports:
+# - "5000:5000"
+# restart: unless-stopped
diff --git a/manifests/nginx_ingress_http.yaml b/manifests/nginx_ingress_http.yaml
index e8e8a80e4..13683d498 100644
--- a/manifests/nginx_ingress_http.yaml
+++ b/manifests/nginx_ingress_http.yaml
@@ -57,3 +57,10 @@ spec:
name: nbiservice
port:
number: 8080
+ - path: /alto(/|$)(.*)
+ pathType: Prefix
+ backend:
+ service:
+ name: altoservice
+ port:
+ number: 5000
diff --git a/manifests/servicemonitors.yaml b/manifests/servicemonitors.yaml
index 1f7f3322d..174ab1636 100644
--- a/manifests/servicemonitors.yaml
+++ b/manifests/servicemonitors.yaml
@@ -475,3 +475,32 @@ spec:
any: false
matchNames:
- tfs # namespace where the app is running
+---
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ namespace: monitoring # namespace where prometheus is running
+ name: tfs-altoservice-metric
+ labels:
+ app: altoservice
+ #release: prometheus
+ #release: prom # name of the release
+ # ( VERY IMPORTANT: You need to know the correct release name by viewing
+ # the servicemonitor of Prometheus itself: Without the correct name,
+ # Prometheus cannot identify the metrics of the Flask app as the target.)
+spec:
+ selector:
+ matchLabels:
+ # Target app service
+ #namespace: tfs
+ app: altoservice # same as above
+ #release: prometheus # same as above
+ endpoints:
+ - port: metrics # named port in target app
+ scheme: http
+ path: /metrics # path to scrape
+ interval: 5s # scrape interval
+ namespaceSelector:
+ any: false
+ matchNames:
+ - tfs # namespace where the app is running
diff --git a/my_deploy.sh b/my_deploy.sh
index a9f3f00e3..3b95ebd4d 100755
--- a/my_deploy.sh
+++ b/my_deploy.sh
@@ -20,7 +20,7 @@
export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/"
# Set the list of components, separated by spaces, you want to build images for, and deploy.
-export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_generator"
+export TFS_COMPONENTS="alto context device pathcomp service slice nbi webui load_generator"
# Uncomment to activate Monitoring
#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring"
@@ -151,3 +151,6 @@ export PROM_EXT_PORT_HTTP="9090"
# Set the external port Grafana HTTP Dashboards will be exposed to.
export GRAF_EXT_PORT_HTTP="3000"
+
+# Set the external port ALTO HTTP Dashboards will be exposed to.
+export ALTO_EXT_PORT_HTTP="5000"
\ No newline at end of file
diff --git a/run_tests_docker.sh b/run_tests_docker.sh
index b7d897d76..4e5f0c2cb 100755
--- a/run_tests_docker.sh
+++ b/run_tests_docker.sh
@@ -24,7 +24,7 @@ REGISTRY_IMAGE=""
#REGISTRY_IMAGE="http://my-container-registry.local/"
# Set the list of components you want to build images for, and deploy.
-COMPONENTS="context device ztp policy service nbi monitoring centralizedattackdetector"
+COMPONENTS="context device ztp policy service nbi monitoring centralizedattackdetector alto"
# Set the tag you want to use for your images.
IMAGE_TAG="tf-dev"
diff --git a/scripts/show_logs_alto.sh b/scripts/show_logs_alto.sh
new file mode 100755
index 000000000..66cc76a88
--- /dev/null
+++ b/scripts/show_logs_alto.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+########################################################################################################################
+# Define your deployment settings here
+########################################################################################################################
+
+# If not already set, set the name of the Kubernetes namespace to deploy to.
+export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"}
+
+########################################################################################################################
+# Automated steps start here
+########################################################################################################################
+
+kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/altoservice -c server
diff --git a/src/alto/00-alto-light.yaml b/src/alto/00-alto-light.yaml
new file mode 100644
index 000000000..69404be12
--- /dev/null
+++ b/src/alto/00-alto-light.yaml
@@ -0,0 +1,33 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: alto-light
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: alto-light
+ template:
+ metadata:
+ labels:
+ app: alto-light
+ spec:
+ containers:
+ - name: alto-light
+ image: docker.io/library/alto_light:latest
+ imagePullPolicy: IfNotPresent
+ ports:
+ - containerPort: 5000
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: alto-light
+spec:
+ selector:
+ app: alto-light
+ ports:
+ - protocol: TCP
+ port: 5000
+ targetPort: 5000
+ type: LoadBalancer
diff --git a/src/alto/Dockerfile b/src/alto/Dockerfile
new file mode 100644
index 000000000..1764e6d61
--- /dev/null
+++ b/src/alto/Dockerfile
@@ -0,0 +1,34 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Utiliza una imagen base con Python instalado
+FROM python:3.7-alpine
+
+# Download the gRPC health probe
+#RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
+# wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \
+# chmod +x /bin/grpc_health_probe
+
+# Copia el código fuente de tu aplicación al contenedor
+COPY /src/alto/service/ /altoservice/
+#COPY service/ /altoservice/
+
+# Establece el directorio de trabajo en /app
+WORKDIR /altoservice
+
+# Instalamos las dependencias
+RUN pip3 install -r requirements.txt
+
+# Ejecuta tu código Python
+CMD [ "python3", "alto_core.py" ]
diff --git a/src/alto/alto_light.tar b/src/alto/alto_light.tar
new file mode 100644
index 0000000000000000000000000000000000000000..414f0d835cdae82a8d8c92d92170a5fe1ee70bd0
GIT binary patch
literal 185929216
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