├── macros └── .gitkeep ├── docs ├── CNAME ├── development │ ├── apps │ │ ├── versions.md │ │ ├── workflows.md │ │ ├── snippets │ │ │ ├── banner.yml │ │ │ └── catalog.yml │ │ ├── scripts │ │ │ ├── index.md │ │ │ ├── state.md │ │ │ └── config.md │ │ ├── project-layout.md │ │ ├── components.md │ │ ├── index.md │ │ └── setup-env.md │ ├── resources │ │ ├── authSecretRef.yaml │ │ ├── registry.yaml │ │ └── catalog.yaml │ ├── terraform │ │ └── providers-all.tf │ ├── ansible │ │ └── index.md │ ├── api │ │ └── client-secret.sh │ ├── custom-registry.md │ └── custom-catalog.md ├── blog │ ├── index.md │ ├── tags.md │ ├── .authors.yml │ ├── subscribe.md │ └── posts │ │ ├── 2024 │ │ └── launch.md │ │ └── 2025 │ │ └── eda-25.4.md ├── index.md ├── stylesheets │ ├── diagrams.css │ ├── animations.css │ ├── steps.css │ ├── nokia-fonts.css │ └── expandable-blocks.css ├── connect │ ├── resources │ │ ├── audit-create.png │ │ ├── install-operator.png │ │ ├── nsx-vcenter-fqdn.png │ │ ├── enter-namespace-operator.png │ │ ├── nutanix-category-example.png │ │ ├── vmware-custom-attribute.png │ │ ├── find-eda-openshift-operator.png │ │ ├── select-operators-operatorhub.png │ │ ├── connect-audit.yaml │ │ ├── openstack-service-account-token.yaml │ │ ├── openshift-service-account-token.yaml │ │ ├── vmware-secret.yaml │ │ ├── cnd-example1.yaml │ │ ├── nutanix-secret.yaml │ │ ├── openstack-helm-values.yaml │ │ ├── openstack-inject-trust-anchor.yaml │ │ ├── nsx-appinstall.yaml │ │ ├── openstack-linux-bond-example.yaml │ │ ├── cnd-example3.yaml │ │ ├── connect-appinstall.yaml │ │ ├── vmware-appinstall.yaml │ │ ├── nutanix-appinstall.yaml │ │ ├── connect-appinstall-delete.yaml │ │ ├── cnd-example2.yaml │ │ ├── cnd-example4.yaml │ │ ├── cnd-example5.yaml │ │ ├── openstack-ovs-dpdk-bond-example.yaml │ │ ├── openstack-controller-sa-crb.yaml │ │ ├── openshift-controller-sa-crb.yaml │ │ ├── openshift-eda-connect-k8s-controller-env-secret.yaml │ │ ├── eda-kubeconfig.yaml │ │ ├── openstack-lldp-playbook.yaml │ │ ├── nutanix-plugin-instance.yaml │ │ ├── eda-connect-k8s-controller-config-cr.yaml │ │ ├── openshift-helm-values.yaml │ │ ├── vmware-plugin-instance.yaml │ │ ├── nsx-plugin-instance.yaml │ │ ├── openstack-neutron-eda-config.yaml │ │ └── openstack-container-prepare-params.yaml │ ├── troubleshooting.md │ ├── audit.md │ ├── cloud-connect-installation.md │ └── kubernetes-plugin-helm-installation.md ├── software-install │ ├── non-production │ │ ├── kind.md │ │ ├── index.md │ │ └── wsl.md │ ├── deploying-eda │ │ ├── setters-reference │ │ │ ├── README.md │ │ │ ├── eda-kpt-playground.md │ │ │ ├── eda-external-packages-kpt-setters.md │ │ │ └── eda-external-packages.md │ │ └── index.md │ ├── resources │ │ ├── prefs-example.mk │ │ └── edaadm-config-example.yaml │ ├── air-gapped │ │ ├── index.md │ │ └── preparing-the-air-gapped-environment.md │ └── preparing-for-installation.md ├── user-guide │ ├── network-topology │ │ └── snippets │ │ │ ├── deleteAll-1.yaml │ │ │ ├── replaceAll-check.yaml │ │ │ ├── vnet-vlan-10.yaml │ │ │ ├── add.yaml │ │ │ ├── delete-1.yaml │ │ │ ├── create.yaml │ │ │ ├── two-nodes-1.yaml │ │ │ ├── replace-1.yaml │ │ │ ├── two-nodes-2.yaml │ │ │ ├── replaceAll-1.yaml │ │ │ └── two-nodes-3.yaml │ ├── ingress │ │ ├── tlsroute.yml │ │ └── gateway.yml │ ├── clab-integration │ │ ├── nodeUser.yaml │ │ ├── nodeProfile.yaml │ │ ├── topoNodes.yaml │ │ ├── topoLink.yaml │ │ └── interface.yaml │ └── try-eda-topo.yaml ├── apps │ ├── notifier │ │ ├── provider_slack.yml │ │ ├── provider_discord.yml │ │ ├── provider_teams.yml │ │ ├── provider_email.yml │ │ ├── install.yml │ │ ├── notifier_alarms.yml │ │ └── notifier_query.yml │ ├── netbox │ │ ├── api-token-secret.yaml │ │ ├── webhook-signature-secret.yaml │ │ ├── example-allocation.yaml │ │ ├── example-instance.yaml │ │ ├── example-allocation-subnet.yaml │ │ ├── install.yml │ │ ├── allocation.yml │ │ ├── instance.yml │ │ └── nb-fabric.yaml │ ├── prometheus-exporter │ │ ├── grouped_metric.yml │ │ ├── prefixed_metric.yml │ │ ├── install.yml │ │ ├── replacement_metric.yml │ │ ├── static_labels_metric.yml │ │ ├── dynamic_labels_metric.yml │ │ └── values_mapping_metric.yml │ ├── interfaces │ │ ├── simple-breakout.yaml │ │ ├── simple-interface.yaml │ │ ├── simple-lag.yaml │ │ ├── simple-interface-storm-control.yaml │ │ └── simple-mh-lag.yaml │ ├── kafka-exporter │ │ ├── install.yml │ │ ├── kafka_producer.yml │ │ └── kafka_clusterproducer.yml │ ├── remote-write │ │ ├── install.yml │ │ ├── destination.yml │ │ └── export.yml │ ├── protocols │ │ ├── bgpgroup.yaml │ │ ├── bgppeer.yaml │ │ ├── defaultbgppeer.yaml │ │ ├── defaultbgpgroup.yaml │ │ ├── defaultaggregateroute.yaml │ │ ├── aggregateroute.yaml │ │ ├── defaultroutereflectorclient.yaml │ │ ├── defaultstaticroute.yaml │ │ ├── routereflector.yaml │ │ ├── routereflectorclient.yaml │ │ ├── defaultroutereflector.yaml │ │ └── staticroute.yaml │ ├── store │ │ ├── install-example.yaml │ │ └── delete-example.yaml │ ├── virtualnetwork.md │ └── remote-write.md ├── javascripts │ └── sh-annotation.js ├── getting-started │ ├── reset.md │ └── virtual-network.md ├── overrides │ ├── .icons │ │ └── nokia │ │ │ └── N-white.svg │ ├── main.html │ └── partials │ │ ├── copyright.html │ │ └── comments.html ├── examples │ ├── my-fabric.yaml │ ├── l2-vnet.yaml │ ├── my-fabric-update-transaction-dryrun.yaml │ ├── my-fabric-update-transaction-prod.yaml │ └── l3-vnet.yaml ├── htmltest.yml ├── digital-twin │ ├── node-shell │ └── node-ssh └── images │ └── icons │ └── eda │ └── topology.svg ├── includes └── abbreviations.md ├── layouts ├── bg.webp └── custom.yml ├── README.md ├── dev └── versioning.md ├── .gitignore ├── my-fabric.yaml ├── hooks └── hooks.py ├── .markdownlint.yml ├── .github └── workflows │ ├── preview-versioned-docs.yml │ ├── deploy-docs.yml │ ├── preview-latest-docs.yml │ └── build-and-deploy.yml └── .gitlab-ci.yml /macros/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/CNAME: -------------------------------------------------------------------------------- 1 | docs.eda.dev -------------------------------------------------------------------------------- /includes/abbreviations.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/development/apps/versions.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/blog/index.md: -------------------------------------------------------------------------------- 1 | # Blog 2 | 3 | -------------------------------------------------------------------------------- /docs/development/apps/workflows.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | template: home.html 3 | title: Home 4 | --- 5 | -------------------------------------------------------------------------------- /layouts/bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nokia-eda/docs/HEAD/layouts/bg.webp -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EDA Documentation 2 | 3 | This is the documentation site for EDA - https://docs.eda.dev 4 | -------------------------------------------------------------------------------- /docs/blog/tags.md: -------------------------------------------------------------------------------- 1 | --- 2 | comments: false 3 | icon: material/tag 4 | --- 5 | # Tags 6 | 7 | -------------------------------------------------------------------------------- /docs/stylesheets/diagrams.css: -------------------------------------------------------------------------------- 1 | div.geDiagramContainer div { 2 | line-height: 1 !important; 3 | box-sizing: initial; 4 | } -------------------------------------------------------------------------------- /docs/connect/resources/audit-create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nokia-eda/docs/HEAD/docs/connect/resources/audit-create.png -------------------------------------------------------------------------------- /docs/connect/resources/install-operator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nokia-eda/docs/HEAD/docs/connect/resources/install-operator.png -------------------------------------------------------------------------------- /docs/connect/resources/nsx-vcenter-fqdn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nokia-eda/docs/HEAD/docs/connect/resources/nsx-vcenter-fqdn.png -------------------------------------------------------------------------------- /docs/connect/resources/enter-namespace-operator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nokia-eda/docs/HEAD/docs/connect/resources/enter-namespace-operator.png -------------------------------------------------------------------------------- /docs/connect/resources/nutanix-category-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nokia-eda/docs/HEAD/docs/connect/resources/nutanix-category-example.png -------------------------------------------------------------------------------- /docs/connect/resources/vmware-custom-attribute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nokia-eda/docs/HEAD/docs/connect/resources/vmware-custom-attribute.png -------------------------------------------------------------------------------- /docs/connect/resources/find-eda-openshift-operator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nokia-eda/docs/HEAD/docs/connect/resources/find-eda-openshift-operator.png -------------------------------------------------------------------------------- /docs/connect/resources/select-operators-operatorhub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nokia-eda/docs/HEAD/docs/connect/resources/select-operators-operatorhub.png -------------------------------------------------------------------------------- /docs/connect/resources/connect-audit.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: connect.eda.nokia.com/v1 2 | kind: ConnectAudit 3 | metadata: 4 | name: test-audit 5 | namespace: eda 6 | spec: 7 | connectPluginName: 8 | scope: PLUGIN 9 | -------------------------------------------------------------------------------- /docs/development/apps/snippets/banner.yml: -------------------------------------------------------------------------------- 1 | apiVersion: banners.eda.local/v1alpha1 2 | kind: Banner 3 | metadata: 4 | name: demo-banner 5 | namespace: eda 6 | spec: 7 | nodes: 8 | - leaf1 9 | loginBanner: Hello EDA! 10 | -------------------------------------------------------------------------------- /docs/software-install/non-production/kind.md: -------------------------------------------------------------------------------- 1 | # EDA on KinD 2 | 3 | Installing EDA on a [KinD][kind-home] cluster is covered in the [quickstart](../../getting-started/try-eda.md) section. 4 | 5 | [kind-home]: https://kind.sigs.k8s.io/ 6 | -------------------------------------------------------------------------------- /docs/user-guide/network-topology/snippets/deleteAll-1.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: topologies.eda.nokia.com/v1alpha1 2 | kind: NetworkTopology 3 | metadata: 4 | generateName: delete-all- 5 | namespace: net-topo-test 6 | spec: 7 | operation: deleteAll 8 | -------------------------------------------------------------------------------- /docs/apps/notifier/provider_slack.yml: -------------------------------------------------------------------------------- 1 | apiVersion: notifiers.eda.nokia.com/v1 2 | kind: ClusterProvider 3 | metadata: 4 | name: slack 5 | namespace: eda-system 6 | spec: 7 | enabled: true 8 | uri: slack://hooks.slack.com/services/ABC/DEF/GHI 9 | -------------------------------------------------------------------------------- /docs/apps/netbox/api-token-secret.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | metadata: 4 | name: netbox-api-token 5 | namespace: eda 6 | type: Opaque 7 | data: 8 | # base64-encoded NetBox API token with IPAM permissions 9 | apiToken: ${NETBOX_API_TOKEN} -------------------------------------------------------------------------------- /docs/apps/notifier/provider_discord.yml: -------------------------------------------------------------------------------- 1 | apiVersion: notifiers.eda.nokia.com/v1 2 | kind: ClusterProvider 3 | metadata: 4 | name: discord 5 | namespace: eda-system 6 | spec: 7 | enabled: true 8 | uri: discord://discord.com/api/webhooks/webhookid/token 9 | -------------------------------------------------------------------------------- /docs/apps/notifier/provider_teams.yml: -------------------------------------------------------------------------------- 1 | apiVersion: notifiers.eda.nokia.com/v1 2 | kind: ClusterProvider 3 | metadata: 4 | name: teams 5 | namespace: eda-system 6 | spec: 7 | enabled: true 8 | uri: teams://.webhook.office.com/webhookb2/XXXXX 9 | -------------------------------------------------------------------------------- /dev/versioning.md: -------------------------------------------------------------------------------- 1 | # Versioning 2 | 3 | Versioning is supported by `mike` and it is installed additionally in the insiders image this project uses. 4 | 5 | ## References 6 | 7 | 1. [Mike and CF Pages](https://github.com/squidfunk/mkdocs-material/discussions/6546) 8 | -------------------------------------------------------------------------------- /docs/apps/netbox/webhook-signature-secret.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | metadata: 4 | name: netbox-webhook-signature 5 | namespace: eda 6 | type: Opaque 7 | data: 8 | # base64-encoded signature key that NetBox will use 9 | signatureKey: ${NETBOX_WEBHOOK_SIGNATURE_KEY} -------------------------------------------------------------------------------- /docs/apps/netbox/example-allocation.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: netbox.eda.nokia.com/v1alpha1 2 | kind: Allocation 3 | metadata: 4 | name: nb-systemip-v4 5 | namespace: eda 6 | spec: 7 | enabled: true 8 | instance: netbox 9 | tags: 10 | - eda-systemip-v4 11 | type: ip-address -------------------------------------------------------------------------------- /docs/apps/prometheus-exporter/grouped_metric.yml: -------------------------------------------------------------------------------- 1 | apiVersion: prom.eda.nokia.com/v1alpha1 2 | kind: Export 3 | metadata: 4 | name: metrics-grouping 5 | namespace: eda-system 6 | spec: 7 | group: group1 8 | exports: 9 | - path: .namespace.node.srl.interface.statistics 10 | -------------------------------------------------------------------------------- /docs/apps/netbox/example-instance.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: netbox.eda.nokia.com/v1alpha1 2 | kind: Instance 3 | metadata: 4 | name: netbox 5 | namespace: eda 6 | spec: 7 | url: http://netbox-server.netbox.svc.cluster.local 8 | apiToken: netbox-api-token 9 | signatureKey: netbox-webhook-signature -------------------------------------------------------------------------------- /docs/apps/prometheus-exporter/prefixed_metric.yml: -------------------------------------------------------------------------------- 1 | apiVersion: prom.eda.nokia.com/v1alpha1 2 | kind: Export 3 | metadata: 4 | name: prefixed-metrics 5 | namespace: eda-system 6 | spec: 7 | exports: 8 | - path: .namespace.node.srl.interface.statistics 9 | prefix: eda 10 | -------------------------------------------------------------------------------- /docs/apps/notifier/provider_email.yml: -------------------------------------------------------------------------------- 1 | apiVersion: notifiers.eda.nokia.com/v1 2 | kind: ClusterProvider 3 | metadata: 4 | name: email 5 | namespace: eda-system 6 | spec: 7 | enabled: true 8 | uri: smtp://$user:$password@smtp.example.com?from=eda@nokia.com&to=noc@customer.com&startTLS=yes 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .cache 2 | .vscode 3 | .idea 4 | .DS_Store 5 | 6 | # in case we run install guide from the docs repo 7 | kpt 8 | 9 | # ignoring private dir 10 | private 11 | 12 | # ignore build dir 13 | site 14 | tmp 15 | tools/ 16 | build/ 17 | *.log 18 | catalog/ 19 | eda-kpt/ 20 | __pycache__ 21 | -------------------------------------------------------------------------------- /docs/apps/netbox/example-allocation-subnet.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: netbox.eda.nokia.com/v1alpha1 2 | kind: Allocation 3 | metadata: 4 | name: nb-isl-v6 5 | namespace: eda 6 | spec: 7 | enabled: true 8 | instance: netbox 9 | subnetLength: 127 10 | tags: 11 | - eda-isl-v6 12 | type: subnet -------------------------------------------------------------------------------- /docs/connect/resources/openstack-service-account-token.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: v1 3 | kind: Secret 4 | type: kubernetes.io/service-account-token 5 | metadata: 6 | name: openstack-plugin 7 | namespace: eda-system 8 | annotations: 9 | kubernetes.io/service-account.name: openstack-plugin 10 | -------------------------------------------------------------------------------- /docs/connect/resources/openshift-service-account-token.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: v1 3 | kind: Secret 4 | type: kubernetes.io/service-account-token 5 | metadata: 6 | name: k8s-controller-plugin 7 | namespace: eda-system 8 | annotations: 9 | kubernetes.io/service-account.name: k8s-controller-plugin 10 | -------------------------------------------------------------------------------- /docs/connect/resources/vmware-secret.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | type: Opaque 4 | metadata: 5 | name: my-vmware-creds 6 | namespace: eda-system 7 | labels: 8 | "eda.nokia.com/backup": "true" 9 | data: 10 | username: YWRtaW4K # base64 encoded 11 | password: YWRtaW4K # base64 encoded 12 | -------------------------------------------------------------------------------- /docs/connect/resources/cnd-example1.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: connect.eda.nokia.com/v1 2 | kind: ConnectNetworkDefinition 3 | metadata: 4 | name: cnd1 5 | spec: 6 | subnets: 7 | - name: "subnet1" 8 | networkAttachmentDefinitions: 9 | - name: ipvlan-ns1/ipvlan-nad1 10 | - name: ipvlan-ns1/ipvlan-nad2 -------------------------------------------------------------------------------- /docs/connect/resources/nutanix-secret.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | type: Opaque 4 | metadata: 5 | name: my-nutanix-creds 6 | namespace: eda-system 7 | labels: 8 | "eda.nokia.com/backup": "true" 9 | data: 10 | username: YWRtaW4K # base64 encoded 11 | password: YWRtaW4K # base64 encoded 12 | 13 | -------------------------------------------------------------------------------- /docs/apps/netbox/install.yml: -------------------------------------------------------------------------------- 1 | apiVersion: appstore.eda.nokia.com/v1 2 | kind: AppInstaller 3 | metadata: 4 | name: netbox-install 5 | namespace: eda-system 6 | spec: 7 | operation: install 8 | apps: 9 | - appId: netbox.eda.nokia.com 10 | catalog: eda-catalog-builtin-apps 11 | version: 12 | value: v2.0.0 13 | -------------------------------------------------------------------------------- /docs/connect/resources/openstack-helm-values.yaml: -------------------------------------------------------------------------------- 1 | connectpluginname: openstack-plugin 2 | connectPassword: 3 | connectUsername: openstack-plugin 4 | connectHost: https://api.eda.example.com:6443 5 | tlsenabled: true 6 | tlscertificatedata: "" 7 | skiptlsverify: false 8 | namespace: default 9 | heartbeat: 10 10 | 11 | -------------------------------------------------------------------------------- /docs/apps/notifier/install.yml: -------------------------------------------------------------------------------- 1 | apiVersion: appstore.eda.nokia.com/v1 2 | kind: AppInstaller 3 | metadata: 4 | name: notifier-install 5 | namespace: eda-system 6 | spec: 7 | operation: install 8 | apps: 9 | - appId: notifier.eda.nokia.com 10 | catalog: eda-catalog-builtin-apps 11 | version: 12 | value: v4.0.0 13 | -------------------------------------------------------------------------------- /docs/apps/interfaces/simple-breakout.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: interfaces.eda.nokia.com/v1alpha1 2 | kind: Breakout 3 | metadata: 4 | name: breakout-example 5 | namespace: default 6 | spec: 7 | node: 8 | - node-1 # Name of the TopoNode 9 | interface: 10 | - ethernet-1-1 # Name of the parent interface on node-1 11 | channels: 4 12 | speed: 100G -------------------------------------------------------------------------------- /docs/apps/kafka-exporter/install.yml: -------------------------------------------------------------------------------- 1 | apiVersion: appstore.eda.nokia.com/v1 2 | kind: AppInstaller 3 | metadata: 4 | name: kafka-exporter-install 5 | namespace: eda-system 6 | spec: 7 | operation: install 8 | apps: 9 | - appId: kafka.eda.nokia.com 10 | catalog: eda-catalog-builtin-apps 11 | version: 12 | value: v4.0.0 13 | -------------------------------------------------------------------------------- /docs/apps/prometheus-exporter/install.yml: -------------------------------------------------------------------------------- 1 | apiVersion: appstore.eda.nokia.com/v1 2 | kind: AppInstaller 3 | metadata: 4 | name: prom-exporter-install 5 | namespace: eda-system 6 | spec: 7 | operation: install 8 | apps: 9 | - appId: prom.eda.nokia.com 10 | catalog: eda-catalog-builtin-apps 11 | version: 12 | value: v4.0.0 13 | -------------------------------------------------------------------------------- /docs/apps/remote-write/install.yml: -------------------------------------------------------------------------------- 1 | apiVersion: appstore.eda.nokia.com/v1 2 | kind: AppInstaller 3 | metadata: 4 | name: remote-write-install 5 | namespace: eda-system 6 | spec: 7 | operation: install 8 | apps: 9 | - appId: remotewrite.eda.nokia.com 10 | catalog: eda-catalog-builtin-apps 11 | version: 12 | value: v2.0.0 13 | -------------------------------------------------------------------------------- /docs/connect/resources/openstack-inject-trust-anchor.yaml: -------------------------------------------------------------------------------- 1 | parameter_defaults: 2 | # Map containing the CA certs and information needed for deploying them. 3 | # Type: json 4 | CAMap: 5 | eda.crt: 6 | content: | 7 | -----BEGIN CERTIFICATE----- 8 | 9 | -----END CERTIFICATE----- 10 | 11 | -------------------------------------------------------------------------------- /docs/development/resources/authSecretRef.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | type: Opaque 4 | metadata: 5 | name: your-creds # A unique secret name 6 | labels: 7 | eda.nokia.com/backup: "true" 8 | data: 9 | username: # Base64 encoded username 10 | password: # Base64 encoded password/token 11 | -------------------------------------------------------------------------------- /docs/development/resources/registry.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: appstore.eda.nokia.com/v1 2 | kind: Registry 3 | metadata: 4 | name: your-registry # name of your registry 5 | spec: 6 | remoteURL: # link to your registry 7 | authSecretRef: your-registry-creds # reference to valid credentials for your registry 8 | skipTLSVerify: {true|false} -------------------------------------------------------------------------------- /docs/development/apps/snippets/catalog.yml: -------------------------------------------------------------------------------- 1 | apiVersion: appstore.eda.nokia.com/v1 2 | kind: Catalog 3 | metadata: 4 | name: eda-labs 5 | spec: 6 | remoteType: git 7 | remoteURL: https://github.com/eda-labs/catalog 8 | skipTLSVerify: false 9 | title: EDA Labs Catalog 10 | # auth secret is not required, as our Catalog repo is public 11 | # authSecretRef: '' -------------------------------------------------------------------------------- /docs/apps/notifier/notifier_alarms.yml: -------------------------------------------------------------------------------- 1 | apiVersion: notifiers.eda.nokia.com/v1 2 | kind: ClusterNotifier 3 | metadata: 4 | name: alarms-to-discord 5 | namespace: eda-system 6 | spec: 7 | description: "Notifier for all alarms to Discord" 8 | enabled: true 9 | sources: 10 | alarms: 11 | include: 12 | - "*" 13 | providers: 14 | - discord 15 | -------------------------------------------------------------------------------- /docs/blog/.authors.yml: -------------------------------------------------------------------------------- 1 | authors: 2 | rdodin: 3 | name: Roman Dodin 4 | description: Swagger 5 | avatar: https://gitlab.com/rdodin/pics/-/wikis/uploads/55adbfe3e2a891510dd2821237b45758/roman_dodin_avatar.webp 6 | bwallis: 7 | name: Bruce Wallis 8 | description: Chief Echidna Officer 9 | avatar: https://avatars.githubusercontent.com/u/4969068 10 | -------------------------------------------------------------------------------- /docs/connect/resources/nsx-appinstall.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: appstore.eda.nokia.com/v1 2 | kind: AppInstaller 3 | metadata: 4 | name: nsx-plugin 5 | namespace: eda-system 6 | spec: 7 | operation: install 8 | apps: 9 | - appId: nsx.eda.nokia.com 10 | catalog: eda-catalog-builtin-apps 11 | version: 12 | type: semver 13 | value: v5.0.0 14 | -------------------------------------------------------------------------------- /docs/connect/resources/openstack-linux-bond-example.yaml: -------------------------------------------------------------------------------- 1 | - type: linux_bond 2 | name: bond1 3 | bonding_options: "mode=active-backup miimon=100" 4 | use_dhcp: false 5 | mtu: 9000 6 | members: 7 | - type: interface 8 | name: nic2 9 | primary: true 10 | mtu: 9000 11 | - type: interface 12 | name: nic3 13 | mtu: 9000 14 | 15 | -------------------------------------------------------------------------------- /docs/user-guide/ingress/tlsroute.yml: -------------------------------------------------------------------------------- 1 | apiVersion: gateway.networking.k8s.io/v1alpha2 2 | kind: TLSRoute 3 | metadata: 4 | name: eda-ui 5 | namespace: eda-system 6 | spec: 7 | parentRefs: 8 | - name: eda-gw-https 9 | namespace: eda-system 10 | rules: 11 | - backendRefs: 12 | - kind: Service 13 | name: eda-api 14 | port: 443 15 | -------------------------------------------------------------------------------- /docs/connect/resources/cnd-example3.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: connect.eda.nokia.com/v1 2 | kind: ConnectNetworkDefinition 3 | metadata: 4 | name: cnd3 5 | spec: 6 | subnets: 7 | - name: "eda-managed-subnet1" 8 | linkedBridgeDomain: eda_bridgedomain_1 9 | networkAttachmentDefinitions: 10 | - name: ipvlan-ns1/ipvlan-nad1 11 | - name: sriov-ns1/sriov-nad1 -------------------------------------------------------------------------------- /docs/connect/resources/connect-appinstall.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: appstore.eda.nokia.com/v1 2 | kind: AppInstaller 3 | metadata: 4 | name: connect-nokia 5 | namespace: eda-system 6 | spec: 7 | operation: install 8 | apps: 9 | - appId: connect.eda.nokia.com 10 | catalog: eda-catalog-builtin-apps 11 | version: 12 | type: semver 13 | value: v5.0.0 14 | -------------------------------------------------------------------------------- /docs/connect/resources/vmware-appinstall.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: appstore.eda.nokia.com/v1 2 | kind: AppInstaller 3 | metadata: 4 | name: vmware-plugin 5 | namespace: eda-system 6 | spec: 7 | operation: install 8 | apps: 9 | - appId: vmware.eda.nokia.com 10 | catalog: eda-catalog-builtin-apps 11 | version: 12 | type: semver 13 | value: v5.0.0 14 | -------------------------------------------------------------------------------- /docs/apps/prometheus-exporter/replacement_metric.yml: -------------------------------------------------------------------------------- 1 | apiVersion: prom.eda.nokia.com/v1alpha1 2 | kind: Export 3 | metadata: 4 | name: replaced-metrics 5 | namespace: eda-system 6 | spec: 7 | exports: 8 | - path: .namespace.node.srl.interface.statistics 9 | metricName: 10 | regex: namespace_node_srl_(\w+)_statistics_(\w+) 11 | replacement: "${1}_${2}" 12 | -------------------------------------------------------------------------------- /docs/connect/resources/nutanix-appinstall.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: appstore.eda.nokia.com/v1 2 | kind: AppInstaller 3 | metadata: 4 | name: nutanix-plugin 5 | namespace: eda-system 6 | spec: 7 | operation: install 8 | apps: 9 | - appId: nutanix.eda.nokia.com 10 | catalog: eda-catalog-builtin-apps 11 | version: 12 | type: semver 13 | value: v0.0.1-beta 14 | -------------------------------------------------------------------------------- /docs/apps/protocols/bgpgroup.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: protocols.eda.nokia.com/v1alpha1 2 | kind: BGPGroup 3 | metadata: 4 | name: example-custom-group 5 | namespace: eda 6 | spec: 7 | description: "Custom VRF BGP group" 8 | localAS: 9 | autonomousSystem: 65002 10 | timers: 11 | holdTime: 90 12 | keepAlive: 30 13 | ipv4Unicast: 14 | enabled: true 15 | maxReceivedRoutes: 1000 -------------------------------------------------------------------------------- /docs/apps/protocols/bgppeer.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: protocols.eda.nokia.com/v1alpha1 2 | kind: BGPPeer 3 | metadata: 4 | name: example-custom-peer 5 | namespace: eda 6 | spec: 7 | description: "Custom VRF BGP peer" 8 | group: "example-custom-group" 9 | interface: "customer-1" 10 | interfaceKind: "ROUTEDINTERFACE" 11 | peerAS: 12 | autonomousSystem: 65200 13 | peerIP: "192.168.2.1" -------------------------------------------------------------------------------- /docs/apps/store/install-example.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: appstore.eda.nokia.com/v1 2 | kind: AppInstaller 3 | metadata: 4 | name: connect-nokia 5 | namespace: eda-system 6 | spec: 7 | operation: install 8 | autoProcessRequirements: 9 | - strict 10 | apps: 11 | - appId: connect.eda.nokia.com 12 | catalog: eda-catalog-builtin-apps 13 | version: 14 | value: v3.0.0 15 | -------------------------------------------------------------------------------- /docs/apps/netbox/allocation.yml: -------------------------------------------------------------------------------- 1 | apiVersion: netbox.eda.nokia.com/v1alpha1 2 | kind: Allocation 3 | metadata: 4 | name: netbox-isl-pool 5 | namespace: eda 6 | spec: 7 | enabled: true 8 | instance: netbox # <-- Reference to the Instance resource 9 | tags: 10 | - eda-isl-pool # <-- Must match tags on NetBox prefixes 11 | type: subnet # <-- One of: ip-address, subnet, ip-in-subnet -------------------------------------------------------------------------------- /docs/apps/store/delete-example.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: appstore.eda.nokia.com/v1 2 | kind: AppInstaller 3 | metadata: 4 | name: delete-connect-nokia 5 | namespace: eda-system 6 | spec: 7 | operation: delete 8 | autoProcessRequirements: 9 | - strict 10 | apps: 11 | - appId: connect.eda.nokia.com 12 | catalog: eda-catalog-builtin-apps 13 | version: 14 | value: v3.0.0 15 | -------------------------------------------------------------------------------- /docs/apps/protocols/defaultbgppeer.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: protocols.eda.nokia.com/v1alpha1 2 | kind: DefaultBGPPeer 3 | metadata: 4 | name: example-default-peer 5 | namespace: eda 6 | spec: 7 | description: "Default VRF BGP peer" 8 | group: "example-default-group" 9 | interface: "system" 10 | interfaceKind: "SYSTEMINTERFACE" 11 | peerAS: 12 | autonomousSystem: 65100 13 | peerIP: "192.168.1.1" -------------------------------------------------------------------------------- /docs/apps/protocols/defaultbgpgroup.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: protocols.eda.nokia.com/v1alpha1 2 | kind: DefaultBGPGroup 3 | metadata: 4 | name: example-default-group 5 | namespace: eda 6 | spec: 7 | description: "Default VRF BGP group" 8 | localAS: 9 | autonomousSystem: 65001 10 | timers: 11 | holdTime: 90 12 | keepAlive: 30 13 | ipv4Unicast: 14 | enabled: true 15 | maxReceivedRoutes: 1000 -------------------------------------------------------------------------------- /docs/connect/resources/connect-appinstall-delete.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: core.eda.nokia.com/v1 2 | kind: Workflow 3 | metadata: 4 | name: connect-nokia 5 | namespace: eda-system 6 | spec: 7 | operation: delete 8 | apps: 9 | - app: connect 10 | catalog: eda-catalog-builtin-apps 11 | vendor: nokia 12 | version: 13 | type: semver 14 | value: v3.0.0 15 | type: app-installer 16 | -------------------------------------------------------------------------------- /docs/user-guide/ingress/gateway.yml: -------------------------------------------------------------------------------- 1 | apiVersion: gateway.networking.k8s.io/v1 2 | kind: Gateway 3 | metadata: 4 | name: eda-gw-https 5 | namespace: eda-system 6 | spec: 7 | gatewayClassName: cilium 8 | listeners: 9 | - allowedRoutes: 10 | namespaces: 11 | from: Same 12 | name: tls-gw 13 | port: 8080 14 | protocol: TLS 15 | tls: 16 | mode: Passthrough 17 | -------------------------------------------------------------------------------- /docs/apps/interfaces/simple-interface.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: interfaces.eda.nokia.com/v1alpha1 2 | kind: Interface 3 | metadata: 4 | name: leaf1-ethernet-1-13 5 | namespace: eda 6 | labels: 7 | eda.nokia.com/role: edge 8 | spec: 9 | type: interface 10 | description: "Customer facing interface" 11 | enabled: true 12 | mtu: 9000 13 | members: 14 | - node: leaf1 15 | interface: ethernet-1-13 16 | -------------------------------------------------------------------------------- /docs/development/resources/catalog.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: appstore.eda.nokia.com/v1 2 | kind: Catalog 3 | metadata: 4 | name: your-catalog # name of your catalog 5 | spec: 6 | title: Your Awesome Catalog # UI name of your catalog, optional 7 | remoteURL: https://.git # link to your git repository. 8 | authSecretRef: your-creds # reference to valid credentials for the git repository 9 | skipTLSVerify: {true|false} -------------------------------------------------------------------------------- /docs/apps/protocols/defaultaggregateroute.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: protocols.eda.nokia.com/v1alpha1 2 | kind: DefaultAggregateRoute 3 | metadata: 4 | name: example-default-aggregate 5 | namespace: eda 6 | spec: 7 | defaultRouter: "default-router" 8 | prefixes: 9 | - "192.168.0.0/16" 10 | - "172.16.0.0/12" 11 | aggregatorIP: "10.0.0.1" 12 | aggregatorASN: 65001 13 | summaryOnly: true 14 | generateICMP: false -------------------------------------------------------------------------------- /docs/apps/prometheus-exporter/static_labels_metric.yml: -------------------------------------------------------------------------------- 1 | apiVersion: prom.eda.nokia.com/v1alpha1 2 | kind: Export 3 | metadata: 4 | name: static-labels-metric 5 | namespace: eda-system 6 | spec: 7 | exports: 8 | - path: .namespace.node.srl.interface.statistics 9 | labels: 10 | static: 11 | - name: env 12 | value: prod 13 | - name: region 14 | value: us-west-1 15 | -------------------------------------------------------------------------------- /docs/connect/resources/cnd-example2.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: connect.eda.nokia.com/v1 2 | kind: ConnectNetworkDefinition 3 | metadata: 4 | name: cnd2 5 | spec: 6 | subnets: 7 | - name: "trunked-subnet1" 8 | networkAttachmentDefinitions: 9 | - name: ipvlan-ns1/ipvlan-nad1-untagged 10 | trunkVlans: 11 | - 10 12 | - name: sriov-ns1/sriov-nad1-untagged 13 | trunkVlans: 14 | - 20 -------------------------------------------------------------------------------- /docs/connect/resources/cnd-example4.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: connect.eda.nokia.com/v1 2 | kind: ConnectNetworkDefinition 3 | metadata: 4 | name: cnd4 5 | spec: 6 | subnets: 7 | - name: "subnet-1" 8 | networkAttachmentDefinitions: 9 | - name: ipvlan-ns1/ipvlan-nad1 10 | preProvisionHostGroupSelector: 'net-group-1' 11 | - name: macvlan-ns1/macvlan-nad1 12 | preProvisionHostGroupSelector: 'net-group-2' 13 | -------------------------------------------------------------------------------- /docs/apps/protocols/aggregateroute.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: protocols.eda.nokia.com/v1alpha1 2 | kind: AggregateRoute 3 | metadata: 4 | name: example-custom-aggregate 5 | namespace: eda 6 | spec: 7 | router: "customer-router" 8 | prefixes: 9 | - "192.168.1.0/24" 10 | - "192.168.2.0/24" 11 | aggregatorIP: "10.0.0.2" 12 | aggregatorASN: 65002 13 | nodes: 14 | - "node1" 15 | - "node2" 16 | summaryOnly: true 17 | generateICMP: false -------------------------------------------------------------------------------- /docs/apps/protocols/defaultroutereflectorclient.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: protocols.eda.nokia.com/v1alpha1 2 | kind: DefaultRouteReflectorClient 3 | metadata: 4 | name: example-default-rr-client 5 | namespace: eda 6 | spec: 7 | defaultBgpClientGroup: "client-group" 8 | interface: "system" 9 | interfaceKind: "SYSTEMINTERFACE" 10 | routeReflectorSelector: 11 | - "role=spine" 12 | routeReflectorIPs: 13 | - "192.168.0.1" 14 | - "192.168.0.2" -------------------------------------------------------------------------------- /docs/connect/resources/cnd-example5.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: connect.eda.nokia.com/v1 2 | kind: ConnectNetworkDefinition 3 | metadata: 4 | name: cnd-router 5 | spec: 6 | routers: 7 | - name: router-1 8 | subnets: 9 | - name: "subnet1" 10 | router: router-1 11 | ipv4Addresses: 12 | - ipPrefix: 192.168.6.0/24 13 | networkAttachmentDefinitions: 14 | - name: ipvlan-ns1/ipvlan-nad1 15 | - name: ipvlan-ns1/ipvlan-nad2 16 | -------------------------------------------------------------------------------- /docs/stylesheets/animations.css: -------------------------------------------------------------------------------- 1 | @-webkit-keyframes heart { 2 | 3 | 0%, 4 | 40%, 5 | 80%, 6 | to { 7 | transform: scale(1) 8 | } 9 | 10 | 20%, 11 | 60% { 12 | transform: scale(1.15) 13 | } 14 | } 15 | 16 | @keyframes heart { 17 | 18 | 0%, 19 | 40%, 20 | 80%, 21 | to { 22 | transform: scale(1) 23 | } 24 | 25 | 20%, 26 | 60% { 27 | transform: scale(1.15) 28 | } 29 | } -------------------------------------------------------------------------------- /docs/javascripts/sh-annotation.js: -------------------------------------------------------------------------------- 1 | // this script is used to remove extra leading space when annotating shell code blocks ending with `\` 2 | // character. See https://github.com/squidfunk/mkdocs-material/issues/3846 for more info. 3 | document$.subscribe(() => { 4 | const tags = document.querySelectorAll("code .se") 5 | tags.forEach(tag => { 6 | if (tag.innerText.startsWith("\\")) { 7 | tag.innerText = "\\" 8 | } 9 | }) 10 | }) -------------------------------------------------------------------------------- /docs/getting-started/reset.md: -------------------------------------------------------------------------------- 1 | # Resetting the Playground 2 | 3 | If you want to start fresh, or just shut down your playground, you can do so with the following commands: 4 | 5 | ```shell 6 | make teardown-cluster 7 | ``` 8 | 9 | This will remove the KinD cluster and all the resources created by the EDA Playground. 10 | 11 | Then you can remove the existing `kpt` packages: 12 | 13 | ```shell 14 | rm -rf eda-kpt 15 | ``` 16 | 17 | And you are ready to start over! 18 | -------------------------------------------------------------------------------- /docs/apps/netbox/instance.yml: -------------------------------------------------------------------------------- 1 | apiVersion: netbox.eda.nokia.com/v1alpha1 2 | kind: Instance 3 | metadata: 4 | name: netbox1 5 | namespace: eda 6 | spec: 7 | url: http://${NETBOX_ADDR}:${NETBOX_PORT} 8 | # Name of a secret containing the base64-encoded API token 9 | # under the `apiToken` key 10 | apiToken: netbox-api-token 11 | # Name of a secret containing the base64-encoded signature key 12 | # under the `signatureKey` key 13 | signatureKey: netbox-webhook-signature -------------------------------------------------------------------------------- /docs/overrides/.icons/nokia/N-white.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /docs/apps/prometheus-exporter/dynamic_labels_metric.yml: -------------------------------------------------------------------------------- 1 | apiVersion: prom.eda.nokia.com/v1alpha1 2 | kind: Export 3 | metadata: 4 | name: dynamic-labels-metric 5 | namespace: eda-system 6 | spec: 7 | exports: 8 | - path: .namespace.node.srl.interface.statistics 9 | labels: 10 | dynamic: 11 | - path: .namespace.node.srl.interface 12 | field: description 13 | - path: .namespace.node.srl.platform.chassis 14 | field: type 15 | -------------------------------------------------------------------------------- /docs/apps/protocols/defaultstaticroute.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: protocols.eda.nokia.com/v1alpha1 2 | kind: DefaultStaticRoute 3 | metadata: 4 | name: example-default-static 5 | namespace: eda 6 | spec: 7 | defaultRouter: "default-router" 8 | prefixes: 9 | - "192.168.0.0/24" 10 | - "172.16.0.0/24" 11 | preference: 5 12 | nexthopGroup: 13 | nexthops: 14 | - ipPrefix: "10.0.0.1" 15 | - ipPrefix: "10.0.0.2" 16 | resolve: true 17 | bfd: 18 | enabled: true -------------------------------------------------------------------------------- /docs/apps/protocols/routereflector.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: protocols.eda.nokia.com/v1alpha1 2 | kind: RouteReflector 3 | metadata: 4 | name: example-custom-rr 5 | namespace: eda 6 | spec: 7 | clusterID: "2.2.2.2" 8 | bgpGroup: "custom-rr-group" 9 | interface: "customer-1" 10 | interfaceKind: "ROUTEDINTERFACE" 11 | ipv4ClientSelector: 12 | - "role=customer-edge" 13 | ipv6ClientSelector: 14 | - "role=customer-edge" 15 | clientIPs: 16 | - "172.16.1.1" 17 | - "172.16.1.2" -------------------------------------------------------------------------------- /docs/apps/remote-write/destination.yml: -------------------------------------------------------------------------------- 1 | apiVersion: remotewrite.eda.nokia.com/v1alpha1 2 | kind: Destination 3 | metadata: 4 | name: dest1 5 | namespace: eda 6 | spec: 7 | url: 'http://prw.example.com:9090/api/v1/write' 8 | writeOptions: 9 | bufferSize: 100 # Number of metrics before sending 10 | flushInterval: 60s # Time interval for sending buffered data 11 | maxRetries: 3 # Retry attempts on failure 12 | timeout: 10s # Client write timeout -------------------------------------------------------------------------------- /docs/apps/protocols/routereflectorclient.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: protocols.eda.nokia.com/v1alpha1 2 | kind: RouteReflectorClient 3 | metadata: 4 | name: example-custom-rr-client 5 | namespace: eda 6 | spec: 7 | bgpGroup: "custom-client-group" 8 | interface: "customer-1" 9 | interfaceKind: "ROUTEDINTERFACE" 10 | ipv4RouteReflectorSelector: 11 | - "role=provider-edge" 12 | ipv6RouteReflectorSelector: 13 | - "role=provider-edge" 14 | routeReflectorIPs: 15 | - "172.16.0.1" 16 | - "172.16.0.2" -------------------------------------------------------------------------------- /docs/apps/protocols/defaultroutereflector.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: protocols.eda.nokia.com/v1alpha1 2 | kind: DefaultRouteReflector 3 | metadata: 4 | name: example-default-rr 5 | namespace: eda 6 | spec: 7 | description: "Default VRF Route Reflector" 8 | clusterID: "1.1.1.1" 9 | defaultBGPRRGroup: "rr-group" 10 | interface: "system" 11 | interfaceKind: "SYSTEMINTERFACE" 12 | clientSelector: 13 | - "role=leaf" 14 | clientIPs: 15 | - "192.168.1.1" 16 | - "192.168.1.2" 17 | ipv4Unicast: 18 | enabled: true -------------------------------------------------------------------------------- /docs/apps/protocols/staticroute.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: protocols.eda.nokia.com/v1alpha1 2 | kind: StaticRoute 3 | metadata: 4 | name: example-custom-static 5 | namespace: eda 6 | spec: 7 | router: "customer-router" 8 | prefixes: 9 | - "192.168.1.0/24" 10 | - "192.168.2.0/24" 11 | preference: 10 12 | nodes: 13 | - "node1" 14 | - "node2" 15 | nexthopGroup: 16 | nexthops: 17 | - ipPrefix: "10.1.0.1" 18 | bfd: 19 | enabled: true 20 | - ipPrefix: "10.1.0.2" 21 | resolve: true -------------------------------------------------------------------------------- /docs/user-guide/network-topology/snippets/replaceAll-check.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: topologies.eda.nokia.com/v1alpha1 2 | kind: NetworkTopology 3 | metadata: 4 | generateName: replace-all-check- 5 | namespace: net-topo-test 6 | spec: 7 | operation: replaceAll 8 | 9 | nodeTemplates: 10 | - name: node 11 | nodeProfile: srlinux-ghcr-25.10.1 12 | platform: 7220 IXR-D3L 13 | labels: 14 | eda.nokia.com/security-profile: managed 15 | nodes: 16 | - name: switch1 17 | template: node 18 | checks: 19 | dryRun: true 20 | -------------------------------------------------------------------------------- /docs/software-install/deploying-eda/setters-reference/README.md: -------------------------------------------------------------------------------- 1 | # Generating KPT setters reference documentation 2 | 3 | To generate the setters reference documentation, go to the playground directory, ensure that packages are downloaded for the right version, and run: 4 | 5 | ```bash 6 | uv run scripts/list-setters.py --markdown eda-kpt/eda-kpt-base 7 | ``` 8 | 9 | ```bash 10 | uv run scripts/list-setters.py --markdown eda-kpt/eda-external-packages 11 | ``` 12 | 13 | ```bash 14 | uv run scripts/list-setters.py --markdown ./eda-kpt/eda-kpt-playground 15 | ``` 16 | -------------------------------------------------------------------------------- /docs/connect/resources/openstack-ovs-dpdk-bond-example.yaml: -------------------------------------------------------------------------------- 1 | - type: ovs_dpdk_bond 2 | name: bond1 3 | mtu: 9000 4 | ovs_options: "bond_mode=balance-tcp lacp=active other-config:lacp-fallback-ab=true other_config:lacp-time=fast" 5 | members: 6 | - type: ovs_dpdk_port 7 | name: ens3f0np0 8 | driver: mlx5_core 9 | members: 10 | - type: interface 11 | name: ens3f0np0 12 | - type: ovs_dpdk_port 13 | name: ens3f1np1 14 | driver: mlx5_core 15 | members: 16 | - type: interface 17 | name: ens3f1np1 18 | 19 | -------------------------------------------------------------------------------- /my-fabric.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: fabrics.eda.nokia.com/v1alpha1 2 | kind: Fabric 3 | metadata: 4 | name: myfabric-1 5 | spec: 6 | leafs: 7 | leafNodeSelector: 8 | - eda.nokia.com/role=leaf 9 | spines: 10 | spineNodeSelector: 11 | - eda.nokia.com/role=spine 12 | interSwitchLinks: 13 | linkSelector: 14 | - eda.nokia.com/role=interSwitch 15 | unnumbered: IPV6 16 | systemPoolIPV4: systemipv4-pool 17 | underlayProtocol: 18 | protocol: 19 | - EBGP 20 | bgp: 21 | asnPool: asn-pool 22 | overlayProtocol: 23 | protocol: EBGP 24 | -------------------------------------------------------------------------------- /docs/apps/kafka-exporter/kafka_producer.yml: -------------------------------------------------------------------------------- 1 | apiVersion: kafka.eda.nokia.com/v1alpha1 2 | kind: Producer 3 | metadata: 4 | name: kafka-producer 5 | namespace: eda 6 | spec: 7 | brokers: "broker1:9092,broker2:9092" 8 | required-acks: wait-for-local 9 | max-retry: 3 10 | timeout: "10s" 11 | compression-codec: gzip 12 | exports: 13 | - topic: "interface-state" 14 | path: ".node.srl.interface" 15 | fields: 16 | - admin-state 17 | - oper-state 18 | where: 'admin-state = "enable"' 19 | period: "60s" 20 | mode: periodic-on-change 21 | -------------------------------------------------------------------------------- /docs/user-guide/clab-integration/nodeUser.yaml: -------------------------------------------------------------------------------- 1 | # https://doc.crds.dev/github.com/nokia-eda/kpt/core.eda.nokia.com/NodeUser/v1@v24.12.1 2 | --- 3 | apiVersion: core.eda.nokia.com/v1 4 | kind: NodeUser 5 | metadata: 6 | name: admin 7 | namespace: eda 8 | spec: 9 | groupBindings: 10 | - groups: 11 | - sudo 12 | nodeSelector: 13 | - "" 14 | username: admin 15 | password: NokiaSrl1! 16 | sshPublicKeys: 17 | # an optional list of ssh public keys for the node user 18 | # - "ssh-ed25519 AAAAC3NzaC1lZYOURKEYHEREYOURKEYHEREYOURKEYHEREYOURKEYHEREHDLeDteKN74" 19 | -------------------------------------------------------------------------------- /docs/apps/interfaces/simple-lag.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: interfaces.eda.nokia.com/v1alpha1 2 | kind: Interface 3 | metadata: 4 | name: leaf1-simple-lag 5 | namespace: eda 6 | labels: 7 | eda.nokia.com/role: edge 8 | spec: 9 | type: lag 10 | description: "Customer facing lag" 11 | enabled: true 12 | mtu: 9000 13 | lag: 14 | type: lacp 15 | minLinks: 2 16 | lacp: 17 | mode: active 18 | interval: fast 19 | systemPriority: 32768 20 | members: 21 | - node: leaf1 22 | interface: ethernet-1-14 23 | - node: leaf1 24 | interface: ethernet-1-15 25 | -------------------------------------------------------------------------------- /docs/apps/prometheus-exporter/values_mapping_metric.yml: -------------------------------------------------------------------------------- 1 | apiVersion: prom.eda.nokia.com/v1alpha1 2 | kind: Export 3 | metadata: 4 | name: mapped-values-metric 5 | namespace: eda-system 6 | spec: 7 | exports: 8 | - path: .namespace.node.srl.interface 9 | fields: 10 | - admin-state 11 | - oper-state 12 | mappings: 13 | - source: "up" 14 | destination: "2" 15 | - source: "down" 16 | destination: "1" 17 | - source: "enable" 18 | destination: "2" 19 | - source: "disable" 20 | destination: "1" 21 | -------------------------------------------------------------------------------- /docs/connect/resources/openstack-controller-sa-crb.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: v1 3 | kind: ServiceAccount 4 | metadata: 5 | name: openstack-plugin 6 | namespace: eda-system 7 | --- 8 | apiVersion: rbac.authorization.k8s.io/v1 9 | kind: ClusterRoleBinding 10 | metadata: 11 | name: openstack-plugin 12 | subjects: 13 | - kind: ServiceAccount 14 | name: openstack-plugin 15 | namespace: eda-system 16 | roleRef: 17 | kind: ClusterRole 18 | # This cluster role is assumed to be already installed by connect app. 19 | name: eda-connect-plugin-cluster-role 20 | apiGroup: rbac.authorization.k8s.io 21 | -------------------------------------------------------------------------------- /docs/user-guide/network-topology/snippets/vnet-vlan-10.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: services.eda.nokia.com/v1 2 | kind: VirtualNetwork 3 | metadata: 4 | name: demo-vnet-bd-vlan-10 5 | namespace: eda 6 | spec: 7 | bridgeDomains: 8 | - name: vnet-demo-bd 9 | spec: 10 | eviPool: evi-pool 11 | tunnelIndexPool: tunnel-index-pool 12 | type: EVPNVXLAN 13 | vniPool: vni-pool 14 | vlans: 15 | - name: vnet-demo-vlan10 16 | spec: 17 | bridgeDomain: vnet-demo-bd 18 | interfaceSelector: 19 | - eda.nokia.com/role=edge 20 | vlanID: "10" 21 | -------------------------------------------------------------------------------- /docs/connect/resources/openshift-controller-sa-crb.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: v1 3 | kind: ServiceAccount 4 | metadata: 5 | name: k8s-controller-plugin 6 | namespace: eda-system 7 | --- 8 | apiVersion: rbac.authorization.k8s.io/v1 9 | kind: ClusterRoleBinding 10 | metadata: 11 | name: k8s-controller-plugin 12 | subjects: 13 | - kind: ServiceAccount 14 | name: k8s-controller-plugin 15 | namespace: eda-system 16 | roleRef: 17 | kind: ClusterRole 18 | # This cluster role is installed by the connect-core app. 19 | name: eda-connect-plugin-cluster-role 20 | apiGroup: rbac.authorization.k8s.io 21 | -------------------------------------------------------------------------------- /docs/examples/my-fabric.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: fabrics.eda.nokia.com/v1alpha1 2 | kind: Fabric 3 | metadata: 4 | name: myfabric-1 5 | namespace: eda 6 | spec: 7 | leafs: 8 | leafNodeSelector: 9 | - eda.nokia.com/role=leaf 10 | spines: 11 | spineNodeSelector: 12 | - eda.nokia.com/role=spine 13 | interSwitchLinks: 14 | linkSelector: 15 | - eda.nokia.com/role=interSwitch 16 | unnumbered: IPV6 17 | systemPoolIPV4: systemipv4-pool 18 | underlayProtocol: 19 | protocol: 20 | - EBGP 21 | bgp: 22 | asnPool: asn-pool 23 | overlayProtocol: 24 | protocol: EBGP 25 | -------------------------------------------------------------------------------- /docs/apps/netbox/nb-fabric.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: fabrics.eda.nokia.com/v1alpha1 2 | kind: Fabric 3 | metadata: 4 | name: my-nb-ebgp-fabric 5 | namespace: eda 6 | spec: 7 | leafs: 8 | leafNodeSelector: 9 | - eda.nokia.com/role=leaf 10 | spines: 11 | spineNodeSelector: 12 | - eda.nokia.com/role=spine 13 | interSwitchLinks: 14 | linkSelector: 15 | - eda.nokia.com/role=interSwitch 16 | poolIPV6: nb-isl-v6 17 | systemPoolIPV4: nb-systemip-v4 18 | underlayProtocol: 19 | bgp: 20 | asnPool: asn-pool 21 | protocol: 22 | - EBGP 23 | overlayProtocol: 24 | protocol: EBGP -------------------------------------------------------------------------------- /docs/apps/kafka-exporter/kafka_clusterproducer.yml: -------------------------------------------------------------------------------- 1 | apiVersion: kafka.eda.nokia.com/v1alpha1 2 | kind: ClusterProducer 3 | metadata: 4 | name: kafka-cluster-producer 5 | namespace: eda-system 6 | spec: 7 | brokers: "broker1:9092,broker2:9092" 8 | required-acks: wait-for-local 9 | max-retry: 3 10 | timeout: "10s" 11 | compression-codec: gzip 12 | exports: 13 | - topic: "interface-state" 14 | path: ".namespace.node.srl.interface" 15 | fields: 16 | - admin-state 17 | - oper-state 18 | where: 'admin-state = "enable"' 19 | period: "60s" 20 | mode: periodic-on-change 21 | -------------------------------------------------------------------------------- /docs/connect/resources/openshift-eda-connect-k8s-controller-env-secret.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | metadata: 4 | name: eda-connect-k8s-controller-env-secret # Do not change the name of this Secret 5 | namespace: # Refers to the namespace where the OLM operator was installed 6 | data: 7 | CONNECT_HOST: https://: # (Caution - Do not use EDA API values, use EDA k8s API values) 8 | CONNECT_PASSWORD: 9 | CONNECT_USERNAME: 10 | -------------------------------------------------------------------------------- /docs/apps/interfaces/simple-interface-storm-control.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: interfaces.eda.nokia.com/v1alpha1 2 | kind: Interface 3 | metadata: 4 | name: example-interface 5 | namespace: eda 6 | labels: 7 | eda.nokia.com/role: edge 8 | spec: 9 | type: interface 10 | description: "Customer facing interface with storm control enabled" 11 | enabled: true 12 | mtu: 9000 13 | ethernet: 14 | stormControl: 15 | enabled: true 16 | units: kbps 17 | broadcastRate: 1000000 18 | multicastRate: 1000000 19 | unknownUnicastRate: 1000000 20 | members: 21 | - node: leaf-1 22 | interface: ethernet-1-1 -------------------------------------------------------------------------------- /docs/connect/resources/eda-kubeconfig.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | clusters: 3 | - cluster: 4 | certificate-authority-data: {CERTIFICATE_AUTH_DATA} 5 | server: {https://FQDN:6443} # should be used for CONNECT_HOST 6 | name: eda-cluster 7 | contexts: 8 | - context: 9 | cluster: eda-cluster 10 | user: eda-cluster 11 | name: eda-cluster 12 | current-context: eda-cluster 13 | kind: Config 14 | preferences: {} 15 | users: 16 | - name: eda-cluster 17 | user: 18 | client-certificate-data: {CLIENT_CERTIFICATE_DATA} # should be used for CONNECT_USERNAME 19 | client-key-data: {CLIENT_KEY_DATA} # Should be used as CONNECT_PASSWORD -------------------------------------------------------------------------------- /hooks/hooks.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | 3 | 4 | def on_config(config, **kwargs): 5 | # set current_year in the copyright 6 | current_year = datetime.now().year 7 | config.copyright = config.copyright.format(current_year=current_year) 8 | 9 | # set the versioned docs branch 10 | eda_version = config.extra["eda_version"] 11 | eda_major_version = f"{eda_version.split('.')[0]}" 12 | eda_minor_version = f"{eda_version.split('.')[1]}" 13 | eda_major_minor_version = f"{eda_major_version}.{eda_minor_version}" 14 | config.edit_uri = config.edit_uri.format(versioned_branch="release-"+eda_major_minor_version) 15 | -------------------------------------------------------------------------------- /docs/htmltest.yml: -------------------------------------------------------------------------------- 1 | # inspired by https://github.com/goreleaser/goreleaser/blob/5adf43295767b5be05fa38a01ffb3ad25bd21797/www/htmltest.yml 2 | # using https://github.com/wjdp/htmltest 3 | DirectoryPath: ./site 4 | IgnoreURLs: 5 | - fonts.gstatic.com 6 | - https://github.com/nokia-eda/docs/edit 7 | - https://eda-api.k8s.orb.local/ 8 | IgnoreDirectoryMissingTrailingSlash: true 9 | IgnoreAltMissing: true 10 | IgnoreSSLVerify: true 11 | IgnoreDirs: 12 | - overrides 13 | IgnoreInternalEmptyHash: true 14 | ExternalTimeout: 120 15 | HTTPHeaders: 16 | "Range": "bytes=0-10" 17 | "Accept": "*/*" 18 | CacheExpires: "96h" 19 | HTTPConcurrencyLimit: 1 20 | -------------------------------------------------------------------------------- /.markdownlint.yml: -------------------------------------------------------------------------------- 1 | "MD007": false # allow multiple spaces after list marker to allow for nested lists that use 4 spaces 2 | "MD010": false # allow tabs 3 | "MD026": false # allow trailing punctuation to support icons shortcodes at the end of a sentence 4 | "MD038": false 5 | "MD033": false # inline html 6 | "MD013": false # line-length 7 | "MD040": false # fenced code blocks should have language selected 8 | "MD053": false # do not remove mkdocs materials footnotes 9 | "MD071": false # do not remove unordered list indentation 10 | "MD034": false # do not add angle brackets around bare links 11 | "MD046": false # do not warn about different code block styles 12 | -------------------------------------------------------------------------------- /docs/software-install/resources/prefs-example.mk: -------------------------------------------------------------------------------- 1 | NO_KIND=1 2 | SIMULATE=false 3 | METALLB_VIP=203.0.113.10/32 4 | EXT_DOMAIN_NAME=eda.domain.tld 5 | EXT_HTTP_PORT=80 6 | EXT_HTTPS_PORT=443 7 | EXT_IPV4_ADDR=203.0.113.10 8 | EXT_IPV6_ADDR="" 9 | HTTPS_PROXY=http://192.0.2.254:8080 10 | HTTP_PROXY=http://192.0.2.254:8080 11 | NO_PROXY=192.0.2.0/24,203.0.113.0/24,.domain.tld,172.22.0.0/16,localhost,127.0.0.1,10.0.1.0/24,0.0.0.0,169.254.116.108 12 | https_proxy=http://192.0.2.254:8080 13 | http_proxy=http://192.0.2.254:8080 14 | no_proxy=192.0.2.0/24,203.0.113.0/24,.domain.tld,172.22.0.0/16,localhost,127.0.0.1,10.0.1.0/24,0.0.0.0,169.254.116.108 15 | LLM_API_KEY=... -------------------------------------------------------------------------------- /docs/apps/remote-write/export.yml: -------------------------------------------------------------------------------- 1 | apiVersion: remotewrite.eda.nokia.com/v1alpha1 2 | kind: Export 3 | metadata: 4 | name: interface-stats 5 | namespace: eda 6 | spec: 7 | exports: 8 | - prefix: interfaces 9 | path: .namespace.node.srl.interface.statistics # EQL path 10 | interval: 30s # Optional polling interval 11 | mode: periodic # periodic | on-change | periodic-on-change 12 | fields: ["in-octets", "out-octets"] # Optional subset of fields 13 | labels: 14 | static: 15 | - name: region 16 | value: us-west 17 | destinations: 18 | - name: dest1 19 | -------------------------------------------------------------------------------- /docs/apps/interfaces/simple-mh-lag.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: interfaces.eda.nokia.com/v1alpha1 2 | kind: Interface 3 | metadata: 4 | name: leaf1-leaf2-simple-mh-lag 5 | namespace: eda 6 | labels: 7 | eda.nokia.com/role: edge 8 | spec: 9 | type: lag 10 | description: "Customer facing multihoming lag" 11 | enabled: true 12 | mtu: 9000 13 | lag: 14 | type: lacp 15 | minLinks: 2 16 | multihoming: 17 | mode: all-active 18 | preferredActiveNode: leaf1 19 | revertive: true 20 | lacp: 21 | mode: active 22 | interval: fast 23 | systemPriority: 32768 24 | members: 25 | - node: leaf1 26 | interface: ethernet-1-20 27 | - node: leaf2 28 | interface: ethernet-1-20 29 | -------------------------------------------------------------------------------- /docs/user-guide/clab-integration/nodeProfile.yaml: -------------------------------------------------------------------------------- 1 | # https://doc.crds.dev/github.com/nokia-eda/kpt/core.eda.nokia.com/NodeProfile/v1@v24.12.1 2 | --- 3 | apiVersion: core.eda.nokia.com/v1 4 | kind: NodeProfile 5 | metadata: 6 | name: srlinux-clab-24.10.1 7 | namespace: eda 8 | spec: 9 | operatingSystem: srl 10 | version: 24.10.1 11 | versionPath: .system.information.version 12 | versionMatch: v24\.10\.1.* 13 | images: 14 | - image: fake.bin 15 | imageMd5: fake.bin.md5 16 | port: 57410 17 | yang: https://eda-asvr.eda-system.svc/eda-system/schemaprofiles/srlinux-ghcr-24.10.1/srlinux-24.10.1.zip 18 | onboardingUsername: admin 19 | onboardingPassword: NokiaSrl1! 20 | nodeUser: admin 21 | annotate: true 22 | -------------------------------------------------------------------------------- /docs/connect/resources/openstack-lldp-playbook.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: neutron_ovs_agent,neutron_ovs_dpdk_agent 3 | gather_facts: no 4 | become: true 5 | tasks: 6 | - name: Make sure the lldpd package is installed 7 | package: 8 | name: 9 | - lldpd 10 | state: present 11 | - name: Make sure lldpd service is enabled/running 12 | service: 13 | name: lldpd 14 | state: started 15 | enabled: yes 16 | - name: Configure portID TLV value 17 | command: lldpcli configure lldp portidsubtype ifname 18 | - name: Configure lldpd interface pattern 19 | command: lldpcli configure system interface pattern {{ nic_pattern | default('em*,en*,p*,!en*v*,!p*v*') }} 20 | 21 | -------------------------------------------------------------------------------- /docs/overrides/main.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block outdated %} 4 | You're not viewing the latest version. 5 | 6 | Click here to go to latest. 7 | 8 | {% endblock %} 9 | 10 | {% block announce %} 11 | 12 | 13 | 🥳 15 | 16 | Nokia EDA {{config.extra.eda_version.rsplit('.', 1)[0]}} is out! Join our Discord to 18 | learn 19 | more! 20 | {% endblock %} 21 | 22 | 23 | {% block content %} 24 | {{ super() }} 25 | {% endblock %} -------------------------------------------------------------------------------- /docs/connect/resources/nutanix-plugin-instance.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: nutanix.eda.nokia.com/v1 2 | kind: NutanixPluginInstance 3 | metadata: 4 | name: my-nutanix-plugin # A unique name for the plugin resource 5 | namespace: eda-system # The system namespace. 6 | spec: 7 | pluginNamespace: eda # The namespace in the EDA deployment holding the fabric associated with this plugin 8 | heartbeatInterval: 30 9 | prismCentralHost: example-host # The IP address or FQDN of the Prism Central 10 | prismCentralTlsVerify: true # To verify TLS of the Prism Central 11 | prismCentralCertificate: "" # If the Prism Central certificate is self signed, add it here to be able to verify from the plugin 12 | authSecretRef: my-nutanix-creds # Credentials are hosted in a separate Secret 13 | 14 | -------------------------------------------------------------------------------- /docs/connect/resources/eda-connect-k8s-controller-config-cr.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: config.eda.nokia.com/v1 2 | kind: ConnectControllerConfig 3 | metadata: 4 | labels: 5 | app.kubernetes.io/name: operator 6 | name: connectcontrollerconfig 7 | namespace: # Refers to the namespace where the OLM operator was installed 8 | spec: 9 | connectPluginName: k8s-controller-plugin 10 | controllerImagePullSecret: eda-k8s-image-secret # Refers to the controller container image registry secret to be used 11 | heartBeat: "10" 12 | logLevel: info 13 | edaNamespace: # The namespace in EDA containing the fabric and resources, this will different from the eda-system namespace. 14 | skipTLSVerify: False 15 | tlsCertificateData: 16 | tlsEnabled: True 17 | -------------------------------------------------------------------------------- /docs/apps/notifier/notifier_query.yml: -------------------------------------------------------------------------------- 1 | apiVersion: notifiers.eda.nokia.com/v1 2 | kind: ClusterNotifier 3 | metadata: 4 | name: interface-down-notifier 5 | namespace: eda-system 6 | spec: 7 | enabled: true 8 | sources: 9 | query: 10 | table: .namespace.node.srl.interface 11 | fields: 12 | - admin-state 13 | - oper-state 14 | - .namespace.node.name 15 | where: admin-state = "enable" and oper-state = "down" 16 | title: Interface Down Alert 17 | template: | 18 | Namespace: {{ index . "namespace.name" }}. 19 | Interface {{ index . "name"}} is DOWN on node {{ index . "namespace.node.name"}}. 20 | (State admin/oper: {{ index . "oper-state" }}/{{ index . "admin-state"}}) 21 | providers: 22 | - discord 23 | -------------------------------------------------------------------------------- /.github/workflows/preview-versioned-docs.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Preview Versioned Docs 3 | on: 4 | workflow_dispatch: 5 | workflow_call: 6 | 7 | jobs: 8 | preview-docs: 9 | if: ${{ !(github.repository == 'nokia-eda/docs') }} 10 | runs-on: ubuntu-24.04 11 | steps: 12 | - name: Checkout __versioned-docs__ branch 13 | uses: actions/checkout@v4 14 | with: 15 | ref: __versioned-docs__ 16 | path: versioned-docs 17 | 18 | - name: Publish preview 19 | uses: cloudflare/wrangler-action@v3 20 | with: 21 | apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} 22 | accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} 23 | command: pages deploy versioned-docs --project-name=eda-docs --branch=${{ secrets.DOCS_VERSIONED_PREVIEW_URL }} 24 | -------------------------------------------------------------------------------- /docs/connect/resources/openshift-helm-values.yaml: -------------------------------------------------------------------------------- 1 | controllerEnvConfig: 2 | connectpluginname: eda-openshift-controller-plugin 3 | heartbeat: "10" 4 | namespace: # The namespace in EDA containing the fabric and resources, this will different from the eda-system namespace. 5 | skiptlsverify: False 6 | loglevel: info 7 | tlscertificatedata: 8 | tlsenabled: True 9 | controllerEnvSecret: 10 | connectHost: https://: # (Caution - Do not use EDA API values, use EDA k8s API values) 11 | connectPassword: 12 | connectUsername: 13 | -------------------------------------------------------------------------------- /docs/user-guide/network-topology/snippets/add.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: topologies.eda.nokia.com/v1alpha1 2 | kind: NetworkTopology 3 | metadata: 4 | generateName: add- 5 | namespace: net-topo-test 6 | spec: 7 | operation: create 8 | 9 | nodeTemplates: 10 | - name: node 11 | nodeProfile: srlinux-ghcr-25.10.1 12 | platform: 7220 IXR-D3L 13 | labels: 14 | eda.nokia.com/security-profile: managed 15 | nodes: 16 | - name: node3 17 | template: node 18 | 19 | linkTemplates: 20 | - name: isl 21 | type: interSwitch 22 | links: 23 | - name: node1-node3 24 | template: isl 25 | endpoints: 26 | - local: 27 | node: node1 28 | interface: ethernet-1-2 29 | remote: 30 | node: node3 31 | interface: ethernet-1-1 32 | -------------------------------------------------------------------------------- /docs/user-guide/network-topology/snippets/delete-1.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: topologies.eda.nokia.com/v1alpha1 2 | kind: NetworkTopology 3 | metadata: 4 | generateName: delete- 5 | namespace: net-topo-test 6 | spec: 7 | operation: delete 8 | 9 | nodeTemplates: 10 | - name: node 11 | nodeProfile: srlinux-ghcr-25.10.1 12 | platform: 7220 IXR-D3L 13 | labels: 14 | eda.nokia.com/security-profile: managed 15 | nodes: 16 | - name: switch3 17 | template: node 18 | 19 | linkTemplates: 20 | - name: isl 21 | type: interSwitch 22 | links: 23 | - name: switch1-switch3 24 | template: isl 25 | endpoints: 26 | - local: 27 | node: switch1 28 | interface: ethernet-1-2 29 | remote: 30 | node: switch3 31 | interface: ethernet-1-1 32 | -------------------------------------------------------------------------------- /docs/user-guide/network-topology/snippets/create.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: topologies.eda.nokia.com/v1alpha1 2 | kind: NetworkTopology 3 | metadata: 4 | generateName: create- #(1)! 5 | namespace: net-topo-test 6 | spec: 7 | operation: create 8 | 9 | nodeTemplates: 10 | - name: node 11 | nodeProfile: srlinux-ghcr-25.10.1 12 | platform: 7220 IXR-D3L 13 | labels: 14 | eda.nokia.com/security-profile: managed 15 | nodes: 16 | - name: node1 17 | template: node 18 | - name: node2 19 | template: node 20 | 21 | linkTemplates: 22 | - name: isl 23 | type: interSwitch 24 | links: 25 | - name: node1-node2 26 | template: isl 27 | endpoints: 28 | - local: 29 | node: node1 30 | interface: ethernet-1-1 31 | remote: 32 | node: node2 33 | interface: ethernet-1-1 34 | -------------------------------------------------------------------------------- /docs/user-guide/network-topology/snippets/two-nodes-1.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: topologies.eda.nokia.com/v1alpha1 2 | kind: NetworkTopology 3 | metadata: 4 | generateName: 2-nodes- 5 | namespace: net-topo-test 6 | spec: 7 | operation: replaceAll 8 | 9 | nodeTemplates: 10 | - name: node 11 | nodeProfile: srlinux-ghcr-25.10.1 12 | platform: 7220 IXR-D3L 13 | labels: 14 | eda.nokia.com/security-profile: managed 15 | nodes: 16 | - name: node1 17 | template: node 18 | - name: node2 19 | template: node 20 | 21 | linkTemplates: 22 | - name: isl 23 | type: interSwitch 24 | links: 25 | - name: node1-node2 26 | template: isl 27 | endpoints: 28 | - local: 29 | node: node1 30 | interface: ethernet-1-1 31 | remote: 32 | node: node2 33 | interface: ethernet-1-1 34 | -------------------------------------------------------------------------------- /docs/user-guide/network-topology/snippets/replace-1.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: topologies.eda.nokia.com/v1alpha1 2 | kind: NetworkTopology 3 | metadata: 4 | generateName: replace- 5 | namespace: net-topo-test 6 | spec: 7 | operation: replace 8 | 9 | nodeTemplates: 10 | - name: node 11 | nodeProfile: srlinux-ghcr-25.10.1 12 | platform: 7220 IXR-D3L 13 | labels: 14 | eda.nokia.com/security-profile: managed 15 | nodes: 16 | - name: node1 17 | template: node 18 | - name: node2 19 | template: node 20 | platform: 7220 IXR-D2L 21 | 22 | linkTemplates: 23 | - name: isl 24 | type: interSwitch 25 | links: 26 | - name: node1-node2 27 | template: isl 28 | endpoints: 29 | - local: 30 | node: node1 31 | interface: ethernet-1-1 32 | remote: 33 | node: node2 34 | interface: ethernet-1-1 35 | -------------------------------------------------------------------------------- /docs/connect/resources/vmware-plugin-instance.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: vmware.eda.nokia.com/v1 2 | kind: VmwarePluginInstance 3 | metadata: 4 | name: my-vmware-plugin-instance # A unique name for the plugin resource (can be the same as the spec.name, or different) 5 | namespace: eda-system # The system namespace. 6 | spec: 7 | pluginNamespace: eda # The namespace in the EDA deployment holding the fabric associated with this plugin 8 | externalId: example-external-id # A unique Identifier for the plugin (can be same as the name) 9 | heartbeatInterval: 30 10 | name: example-vSphere # A unique name for the plugin 11 | vcsaHost: example-host # The IP address of the vCenter Server 12 | vcsaTlsVerify: true # To verify TLS of the VCSA 13 | vcsaCertificate: "" # If the VCSA certificate is self signed, add it here to be able to verify from the plugin 14 | authSecretRef: my-vmware-creds # Credentials are hosted in a separate Secret 15 | -------------------------------------------------------------------------------- /docs/user-guide/clab-integration/topoNodes.yaml: -------------------------------------------------------------------------------- 1 | # https://doc.crds.dev/github.com/nokia-eda/kpt/core.eda.nokia.com/TopoNode/v1@v24.12.1 2 | --- 3 | apiVersion: core.eda.nokia.com/v1 4 | kind: TopoNode 5 | metadata: 6 | name: clab-vlan-srl1 7 | labels: 8 | eda.nokia.com/security-profile: managed 9 | namespace: eda 10 | spec: 11 | nodeProfile: srlinux-clab-24.10.1 12 | operatingSystem: srl 13 | platform: 7220 IXR-D2L 14 | version: 24.10.1 15 | productionAddress: 16 | ipv4: # IP address of the clab-vlan-srl1 node 17 | --- 18 | apiVersion: core.eda.nokia.com/v1 19 | kind: TopoNode 20 | metadata: 21 | name: clab-vlan-srl2 22 | labels: 23 | eda.nokia.com/security-profile: managed 24 | namespace: eda 25 | spec: 26 | nodeProfile: srlinux-clab-24.10.1 27 | operatingSystem: srl 28 | platform: 7220 IXR-D2L 29 | version: 24.10.1 30 | productionAddress: 31 | ipv4: # IP address of the clab-vlan-srl2 node 32 | -------------------------------------------------------------------------------- /docs/blog/subscribe.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/rss 3 | --- 4 | 5 | # Subscribe To This Blog 6 | 7 | If you want to get notified when a new post is published on this blog - consider subscribing via one of the following channels. 8 | 9 | ## RSS 10 | 11 | This blog publishes two RSS feeds: 12 | 13 | - `https://docs.eda.dev/feed_rss_created.xml` - feed is updated whenever a new post is created. 14 | - `https://docs.eda.dev/feed_rss_updated.xml` - feed is updated whenever a new post is **created or updated**. 15 | 16 | Depending on how thoroughly you want to monitor the blog choose between those two feeds. 17 | 18 | ## Email 19 | 20 | You can get notifications in your mailbox by channeling the RSS feed using one of the RSS-to-Email services. 21 | 22 | A popular option is a free [blogtrottr](https://blogtrottr.com/) service, but if it doesn't suit you, there are alternatives like feedrabbit and IFTT. 23 | 24 | In blogtrottr, all you need to do is to enter `https://docs.eda.dev` in the site input field, type in your email and select the "Realtime" delivery option. Then select which feed you want to receive. 25 | -------------------------------------------------------------------------------- /docs/user-guide/network-topology/snippets/two-nodes-2.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: topologies.eda.nokia.com/v1alpha1 2 | kind: NetworkTopology 3 | metadata: 4 | generateName: 2-nodes- 5 | namespace: net-topo-test 6 | spec: 7 | operation: replaceAll 8 | 9 | nodeTemplates: 10 | - name: node 11 | nodeProfile: srlinux-ghcr-25.10.1 12 | platform: 7220 IXR-D3L 13 | labels: 14 | eda.nokia.com/security-profile: managed 15 | nodes: 16 | - name: node1 17 | template: node 18 | - name: node2 19 | template: node 20 | 21 | linkTemplates: 22 | - name: isl 23 | type: interSwitch 24 | - name: edge 25 | type: edge 26 | links: 27 | - name: node1-node2 28 | template: isl 29 | endpoints: 30 | - local: 31 | node: node1 32 | interface: ethernet-1-1 33 | remote: 34 | node: node2 35 | interface: ethernet-1-1 36 | - name: node2-ethernet-1-10 37 | template: edge 38 | endpoints: 39 | - local: 40 | node: node2 41 | interface: ethernet-1-10 42 | -------------------------------------------------------------------------------- /docs/development/terraform/providers-all.tf: -------------------------------------------------------------------------------- 1 | variable "base_url" { 2 | default = "https://eda-demo.test.io:9443" 3 | } 4 | 5 | variable "eda_client_secret" { 6 | default = "your_client_secret" 7 | } 8 | 9 | variable "eda_username" { 10 | default = "your_username" 11 | } 12 | 13 | variable "eda_password" { 14 | default = "your_password" 15 | } 16 | 17 | terraform { 18 | required_providers { 19 | interfaces-v1alpha1 = { 20 | source = "nokia-eda/interfaces-v1alpha1" 21 | } 22 | fabrics-v1alpha1 = { 23 | source = "nokia-eda/fabrics-v1alpha1" 24 | } 25 | # add more providers here 26 | } 27 | } 28 | 29 | provider "interfaces-v1alpha1" { 30 | base_url = var.base_url 31 | eda_client_secret = var.eda_client_secret 32 | eda_username = var.eda_username 33 | eda_password = var.eda_password 34 | } 35 | 36 | provider "fabrics-v1alpha1" { 37 | base_url = var.base_url 38 | eda_client_secret = var.eda_client_secret 39 | eda_username = var.eda_username 40 | eda_password = var.eda_password 41 | } 42 | 43 | # add more providers configs here if needed 44 | -------------------------------------------------------------------------------- /docs/connect/resources/nsx-plugin-instance.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: vmware.eda.nokia.com/v1 2 | kind: NsxPluginInstance 3 | metadata: 4 | name: my-nsx-plugin-instance # A unique name for the plugin resource (can be the same as the spec.name, or different) 5 | namespace: eda-system # The system namespace. 6 | spec: 7 | pluginNamespace: eda # The namespace in the EDA deployment holding the fabric associated with this plugin 8 | externalId: example-external-id # A unique Identifier for the plugin (can be same as the name) 9 | heartbeatInterval: 30 10 | name: example-NSX # A unique name for the plugin 11 | nsxManagementIP: exampleHost # The IP address of the NSX Server 12 | nsxPollInterval: 2 # The plugin will poll NSX for changes every x seconds 13 | nsxTlsVerify: false # To verify TLS of the NSX server 14 | nsxCertificate: "" # If the NSX certificate is self signed, add it here to be able to verify from the plugin 15 | authSecretRef: my-nsx-creds # Credentials are hosted in a separate Secret 16 | vCenters: 17 | - vCenterFQDN: x.y.z # FQDN or IP of the Vcenter as defined in NSX 18 | vmwarePluginID: example-VMWARE # Name of the Vcenter Plugin 19 | -------------------------------------------------------------------------------- /docs/connect/resources/openstack-neutron-eda-config.yaml: -------------------------------------------------------------------------------- 1 | parameter_defaults: 2 | ControllerExtraConfig: 3 | neutron::config::plugin_ml2_config: 4 | DEFAULT/nic_mapping_provisioning: 5 | value: 'True' 6 | ml2_eda_connect/plugin_name: 7 | value: '' 8 | ml2_eda_connect/api_host: 9 | value: 'https://api.eda.example.com:6443' 10 | ml2_eda_connect/api_namespace: 11 | value: 'default' 12 | ml2_eda_connect/api_token: 13 | value: '' 14 | ml2_eda_connect/ca_cert_path: 15 | value: '/etc/pki/ca-trust/source/anchors/eda.crt.pem' 16 | NeutronFirewallDriver: openvswitch 17 | NeutronOVSFirewallDriver: openvswitch 18 | NeutronServicePlugins: router,segments,trunk,qos,network_segment_range,port_forwarding,conntrack_helper,nic_mapping,log 19 | NeutronTypeDrivers: vxlan,vlan,flat,gre 20 | NeutronNetworkType: vlan,vxlan 21 | NeutronMechanismDrivers: eda_connect,openvswitch,sriovnicswitch,l2population 22 | NeutronAgentExtensions: nic-mapping,qos 23 | NeutronPluginExtensions: eda_network,qos,port_security,tag_ports_during_bulk_creation,dns_domain_keywords 24 | 25 | -------------------------------------------------------------------------------- /docs/software-install/non-production/index.md: -------------------------------------------------------------------------------- 1 | # Installation Overview 2 | 3 | There are several non-production deployment options that can be used to run and deploy EDA in a lab environment for testing, development and demo purposes: 4 | 5 | [Own On-prem cluster](./on-prem-cluster.md) 6 | 7 | : Use your own Kubernetes cluster to deploy EDA. This can be used for most types of standard Kubernetes clusters. 8 | 9 | [Playground using KinD](../../getting-started/try-eda.md) 10 | 11 | : Deploy EDA in a Kubernetes environment running on Linux server. 12 | 13 | [Playground on macOS](./macos.md) 14 | 15 | : Deploy EDA Playground in a Kubernetes environment running on your personal Macbook, whether it is ARM or Intel-based. 16 | 17 | [Playground on WSL](./wsl.md) 18 | 19 | : Deploy EDA Playground in a Kubernetes environment running on your personal Windows machine, be it a laptop or a desktop. 20 | 21 | You can also customize your EDA installation following the [Installation customization](../deploying-eda/installing-the-eda-application.md#customizing-the-installation) guide. This will provide you with the details on how to manipulate the kpt packages to fit your specific needs and design. 22 | -------------------------------------------------------------------------------- /docs/examples/l2-vnet.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: services.eda.nokia.com/v1alpha1 2 | kind: VirtualNetwork 3 | metadata: 4 | name: vnet1 5 | namespace: eda 6 | spec: 7 | bridgeDomains: 8 | - name: bd1 9 | spec: 10 | eviPool: evi-pool 11 | l2proxyARPND: 12 | dynamicLearning: 13 | ageTime: 2000 14 | enabled: true 15 | sendRefresh: 2000 16 | ipDuplication: 17 | enabled: true 18 | holdDownTime: 10 19 | monitoringWindow: 10 20 | numMoves: 4 21 | proxyARP: true 22 | proxyND: false 23 | tableSize: 250 24 | macAging: 300 25 | tunnelIndexPool: tunnel-index-pool 26 | type: EVPNVXLAN 27 | vniPool: vni-pool 28 | vlans: 29 | - name: storage 30 | spec: 31 | bridgeDomain: bd1 32 | interfaceSelector: 33 | - eda.nokia.com/edgeLinkType=storage 34 | vlanID: pool 35 | vlanPool: vlan-pool 36 | - name: compute 37 | spec: 38 | bridgeDomain: bd1 39 | interfaceSelector: 40 | - eda.nokia.com/edgeLinkType=compute 41 | vlanID: pool 42 | vlanPool: vlan-pool 43 | -------------------------------------------------------------------------------- /docs/user-guide/network-topology/snippets/replaceAll-1.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: topologies.eda.nokia.com/v1alpha1 2 | kind: NetworkTopology 3 | metadata: 4 | generateName: replace-all- 5 | namespace: net-topo-test 6 | spec: 7 | operation: replaceAll 8 | 9 | nodeTemplates: 10 | - name: node 11 | nodeProfile: srlinux-ghcr-25.10.1 12 | platform: 7220 IXR-D3L 13 | labels: 14 | eda.nokia.com/security-profile: managed 15 | nodes: 16 | - name: switch1 17 | template: node 18 | - name: switch2 19 | template: node 20 | - name: switch3 21 | template: node 22 | 23 | linkTemplates: 24 | - name: isl 25 | type: interSwitch 26 | links: 27 | - name: switch1-switch2 28 | template: isl 29 | endpoints: 30 | - local: 31 | node: switch1 32 | interface: ethernet-1-1 33 | remote: 34 | node: switch2 35 | interface: ethernet-1-1 36 | - name: switch1-switch3 37 | template: isl 38 | endpoints: 39 | - local: 40 | node: switch1 41 | interface: ethernet-1-2 42 | remote: 43 | node: switch3 44 | interface: ethernet-1-1 45 | -------------------------------------------------------------------------------- /docs/examples/my-fabric-update-transaction-dryrun.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: core.eda.nokia.com/v1 2 | kind: Transaction 3 | metadata: 4 | name: update-fabric-dryrun 5 | namespace: eda 6 | spec: 7 | description: "Updading fabric from using eBGP for overlay protocol to iBGP" 8 | dryRun: true 9 | keepDetailedLog: true 10 | items: 11 | - replace: 12 | apiVersion: fabrics.eda.nokia.com/v1alpha1 13 | kind: Fabric 14 | metadata: 15 | name: my-fabric 16 | spec: 17 | leafNodeSelector: 18 | - eda.nokia.com/role=leaf 19 | linkSelector: 20 | - eda.nokia.com/role=interSwitch 21 | spineNodeSelector: 22 | - eda.nokia.com/role=spine 23 | systemPoolIPV4: systemipv4-pool 24 | islPoolIPV4: ipv4-pool 25 | underlayProtocol: 26 | asnPool: asn-pool 27 | protocol: 28 | - ebgp 29 | overlayProtocol: 30 | protocol: ibgp 31 | autonomousSystem: 10001 32 | clusterID: 2.2.2.2 33 | rrClientNodeSelector: 34 | - eda.nokia.com/role in (leaf) 35 | rrNodeSelector: 36 | - eda.nokia.com/role in (spine) 37 | -------------------------------------------------------------------------------- /docs/examples/my-fabric-update-transaction-prod.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: core.eda.nokia.com/v1 2 | kind: Transaction 3 | metadata: 4 | name: update-fabric-prod 5 | namespace: eda 6 | spec: 7 | description: "Updading fabric from using eBGP for overlay protocol to iBGP" 8 | dryRun: false 9 | keepDetailedLog: true 10 | items: 11 | - replace: 12 | apiVersion: fabrics.eda.nokia.com/v1alpha1 13 | kind: Fabric 14 | metadata: 15 | name: my-fabric 16 | spec: 17 | leafNodeSelector: 18 | - eda.nokia.com/role=leaf 19 | linkSelector: 20 | - eda.nokia.com/role=interSwitch 21 | spineNodeSelector: 22 | - eda.nokia.com/role=spine 23 | systemPoolIPV4: systemipv4-pool 24 | islPoolIPV4: ipv4-pool 25 | underlayProtocol: 26 | asnPool: asn-pool 27 | protocol: 28 | - ebgp 29 | overlayProtocol: 30 | protocol: ibgp 31 | autonomousSystem: 10001 32 | clusterID: 2.2.2.2 33 | rrClientNodeSelector: 34 | - eda.nokia.com/role in (leaf) 35 | rrNodeSelector: 36 | - eda.nokia.com/role in (spine) 37 | -------------------------------------------------------------------------------- /docs/development/ansible/index.md: -------------------------------------------------------------------------------- 1 | # Ansible Collections for Nokia EDA 2 | 3 | [:octicons-link-external-16: ](https://ansible.eda.dev) · [:octicons-link-external-16: Nokia EDA Collection in Galaxy][galaxy-namespace] 4 | 5 | [Ansible](https://docs.ansible.com) is an open-source automation platform that allows you to automate tasks across a wide range of IT environments. It uses a simple, human-readable language to describe automation tasks, making it accessible to both developers and operations teams. 6 | In order to extend the platform and meet specific needs and target environments, Ansible allows users to create custom modules and plugins that are packaged as [Ansible collections](https://docs.ansible.com/ansible/latest/collections_guide/index.html) and hosted at [Ansible Galaxy](https://galaxy.ansible.com/ui/). 7 | 8 | Nokia provides a set of Ansible collections specifically designed for the Event Driven Automation (EDA) platform that allow users to automate interactions with the EDA platform and manage the resources under its management. 9 | 10 | Go to **https://ansible.eda.dev** for a complete reference and examples. 11 | 12 | [galaxy-namespace]: https://galaxy.ansible.com/ui/namespaces/nokia/?sort=name&keywords=eda&page=1 13 | -------------------------------------------------------------------------------- /docs/digital-twin/node-shell: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Script to open shell into a simnode in EDA CX 4 | # Usage: ./node-shell [:-eda] [:-eda-system] 5 | 6 | # provide the SimNode name as the first argument 7 | # e.g. node-shell client1 8 | 9 | SIMNODE_NAME=${1} 10 | 11 | # user namespace to look up the TopoNode in 12 | # default is eda 13 | USER_NS=${2:-eda} 14 | 15 | # core namespace to look up cx pods in 16 | # default is eda 17 | CORE_NS=${3:-eda-system} 18 | 19 | function list_simnodes() { 20 | kubectl --namespace ${USER_NS} get simnodes 21 | } 22 | 23 | if [ -z "${SIMNODE_NAME}" ]; then 24 | echo "Usage: $0 [:-eda] [:-eda-system]" 25 | echo " Available nodes are:" 26 | list_simnodes | sed 's/^/ /' 27 | exit 1 28 | fi 29 | 30 | # open shell to the cx pod 31 | kubectl -n ${CORE_NS} exec -it \ 32 | $(kubectl get -n ${CORE_NS} pods \ 33 | -l cx-node-namespace/${USER_NS} -l cx-pod-name=${SIMNODE_NAME} -o jsonpath="{.items[0].metadata.name}") -- sh -c "(bash -l || ash | sh)" \ 34 | || { 35 | echo "Failed to open shell into node ${SIMNODE_NAME} in ${USER_NS} namespace." 36 | echo "Available nodes are:" 37 | list_simnodes | sed 's/^/ /' 38 | exit 1 39 | } -------------------------------------------------------------------------------- /.github/workflows/deploy-docs.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Deploy Docs 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | target-branch: 7 | description: "Target cloudflare branch for deployment" 8 | required: true 9 | type: string 10 | workflow_call: 11 | inputs: 12 | target-branch: 13 | description: "Target cloudflare branch for deployment" 14 | required: true 15 | type: string 16 | 17 | jobs: 18 | release-docs: 19 | runs-on: ubuntu-24.04 20 | steps: 21 | - name: Checkout __versioned-docs__ branch 22 | uses: actions/checkout@v4 23 | with: 24 | ref: __versioned-docs__ 25 | path: versioned-docs 26 | 27 | - name: Set branch env var 28 | id: set-branch 29 | run: | 30 | if [ "${{ inputs.target-branch }}" = "main" ]; then 31 | echo "CF_BRANCH=main" >> $GITHUB_ENV 32 | else 33 | echo "CF_BRANCH=${{ secrets.DOCS_VERSIONED_PREVIEW_URL }}" >> $GITHUB_ENV 34 | fi 35 | 36 | - name: Publish preview 37 | uses: cloudflare/wrangler-action@v3 38 | with: 39 | apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} 40 | accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} 41 | command: pages deploy versioned-docs --project-name=eda-docs --branch=${{ env.CF_BRANCH }} 42 | -------------------------------------------------------------------------------- /docs/stylesheets/steps.css: -------------------------------------------------------------------------------- 1 | :root>* { 2 | --md-steps-bg-color: var(--md-code-bg-color); 3 | --md-steps-fg-color: var(--md-code-fg-color); 4 | --md-steps-border-color: hsla(0, 0%, 75%, 1); 5 | } 6 | 7 | :root>*[data-md-color-scheme="slate"] { 8 | --md-steps-border-color: hsla(225, 15%, 30%, 1); 9 | } 10 | 11 | .md-typeset div.steps>ol { 12 | counter-reset: item; 13 | } 14 | 15 | .md-typeset div.steps>ol>li { 16 | position: relative; 17 | padding-left: 1em; 18 | list-style: none; 19 | } 20 | 21 | .md-typeset div.steps>ol>li::before { 22 | position: absolute; 23 | top: 0; 24 | left: 0; 25 | z-index: -1; 26 | display: block; 27 | width: 1.75em; 28 | height: 1.75em; 29 | margin-left: -1.25em; 30 | color: var(--md-steps-fg-color); 31 | font-weight: 600; 32 | font-size: 0.9em; 33 | text-align: center; 34 | background-color: var(--md-steps-bg-color); 35 | border: 1px solid var(--md-steps-border-color); 36 | border-radius: 100px; 37 | content: counter(item); 38 | counter-increment: item; 39 | } 40 | 41 | .md-typeset div.steps>ol>li::after { 42 | position: absolute; 43 | top: 0; 44 | bottom: 0; 45 | left: -0.36em; 46 | display: block; 47 | width: 1px; 48 | margin-top: 2em; 49 | border-left: 1px solid var(--md-steps-border-color); 50 | content: ''; 51 | } 52 | -------------------------------------------------------------------------------- /docs/user-guide/network-topology/snippets/two-nodes-3.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: topologies.eda.nokia.com/v1alpha1 2 | kind: NetworkTopology 3 | metadata: 4 | generateName: 2-nodes- 5 | namespace: net-topo-test 6 | spec: 7 | operation: replaceAll 8 | 9 | nodeTemplates: 10 | - name: node 11 | nodeProfile: srlinux-ghcr-25.10.1 12 | platform: 7220 IXR-D3L 13 | labels: 14 | eda.nokia.com/security-profile: managed 15 | nodes: 16 | - name: node1 17 | template: node 18 | - name: node2 19 | template: node 20 | 21 | linkTemplates: 22 | - name: isl 23 | type: interSwitch 24 | - name: edge 25 | type: edge 26 | links: 27 | - name: node1-node2 28 | template: isl 29 | endpoints: 30 | - local: 31 | node: node1 32 | interface: ethernet-1-1 33 | remote: 34 | node: node2 35 | interface: ethernet-1-1 36 | - name: node2-ethernet-1-10 37 | template: edge 38 | endpoints: 39 | - local: 40 | node: node2 41 | interface: ethernet-1-10 42 | sim: 43 | simNode: server2 44 | simNodeInterface: eth1 45 | simulation: 46 | simNodeTemplates: 47 | - name: multitool 48 | type: Linux #(1)! 49 | image: ghcr.io/srl-labs/network-multitool:latest 50 | simNodes: 51 | - name: server2 52 | template: multitool 53 | -------------------------------------------------------------------------------- /docs/user-guide/clab-integration/topoLink.yaml: -------------------------------------------------------------------------------- 1 | # https://doc.crds.dev/github.com/nokia-eda/kpt/core.eda.nokia.com/TopoLink/v1@v24.12.1 2 | --- 3 | apiVersion: core.eda.nokia.com/v1 4 | kind: TopoLink 5 | metadata: 6 | name: srl1-client1 7 | namespace: eda 8 | spec: 9 | links: 10 | - local: 11 | node: clab-vlan-srl1 12 | interface: ethernet-1/1 13 | interfaceResource: clab-vlan-srl1-ethernet-1-1 14 | remote: 15 | node: clab-vlan-client1 16 | interface: eth1 17 | interfaceResource: eth1 18 | type: edge 19 | --- 20 | apiVersion: core.eda.nokia.com/v1 21 | kind: TopoLink 22 | metadata: 23 | name: srl1-srl2 24 | namespace: eda 25 | spec: 26 | links: 27 | - local: 28 | node: clab-vlan-srl1 29 | interface: ethernet-1/10 30 | interfaceResource: clab-vlan-srl1-ethernet-1-10 31 | remote: 32 | node: clab-vlan-srl2 33 | interface: ethernet-1/10 34 | interfaceResource: clab-vlan-srl2-ethernet-1-10 35 | type: interSwitch 36 | --- 37 | apiVersion: core.eda.nokia.com/v1 38 | kind: TopoLink 39 | metadata: 40 | name: srl2-client2 41 | namespace: eda 42 | spec: 43 | links: 44 | - local: 45 | node: clab-vlan-srl2 46 | interface: ethernet-1/1 47 | interfaceResource: clab-vlan-srl2-ethernet-1-1 48 | remote: 49 | node: clab-vlan-client2 50 | interface: eth1 51 | interfaceResource: eth1 52 | type: edge 53 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | variables: 2 | GIT_DEPTH: 0 3 | MKDOCS_IMAGE: cr.srlinux.dev/pub/mkdocs-material-insiders:9.6.1-insiders-4.53.15-hellt 4 | 5 | htmltest: 6 | stage: test 7 | needs: 8 | - job: build 9 | artifacts: true 10 | image: 11 | name: cr.srlinux.dev/pub/debian:bookworm-slim 12 | script: 13 | - apt update && apt install -y --no-install-recommends curl file ca-certificates 14 | - curl https://htmltest.wjdp.uk | bash 15 | - ./bin/htmltest -c docs/htmltest.yml 16 | rules: 17 | - if: $CI_PIPELINE_SOURCE == "merge_request_event" 18 | 19 | build: 20 | stage: test 21 | image: 22 | name: $MKDOCS_IMAGE 23 | entrypoint: [""] 24 | script: 25 | - mkdocs build --site-dir site 26 | artifacts: 27 | paths: 28 | - site 29 | rules: 30 | - if: $CI_PIPELINE_SOURCE == "merge_request_event" 31 | 32 | upload_preview: 33 | stage: test 34 | needs: 35 | - job: build 36 | artifacts: true 37 | image: 38 | name: node:lts-alpine 39 | before_script: 40 | - npm install -g wrangler 41 | script: 42 | - wrangler pages deploy site --project-name=eda-docs --branch=$CI_COMMIT_REF_NAME 43 | rules: 44 | - if: $CI_PIPELINE_SOURCE == "merge_request_event" 45 | 46 | pages: 47 | stage: deploy 48 | image: 49 | name: $MKDOCS_IMAGE 50 | entrypoint: [""] 51 | script: 52 | - mkdocs build --site-dir public 53 | artifacts: 54 | paths: 55 | - public 56 | rules: 57 | - if: $CI_COMMIT_BRANCH == "main" 58 | -------------------------------------------------------------------------------- /docs/software-install/deploying-eda/index.md: -------------------------------------------------------------------------------- 1 | # Deploying EDA 2 | 3 | These are the major steps for installing the EDA deployment. This applies to both Air-gapped installations and Internet based installations. Some steps will differ depending on the type of install, this will be clearly called out highlighting both options. 4 | 5 | /// html | div.steps 6 | 7 | 1. [Preparing the EDAADM configuration file](setting-up-the-eda-virtual-machine-nodes.md#preparing-the-edaadm-configuration-file) 8 | This task describes the details of the EDAADM configuration file and how to set it up. 9 | 10 | 2. [Generating the Talos machine configurations](setting-up-the-eda-virtual-machine-nodes.md#generating-the-talos-machine-configurations) 11 | Using the EDA ADM tool and the configuration file, this task generates specific Talos machine configuration files for each Talos VM. 12 | 13 | 3. [Deploying the Talos virtual machines](setting-up-the-eda-virtual-machine-nodes.md#deploying-the-talos-virtual-machines) 14 | This task describes how to use the Talos base image and machine configuration files to deploy the Talos VMs in your KVM or VMware vSphere environment. 15 | 16 | 4. [Bootstrap the Talos Kubernetes cluster](bootstrap-the-talos-kubernetes-cluster.md) 17 | This task bootstraps the Talos Kubernetes environment using the VMs you have created. 18 | 19 | 5. [Installing the EDA application](installing-the-eda-application.md) 20 | Using the EDA Installation playground, this step installs EDA on the Kubernetes environment in the EDA nodes. 21 | 22 | /// 23 | -------------------------------------------------------------------------------- /docs/digital-twin/node-ssh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Script to SSH into a specific node in the EDA topology 4 | # Usage: ./node-ssh [:-eda] [:-eda-system] 5 | 6 | # provide the TopoNode name as the first argument 7 | # e.g. node-ssh leaf1 8 | NODE_NAME=${1} 9 | 10 | # user namespace to look up the TopoNode in 11 | # default is eda 12 | USER_NS=${2:-eda} 13 | 14 | # core namespace to cx pods in 15 | # default is eda 16 | CORE_NS=${3:-eda-system} 17 | 18 | function list_nodes() { 19 | kubectl --namespace ${CORE_NS} get pods -l cx-cluster-name=eda \ 20 | -o=jsonpath='{.items[*].metadata.labels.cx-pod-name}' | tr ' ' '\n' 21 | } 22 | 23 | if [ -z "${NODE_NAME}" ]; then 24 | echo "Usage: $0 []" 25 | echo " Available nodes are:" 26 | list_nodes | sed 's/^/ /' 27 | exit 1 28 | fi 29 | 30 | NODE_ADDR=$(kubectl -n ${USER_NS} get targetnode "${NODE_NAME}" -o jsonpath='{.spec.address}') 31 | if [ -z "${NODE_ADDR}" ]; then 32 | echo "Node ${NODE_NAME} not found in namespace ${USER_NS}; available nodes are:" 33 | list_nodes | sed 's/^/ /' 34 | exit 1 35 | fi 36 | 37 | USERNAME=admin 38 | # SSH to the node from the eda-toolbox pod 39 | kubectl -n ${CORE_NS} exec -it \ 40 | $(kubectl get -n ${CORE_NS} pods \ 41 | -l eda.nokia.com/app=eda-toolbox -o jsonpath="{.items[0].metadata.name}") \ 42 | -- ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \ 43 | -p 22 "${USERNAME}@${NODE_ADDR}" || { 44 | echo "Failed to SSH into node ${NODE_NAME} at ${NODE_ADDR}" 45 | exit 1 46 | } -------------------------------------------------------------------------------- /docs/overrides/partials/copyright.html: -------------------------------------------------------------------------------- 1 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /docs/user-guide/clab-integration/interface.yaml: -------------------------------------------------------------------------------- 1 | ######################### 2 | #### srl1 Interface ##### 3 | ######################### 4 | --- 5 | apiVersion: interfaces.eda.nokia.com/v1alpha1 6 | kind: Interface 7 | metadata: 8 | labels: 9 | role: access 10 | name: clab-vlan-srl1-ethernet-1-1 11 | namespace: eda 12 | spec: 13 | enabled: true 14 | encapType: "null" 15 | lldp: true 16 | members: 17 | - enabled: true 18 | interface: ethernet-1-1 19 | node: clab-vlan-srl1 20 | type: interface 21 | 22 | --- 23 | apiVersion: interfaces.eda.nokia.com/v1alpha1 24 | kind: Interface 25 | metadata: 26 | labels: 27 | role: interSwitch 28 | name: clab-vlan-srl1-ethernet-1-10 29 | namespace: eda 30 | spec: 31 | enabled: true 32 | encapType: "null" 33 | lldp: true 34 | members: 35 | - enabled: true 36 | interface: ethernet-1-10 37 | node: clab-vlan-srl1 38 | type: interface 39 | 40 | ######################### 41 | #### srl2 Interface ##### 42 | ######################### 43 | --- 44 | apiVersion: interfaces.eda.nokia.com/v1alpha1 45 | kind: Interface 46 | metadata: 47 | labels: 48 | role: access 49 | name: clab-vlan-srl2-ethernet-1-1 50 | namespace: eda 51 | spec: 52 | enabled: true 53 | encapType: "null" 54 | lldp: true 55 | members: 56 | - enabled: true 57 | interface: ethernet-1-1 58 | node: clab-vlan-srl2 59 | type: interface 60 | 61 | --- 62 | apiVersion: interfaces.eda.nokia.com/v1alpha1 63 | kind: Interface 64 | metadata: 65 | labels: 66 | role: interSwitch 67 | name: clab-vlan-srl2-ethernet-1-10 68 | namespace: eda 69 | spec: 70 | enabled: true 71 | encapType: "null" 72 | lldp: true 73 | members: 74 | - enabled: true 75 | interface: ethernet-1-10 76 | node: clab-vlan-srl2 77 | type: interface 78 | -------------------------------------------------------------------------------- /docs/connect/resources/openstack-container-prepare-params.yaml: -------------------------------------------------------------------------------- 1 | parameter_defaults: 2 | ContainerImagePrepare: 3 | - push_destination: true 4 | set: 5 | ceph_alertmanager_image: ose-prometheus-alertmanager 6 | ceph_alertmanager_namespace: registry.redhat.io/openshift4 7 | ceph_alertmanager_tag: v4.12 8 | ceph_grafana_image: rhceph-6-dashboard-rhel9 9 | ceph_grafana_namespace: registry.redhat.io/rhceph 10 | ceph_grafana_tag: latest 11 | ceph_image: rhceph-6-rhel9 12 | ceph_namespace: registry.redhat.io/rhceph 13 | ceph_node_exporter_image: ose-prometheus-node-exporter 14 | ceph_node_exporter_namespace: registry.redhat.io/openshift4 15 | ceph_node_exporter_tag: v4.12 16 | ceph_prometheus_image: ose-prometheus 17 | ceph_prometheus_namespace: registry.redhat.io/openshift4 18 | ceph_prometheus_tag: v4.12 19 | ceph_tag: latest 20 | name_prefix: openstack- 21 | name_suffix: '' 22 | namespace: registry.redhat.io/rhosp-rhel9 23 | neutron_driver: ovn 24 | rhel_containers: False 25 | tag: 17.1 26 | excludes: 27 | - neutron-server 28 | - neutron-openvswitch-agent 29 | - push_destination: true 30 | set: 31 | name_prefix: rhosp17-1-openstack- 32 | name_suffix: '' 33 | namespace: registry.connect.redhat.com/nokia-ni 34 | neutron_driver: null 35 | rhel_containers: false 36 | tag: '17.1' 37 | includes: 38 | - neutron-server 39 | - neutron-openvswitch-agent 40 | tag_from_label: '{version}-{release}' 41 | ContainerImageRegistryLogin: true 42 | ContainerImageRegistryCredentials: 43 | registry.connect.redhat.com: 44 | |: "" 45 | 46 | -------------------------------------------------------------------------------- /docs/overrides/partials/comments.html: -------------------------------------------------------------------------------- 1 | {% if page.meta.comments %} 2 |

{{ lang.t("meta.comments") }}

3 | 8 | 9 | 10 | 38 | {% endif %} -------------------------------------------------------------------------------- /docs/development/api/client-secret.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | export EDA_API_URL="${EDA_API_URL:-https://myinstance.eda.rocks:9443}" 4 | export KC_KEYCLOAK_URL="${EDA_API_URL}/core/httpproxy/v1/keycloak/" 5 | export KC_REALM="master" 6 | export KC_CLIENT_ID="admin-cli" 7 | export KC_USERNAME="${KC_USERNAME:-admin}" 8 | export KC_PASSWORD="${KC_PASSWORD:-admin}" 9 | export EDA_REALM="eda" 10 | export API_CLIENT_ID="eda" 11 | 12 | # Get access token 13 | KC_ADMIN_ACCESS_TOKEN=$(curl -sk \ 14 | -X POST "$KC_KEYCLOAK_URL/realms/$KC_REALM/protocol/openid-connect/token" \ 15 | -H "Content-Type: application/x-www-form-urlencoded" \ 16 | -d "grant_type=password" \ 17 | -d "client_id=$KC_CLIENT_ID" \ 18 | -d "username=$KC_USERNAME" \ 19 | -d "password=$KC_PASSWORD" \ 20 | | jq -r '.access_token') 21 | 22 | if [ -z "$KC_ADMIN_ACCESS_TOKEN" ]; then 23 | echo "Failed to obtain keycloak admin token" 24 | exit 1 25 | fi 26 | 27 | 28 | # Fetch all clients in the 'eda-realm' 29 | KC_CLIENTS=$(curl -sk \ 30 | -X GET "$KC_KEYCLOAK_URL/admin/realms/$EDA_REALM/clients" \ 31 | -H "Authorization: Bearer $KC_ADMIN_ACCESS_TOKEN" \ 32 | -H "Content-Type: application/json") 33 | 34 | # Get the `eda` client's ID 35 | EDA_CLIENT_ID=$(echo "$KC_CLIENTS" | jq -r ".[] | select(.clientId==\"${API_CLIENT_ID}\") | .id") 36 | 37 | if [ -z "$EDA_CLIENT_ID" ]; then 38 | echo "Client 'eda' not found in realm 'eda-realm'" 39 | exit 1 40 | fi 41 | 42 | # Fetch the client secret 43 | EDA_CLIENT_SECRET=$(curl -sk \ 44 | -X GET "$KC_KEYCLOAK_URL/admin/realms/$EDA_REALM/clients/$EDA_CLIENT_ID/client-secret" \ 45 | -H "Authorization: Bearer $KC_ADMIN_ACCESS_TOKEN" \ 46 | -H "Content-Type: application/json" \ 47 | | jq -r '.value') 48 | 49 | if [ -z "$EDA_CLIENT_SECRET" ]; then 50 | echo "Failed to fetch client secret" 51 | exit 1 52 | fi 53 | 54 | echo "$EDA_CLIENT_SECRET" -------------------------------------------------------------------------------- /layouts/custom.yml: -------------------------------------------------------------------------------- 1 | size: 2 | width: 1200 3 | height: 630 4 | layers: 5 | # Background 6 | - background: 7 | image: layouts/bg.webp 8 | color: "#00000033" 9 | # Logo 10 | - background: 11 | image: docs/images/eda.svg 12 | size: 13 | width: 500 14 | height: 500 15 | origin: end center 16 | offset: 17 | x: -100 18 | # Title 19 | - size: { width: 730, height: 310 } 20 | offset: { x: 62, y: 160 } 21 | typography: 22 | # show custom title from the page meta if defined, 23 | # otherwise use the page title from markdown heading 24 | content: >- 25 | {%- if page.meta.title -%} 26 | {{ page.meta.title }} 27 | {%- else -%} 28 | {{ page.title }} 29 | {%- endif -%} 30 | align: start 31 | line: 32 | amount: 3 33 | height: 1.25 34 | font: 35 | style: Thin 36 | # EDA name 37 | - size: { width: 300, height: 100 } 38 | offset: 39 | x: 62 40 | y: 20 41 | typography: 42 | content: EDA 43 | font: 44 | style: Bold 45 | 46 | definitions: 47 | - &page_title_with_site_name >- 48 | {%- if not page.is_homepage -%} 49 | {{ page.meta.get("title", page.title) }} - {{ config.site_name }} 50 | {%- else -%} 51 | {{ page.meta.get("title", page.title) }} 52 | {%- endif -%} 53 | 54 | - &page_description >- 55 | {{ page.meta.get("description", config.site_description) or "" }} 56 | 57 | tags: 58 | og:type: website 59 | og:title: *page_title_with_site_name 60 | og:description: *page_description 61 | og:image: "{{ image.url }}" 62 | og:image:type: "{{ image.type }}" 63 | og:image:width: "{{ image.width }}" 64 | og:image:height: "{{ image.height }}" 65 | og:url: "{{ page.canonical_url }}" 66 | 67 | twitter:card: summary_large_image 68 | twitter:title: *page_title_with_site_name 69 | twitter:description: *page_description 70 | twitter:image: "{{ image.url }}" 71 | -------------------------------------------------------------------------------- /docs/development/apps/scripts/index.md: -------------------------------------------------------------------------------- 1 | # Script Apps a.k.a. Intents 2 | 3 | Script applications (also often referred to as _intents_) are EDA applications powered by Python scripts that are executed as a result of some external event. The simplest event is a user creating or modifying a resource in EDA that triggers a script app to be executed as a reaction to this event. 4 | 5 | For example, when a user creates an instance of a `Banner` resource via any of the EDA interfaces, the script application associated with the `Banner` resource is triggered to execute its logic - in this case, to configure a banner message on a network device. 6 | 7 | There exists three types of scripts: 8 | 9 | * `config` 10 | * `state` 11 | * `conversion` 12 | 13 | Among these, `config` and `state` are the most common. 14 | 15 | `config` scripts[^1] are triggered when a resource is created, updated or deleted, and typically result in transactions to targets describing intended configuration. 16 | 17 | `state` scripts[^2] are responsible for alarm generation, subscription and normalization of telemetry data, and publishing updates to the `status` field of resources, or the creation of state-only resources. 18 | 19 | `conversion` scripts are run when a resource is converted from one version to another, i.e. only during upgrades and resource version translation. 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | * :material-hammer-screwdriver:{ .middle } **App Example** 28 | 29 | --- 30 | 31 | Practical walkthrough of a simple script app. 32 | 33 | [:octicons-arrow-right-24: Banner application walkthrough](banner-script.md) 34 | 35 | * :octicons-question-16:{ .middle } **More reading?** 36 | 37 | --- 38 | 39 | Learn more about the Config and State scripts. 40 | 41 | [:octicons-arrow-right-24: Config scripts](config.md) 42 | 43 |
44 | 45 | [^1]: Execute inside EDA Config Engine. 46 | [^2]: Execute inside EDA State Engine. 47 | -------------------------------------------------------------------------------- /docs/software-install/air-gapped/index.md: -------------------------------------------------------------------------------- 1 | # Air-gapped setup 2 | 3 | In case the installation will be Air-gapped[^1], this section provides steps on how to set up the Assets VM and load it with the necessary assets for deploying EDA in an Air-gapped environment. 4 | 5 | ## Conceptual Overview 6 | 7 | In an Air-Gapped environment, an Assets VM is deployed that will provide the services that will serve the container images, git repositories and artifacts used during installation of the EDA Talos Kubernetes cluster and EDA itself. 8 | 9 | The goal of the Air-Gapped solution design is to allow flexibility in the deployment and content of the Assets VM in the Air-Gapped environment. By providing a standalone Assets VM without any assets automatically included, there is freedom of choice of what assets are uploaded to the Assets VM. 10 | 11 | It allows for a single Assets VM to be used for multiple deployments and versions of EDA, as the assets for multiple versions of EDA can be uploaded to the same Assets VM. 12 | 13 | Similarly, by splitting up the assets in bundles, it is possible to only upload specific content to the Assets VM. The bundle concept also allows for the creation of custom bundles, for instance for 3rd party Apps, so they can also be hosted on the Assets VM. 14 | 15 | ## Environments 16 | 17 | Two environments will be discussed and used in an air-gapped installation: 18 | 19 | *Public Environment* 20 | : This environment has Internet access. You use a system with Internet access to create the Assets VM image and to download all the necessary assets and tools. 21 | 22 | *Air-gapped Environment* 23 | : This environment does not have Internet access. It is the environment in which EDA is deployed. 24 | 25 | In each environment, you must have a system from which you can execute the steps. You can use a system to first connect to the internet, execute the steps for the public network and then move the same system to the Air-gapped environment to continue. Or, you can have two systems, and you would copy the data from the public system to the Air-Gapped system. More details on the requirements for these systems are included later in this document. 26 | 27 | For each section, there will be a note in which environment the section applies. 28 | 29 | [^1]: An Air-gapped environment is an environment that does not have network connectivity to the Internet. 30 | -------------------------------------------------------------------------------- /.github/workflows/preview-latest-docs.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Preview latest docs 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | 9 | jobs: 10 | preview-latest-docs: 11 | runs-on: ubuntu-24.04 12 | # do not run on nokia-eda/docs repo 13 | if: ${{ !(github.repository == 'nokia-eda/docs') }} 14 | env: 15 | BRANCH_NAME: ${{ github.head_ref || github.ref_name }} 16 | permissions: 17 | pull-requests: write 18 | issues: write 19 | contents: read 20 | deployments: write 21 | repository-projects: read 22 | packages: read 23 | 24 | steps: 25 | - name: Checkout 26 | uses: actions/checkout@v4 27 | 28 | - name: Login to GitHub Container Registry 29 | uses: docker/login-action@v3 30 | with: 31 | registry: ghcr.io 32 | username: ${{ github.actor }} 33 | password: ${{ secrets.GITHUB_TOKEN }} 34 | 35 | - name: Build docs 36 | run: bash run.sh build-docs 37 | 38 | - name: User preview branch name if push to main 39 | if: github.ref == 'refs/heads/main' 40 | env: 41 | PREVIEW_BRANCH: ${{ secrets.DOCS_PREVIEW_URL }} 42 | run: | 43 | if [ "$BRANCH_NAME" = "main" ]; then 44 | echo "BRANCH_NAME=${PREVIEW_BRANCH}" >> $GITHUB_ENV 45 | fi 46 | 47 | - name: Publish to Cloudflare Pages 48 | uses: cloudflare/wrangler-action@v3 49 | id: wrangler-deploy 50 | with: 51 | apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} 52 | accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} 53 | command: pages deploy site --project-name=eda-docs --branch=${{ env.BRANCH_NAME }} 54 | 55 | - name: Add deploy comment to PR 56 | uses: actions/github-script@v7 57 | if: github.event_name == 'pull_request' 58 | with: 59 | script: | 60 | const branchName = process.env.BRANCH_NAME.replace(/[._]/g, '-'); 61 | github.rest.issues.createComment({ 62 | issue_number: context.issue.number, 63 | owner: context.repo.owner, 64 | repo: context.repo.repo, 65 | body: `🏗 Preview site deployed to: 66 | 67 | * ${{ steps.wrangler-deploy.outputs.deployment-url }} 68 | * https://${branchName}.eda-docs.pages.dev` 69 | }) 70 | -------------------------------------------------------------------------------- /docs/development/apps/scripts/state.md: -------------------------------------------------------------------------------- 1 | # State scripts 2 | 3 | State scripts enable EDA's unique ability to provide and act on the state of abstracted resources. They are being executed inside State Engine and are responsible for alarm generation, subscription and normalization of telemetry data, and publishing updates to the status field of resources, or the creation of state-only resources. 4 | 5 | State scripts perform more work than just providing the state of a declarative abstracted intent. It adds operational capabilities to the EDA platform in a broad sense. 6 | 7 | ## Triggering scripts 8 | 9 | A state script is _attached_ to a particular resource via the applications `manifest.yaml` exactly the same way as [configuration script](config.md#triggering-scripts): 10 | 11 | ```yaml hl_lines="10-14" title="snippet of the Banner app manifest" 12 | apiVersion: core.eda.nokia.com/v1 13 | kind: Manifest 14 | metadata: 15 | name: banners 16 | spec: 17 | components: 18 | - crd: 19 | path: banners/crds/banners.eda.local_bannerstates.yaml 20 | schema: banners/openapiv3/eda_oas_banners.eda.local_bannerstates.json 21 | - script: 22 | path: banners/intents/bannerstate/state_intent.py 23 | trigger: 24 | kind: BannerState 25 | type: state 26 | ``` 27 | 28 | The manifest presented above results in the logic contained in `banners/intents/bannerstate/state_intent.py` script being run whenever a `BannerState` resource is created or updated. The `BannerState` resource is added to the EDA API via the `crd` component defined in the same manifest file. 29 | 30 | The state-related custom resource (`BannerState` in the example above) is typically created by the configuration script attached to the resource it represents. 31 | 32 | ## Entrypoint 33 | 34 | Again, similar to configuration scripts, the entrypoint to a state script is the `process_state_cr` function, which is called by State Engine with the state resource object passed as a dictionary to the function. 35 | 36 | ```python 37 | def process_state_cr(cr): 38 | """Process Banner State CR.""" 39 | ... 40 | ``` 41 | 42 | The state script then can: 43 | 44 | * query the EDA in-memory database (EDB) for more state information using `eda_state.list_db` method 45 | * update the EDB using `eda_state.update_db` method 46 | * generate alarms using `eda_state.update_alarm` method when thresholds are crossed 47 | * normalize paths and present the state data in a vendor-agnostic way 48 | -------------------------------------------------------------------------------- /docs/images/icons/eda/topology.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/development/custom-registry.md: -------------------------------------------------------------------------------- 1 | # Add a Custom EDA Store Registry 2 | 3 | ## Overview 4 | 5 | An EDA Store Registry is a container registry that contains OCI compliant images of an App. It is where you will upload your full App content and code as a single OCI image. 6 | 7 | The `manifest.spec.image` field will point to the specific App image with a specific tag for each version. 8 | 9 | ## Adding a Registry to the EDA Store 10 | 11 | ### Creating a Credentials Secret 12 | 13 | If the registry hosting your App OCI image requires authentication, you must create a Kubernetes secret that contains the credentials to connect to the Registry git repository over HTTPS. This can be done using the following resource where you replace the data with the correct `base64` encoded values. 14 | 15 | --8<-- "docs/development/custom-catalog.md:secret-label-caution" 16 | 17 | /// tab | YAML Resource 18 | 19 | ```yaml 20 | --8<-- "docs/development/resources/authSecretRef.yaml" 21 | ``` 22 | 23 | /// 24 | /// tab | `kubectl apply` command 25 | 26 | ```bash 27 | kubectl apply -f - < 53 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/software-install/air-gapped/preparing-the-air-gapped-environment.md: -------------------------------------------------------------------------------- 1 | # Preparing the Air-gapped environment 2 | 3 | After [preparing](preparing-the-assets-vm.md) the Assets VM and [downloading](downloading-the-assets.md) the necessary assets, the fetched data needs to be made available in the Air-gapped environment. Two options are available: 4 | 5 | 1. Move the system that was used to prepare the Assets VM to the Air-gapped environment. For instance, if it is a laptop or a VM, you can move to the Air-gapped environment by changing its network configuration. 6 | 2. Copy the data from the system that was used to prepare the Assets VM to the Air-gapped environment using a USB key or a temporary network connection. The data should include: 7 | * The playground repository cloned during the ["Preparing for installation"](../preparing-for-installation.md) step. 8 | * The edaadm repository which includes the `eda-cargo` folder holding the Air-gapped data (bundles, asset VM image and Talos base VM images). The `eda-cargo` folder was populated during the [preparing](preparing-the-assets-vm.md) the Assets VM and [downloading](downloading-the-assets.md) the necessary assets steps. 9 | 10 | ## Loading the Kpt Setters image 11 | 12 | /// admonition | Note 13 | type: subtle-note 14 | These steps are to be executed in the air-gapped environment. 15 | /// 16 | 17 | The procedures for setting up the Assets VM and installing EDA use [Kpt](https://kpt.dev) - a package manager for Kubernetes. Kpt relies on the `kpt-apply-setters` container to be present in the local Docker image cache of the air-gapped system to be able to perform its operations. 18 | The container image is part of the `eda-bundle-tools` bundle in the `edaadm/bundles` list. If you used the `save-all-bundles` option when downloading the assets, you will have that bundle on your air-gapped system. If you do not have it yet, you can download the bundle on the system with Internet and copy over the content of the bundle to the air-gapped environment before executing the steps. 19 | 20 | To load the `kpt-apply-setters` image from the `eda-bundle-tools` bundle, follow these steps: 21 | 22 | /// html | div.steps 23 | 24 | 1. Go to the `edaadm` repository directory. 25 | 26 | Change into the `edaadm` repository that you have copied from the Internet-connected system: 27 | 28 | ```bash 29 | cd path/to/edaadm 30 | ``` 31 | 32 | 2. Import the image into the local docker image cache 33 | 34 | Note that the version of the bundle might update to a newer version in the future. In that case, replace the `1-0-0` with the appropriate version and the correct `kpt-apply-setters` version as well. 35 | 36 | ```bash 37 | docker load -i ./bundles/eda-cargo/eda-bundle-tools-1-0-0/images/srl-labs-kpt-apply-setters-0-1-1 38 | ``` 39 | -------------------------------------------------------------------------------- /docs/apps/virtualnetwork.md: -------------------------------------------------------------------------------- 1 | # Virtual Network (VNET) 2 | 3 | The Virtual Network (`VNET`) application is a resource designed to group and manage network services together, typically deployed as overlay services. The VNET simplifies management by serving as a single input for a set of resources that support a common set of applications. 4 | 5 | ## Core Components of VNET 6 | 7 | The primary components that make up the VNET include: 8 | 9 | - **BridgeDomain**: Represents a Layer 2 broadcast domain. It is used in conjunction with VLAN and BridgeInterface resources, which attach sub-interfaces to this L2 broadcast domain. 10 | 11 | - **VLAN**: Groups sub-interfaces together under a common VLAN ID. VLAN IDs can be automatically assigned from a pool or manually set by the user. The VLAN uses a label selector to select the interfaces on which to provisioning the sub-interfaces. 12 | 13 | - **BridgeInterface**: Allows operators to manually attach a sub-interface to a specific BridgeDomain. 14 | 15 | - **Router**: Acts as a Layer 3 domain manager. It can connect multiple BridgeDomains through an `IRBInterface` or link directly to `RoutedInterfaces`. 16 | 17 | - **IRBInterface** (Integrated Routing and Bridging Interface): Connects a BridgeDomain to a Router, facilitating communication between Layer 2 and Layer 3 networks. 18 | 19 | - **RoutedInterface**: Represents a directly connected Layer 3 interface on a device that is attached to a Router. 20 | 21 | - **DHCPRelay**: Enables DHCP relay functionality on sub-interfaces within the VNET, facilitating dynamic IP address allocation. 22 | 23 | ## Additional Capabilities 24 | 25 | - **PE-CE BGP**: The VNET also supports Provider Edge to Customer Edge (PE-CE) BGP. 26 | - **IP Filters**: IPv4, IPv6 and MAC filters can also be used within the `VirtualNetwork`. 27 | - **DSCP and Dot1p classifiers**: Attachment of DSCP and Dot1p classifiers are also supported. 28 | 29 | ## Example VNETs 30 | 31 | ### Layer 2 VNET 32 | 33 | /// tab | `kubectl` 34 | 35 | ```bash 36 | cat << 'EOF' | tee l2-vnet.yaml | kubectl apply -f - 37 | --8<-- "docs/examples/l2-vnet.yaml" 38 | EOF 39 | ``` 40 | 41 | /// 42 | /// tab | YAML 43 | 44 | ```yaml 45 | --8<-- "docs/examples/l2-vnet.yaml" 46 | ``` 47 | 48 | /// 49 | 50 | ### Layer 3 VNET 51 | 52 | /// tab | `kubectl` 53 | 54 | ```bash 55 | cat << 'EOF' | tee l3-vnet.yaml | kubectl apply -f - 56 | --8<-- "docs/examples/l3-vnet.yaml" 57 | EOF 58 | ``` 59 | 60 | /// 61 | /// tab | YAML 62 | 63 | ```yaml 64 | --8<-- "docs/examples/l3-vnet.yaml" 65 | ``` 66 | 67 | /// 68 | 69 | ## Verify the status of the `VirtualNetwork` 70 | 71 | Verify the fabric operational state: 72 | 73 | ```shell 74 | kubectl -n eda get virtualnetwork 75 | 76 | NAME OPERATIONALSTATE LASTCHANGE 77 | vnet1 down 2024-04-30T21:26:36.000Z 78 | vnet2 degraded 2024-04-30T22:47:38.000Z 79 | ``` 80 | -------------------------------------------------------------------------------- /docs/connect/troubleshooting.md: -------------------------------------------------------------------------------- 1 | # Troubleshooting Cloud Connect 2 | 3 | ## Cloud Connect Custom Resources 4 | 5 | Connect will introduce and expose four new CRDs in EDA and the EDA Kubernetes environment: 6 | 7 | * `ConnectPlugin` - The logical representation of a plugin, created and managed by a running plugin. 8 | * `ConnectPluginActionable` - An actionable is an action that a plugin must take. This can be created by the Connect Core itself or by a user who 9 | wants to trigger the action. 10 | * `ConnectPluginHeartbeat` - A plugin sends heartbeats at a well-defined interval, and by doing so, updates this resources linked to its 11 | `ConnectPlugin`. When a plugin does not send heartbeats for a while (three times the expected interval), an alarm will be raised by the Core. 12 | * `ConnectInterface` - The logical representation of a physical interface of a bare metal compute. The labels on the `ConnectInterface` are used to 13 | label the matching EDA `Interface`, so that they can be used as sub-interface label selectors for EDA `BridgeDomains`. 14 | 15 | ## Problem: Missing `ConnectPlugin` for deployed plugin 16 | 17 | This problem is only applicable for plugins that are deployed outside the EDA Kubernetes cluster, for example, the OpenShift or OpenStack plugin. 18 | This indicates a connection problem from the plugin towards the EDA Kubernetes cluster. Verify the following information: 19 | 20 | * Check the plugin logs for error messages. 21 | * Verify the plugin's configuration, especially the Kubernetes information (location/URL, certificates, user certificates, and so forth). 22 | 23 | ## Problem: Application connectivity 24 | 25 | An application missing connectivity can have multiple causes; here are some of the most common: 26 | 27 | * Check whether there are any alarms reported in EDA. 28 | * Check whether there are any transaction results in FAILED state. You can check this with `kubectl get transactions -A` or 29 | `edactl transaction kubernetes-pending` 30 | * Check whether the bridge domain and VLAN are up, and the VLAN is showing the expected number of UP subinterfaces 31 | * Check the `ConnectInterface` corresponding to the hypervisor NIC where you expect to see traffic. 32 | * If no `ConnectInterface` can be found, check the plugin. It is responsible for creating the `ConnectInterface`. 33 | * If a `ConnectInterface` can be found, check the status. 34 | * If it is '', the connect-interface-controller is not online. 35 | * If it is 'Disconnected', it cannot find an interface to label. 36 | * Check the interface corresponding to the NIC on the SRL that is connected to the relevant hypervisor. 37 | * If it is not found: the operator has to create the "downlink" interfaces 38 | * If it is found: check the status 39 | * If no members with the LLDP information are found, check the LLDP process on the hypervisor and on the SRL node 40 | -------------------------------------------------------------------------------- /.github/workflows/build-and-deploy.yml: -------------------------------------------------------------------------------- 1 | name: Build and Deploy Versioned Docs 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | version: 7 | description: "Documentation version" 8 | default: "25.4" 9 | required: true 10 | type: string 11 | alias: 12 | description: "Version alias (e.g. latest or not)" 13 | required: false 14 | default: "" 15 | options: 16 | - "" 17 | - "latest" 18 | type: choice 19 | build-from-branch: 20 | description: "Build docs from the selected branch? If false, builds from the release- branch." 21 | required: false 22 | default: false 23 | type: boolean 24 | 25 | jobs: 26 | build: 27 | runs-on: ubuntu-24.04 28 | outputs: 29 | target-branch: ${{ steps.set-target-branch.outputs.target-branch }} 30 | permissions: 31 | contents: write 32 | repository-projects: read 33 | packages: read 34 | steps: 35 | - name: Checkout repository 36 | uses: actions/checkout@v4 37 | with: 38 | fetch-depth: 0 # Fetch all history for git committers plugin 39 | # build docs from the selected branch or from the release branch? 40 | ref: ${{ github.event.inputs.build-from-branch == 'true' && github.ref_name || format('release-{0}', github.event.inputs.version) }} 41 | 42 | - name: Login to GitHub Container Registry 43 | uses: docker/login-action@v3 44 | with: 45 | registry: ghcr.io 46 | username: ${{ github.actor }} 47 | password: ${{ secrets.GITHUB_TOKEN }} 48 | 49 | - name: Build docs version 50 | env: 51 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 52 | run: | 53 | if [ -n "${{ github.event.inputs.alias }}" ]; then 54 | bash run.sh build-version "${{ github.event.inputs.version }}" "${{ github.event.inputs.alias }}" 55 | else 56 | bash run.sh build-version "${{ github.event.inputs.version }}" 57 | fi 58 | 59 | - name: Set default docs version 60 | if: ${{ github.event.inputs.alias != '' }} 61 | env: 62 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 63 | run: | 64 | bash run.sh set-default-version --push "${{ github.event.inputs.version }}" 65 | 66 | - name: Set target branch 67 | id: set-target-branch 68 | run: | 69 | if [ "${{ github.repository }}" != "nokia-eda/docs" ]; then 70 | echo "target-branch=preview" >> $GITHUB_OUTPUT 71 | else 72 | echo "target-branch=main" >> $GITHUB_OUTPUT 73 | fi 74 | 75 | deploy-docs: 76 | needs: build 77 | uses: ./.github/workflows/deploy-docs.yml 78 | secrets: inherit 79 | with: 80 | target-branch: ${{ needs.build.outputs.target-branch }} 81 | -------------------------------------------------------------------------------- /docs/software-install/non-production/wsl.md: -------------------------------------------------------------------------------- 1 | # EDA on Windows (WSL) 2 | 3 | Thanks to EDA's deployment model that uses Kubernetes, you can install EDA anywhere where a Kubernetes cluster can run. And Windows is no exception! 4 | Thanks to the [Windows Subsystem Linux](https://learn.microsoft.com/en-us/windows/wsl/install) (aka WSL). WSL allows Windows users to run a Linux distribution as a tightly-integrated VM. 5 | 6 | ## Installation prerequisites 7 | 8 | ### Hardware requirements 9 | 10 | Before proceeding with the installation, users have to ensure they meet the hardware requirements for EDA Playground installation that are outlined in the [Try EDA](../../getting-started/try-eda.md) section: 11 | 12 | --8<-- "docs/getting-started/try-eda.md:resources-reqs" 13 | 14 | The CPU/Memory/Storage requirements should be available to the WSL virtual machine, and the default settings used by the WSL system may not be enough to meet those requirements. 15 | 16 | Users can [fine tune the resource allocations](https://learn.microsoft.com/en-us/windows/wsl/wsl-config) for the WSL virtual machine to meet their needs. Make sure to allocate the required number of CPU/Memory/Storage resources to the WSL virtual machine. 17 | 18 | ### WSL version 19 | 20 | An important prerequisite for installing EDA on WSL is to have WSL version at 2.5 version or later. Check what version of the WSL you have running on your Windows, by running the following command in the Windows terminal: 21 | 22 | ```shell 23 | wsl --version 24 | ``` 25 | 26 | If the version is older than 2.5 you will need to upgrade it. At the time of this writing, the WSL version 2.5 is [available](https://github.com/microsoft/WSL/releases) as a pre-release, to update your WSL to the pre-release version, run the following: 27 | 28 | ```shell 29 | wsl --update --pre-release 30 | ``` 31 | 32 | ## WSL distributive 33 | 34 | Windows offers you a choice of distributives you can install on WSL. While you can choose any Linux distributive, we can recommend running the [WSL-Containerlab](https://containerlab.dev/windows/#wsl-containerlab) distributive that has been preconfigured with tools like Docker engine. 35 | 36 | Download the `.wsl` distributive file from the [releases page](https://github.com/srl-labs/wsl-containerlab/releases/latest) and simply double click on it to install WSL-Containerlab WSL distributive. 37 | 38 | You should be able to see "Containerlab" as a program in your start menu, and by opening this program you will start the distributive. 39 | 40 | ## EDA installation 41 | 42 | Once you are in the shell of a chosen WSL distributive, proceed with the EDA installation steps as laid out on the [Try EDA page](../../getting-started/try-eda.md). 43 | 44 | ## UI/API access 45 | 46 | Once the installation of the EDA Playground is complete, you can start the UI/API port forward as outlined in Step 6 from the [Try EDA page](../../getting-started/try-eda.md). 47 | -------------------------------------------------------------------------------- /docs/stylesheets/nokia-fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'NokiaPureHeadlineLight'; 3 | font-weight: normal; 4 | font-style: normal; 5 | src: url('https://www.nokia.com/themes/custom/onenokia_base_theme/fonts/nokia/nokiapureheadline_light.eot'); 6 | src: url('https://www.nokia.com/themes/custom/onenokia_base_theme/fonts/nokia/nokiapureheadline_light.woff2') format('woff2'), 7 | url('https://www.nokia.com/themes/custom/onenokia_base_theme/fonts/nokia/nokiapureheadline_light.woff') format('woff'), 8 | url('https://www.nokia.com/themes/custom/onenokia_base_theme/fonts/nokia/nokiapureheadline_light.ttf') format('truetype'), 9 | url('https://www.nokia.com/themes/custom/onenokia_base_theme/fonts/nokia/nokiapureheadline_light.svg#svgFontName') format('svg'); 10 | } 11 | 12 | @font-face { 13 | font-family: 'NokiaPureHeadlineUltralight'; 14 | font-weight: normal; 15 | font-style: normal; 16 | src: url('https://www.nokia.com/themes/custom/onenokia_base_theme/fonts/nokia/nokiapureheadline_ultralight.eot'); 17 | src: url('https://www.nokia.com/themes/custom/onenokia_base_theme/fonts/nokia/nokiapureheadline_ultralight.woff2') format('woff2'), 18 | url('https://www.nokia.com/themes/custom/onenokia_base_theme/fonts/nokia/nokiapureheadline_ultralight.woff') format('woff'), 19 | url('https://www.nokia.com/themes/custom/onenokia_base_theme/fonts/nokia/nokiapureheadline_ultralight.ttf') format('truetype'), 20 | url('https://www.nokia.com/themes/custom/onenokia_base_theme/fonts/nokia/nokiapureheadline_ultralight.svg#svgFontName') format('svg'); 21 | } 22 | 23 | /* This is a regular font for the text body */ 24 | @font-face { 25 | font-family: 'NokiaPureText'; 26 | src: url('https://cdn.jsdelivr.net/gh/hellt/fonts@v0.1.0/nokia/NokiaPureText_Lt.eot'); 27 | /* IE9 Compat Modes */ 28 | src: url('https://cdn.jsdelivr.net/gh/hellt/fonts@v0.1.0/nokia/NokiaPureText_Lt.woff2') format('woff2'), 29 | /* Super Modern Browsers */ 30 | url('https://cdn.jsdelivr.net/gh/hellt/fonts@v0.1.0/nokia/NokiaPureText_Lt.woff') format('woff'), 31 | /* Safari, Android, iOS */ 32 | url('https://cdn.jsdelivr.net/gh/hellt/fonts@v0.1.0/nokia/NokiaPureText_Lt.svg#svgFontName') format('svg'); 33 | /* Legacy iOS */ 34 | font-weight: normal; 35 | font-style: normal; 36 | } 37 | 38 | /* This is a bold font */ 39 | @font-face { 40 | font-family: 'NokiaPureText'; 41 | src: url('https://cdn.jsdelivr.net/gh/hellt/fonts@v0.1.0/nokia/NokiaPureText_Bd.eot'); 42 | /* IE9 Compat Modes */ 43 | src: url('https://cdn.jsdelivr.net/gh/hellt/fonts@v0.1.0/nokia/NokiaPureText_Bd.woff2') format('woff2'), 44 | /* Super Modern Browsers */ 45 | url('https://cdn.jsdelivr.net/gh/hellt/fonts@v0.1.0/nokia/NokiaPureText_Bd.woff') format('woff'), 46 | /* Safari, Android, iOS */ 47 | url('https://cdn.jsdelivr.net/gh/hellt/fonts@v0.1.0/nokia/NokiaPureText_Bd.svg#svgFontName') format('svg'); 48 | /* Legacy iOS */ 49 | font-weight: bold; 50 | font-style: normal; 51 | } -------------------------------------------------------------------------------- /docs/development/custom-catalog.md: -------------------------------------------------------------------------------- 1 | # Add a Custom EDA Store Catalog 2 | 3 | ## Overview 4 | 5 | An App Catalog is a structured git repository that contains all the necessary information EDA Store needs to install an app. The `Manifest` is the most important one. But the app can also contain other app metadata information for the UI, like a README, or a license (see the manifest `appInfo` specification field). The catalog of built-in apps that is delivered along with EDA can be found here. 6 | 7 | ## Catalog Structure 8 | 9 | The structure of a catalog is as follows: 10 | 11 | ``` 12 | vendors/ 13 | 14 | apps/ 15 | / 16 | manifest.yaml 17 | README.md 18 | LICENSE 19 | ... # Other useful files, which can be referenced in the manifest and used in the UI. 20 | / 21 | ... 22 | / 23 | apps/ 24 | ... 25 | ... 26 | ``` 27 | 28 | /// admonition | The manifest of an App must be called `manifest.yaml` and be placed in `vendors//apps//manifest.yaml` in the git repository. 29 | type: note 30 | /// 31 | 32 | ### App Versioning 33 | 34 | Apps will have multiple versions. To version the Apps in the Catalog, git tags are used. A structured git tag will be seen as an installable App (with a certain version) for the EDA Store, which can then be installed from the UI. 35 | 36 | Any tag in the form of `vendors//apps//` will be registered as an installable App by the EDA Store. 37 | 38 | The version field should conform to [Semantic Versioning 2.0](https://semver.org/), prefixed with a "v". For example: v0.1, v0.1.0-alpha. 39 | 40 | ## Adding a Catalog to the EDA Store 41 | 42 | ### Creating a Credentials Secret 43 | 44 | If the Catalog-hosting Git repository requires authentication, you must create a Kubernetes secret that contains the credentials to connect to the Catalog git repository over HTTPS. This can be done using the following resource where you replace the data with the correct `base64` encoded values. 45 | 46 | 47 | /// caution | mandatory label 48 | The secrets used by the app catalog or app registry must have the `eda.nokia.com/backup: "true"` label for the EDA Store to pick them up. 49 | /// 50 | 51 | 52 | /// tab | YAML Resource 53 | 54 | ```yaml 55 | --8<-- "docs/development/resources/authSecretRef.yaml" 56 | ``` 57 | 58 | /// 59 | /// tab | `kubectl apply` command 60 | 61 | ```bash 62 | kubectl apply -f - <_Connect_>_Audit_. 8 | ![Create Audit](resources/audit-create.png) 9 | 10 | As an alternative, you can also create an `Audit` resource in the Kubernetes cluster of EDA with the following content: 11 | 12 | /// tab | YAML Resource 13 | ```yaml 14 | --8<-- "docs/connect/resources/connect-audit.yaml" 15 | ``` 16 | /// 17 | /// tab | `kubectl apply` command 18 | ```bash 19 | kubectl apply -f - < Check the [Banner application walkthrough](scripts/banner-script.md) to see what makes up a simple intent-based application. 40 | 41 | ## Dashboards 42 | 43 | The developers can create and bundle custom UI dashboards, adding observability and monitoring capabilities for their apps. The dashboards are defined using JSON files and can be found in the **`ui`** directory of the app. 44 | 45 | ## Workflows 46 | 47 | Workflows are the "run to completion" applications that can be triggered by the resources, users or API clients. Workflows are typically used to implement the logic of the application for one-shot operations - things like upgrades, network pings, route information collection or other operations that are not perpetually ongoing. 48 | 49 | Workflows are typically written in Go, but can be written in any language for which EDA Development Kit (EDK) support is available. 50 | 51 | ## Documentation 52 | 53 | Each application contains its own documentation in the **`docs`** directory. The documentation is written in Markdown and includes the overview of the application, its components, license info, usage examples and documentation for each resource defined by the application. 54 | 55 | ## Manifest 56 | 57 | The **`manifest.yaml`** file defines every aspect of the application packaging, including the application metadata, its components, dependencies, and other relevant information. EDA Store uses this manifest file to understand how to install, deploy and manage the application within an EDA platform. 58 | 59 | Whenever a user adds a new application component with the `edabuilder` CLI, the manifest file is automatically updated to include the new components, therefore users typically should not need to edit this file too often manually. 60 | 61 | ## Other resources 62 | 63 | Some applications may include more specialized components, but these are less common and the majority of applications will consist of the components described above. 64 | 65 | [^1]: The layout of the project is covered in the [Project Layout](project-layout.md) section. 66 | -------------------------------------------------------------------------------- /docs/development/apps/index.md: -------------------------------------------------------------------------------- 1 | # Developing apps on EDA 2 | 3 | EDA is all about extensibility, and the packaging of this extensibility is referred to as an "app". 4 | 5 | > For a refresher on what an app is, check out [apps](../../apps/app-store.md). 6 | 7 | With base configuration your EDA cluster points to an app catalog supplied by Nokia. This gives you access to official Nokia-supported applications, including upgrades via the EDA store. If you're anything like us you have your own opinions about how you'd like to solve your automation problems! This is where building your own app comes in. 8 | 9 | Apps in general let you: 10 | 11 | * Template inputs to resources within your cluster. 12 | Have strong opinions about how your users interact with resources - set defaults, enforce constraints, and provide a consistent user experience. 13 | * Define your own inputs, and the execution logic that should run in response to those inputs. 14 | Generate configuration for targets, respond to telemetry events, trigger workflows, and much, much more. 15 | * Generate alarms, normalize telemetry data. 16 | * Define your own dashboards and other UI visualizations. 17 | * Define your own workflows - one-shot operations that you'd like to expose to your users. 18 | 19 | An application may consist of one or more of these components, or none of them! 20 | 21 | ## Why build on EDA? 22 | 23 | You've likely used other infrastructure automation tools before, and you may be wondering why you should build on EDA. Here are a few reasons: 24 | 25 | * EDA operates on a deterministic, declarative, abstracted, and event-driven model. 26 | This means that you can define the state you want your infrastructure to be in, and EDA will take care of making sure it gets there. No more handling deltas or worrying about order of operations. This massively simplifies application logic - given a certain input what would you like the output to be? 27 | * Built for all your state streaming needs. 28 | Simply define the set of things you'd like to monitor, and what you'd like to have happen on any updates. EDA takes care of subscriptions, and event triggers for you, providing a generic means to raise alarms, publish status of infrastructure, and normalize telemetry data. 29 | * EDA is built on top of Kubernetes, which means you get all the benefits of Kubernetes - scalability, reliability, and a rich ecosystem of tools. 30 | * And all of this comes with the multivendor capabilities. 31 | 32 | ## Development workflow 33 | 34 | In its simplest form, an app builders workflow consists of the following steps: 35 | 36 | * Define the resources you want to handle - the abstractions or inputs you expect your users to provide. 37 | * Define the logic you need - the scripts (or sometimes referred to as intents) that will run in response to changes in those resources. These scripts are written in Python[^1]. 38 | * Define the relationships between the above - what logic is triggered by what resources. 39 | 40 | In its more advanced form you may: 41 | 42 | * Write Kubernetes-controller style apps, which are a bit more complex, but also more powerful. 43 | This effectively lets you build and package your own Kubernetes controllers, which can be used to manage any Kubernetes resource, or any EDA resource. 44 | * Define any views required - the dashboards that will display the state of your resources, or any other information you want to expose or visualize. 45 | * Define the workflows you need - the one-shot operations that you want your users to be able to perform. Think ping, upgrade, verify, etc. 46 | 47 | ## Next steps 48 | 49 | [:octicons-arrow-right-24: Setup the dev environment](setup-env.md) 50 | 51 | [^1]: [MicroPython](https://micropython.org/) to be precise. The considerably faster cold startup times and lower memory footprint make it ideal for the event-driven nature of EDA. 52 | -------------------------------------------------------------------------------- /docs/getting-started/virtual-network.md: -------------------------------------------------------------------------------- 1 | # Virtual network 2 | 3 | To make sure that you can get the full EDA experience without upfronting any hardware investment, EDA is packaged with a Digital Sandbox solution called **CX**. 4 | CX is in charge of creating and managing virtual topologies running in the cluster. 5 | 6 | /// admonition | Note 7 | type: subtle-note 8 | If you completed the [Try EDA](try-eda.md) procedure the virtual network is already created for you. This section provides details on how the virtual network is created, what it consists of, and how to connect to the virtual nodes. 9 | /// 10 | 11 | ## Example topology 12 | 13 | An example [3-node Leaf/Spine topology][3-node-example-topo-gh-url] is provided with this quickstart and is automatically deployed when you run the all-in-one [`try-eda`](try-eda.md) installation command. 14 | 15 | As part of this command a separate make target is called to load the topology resources into the cluster which, in its turn, triggers CX controller to start spinning up the nodes and wiring links between them. 16 | 17 | ```{.shell .no-select} 18 | make topology-load #(1)! 19 | ``` 20 | 21 | 1. No need to run this target if you already completed the [Try EDA](try-eda.md) step, it has happened already. 22 | 23 | `topology-load` targets loads the example topology provided in the json file as a ConfigMap into the cluster. The CX controller watches for ConfigMap changes and creates the corresponding topology resources. 24 | 25 | As a result you will get you the following topology running in your cluster: 26 | 27 | -{{ diagram(url='hellt/tmp/diagrams/playground-topology.drawio', title='', page=0) }}- 28 | 29 | As you would expect, it takes some time to spin up the nodes and establish the connections, you can check the status of the deployed topology in the [Verify](verification.md#node-connectivity) section of the quickstart. 30 | 31 | ## Connecting to the nodes 32 | 33 | Your network engineering roots may ask to check out what is going on on an individual node, which requires you to start a shell in the Pod running the SR Linux simulator. This can be accomplished with these simple commands: 34 | 35 | ```{.shell .no-select} 36 | make leaf1-ssh #(1)! 37 | ``` 38 | 39 | 1. Of course, changing `leaf1` to `leaf2` or `spine1` will log you in the other nodes. 40 | 41 |
42 | ```{.text .no-select .no-copy} 43 | Using configuration file(s): ['/etc/opt/srlinux/srlinux.rc'] 44 | Welcome to the srlinux CLI. 45 | Type 'help' (and press ) if you need any help using this. 46 | --{ + running }--[ ]-- 47 | A:leaf1# 48 | ``` 49 |
50 | 51 | ## Initial configuration 52 | 53 | The SR Linux nodes (the leaf and spine switches) that make up the virtual network come up with a minimal node configuration - only the bits that are required by EDA to onboard the nodes. By connecting to the node and running `info` command you can see the initial configuration and verify that it has no configuration besides the basic management settings. 54 | 55 | With this barebones topology deployed we can start exploring EDA automation powers. Let's explore how EDA framework can be used to provision complex services with simple declarative abstractions. 56 | 57 | [:octicons-arrow-right-24: Automating fabric configuration](units-of-automation.md) 58 | 59 | ## Tearing down the topology 60 | 61 | In case you break your topology nodes beyond repair, you can always start over by tearing down the topology: 62 | 63 | ```{.shell .no-select} 64 | make teardown-topology 65 | ``` 66 | 67 | This will remove the topology nodes resources, the accompanying simulators and NPP pods associated with them. 68 | 69 | [3-node-example-topo-gh-url]: https://github.com/nokia-eda/playground/blob/main/topology/3-nodes-srl.yaml 70 | 71 | 72 | -------------------------------------------------------------------------------- /docs/blog/posts/2025/eda-25.4.md: -------------------------------------------------------------------------------- 1 | --- 2 | date: 2025-05-01 3 | authors: 4 | - bwallis 5 | tags: 6 | - release 7 | --- 8 | 9 | # EDA 25.4 10 | 11 | It is that time again :partying_face: The EDA product team are pleased to announce the release of EDA 25.4.1 :rocket: 12 | 13 | The team have been hard at work; introducing our first non-SR Linux OS, a boatload of QoL UI improvements (bulk edits!), and a number of app extensions to cover additional use cases. 14 | 15 | To some numbers! In this release we delivered **152 GA features**, 14 alpha features, and 90 beta features (I'll come back to this later). 16 | 17 | 18 | 19 | Our big themes for this release were DX (or Developer Experience) and productizing SR OS as a first class citizen. 20 | 21 | To look at DX first, with EDA 25.4 we are providing: 22 | 23 | * Extensions to `edactl` to support intent debuggability (under edactl intent debug). 24 | This includes the ability to trigger instances of intents to run, with DEBUG toggled to allow more logging verbosity. 25 | 26 | It includes the ability to monitor execution of instances (including the immediate monitor + trigger). This massively improves intent debuggability, dumping any logs, subscriptions, inputs, and outputs your application received/emitted. 27 | 28 | For performance debugging, stats are provided for all execution of all intents, including number of executions and cumulative execution time. 29 | 30 | * The [new `edabuilder` tool](../../../development/apps/index.md). 31 | 32 | Purposefully built for developing applications on EDA (intent-based or otherwise). 33 | The initial focus of the tool is primarily to assist with the scaffolding/packaging/testing/publishing of an application, including its resources and intents. 34 | A [new section of documentation](../../../development/apps/index.md) dedicated to the above. 35 | 36 | Now for **Nokia SR OS** - our first litmus test on our claims of supporting multiple operating systems. We are releasing this as **beta in EDA 25.4.1**, with the expectation that this graduates to GA in 25.8.1. The large number of beta features mentioned above relate to this. 37 | 38 | You are free to try EDA with SR OS in a lab environment, with most apps already providing support. 39 | 40 | There are minor gaps in app coverage for SR OS (upgrades are not supported for example), but you should find coverage for the common use cases we support SR Linux for, including: 41 | 42 | * ZTP (including component configuration) 43 | * Underlay via the Fabric resource and its dependencies. 44 | * Overlay via the VirtualNetwork resource and its dependencies. 45 | * The surrounding set of policies/profiles in filters, QoS, routing policies, and almost everything else. 46 | * Queries with EQL, including natural language. 47 | Use `sros:` as a prefix to force a query to only SR OS devices. 48 | * Normalization of all state data, including overlays (CPU, memory, disk). 49 | * Lots, lots more. 50 | 51 | This covers SR OS both as a DC GW (using option A), and as any of the roles used by SR Linux today - leaf, spine, superspine. 52 | 53 | /// admonition | Supported SR OS releases 54 | type: subtle-note 55 | You must use SR OS 24.10R4 or above, or 25.3R2 or above. 56 | /// 57 | 58 | For now you must run SR OS nodes in containerlab, or interact with real hardware in your physical lab. 59 | 60 | Beyond these themes you'll find new overlays, extensions to our integrations with Prometheus, ServiceNow, PagerDuty, and NetBox, and enhancements in our integration with OpenStack. 61 | 62 | You'll also (if you're paying attention) notice huge speed improvements in transactions and general scale improvements at scale. We were already blazing fast here (deploying scaled fabrics in seconds) but we have managed to squeeze a measly 10x improvement in some intent apps, with most seeing somewhere in the 5-8x range. 63 | 64 | With that said, onwards! 65 | 66 | If you aren't there yet, join the EDA Discord server: https://eda.dev/discord. 67 | 68 | with :heart: from the EDA product team 69 | -------------------------------------------------------------------------------- /docs/software-install/deploying-eda/setters-reference/eda-external-packages-kpt-setters.md: -------------------------------------------------------------------------------- 1 | | Name | Value | 2 | |------|---------------| 3 | | **eda-external-packages/cert-manager/cert-manager.yaml** || 4 | | `CORE_IMG_CREDENTIALS` | core | 5 | | `CMCA_IMG` | "quay.io/jetstack/cert-manager-cainjector:v1.16.2" | 6 | | `CMCT_IMG` | "quay.io/jetstack/cert-manager-controller:v1.16.2" | 7 | | `CM_ARGS` | Non scalar value, see the file for details. | 8 | | `CMWH_IMG` | "quay.io/jetstack/cert-manager-webhook:v1.16.2" | 9 | 10 | | Name | Current Value | 11 | |------|---------------| 12 | | **eda-external-packages/csi-driver/cert-manager-csi-driver.in.yaml** || 13 | | `EDA_CORE_NAMESPACE` | eda-system | 14 | | `CSI_REGISTRAR_IMG` | "k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.12.0" | 15 | | `CSI_LIVPROBE_IMG` | "registry.k8s.io/sig-storage/livenessprobe:v2.12.0" | 16 | | `CSI_DRIVER_IMG` | "quay.io/jetstack/cert-manager-csi-driver:v0.10.1" | 17 | 18 | | Name | Current Value | 19 | |------|---------------| 20 | | **eda-external-packages/eda-api-ingress-https-passthrough/api-ingress-ssl-passthrough.yaml** || 21 | | `EXT_DOMAIN_NAME` | "changeme.eda.dev" | 22 | | `INT_HTTPS_PORT` | 443 | 23 | 24 | | Name | Current Value | 25 | |------|---------------| 26 | | **eda-external-packages/eda-api-ingress-https/eda-api-ingress-cert.yaml** || 27 | | `EXT_IPV4_ADDR` | "192.168.139.35" | 28 | | `EXT_IPV6_ADDR` | "dead:beef:cc66:0:f412:67ff:dead:beef" | 29 | 30 | | Name | Current Value | 31 | |------|---------------| 32 | | **eda-external-packages/fluent-operator/fluent-bit-collector/eda-fbc-deployment.yaml** || 33 | | `FO_FC_IMG` | ghcr.io/nokia-eda/core/eda-fluentbit-collector:v4.0.1-debian-1.0 | 34 | 35 | | Name | Current Value | 36 | |------|---------------| 37 | | **eda-external-packages/fluent-operator/fluent-operator/manifests/fluent-bit-operator-ds.yaml** || 38 | | `FO_FB_IMG` | ghcr.io/nokia-eda/ext/fluent/fluent-operator/fluent-bit:v4.0.1 | 39 | 40 | | Name | Current Value | 41 | |------|---------------| 42 | | **eda-external-packages/fluent-operator/fluent-operator/manifests/fluent-bit-operator.yaml** || 43 | | `FO_IMG` | ghcr.io/nokia-eda/ext/fluent/fluent-operator/fluent-operator:3.4.0 | 44 | 45 | | Name | Current Value | 46 | |------|---------------| 47 | | **eda-external-packages/fluentd/fluentd-bit-ds.yaml** || 48 | | `FB_IMG` | cr.fluentbit.io/fluent/fluent-bit:3.0.7 | 49 | 50 | | Name | Current Value | 51 | |------|---------------| 52 | | **eda-external-packages/fluentd/fluentd.yaml** || 53 | | `FD_IMG` | ghcr.io/nokia-eda/core/fluentd:v1.17.0-debian-1.0 | 54 | 55 | | Name | Current Value | 56 | |------|---------------| 57 | | **eda-external-packages/git-no-pvc/gogs-admin-user.yaml** || 58 | | `EDA_GOGS_NAMESPACE` | eda-system | 59 | | `GOGS_ADMIN_USER` | ZWRhCg== | 60 | | `GOGS_ADMIN_PASS` | ZWRhCg== | 61 | 62 | | Name | Current Value | 63 | |------|---------------| 64 | | **eda-external-packages/git-no-pvc/gogs-deployment-no-pvc.yaml** || 65 | | `GOGS_IMG_TAG` | ghcr.io/gogs/gogs:0.13.0 | 66 | 67 | | Name | Current Value | 68 | |------|---------------| 69 | | **eda-external-packages/git-no-pvc/gogs-replica-service.yaml** || 70 | | `GIT_SVC_TYPE` | ClusterIP | 71 | 72 | | Name | Current Value | 73 | |------|---------------| 74 | | **eda-external-packages/git/gogs-pv-claim.yaml** || 75 | | `GOGS_PV_CLAIM_ACCESSMODE` | ReadWriteOnce | 76 | | `GOGS_PV_CLAIM_SIZE` | 24Gi | 77 | 78 | | Name | Current Value | 79 | |------|---------------| 80 | | **eda-external-packages/git/gogs-replica-pv-claim.yaml** || 81 | | `GOGS_REPLICA_PV_CLAIM_ACCESSMODE` | ReadWriteOnce | 82 | | `GOGS_REPLICA_PV_CLAIM_SIZE` | 24Gi | 83 | 84 | | Name | Current Value | 85 | |------|---------------| 86 | | **eda-external-packages/trust-manager/trust-manager.yaml** || 87 | | `EDA_TRUSTMGR_NAMESPACE` | eda-system | 88 | | `TRUSTMGRBUNDLE_IMG` | "quay.io/jetstack/cert-manager-package-debian:20210119.0" | 89 | | `TRUSTMGR_IMG` | "quay.io/jetstack/trust-manager:v0.15.0" | 90 | | `TRUSTMGR_ARGS` | Non scalar value, see the file for details. | 91 | | `EDA_TRUSTMGR_ISSUER_DNSNAMES` | Non scalar value, see the file for details. | 92 | -------------------------------------------------------------------------------- /docs/software-install/deploying-eda/setters-reference/eda-external-packages.md: -------------------------------------------------------------------------------- 1 | | Name | Value | 2 | |------|---------------| 3 | | **eda-external-packages/cert-manager/cert-manager.yaml** || 4 | | `CORE_IMG_CREDENTIALS` | core | 5 | | `CMCA_IMG` | "ghcr.io/nokia-eda/ext/jetstack/cert-manager-cainjector:v1.16.2" | 6 | | `CMCT_IMG` | "ghcr.io/nokia-eda/ext/jetstack/cert-manager-controller:v1.16.2" | 7 | | `CM_ARGS` | Non scalar value, see the file for details. | 8 | | `CMWH_IMG` | "ghcr.io/nokia-eda/ext/jetstack/cert-manager-webhook:v1.16.2" | 9 | 10 | | Name | Value | 11 | |------|---------------| 12 | | **eda-external-packages/csi-driver/cert-manager-csi-driver.in.yaml** || 13 | | `EDA_CORE_NAMESPACE` | eda-system | 14 | | `CSI_REGISTRAR_IMG` | "ghcr.io/nokia-eda/ext/sig-storage/csi-node-driver-registrar:v2.12.0" | 15 | | `CSI_LIVPROBE_IMG` | "ghcr.io/nokia-eda/ext/sig-storage/livenessprobe:v2.12.0" | 16 | | `CSI_DRIVER_IMG` | "ghcr.io/nokia-eda/ext/jetstack/cert-manager-csi-driver:v0.10.1" | 17 | 18 | | Name | Value | 19 | |------|---------------| 20 | | **eda-external-packages/eda-api-ingress-https-passthrough/api-ingress-ssl-passthrough.yaml** || 21 | | `EXT_DOMAIN_NAME` | "" | 22 | | `INT_HTTPS_PORT` | 443 | 23 | 24 | | Name | Value | 25 | |------|---------------| 26 | | **eda-external-packages/eda-api-ingress-https/eda-api-ingress-cert.yaml** || 27 | | `EXT_IPV4_ADDR` | "" | 28 | | `EXT_IPV6_ADDR` | "" | 29 | 30 | | Name | Value | 31 | |------|---------------| 32 | | **eda-external-packages/fluent-operator/fluent-bit-collector/eda-fbc-deployment.yaml** || 33 | | `FO_FC_IMG` | ghcr.io/nokia-eda/core/eda-fluentbit-collector:v4.0.1-debian-1.0 | 34 | 35 | | Name | Value | 36 | |------|---------------| 37 | | **eda-external-packages/fluent-operator/fluent-operator/manifests/fluent-bit-operator-ds.yaml** || 38 | | `FO_FB_IMG` | ghcr.io/nokia-eda/ext/fluent/fluent-operator/fluent-bit:v4.0.1 | 39 | 40 | | Name | Value | 41 | |------|---------------| 42 | | **eda-external-packages/fluent-operator/fluent-operator/manifests/fluent-bit-operator.yaml** || 43 | | `FO_IMG` | ghcr.io/nokia-eda/ext/fluent/fluent-operator/fluent-operator:3.4.0 | 44 | 45 | | Name | Value | 46 | |------|---------------| 47 | | **eda-external-packages/fluentd/fluentd-bit-ds.yaml** || 48 | | `FB_IMG` | ghcr.io/nokia-eda/core/fluent-bit:3.0.7-amd64 | 49 | 50 | | Name | Value | 51 | |------|---------------| 52 | | **eda-external-packages/fluentd/fluentd.yaml** || 53 | | `FD_IMG` | ghcr.io/nokia-eda/core/fluentd:v1.17.0-debian-1.0 | 54 | 55 | | Name | Value | 56 | |------|---------------| 57 | | **eda-external-packages/git-no-pvc/gogs-admin-user.yaml** || 58 | | `EDA_GOGS_NAMESPACE` | eda-system | 59 | | `GOGS_ADMIN_USER` | ZWRhCg== | 60 | | `GOGS_ADMIN_PASS` | ZWRhCg== | 61 | 62 | | Name | Value | 63 | |------|---------------| 64 | | **eda-external-packages/git-no-pvc/gogs-replica-service.yaml** || 65 | | `GIT_SVC_TYPE` | ClusterIP | 66 | 67 | | Name | Value | 68 | |------|---------------| 69 | | **eda-external-packages/git-no-pvc/gogs-deployment-no-pvc.yaml** || 70 | | `GOGS_TOLERATION_NODE_UNREACHABLE` | 300 | 71 | | `GOGS_TOLERATION_NODE_NOT_READY` | 300 | 72 | | `GOGS_IMG_TAG` | ghcr.io/nokia-eda/core/gogs:0.13.0 | 73 | 74 | | Name | Value | 75 | |------|---------------| 76 | | **eda-external-packages/git/gogs-pv-claim.yaml** || 77 | | `GOGS_PV_CLAIM_ACCESSMODE` | ReadWriteOnce | 78 | | `GOGS_PV_CLAIM_SIZE` | 24Gi | 79 | 80 | | Name | Value | 81 | |------|---------------| 82 | | **eda-external-packages/git/gogs-replica-pv-claim.yaml** || 83 | | `GOGS_REPLICA_PV_CLAIM_ACCESSMODE` | ReadWriteOnce | 84 | | `GOGS_REPLICA_PV_CLAIM_SIZE` | 24Gi | 85 | 86 | | Name | Value | 87 | |------|---------------| 88 | | **eda-external-packages/trust-manager/trust-manager.yaml** || 89 | | `EDA_TRUSTMGR_NAMESPACE` | eda-system | 90 | | `TRUSTMGRBUNDLE_IMG` | "ghcr.io/nokia-eda/ext/jetstack/cert-manager-package-debian:20210119.0" | 91 | | `TRUSTMGR_IMG` | "ghcr.io/nokia-eda/ext/jetstack/trust-manager:v0.15.0" | 92 | | `TRUSTMGR_ARGS` | Non scalar value, see the file for details. | 93 | | `EDA_TRUSTMGR_ISSUER_DNSNAMES` | Non scalar value, see the file for details. | 94 | -------------------------------------------------------------------------------- /docs/software-install/resources/edaadm-config-example.yaml: -------------------------------------------------------------------------------- 1 | version: 25.4.1 2 | clusterName: eda-compute-cluster 3 | machines: 4 | - name: eda-node01 5 | endpoint: "192.0.2.11" 6 | interfaces: 7 | - name: eth0 8 | dhcp: false 9 | interface: eth0 10 | addresses: 11 | - 192.0.2.11/24 12 | routes: 13 | - network: 0.0.0.0/0 14 | gateway: 192.0.2.1 15 | mtu: 9000 16 | - name: eth1 17 | dhcp: false 18 | interface: eth1 19 | addresses: 20 | - 203.0.113.11/24 21 | mtu: 9000 22 | disks: 23 | os: /dev/vda 24 | storage: /dev/vdb 25 | - name: eda-node02 26 | endpoint: "192.0.2.12" 27 | interfaces: 28 | - name: eth0 29 | dhcp: false 30 | interface: eth0 31 | addresses: 32 | - 192.0.2.12/24 33 | routes: 34 | - network: 0.0.0.0/0 35 | gateway: 192.0.2.1 36 | mtu: 9000 37 | - name: eth1 38 | dhcp: false 39 | interface: eth1 40 | addresses: 41 | - 203.0.113.12/24 42 | mtu: 9000 43 | disks: 44 | os: /dev/vda 45 | storage: /dev/vdb 46 | - name: eda-node03 47 | endpoint: "192.0.2.13" 48 | interfaces: 49 | - name: eth0 50 | dhcp: false 51 | interface: eth0 52 | addresses: 53 | - 192.0.2.13/24 54 | routes: 55 | - network: 0.0.0.0/0 56 | gateway: 192.0.2.1 57 | mtu: 9000 58 | - name: eth1 59 | dhcp: false 60 | interface: eth1 61 | addresses: 62 | - 203.0.113.13/24 63 | mtu: 9000 64 | disks: 65 | os: /dev/vda 66 | storage: /dev/vdb 67 | - name: eda-node04 68 | endpoint: "192.0.2.14" 69 | interfaces: 70 | - name: eth0 71 | dhcp: false 72 | interface: eth0 73 | addresses: 74 | - 192.0.2.14/24 75 | routes: 76 | - network: 0.0.0.0/0 77 | gateway: 192.0.2.1 78 | mtu: 9000 79 | - name: eth1 80 | dhcp: false 81 | interface: eth1 82 | addresses: 83 | - 203.0.113.14/24 84 | mtu: 9000 85 | disks: 86 | os: /dev/vda 87 | - name: eda-node05 88 | endpoint: "192.0.2.15" 89 | interfaces: 90 | - name: eth0 91 | dhcp: false 92 | interface: eth0 93 | addresses: 94 | - 192.0.2.15/24 95 | routes: 96 | - network: 0.0.0.0/0 97 | gateway: 192.0.2.1 98 | mtu: 9000 99 | - name: eth1 100 | dhcp: false 101 | interface: eth1 102 | addresses: 103 | - 203.0.113.15/24 104 | mtu: 9000 105 | disks: 106 | os: /dev/vda 107 | - name: eda-node06 108 | endpoint: "192.0.2.16" 109 | interfaces: 110 | - name: eth0 111 | dhcp: false 112 | interface: eth0 113 | addresses: 114 | - 192.0.2.16/24 115 | routes: 116 | - network: 0.0.0.0/0 117 | gateway: 192.0.2.1 118 | mtu: 9000 119 | - name: eth1 120 | dhcp: false 121 | interface: eth1 122 | addresses: 123 | - 203.0.113.16/24 124 | mtu: 9000 125 | disks: 126 | os: /dev/vda 127 | k8s: 128 | stack: ipv4 129 | primaryNode: eda-node01 130 | endpointUrl: https://192.0.2.5:6443 131 | allowSchedulingOnControlPlanes: true 132 | control-plane: 133 | - eda-node01 134 | - eda-node02 135 | - eda-node03 136 | worker: 137 | - eda-node04 138 | - eda-node05 139 | - eda-node06 140 | vip: 141 | ipv4: 192.0.2.5 142 | interface: eth0 143 | env: 144 | http_proxy: http://192.0.2.254:8080 145 | https_proxy: http://192.0.2.254:8080 146 | no_proxy: 192.0.2.0/24,203.0.113.0/24,.domain.tld,172.22.0.0/16,localhost,127.0.0.1,10.0.1.0/24,0.0.0.0,169.254.116.108 147 | time: 148 | disabled: false 149 | servers: 150 | - 192.0.2.253 151 | - 192.0.2.254 152 | nameservers: 153 | servers: 154 | - 192.0.2.253 155 | - 192.0.2.254 -------------------------------------------------------------------------------- /docs/connect/cloud-connect-installation.md: -------------------------------------------------------------------------------- 1 | # Cloud Connect Core Installation 2 | 3 | This guide provides detailed instructions for installing the EDA Cloud Connect Core application. 4 | 5 | ## Prerequisites 6 | 7 | * EDA cluster is up and running 8 | * Access to the EDA Store UI or Kubernetes API 9 | * All Connect Core dependencies are satisfied (automatically resolved when installing through the UI) 10 | 11 | ## Installation Using EDA Store UI 12 | 13 | Cloud Connect is an application in the EDA app ecosystem. The easiest way to install it is through the EDA Store UI: 14 | 15 | 1. Navigate to the EDA Store in the EDA UI 16 | 2. Locate the Cloud Connect Core application 17 | 3. Click Install 18 | 4. Configure the installation options (see [Plugin Configuration Options](#plugin-configuration-options)) 19 | 5. Complete the installation 20 | 21 | Dependencies are automatically resolved when installing through the UI. 22 | 23 | ## Installation Using Kubernetes API 24 | 25 | If you prefer installing the Connect Core using the Kubernetes API, you can do so by creating the following Workflow resource: 26 | 27 | /// details | Connect Core dependencies 28 | 29 | When installing through the UI, dependencies are automatically resolved; this is not the case through the API. Make sure all dependencies of the 30 | Connect Core app are installed before executing the below kubectl command. 31 | 32 | When the dependencies are not satisfied, an error like the following will be added to the status of the AppInstaller object: 33 | 34 | ```app requirements validation failed: connect.eda.nokia.com requires interfaces.eda.nokia.com, but interfaces.eda.nokia.com is not present``` 35 | 36 | /// 37 | 38 | /// tab | YAML Resource 39 | 40 | ```yaml 41 | --8<-- "docs/connect/resources/connect-appinstall.yaml" 42 | ``` 43 | 44 | /// 45 | /// tab | `kubectl apply` command" 46 | 47 | ```bash 48 | kubectl apply -f - <'); 43 | } 44 | 45 | .md-typeset .md-code__button[data-md-type="collapse"] { 46 | right: 2.6rem; 47 | } 48 | 49 | .md-typeset .md-code__button[data-md-type="collapse"]::after { 50 | mask-image: url('data:image/svg+xml,'); 51 | } 52 | 53 | /* END overlay code block styles */ 54 | 55 | /* START overlay table styles */ 56 | .table-wrapper { 57 | position: relative; 58 | } 59 | 60 | .md-typeset .md-table__button { 61 | margin-top: 0rem !important; 62 | position: absolute; 63 | top: 0.5rem; 64 | right: 0.5rem; 65 | width: 1.5em; 66 | height: 1.5em; 67 | cursor: pointer; 68 | display: flex; 69 | align-items: center; 70 | justify-content: center; 71 | color: var(--md-default-fg-color--lightest); 72 | background-color: var(--md-default-bg-color); 73 | border: 1px solid var(--md-default-fg-color--lightest); 74 | border-radius: 0.2rem; 75 | transition: all 250ms; 76 | z-index: 10; 77 | opacity: 0; 78 | visibility: hidden; 79 | } 80 | 81 | /* Show button at half opacity when hovering over header */ 82 | .table-wrapper.header-hover .md-table__button { 83 | opacity: 0.5; 84 | visibility: visible; 85 | } 86 | 87 | /* Only highlight with accent color when hovering directly over the button */ 88 | .md-typeset .md-table__button:hover, 89 | .md-typeset .md-table__button:focus { 90 | color: var(--md-accent-fg-color); 91 | border-color: var(--md-accent-fg-color); 92 | opacity: 1; 93 | } 94 | 95 | .md-typeset .md-table__button::after { 96 | display: block; 97 | width: 1em; 98 | height: 1em; 99 | content: ""; 100 | background-color: currentcolor; 101 | mask-repeat: no-repeat; 102 | mask-position: center; 103 | mask-size: contain; 104 | } 105 | 106 | .md-typeset .md-table__button[data-md-type="expand"]::after { 107 | mask-image: url('data:image/svg+xml,'); 108 | } 109 | 110 | .md-typeset .md-table__button[data-md-type="collapse"]::after { 111 | mask-image: url('data:image/svg+xml,'); 112 | } 113 | 114 | /* END overlay table styles */ -------------------------------------------------------------------------------- /docs/blog/posts/2024/launch.md: -------------------------------------------------------------------------------- 1 | --- 2 | date: 2024-12-12 3 | authors: 4 | - bwallis 5 | tags: 6 | - media 7 | - nfd 8 | --- 9 | 10 | # The beginning of an ~~era~~ EDA 11 | 12 |
13 |
14 | Today marks a huge milestone. You may have heard us talking about "EDA" at several public events - now you get to experience it for yourself. 15 | 16 | It was a mere 24 months ago that we started the initial design for a next generation controller, which eventually adopted the codename EDA - Event Driven Automation. 17 | 18 | Our goals were lofty; intents without inflexibility, simplified consumption of streaming telemetry, multi vendor, multi domain, CI/CD, pipelines, all encompassing revision control, all built for the modern tooling era. 19 | 20 | Did we succeed? You get to be the judge! 21 | 22 |
23 | 24 |
25 | ![img](../../../images/eda.svg) 26 |
27 | 28 |
29 | 30 | 31 | 32 | ## EDA? 33 | 34 | If you've never heard of EDA before there is no better place to start than checking out the [NFD special](https://techfieldday.com/event/nfdxnokia24/) dedicated to this next generation automation controller. 35 | 36 | Before diving into the technical details, we wanted to share a bit about our motivations. What problems we saw unsolved and how we saw EDA as a solution, and the world of declarative abstractions. 37 | 38 | -{{youtube(url='https://www.youtube.com/embed/aNOyAz5A1Sw')}}- 39 | 40 | What you will notice when reading through this engineering documentation portal is that we always try to put a demo behind the concepts we are describing. Our NFD appearance was not an exception - after explaining the design goals, drawing out the problem space and telling you how we think EDA is fit to solve them, we did a live demo of EDA in action. 41 | 42 | How to deploy the whole fabric config in a network-wide transaction over a fleet of devices using declarative abstractions? How declarative abstractions can be nested and composed? How leveraging modeled network management interfaces can guarantee safety and reliability when used in conjunction with a transaction model? 43 | This is all waiting for you in the next video: 44 | 45 | -{{youtube(url='https://www.youtube.com/embed/qaMoBUBdUJU')}}- 46 | 47 | After covering the configuration aspects of EDA we switch to _state_. What exactly do we mean by saying that abstractions should not only be for configuration, but also for state? How having state and configuration together can help operations? What would it look like to have a query language for your whole network, both for config and state? 48 | And lastly, if you came for AI bits - this video is for you! 49 | 50 | -{{youtube(url='https://www.youtube.com/embed/PIw9CohK-4k')}}- 51 | 52 | ## Try EDA 53 | 54 | The NFD videos are a great introduction to the concepts behind EDA, and it is highly likely we target the same problems you face with existing automation software. In that case, you would presumably willing to book an EDA demo... 55 | While booking a demo is absolutely possible, we are confident that you'll be able to recognize the value of EDA by running it in your own environment and on your own terms. 56 | 57 | And with that said. the team[^1] is immensely proud to share EDA's first **public** release tagged with `24.12.1` version. This release is available for everyone to enjoy without a license and is available for download from the public GitHub container registry. No, really - no pay walls or registration walls. 58 | 59 |

60 | [Try EDA](../../../getting-started/try-eda.md){ .md-button .md-button--primary } 61 |

62 | 63 | We're excited to see the yet-unimagined ways you'll use the framework to solve interesting automation problems. 64 | 65 | ## Community 66 | 67 | EDA is a framework that allows users to create their own automation journey by creating custom abstractions, CI/CD workflows, composable UI dashboards, and applications that can be shared with the community. We wholeheartedly believe that the automation flourishes when it is open, collaborative, and accessible to everyone. 68 | 69 | As with SR Linux, we host our community Discord server and invite everyone to join us as we push the boundaries of what is possible with automation. 70 | 71 |

72 | [:fontawesome-brands-discord: Join EDA Discord](https://eda.dev/discord){ .md-button .md-button--primary } 73 |

74 | 75 | [^1]: From the EDA development, test, and product management teams. 76 | -------------------------------------------------------------------------------- /docs/development/apps/setup-env.md: -------------------------------------------------------------------------------- 1 | # Setting up the dev environment 2 | 3 | Before you start building an app, you'll need to prepare the development environment. This guide assumes you have EDA installed already and if you don't, you can quickly spin one up by following the [Try EDA](../../getting-started/try-eda.md) guide. 4 | 5 | Your primary tools when developing an app: 6 | 7 | * `edabuilder` for scaffolding, building, and publishing your app. 8 | * `go` sdk for authoring the API of your custom resources. 9 | * `python` runtime for getting syntax highlighting and IDE support when writing intents optional. 10 | * `kubectl` for creating resources. 11 | * `edactl` for verifying installation workflows and debugging. 12 | 13 | These tools are available for all major OSes and architectures, so you can develop on your preferred platform, no matter where you are. 14 | 15 | /// tab | `edabuilder` 16 | `edabuilder` is a CLI tool that helps to scaffold a new EDA app, build the container for it and then publish the application to the catalog. The CLI can be downloaded from the [GitHub repository][edabuilder-repo-release] as well as from the `eda-toolbox`[^1] Pod. 17 | 18 | [edabuilder-repo-release]: https://github.com/nokia-eda/edabuilder/releases 19 | 20 | //// tab | Download from GitHub 21 | Download the latest `edabuilder` binary from the [GitHub repository][edabuilder-repo-release] directly, or leverage the downloader script that comes with the [EDA Playground](https://github.com/nokia-eda/playground): 22 | 23 | ```bash title="Run in the EDA Playground repository" 24 | make download-edabuilder 25 | ``` 26 | 27 | This will download the `edabuilder` binary to the `./tools` directory in the EDA Playground repository. For convenience, you can move the binary somewhere to your `$PATH`. 28 | //// 29 | //// tab | Download from eda-toolbox 30 | 31 | If you're developing on a linux/amd64 machine, you can get the `edabuilder` binary from the `eda-toolbox` Pod: 32 | 33 | ```shell 34 | TOOLBOX_POD=$(kubectl get -n eda-system pod -l eda.nokia.com/app=eda-toolbox \ 35 | -o jsonpath='{.items[0].metadata.name}') 36 | kubectl -n eda-system \ 37 | cp ${TOOLBOX_POD}:/eda/tools/edabuilder /usr/local/bin/edabuilder 38 | sudo chmod +x /usr/local/bin/edabuilder 39 | ``` 40 | 41 | //// 42 | /// 43 | 44 | /// tab | `go` 45 | We will define the API of our declarative apps exactly like in Kubernetes - by crafting the Go files that extend the API of the EDA core. For this, we need a Go SDK. 46 | 47 | Install Go SDK by following [the upstream installation instructions](https://go.dev/doc/install). 48 | 49 | /// note 50 | The minimum required Go version is `1.24.0`. 51 | /// 52 | /// 53 | 54 | /// tab | `python` 55 | While being optional, we recommend installing the Python runtime and initialize a virtual environment for development. 56 | 57 | If you already have a Python environment dialed in, you can skip this step, but if not, then the easiest way to get Python on your dev machine is by installing [uv](https://docs.astral.sh/uv/getting-started/installation/) - a modern multiplatform Python distribution and package manager. 58 | /// 59 | 60 | /// tab | `kubectl` 61 | [`kubectl`](https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/) is the Kubernetes command-line tool. During development, you may find it easier to create resources with it, rather than venturing into the EDA UI. 62 | 63 | If you have completed the Try EDA step, then kubectl has already been downloaded for you and you can just copy it out to a permanent location in your `$PATH`. 64 | /// 65 | 66 | /// tab | `edactl` 67 | `edactl` will help you query the EDA cluster and debug your application. You don't even need to download it directly, you can use an alias to run it from within the EDA cluster as explained in the [CLI Tools](../../user-guide/using-the-clis.md#edactl) guide. 68 | /// 69 | 70 | And now with these tools in your toolchest, you've got everything you need to start building your first app! Choose your preferred path, would you want to put the code to the compiler right away or want to beef up your knowledge on the matter? 71 | 72 |
73 | 74 | * :material-hammer-screwdriver:{ .middle } __Quick start__ 75 | 76 | --- 77 | 78 | Prefer to dive into a hands on example? 79 | 80 | [:octicons-arrow-right-24: Create your first app](quick-start.md) 81 | 82 | * :octicons-question-16:{ .middle } __More reading?__ 83 | 84 | --- 85 | 86 | Thirsting for knowledge? 87 | 88 | [:octicons-arrow-right-24: Learn what makes up an app](components.md) 89 | 90 |
91 | 92 | [^1]: `eda-toolbox` pod is by default deployed in the `eda-system` namespace. 93 | -------------------------------------------------------------------------------- /docs/apps/remote-write.md: -------------------------------------------------------------------------------- 1 | # Remote Write 2 | 3 | -{{% import 'icons.html' as icons %}}- 4 | 5 | | {: .hide-th } | | 6 | | -------------------- | ------------------------------------------------------------------------------------------------------- | 7 | | **Description** | The Remote Write app exports metrics to servers adhering to Prometheus Remote-Write Specifications | 8 | | **Author** | Nokia | 9 | | **Supported OS** | N/A | 10 | | **Catalog** | [nokia-eda/catalog][catalog] | 11 | | **Source Code** | coming soon | 12 | 13 | [catalog]: https://github.com/nokia-eda/catalog 14 | 15 | --- 16 | 17 | ## Overview 18 | 19 | The Remote Write app enables exporting network and EDA metrics to remote Prometheus-compatible servers using the [Remote-Write specification v1.0](https://prometheus.io/docs/specs/prw/remote_write_spec/). The app provides resources to define the metrics to export and the destinations to send them to. 20 | 21 | Application components: 22 | 23 | /// tab | Resources 24 | 25 |
26 |
27 | -{{icons.default_category_icon("REMOTEWRITE")}}- 28 | 29 | * Cluster Destinations 30 | * Cluster Exporters 31 | * Destinations 32 | * Exporters 33 | 34 |
35 |
36 | /// 37 | 38 | ## Installation 39 | 40 | Notifier app can be installed using [EDA Store](app-store.md) or by running the app-installer workflow with `kubectl`: 41 | 42 | /// tab | YAML 43 | 44 | ```yaml 45 | --8<-- "docs/apps/remote-write/install.yml" 46 | ``` 47 | 48 | /// 49 | /// tab | `kubectl` 50 | 51 | ```bash 52 | cat << 'EOF' | kubectl apply -f - 53 | --8<-- "docs/apps/remote-write/install.yml" 54 | EOF 55 | ``` 56 | 57 | /// 58 | 59 | ## Getting Started 60 | 61 | After installing the app, you can configure: 62 | 63 | * **Export** and **ClusterExport**: Define metrics to collect (with filtering, mapping, renaming, labels, etc.). 64 | * **Destination** and **ClusterDestination**: Define remote write endpoints (with TLS, authentication, and buffering). 65 | 66 | ## Example Resources 67 | 68 | ### Destination 69 | 70 | Defines a remote server to which metrics are written. Supports optional TLS, authentication, custom headers, retries, and timeouts. 71 | 72 | /// tab | YAML 73 | 74 | ```yaml 75 | --8<-- "docs/apps/remote-write/destination.yml" 76 | ``` 77 | 78 | /// 79 | /// tab | `kubectl` 80 | 81 | ```bash 82 | cat << 'EOF' | kubectl apply -f - 83 | --8<-- "docs/apps/remote-write/destination.yml" 84 | EOF 85 | ``` 86 | 87 | /// 88 | 89 | ### Export: Interfaces Statistics 90 | 91 | Defines what metrics to export and to which destinations. Metrics are retrieved from the state DB at the given `path` and can include optional filtering, labeling, and transformation. 92 | 93 | /// tab | YAML 94 | 95 | ```yaml 96 | --8<-- "docs/apps/remote-write/export.yml" 97 | ``` 98 | 99 | /// 100 | /// tab | `kubectl` 101 | 102 | ```bash 103 | cat << 'EOF' | kubectl apply -f - 104 | --8<-- "docs/apps/remote-write/export.yml" 105 | EOF 106 | ``` 107 | 108 | /// 109 | 110 | --- 111 | 112 | ## Advanced Configuration 113 | 114 | ### Destination Resource Options 115 | 116 | * **authentication**: `username`/`password` for basic auth. 117 | * **authorization**: `type` (for example, Bearer) and token-based credentials. 118 | * **tls**: Provide CA/cert/key file paths and `skipVerify` flag. 119 | * **writeOptions**: Tune buffer size, flush interval, custom HTTP headers, retries, and timeouts. 120 | * **metadata**: 121 | 122 | * `include`: Whether to send metadata. 123 | * `interval`: Frequency of metadata updates. 124 | * `maxEntriesPerWrite`: Limit per request. 125 | 126 | ### Export Resource Options 127 | 128 | * **path** (required): State DB path to collect from. 129 | * **mode**: `periodic`, `on-change`, or `periodic-on-change`. 130 | * **interval**: Polling interval for metric collection. 131 | * **fields**: Optional subset of fields to export. 132 | * **labels**: Static and dynamic labels. 133 | * **mappings**: Transform field values using regex and numeric replacements. 134 | * **metricName**: Rename metrics using regex. 135 | * **resource**: Use a CR as source; metric value is `1`, and CR labels are used as metric labels. 136 | * **where**: Filtering condition (e.g., `admin-state = enable`). 137 | -------------------------------------------------------------------------------- /docs/software-install/preparing-for-installation.md: -------------------------------------------------------------------------------- 1 | # Preparing for installation 2 | 3 | ## Download the EDA Installation playground 4 | 5 | Ensure that your Linux installation[^1] environment meets the requirements described in [Installation platform requirements](index.md#installation-platform-requirements). 6 | 7 | Clone the playground repository to your tools-system. 8 | 9 | ```bash 10 | git clone https://github.com/nokia-eda/playground && cd playground 11 | ``` 12 | 13 | ### Installing additional tools 14 | 15 | Download additional tools that can be used during the installation. 16 | 17 | ```bash 18 | make download-tools 19 | ``` 20 | 21 | As a result of this command, the `kind`, `kubectl`, `kpt`, and `yq` utilities will be installed in the `./tools` directory. 22 | 23 | ### Obtaining the EDA packages 24 | 25 | EDA is packaged using the [Kubernetes Package Tool](https://kpt.dev) (kpt). EDA uses this package manager tool to install core EDA components. The installer downloads two kpt packages by downloading their relevant git repositories. 26 | 27 | To obtain the EDA package, enter the following command: 28 | 29 | ``` 30 | make download-pkgs 31 | ``` 32 | 33 | This command downloads the following git repositories to their respective directories: 34 | 35 | * EDA kpt package in the `eda-kpt` directory 36 | * EDA built-in catalog in the `catalog` directory 37 | 38 | ## Download edaadm tools 39 | 40 | Ensure that your Linux installation environment meets the requirements described in [Installation platform requirements](index.md#installation-platform-requirements). 41 | 42 | Clone the EDAADM repository: 43 | 44 | ```bash 45 | git clone https://github.com/nokia-eda/edaadm && cd edaadm 46 | ``` 47 | 48 | The CLI tool that orchestrates the configuration and installation of the EDA platform in a production environment is called `edaadm`. To download `edaadm` run the following command from the root of the `edaadm` repository: 49 | 50 | ```bash 51 | make -C bundles/ download-tools 52 | ``` 53 | 54 | This step downloads[^2] the `edaadm` CLI tool for your architecture in the `./bundles/tools` directory. You can copy the `edaadm` binary from the `./bundles/tools` directory to a location in your `$PATH` to make it available in your shell for future use, for example: 55 | 56 | ```bash title="copying edaadm to /usr/local/bin" 57 | sudo cp bundles/tools/edaadm* /usr/local/bin/edaadm 58 | ``` 59 | 60 | 73 | 74 | ## Download the Talos machine image 75 | 76 | The `edaadm` tool provides you with the URL to download the latest Talos machine image for use with VMware or KVM. 77 | 78 | To deploy the Talos Kubernetes environment, download the Talos Machine image based on the environment in which you want to deploy the VMs. 79 | 80 | ### Downloading the KVM image 81 | 82 | Use the `edaadm` tool to display the URL from where you can download the latest image for use with KVM for the supported Talos version. 83 | 84 | ``` 85 | edaadm images --mach-type nocloud 86 | ``` 87 | 88 |
89 | ```{.text .no-copy .no-select} 90 | Schematic ID is :376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba 91 | Asset URLs are: 92 | https://factory.talos.dev/image/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba/v1.9.2/nocloud-amd64.iso 93 | https://factory.talos.dev/image/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba/v1.9.2/nocloud-amd64.raw.xz 94 | ``` 95 |
96 | 97 | Download the `nocloud-amd64.iso` image from the ISO URL, filepath.iso. 98 | 99 | You can download using your browser or you can use the curl command. 100 | 101 | ### Downloading the VMware OVA image 102 | 103 | Use the `edaadm` tool to display the URL from where you can download latest image for use with VMware vSphere for the supported Talos version. 104 | 105 | ``` 106 | edaadm images --mach-type vmware 107 | ``` 108 | 109 |
110 | ```{.text .no-copy .no-select} 111 | Schematic ID is :903b2da78f99adef03cbbd4df6714563823f63218508800751560d3bc3557e40 112 | Asset URLs are: 113 | https://factory.talos.dev/image/903b2da78f99adef03cbbd4df6714563823f63218508800751560d3bc3557e40/v1.9.2/vmware-amd64.iso 114 | https://factory.talos.dev/image/903b2da78f99adef03cbbd4df6714563823f63218508800751560d3bc3557e40/v1.9.2/vmware-amd64.ova 115 | ``` 116 |
117 | 118 | Download the `vmware-amd64.ova` image from the OVA URL, filepath.ova. 119 | 120 | You can download using your browser or you can use the curl or wget commands. You can also use the URL directly with the ovftool command to deploy the OVA to your VMware vSphere environment. 121 | 122 | [^1]: This system might also be referred to as the "tools-system" further in this documentation. 123 | [^2]: The `edaadm` binary for different platforms can be manually downloaded from https://github.com/nokia-eda/edaadm/releases/. 124 | -------------------------------------------------------------------------------- /docs/connect/kubernetes-plugin-helm-installation.md: -------------------------------------------------------------------------------- 1 | # Kubernetes Plugin Helm Installation 2 | 3 | This guide provides step-by-step instructions for installing the EDA Connect Kubernetes plugin using Helm charts. 4 | 5 | /// warning 6 | Before proceeding with this installation method, ensure you have completed all the prerequisites and preparation steps described in the [Kubernetes Plugin Installation](kubernetes-plugin-installation.md) guide. 7 | /// 8 | 9 | ## Prerequisites 10 | 11 | * All prerequisites from the [Kubernetes Plugin Installation](kubernetes-plugin-installation.md) guide must be met 12 | * EDA Kubernetes preparation steps (Service Account and Token) must be completed 13 | * Helm 3.x installed on your system 14 | 15 | ## Installation Steps 16 | 17 | ### Step 1: Fetch the EDA Connect OpenShift Plugin Helm Charts 18 | 19 | There are two ways to get the Helm charts to deploy the EDA Connect OpenShift plugin: 20 | 21 | 1. Using the EDA Playground (if you used it to install EDA): 22 | 23 | ```bash 24 | make download-connect-k8s-helm-charts 25 | ``` 26 | 27 | 2. Downloading the release tarball and unpacking it: 28 | 29 | ```bash 30 | curl -sLO https://github.com/nokia-eda/connect-k8s-helm-charts/archive/refs/tags/5.0.0.tar.gz 31 | tar zxf 5.0.0.tar.gz 32 | ``` 33 | 34 | ### Step 2: Create a Namespace for the OpenShift Plugin 35 | 36 | The OpenShift Plugin uses its own namespace to separate it from other resources in the OpenShift cluster: 37 | 38 | ```bash 39 | kubectl create namespace eda-connect-k8s-controller 40 | ``` 41 | 42 | ### Step 3: Configure a Pull Secret for the Controller Image 43 | 44 | If the EDA Connect OpenShift Plugin Controller image is hosted in a registry that requires authentication, create a Kubernetes secret for OpenShift to pull the image: 45 | 46 | ```bash 47 | export PULL_TOKEN= 48 | kubectl create secret docker-registry eda-k8s-image-secret \ 49 | --docker-server=ghcr.io/nokia-eda/eda-connect-k8s-controller \ 50 | --docker-username=nokia-eda-bot \ 51 | --docker-password=${PULL_TOKEN} \ 52 | -n eda-connect-k8s-controller 53 | ``` 54 | 55 | /// details | Getting the pull token 56 | type: info 57 | 58 | The pull token can be retrieved from your EDA deployment. See the [Get the Pull Token](kubernetes-plugin-installation.md#get-the-pull-token) section in the main installation guide for detailed instructions. 59 | /// 60 | 61 | ### Step 4: Set Up the Helm Values 62 | 63 | Create a `helm-values.yaml` file with the following content and update the fields as appropriate: 64 | 65 | ```yaml 66 | --8<-- "docs/connect/resources/openshift-helm-values.yaml" 67 | ``` 68 | 69 | #### Helm Values Reference 70 | 71 | The possible Helm Values are: 72 | 73 | **`connectpluginname`** 74 | : A name for the plugin. Make sure this is a unique name within your EDA environment. 75 | 76 | /// warning | Plugin Name Requirements 77 | The plugin name must comply with the regex check of `'([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]'` and can only contain alphanumerical 78 | characters and `.`, `_` and `-`. It must start with an alphanumerical character, and have a length of 63 characters or fewer. 79 | /// 80 | 81 | **`heartbeat`** 82 | : The interval in seconds at which the plugin should send heartbeats. Values between 10-30 are recommended. 83 | 84 | _**`namespace`** 85 | : A name of a namespace in EDA containing the fabric and resources. 86 | 87 | /// details | EDA Namespace 88 | type: warning 89 | The EDA Namespace is the namespace in EDA where the fabric is configured. This is different from the `eda-system` namespace used for EDA system components. 90 | /// 91 | 92 | **`skiptlsverify`** 93 | : Can be enabled to disable server TLS certificate verification when connecting to the EDA Kubernetes cluster (not recommended for production). 94 | 95 | **`tlscertificatedata`** 96 | : When certificate validation is enabled, this property can contain the certificate information of the EDA Kubernetes cluster, similar to what a kubeconfig would contain. This is only needed if certificate validation is enabled and if the EDA Kubernetes certificate has not been signed by a trusted authority. 97 | 98 | **`tlsenabled`** 99 | : Should always be true to make sure TLS is used to secure the communication with the EDA Kubernetes cluster. 100 | 101 | **`connectHost`** 102 | : The URL to reach the EDA Kubernetes cluster API. 103 | 104 | **`connectPassword`** 105 | : The long-lived token created in the [Create a Service Account Token](kubernetes-plugin-installation.md#create-a-service-account-token) section. 106 | 107 | **`connectUsername`** 108 | : The service account name for the account created in the [Create a Service Account](kubernetes-plugin-installation.md#create-a-service-account) section. 109 | 110 | ### Step 5: Deploy the Plugin 111 | 112 | Deploy the EDA Connect OpenShift Plugin using Helm: 113 | 114 | ```bash 115 | helm install eda-k8s connect-k8s-helm-charts/ \ 116 | -n eda-connect-k8s-controller \ 117 | -f helm-values.yaml \ 118 | --set controller.imagePullSecretName=eda-k8s-image-secret 119 | ``` 120 | 121 | ## Post-Installation Verification 122 | 123 | After deployment, verify the installation was successful using the steps described in the [Post-Installation Verification](kubernetes-plugin-installation.md#post-installation-verification) section of the main installation guide. 124 | 125 | -------------------------------------------------------------------------------- /docs/user-guide/try-eda-topo.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: topologies.eda.nokia.com/v1alpha1 2 | kind: NetworkTopology 3 | metadata: 4 | name: try-eda-topology-a 5 | namespace: eda 6 | spec: 7 | operation: replaceAll 8 | nodeTemplates: 9 | - name: leaf 10 | nodeProfile: srlinux-ghcr-25.10.1 11 | platform: 7220 IXR-D3L 12 | labels: 13 | eda.nokia.com/security-profile: managed 14 | eda.nokia.com/role: leaf 15 | - name: spine 16 | nodeProfile: srlinux-ghcr-25.10.1 17 | platform: 7220 IXR-D5 18 | labels: 19 | eda.nokia.com/security-profile: managed 20 | eda.nokia.com/role: spine 21 | nodes: 22 | - name: leaf1 23 | template: leaf 24 | - name: leaf2 25 | template: leaf 26 | - name: spine1 27 | template: spine 28 | linkTemplates: 29 | - name: isl 30 | type: interSwitch 31 | speed: 25G 32 | encapType: "null" 33 | labels: 34 | eda.nokia.com/role: interSwitch 35 | - name: edge 36 | type: edge 37 | encapType: dot1q 38 | labels: 39 | eda.nokia.com/role: edge 40 | links: 41 | #################### 42 | # ISLs 43 | #################### 44 | - name: leaf1-spine1-1 45 | template: isl 46 | endpoints: 47 | - local: 48 | node: leaf1 49 | interface: ethernet-1-1 50 | remote: 51 | node: spine1 52 | interface: ethernet-1-1 53 | - name: leaf1-spine1-2 54 | template: isl 55 | endpoints: 56 | - local: 57 | node: leaf1 58 | interface: ethernet-1-2 59 | remote: 60 | node: spine1 61 | interface: ethernet-1-2 62 | - name: leaf2-spine1-1 63 | template: isl 64 | endpoints: 65 | - local: 66 | node: leaf2 67 | interface: ethernet-1-1 68 | remote: 69 | node: spine1 70 | interface: ethernet-1-3 71 | - name: leaf2-spine1-2 72 | template: isl 73 | endpoints: 74 | - local: 75 | node: leaf2 76 | interface: ethernet-1-2 77 | remote: 78 | node: spine1 79 | interface: ethernet-1-4 80 | #################### 81 | # Edges 82 | #################### 83 | - name: leaf1-ethernet-1-3 84 | template: edge 85 | endpoints: 86 | - local: 87 | node: leaf1 88 | interface: ethernet-1-3 89 | - name: leaf1-ethernet-1-4 90 | template: edge 91 | endpoints: 92 | - local: 93 | node: leaf1 94 | interface: ethernet-1-4 95 | - name: leaf1-ethernet-1-5 96 | template: edge 97 | endpoints: 98 | - local: 99 | node: leaf1 100 | interface: ethernet-1-5 101 | - name: leaf1-ethernet-1-6 102 | template: edge 103 | endpoints: 104 | - local: 105 | node: leaf1 106 | interface: ethernet-1-6 107 | - name: leaf1-ethernet-1-7 108 | template: edge 109 | endpoints: 110 | - local: 111 | node: leaf1 112 | interface: ethernet-1-7 113 | - name: leaf1-ethernet-1-8 114 | template: edge 115 | endpoints: 116 | - local: 117 | node: leaf1 118 | interface: ethernet-1-8 119 | - name: leaf1-ethernet-1-9 120 | template: edge 121 | endpoints: 122 | - local: 123 | node: leaf1 124 | interface: ethernet-1-9 125 | - name: leaf1-e1011 126 | template: edge 127 | endpoints: 128 | - local: 129 | node: leaf1 130 | interface: ethernet-1-10 131 | - local: 132 | node: leaf1 133 | interface: ethernet-1-11 134 | - name: leaf2-ethernet-1-3 135 | template: edge 136 | endpoints: 137 | - local: 138 | node: leaf2 139 | interface: ethernet-1-3 140 | - name: leaf2-ethernet-1-4 141 | template: edge 142 | endpoints: 143 | - local: 144 | node: leaf2 145 | interface: ethernet-1-4 146 | - name: leaf2-ethernet-1-5 147 | template: edge 148 | endpoints: 149 | - local: 150 | node: leaf2 151 | interface: ethernet-1-5 152 | - name: leaf2-ethernet-1-6 153 | template: edge 154 | endpoints: 155 | - local: 156 | node: leaf2 157 | interface: ethernet-1-6 158 | - name: leaf2-ethernet-1-7 159 | template: edge 160 | endpoints: 161 | - local: 162 | node: leaf2 163 | interface: ethernet-1-7 164 | - name: leaf2-ethernet-1-8 165 | template: edge 166 | endpoints: 167 | - local: 168 | node: leaf2 169 | interface: ethernet-1-8 170 | - name: leaf2-ethernet-1-9 171 | template: edge 172 | endpoints: 173 | - local: 174 | node: leaf2 175 | interface: ethernet-1-9 176 | - name: leaf2-e1011 177 | template: edge 178 | endpoints: 179 | - local: 180 | node: leaf2 181 | interface: ethernet-1-10 182 | - local: 183 | node: leaf2 184 | interface: ethernet-1-11 185 | - name: leaf1-2-e1212 186 | template: edge 187 | endpoints: 188 | - local: 189 | node: leaf1 190 | interface: ethernet-1-12 191 | - local: 192 | node: leaf2 193 | interface: ethernet-1-12 194 | simulation: 195 | topology: 196 | - node: "*" 197 | interface: "*" 198 | simNode: testman-default 199 | simNodeTemplates: 200 | - name: default 201 | type: TestMan 202 | simNodes: 203 | - name: testman-default 204 | template: default 205 | --------------------------------------------------------------------------------