summaryrefslogtreecommitdiff
path: root/doc/developer
diff options
context:
space:
mode:
Diffstat (limited to 'doc/developer')
-rw-r--r--doc/developer/frr-release-procedure.rst181
-rw-r--r--doc/developer/maintainer-release-build.rst89
-rw-r--r--doc/developer/packaging.rst8
-rw-r--r--doc/developer/release-announcement-template.md40
-rw-r--r--doc/developer/subdir.am3
-rw-r--r--doc/developer/topotests-jsontopo.rst609
-rw-r--r--doc/developer/workflow.rst3
7 files changed, 533 insertions, 400 deletions
diff --git a/doc/developer/frr-release-procedure.rst b/doc/developer/frr-release-procedure.rst
new file mode 100644
index 0000000000..ff95aa04a9
--- /dev/null
+++ b/doc/developer/frr-release-procedure.rst
@@ -0,0 +1,181 @@
+.. _frr-release-procedure:
+
+FRR Release Procedure
+=====================
+
+``<version>`` - version to be released, e.g. 7.3
+``origin`` - FRR upstream repository
+
+1. Checkout ``dev/<version>``.
+
+ .. code-block:: console
+
+ git checkout dev/<version>
+
+2. Create and push a new branch called ``stable/<version>`` based on the
+ ``dev/<version>`` branch.
+
+ .. code-block:: console
+
+ git checkout -b stable/<version>
+ git push origin stable/<version>:refs/heads/stable/<version>
+
+3. Update Changelog for Red Hat Packages:
+
+ Edit :file:`redhat/frr.spec.in` and look for the ``%changelog`` section:
+
+ - Change last (top of list) entry from ``%{version}`` to the **last**
+ released version number. For example, if ``<version>`` is ``7.3`` and the
+ last public release was ``7.2``, you would use ``7.2``, changing the file
+ like so::
+
+ * Tue Nov 7 2017 Martin Winter <mwinter@opensourcerouting.org> - %{version}
+
+ to::
+
+ * Tue Nov 7 2017 Martin Winter <mwinter@opensourcerouting.org> - 7.2
+
+ - Add new entry to the top of the list with ``%{version}`` tag. Make sure
+ to watch the format, i.e. the day is always 2 characters, with the 1st
+ character being a space if the day is one digit.
+
+ - Add the changelog text below this entry.
+
+4. Update Changelog for Debian Packages:
+
+ Edit :file:`changelog-auto.in`:
+
+ - Change last (top of list) entry from ``@VERSION@`` to the **last**
+ released version number. For example, if ``<version>`` is ``7.3`` and the
+ last public release was ``7.2``, you would use ``7.2``, changing the file
+ like so::
+
+ frr (@VERSION@) RELEASED; urgency=medium
+
+ to::
+
+ frr (7.2) RELEASED; urgency=medium
+
+ - Add a new entry to the top of the list with a ``@VERSION@`` tag. Make sure
+ to watch the format.
+
+ - Add the changelog text below this entry.
+
+ - Verify the changelog format using ``dpkg-parsechangelog``. In the
+ repository root:
+
+ .. code-block:: console
+
+ dpkg-parsechangelog
+
+ You should see output like this::
+
+ vagrant@local ~/frr> dpkg-parsechangelog
+ Source: frr
+ Version: 7.3-dev-0
+ Distribution: UNRELEASED
+ Urgency: medium
+ Maintainer: FRRouting-Dev <dev@lists.frrouting.org>
+ Timestamp: 1540478210
+ Date: Thu, 25 Oct 2018 16:36:50 +0200
+ Changes:
+ frr (7.3-dev-0) RELEASED; urgency=medium
+ .
+ * Your Changes Here
+
+5. Change main version number:
+
+ - Edit :file:`configure.ac` and change version in the ``AC_INIT`` command
+ to ``<version>``
+
+6. Commit the changes, adding the changelog to the commit message. Follow all
+ existing commit guidelines.
+
+7. Create and submit a GitHub pull request, with the ``HEAD`` set to
+ ``stable/<version>`` and the base set to the upstream ``master`` branch.
+ Allow NetDef CI to complete its run and verify that all package builds were
+ successful.
+
+8. Create a git tag for the version:
+
+ .. code-block:: console
+
+ git tag -a frr-<version> -m "FRRouting Release <version>"
+
+9. Push the commit and new tag.
+
+ .. code-block:: console
+
+ git push origin stable/<version>:refs/head/stable/<version>
+ git push origin frr-<version>
+
+10. Kick off the Release build plan on the CI system for the correct release.
+ Contact Martin Winter for this step. Ensure all release packages build
+ successfully.
+
+11. Kick off the Snapcraft build plan for the release.
+
+12. Acquire the release RPM binary packages from Martin Winter.
+
+13. On GitHub, go to the <https://github.com/FRRouting/frr/releases>_ and click
+ "Draft a new release". Write a release announcement. The release
+ announcement should follow the template in
+ ``release-announcement-template.md``, located next to this document. Check
+ for spelling errors, and optionally (but preferably) have other maintainers
+ proofread the announcement text.
+
+ Attach **only** the binary RPM packages to the GitHub release using
+ GitHub's attachment functionality. Do not attach Debian packages. Do not
+ attach source tarballs - these will be generated and attached by GitHub
+ automatically. Do not publish the release yet.
+
+14. Contact the current Debian maintainer for FRR to get new Debian packages
+ built and published on our APT repository at https://deb.frrouting.net/.
+ Ensure the webpage text is updated. Verify that new packages install
+ successfully on a vanilla Debian installation using the instructions on the
+ webpage.
+
+15. Deploy Snapcraft release (after CI system finishes the tests for snapcraft
+ testplan).
+
+16. Update the Read The Docs instance to being publishing documentation built
+ off the ``stable/<version>`` branch. Contact Quentin Young for this step.
+
+17. Publish the GitHub release.
+
+18. Clone the ``frr-www`` repository:
+
+ .. code-block:: console
+
+ git clone https://github.com/FRRouting/frr-www.git
+
+19. Add a new release announcement, using a previous announcement as template:
+
+ .. code-block:: console
+
+ cp <old-version>-launch.md <version>-launch.md
+
+ Paste the GitHub release announcement text into this document, and **remove
+ line breaks**. In other words, this::
+
+ This is one continuous
+ sentence that should be
+ rendered on one line
+
+ Needs to be changed to this::
+
+ This is one continuous sentence that should be rendered on one line
+
+ This is very important otherwise the announcement will be unreadable on the
+ website.
+
+ Make sure to add a link to the GitHub releases page at the top.
+
+ Once finished, manually add a new entry into ``index.html`` to link to this
+ new announcement. Look at past commits to see how to do this.
+
+20. Deploy the updated ``frr-www`` on the frrouting.org web server and verify
+ that the announcement text is visible.
+
+21. Send an email to ``announce@lists.frrouting.org``. The text of this email
+ should include the text from the GitHub release.
diff --git a/doc/developer/maintainer-release-build.rst b/doc/developer/maintainer-release-build.rst
deleted file mode 100644
index 7792173034..0000000000
--- a/doc/developer/maintainer-release-build.rst
+++ /dev/null
@@ -1,89 +0,0 @@
-Release Build Procedure for FRR Maintainers
-===========================================
-
-1. Rename branch (if needed)
-
-.. code-block:: shell
-
- git clone git@github.com:FRRouting/frr.git
- cd frr
- git checkout dev/5.0
- git push origin :refs/heads/dev/5.0
- git push origin dev/5.0:refs/heads/stable/5.0
-
-2. Checkout the new stable branch:
-
-.. code-block:: shell
-
- git checkout stable/5.0
-
-3. Update Changelog for RedHat Package:
-
- Edit :file:`redhat/frr.spec.in` and look for the ``%changelog`` section:
-
- - Change last (top of list) entry from ``%{version}`` to previous fixed
- version number, i.e.::
-
- * Tue Nov 7 2017 Martin Winter <mwinter@opensourcerouting.org> - %{version}
-
- to::
-
- * Tue Nov 7 2017 Martin Winter <mwinter@opensourcerouting.org> - 3.0.2
-
- - Add new entry to the top of the list with ``%{version}`` tag and changelog
- for version.
- Make sure to watch the format, i.e. the day is always 2 characters, with
- the 1st character being a space if the day is one digit.
-
-4. Update Changelog for Debian Packages:
-
- Edit :file:`debian/changelog-auto.in`:
-
- - Change last (top of list) entry from ``@VERSION@`` to previous fixed
- version number, i.e.::
-
- frr (@VERSION@) RELEASED; urgency=medium
-
- to::
-
- frr (3.0.2) RELEASED; urgency=medium
-
- - Add a new entry to the top of the list with a ``@VERSION@`` tag and
- changelog for version.
-
-5. Change main version number:
-
- - Edit :file:`configure.ac` and change version in the ``AC_INIT`` command
- - Create a new entry with the version as ``%{version}`` tag
-
-6. Test building at least a Red Hat and Ubuntu package (or create a PR to have
- the CI system test them)
-
-7. Commit the changes, adding the changelog to the commit message
-
-8. Create a git tag for the version:
-
- .. code-block:: shell
-
- git tag -a frr-5.0 -m "FRRouting Release 5.0"
-
-9. Push the commit and tag(s) and watch for errors on CI:
-
- .. code-block:: shell
-
- git push
- git push --tags
-
-10. Kick off the Release build plan on the CI system for the correct release
-
-11. Send a Release Announcement with changes to
- ``announce@lists.frrouting.org``
-
-12. Kick off the Snapcraft build plan for the correct release
-
-13. After CI plans succeed, release on GitHub by going to
- https://github.com/FRRouting/frr/releases and selecting "Draft a new
- release".
-
-14. Deploy Snapcraft release (after CI system finishes the tests for snapcraft
- testplan)
diff --git a/doc/developer/packaging.rst b/doc/developer/packaging.rst
index b174a9660c..0c072e4d16 100644
--- a/doc/developer/packaging.rst
+++ b/doc/developer/packaging.rst
@@ -1,10 +1,10 @@
-*********
-Packaging
-*********
+********************
+Releases & Packaging
+********************
.. toctree::
:maxdepth: 2
- maintainer-release-build
+ frr-release-procedure
packaging-debian
packaging-redhat
diff --git a/doc/developer/release-announcement-template.md b/doc/developer/release-announcement-template.md
new file mode 100644
index 0000000000..658b87eada
--- /dev/null
+++ b/doc/developer/release-announcement-template.md
@@ -0,0 +1,40 @@
+<!---
+name: release-announcement-template
+about: Template to use when drafing a new release announcement. DELETE THIS
+ BLOCK BEFORE PUBLISHING.
+--->
+
+We are pleased to announce FRR <version>.
+
+<!-- Add a brief summary of major changes here -->
+
+Thank you to all contributors!
+
+Changelog
+---------
+
+<!-- List **only** user-visible changes in this section. When listing changes to individual daemons, alphabetize the list by daemon name. -->
+
+**All daemons:**
+- <!-- List changes to all daemons -->
+
+<!-- If a new daemon was added, list it at the top here -->
+**New daemon: <new>**
+- Adds support for <protocol/feature>
+
+**daemon 1**
+- <!-- List changes -->
+
+**daemon 2**
+- <!-- List changes -->
+
+**daemon N**
+- <!-- List changes -->
+
+### Internal improvements
+
+- <!-- List **only** user-invisible changes here -->
+
+### Packaging changes
+
+- <!-- List any new or removed packages here -->
diff --git a/doc/developer/subdir.am b/doc/developer/subdir.am
index 557a41c51f..2c49d6b875 100644
--- a/doc/developer/subdir.am
+++ b/doc/developer/subdir.am
@@ -26,6 +26,7 @@ dev_RSTFILES = \
doc/developer/building.rst \
doc/developer/cli.rst \
doc/developer/conf.py \
+ doc/developer/frr-release-procedure.rst \
doc/developer/hooks.rst \
doc/developer/include-compile.rst \
doc/developer/index.rst \
@@ -33,7 +34,6 @@ dev_RSTFILES = \
doc/developer/lists.rst \
doc/developer/locking.rst \
doc/developer/logging.rst \
- doc/developer/maintainer-release-build.rst \
doc/developer/memtypes.rst \
doc/developer/modules.rst \
doc/developer/next-hop-tracking.rst \
@@ -55,6 +55,7 @@ EXTRA_DIST += \
$(dev_RSTFILES) \
doc/developer/draft-zebra-00.ms \
doc/developer/ldpd-basic-test-setup.md \
+ doc/developer/release-announcement-template.md \
# end
DEVBUILD = doc/developer/_build
diff --git a/doc/developer/topotests-jsontopo.rst b/doc/developer/topotests-jsontopo.rst
index 65bdcbe9cf..130f072b62 100644
--- a/doc/developer/topotests-jsontopo.rst
+++ b/doc/developer/topotests-jsontopo.rst
@@ -6,54 +6,54 @@ FRRouting Topology Tests with Mininet
*************************************
Overview
-########
+========
On top of current topotests framework following enhancements are done:
-#.
- Creating the topology and assigning IPs to router' interfaces dynamically.\ :raw-html-m2r:`<br>`
+#. Creating the topology and assigning IPs to router' interfaces dynamically.\ :raw-html-m2r:`<br>`
It is achieved by using json file, in which user specify the number of routers,
links to each router, interfaces for the routers and protocol configurations for
all routers.
-#.
- Creating the configurations dynamically. It is achieved by using
+#. Creating the configurations dynamically. It is achieved by using
/usr/lib/frr/frr-reload.py utility, which takes running configuration and the
newly created configuration for any particular router and creates a delta
file(diff file) and loads it to router.
Logging of test case executions
-###############################
+===============================
#. User can enable logging of testcases execution messages into log file by
adding "frrtest_log_dir = /tmp/topotests/" in pytest.ini file
-#. Router's current configuration can be displyed on console or sent to logs by
+#.Router's current configuration can be displyed on console or sent to logs by
adding "show_router_config = True" in pytest.ini file
Log file name will be displayed when we start execution:
-root@test:~/topotests/example-topojson-test/test_topo_json_single_link# python
-test_topo_json_single_link.py Logs will be sent to logfile:
-/tmp/topotests/test_topo_json_single_link_11:57:01.353797
+
+.. code-block:: console
+
+ root@test:~/topotests/example-topojson-test/test_topo_json_single_link# python
+ test_topo_json_single_link.py Logs will be sent to logfile:
+ /tmp/topotests/test_topo_json_single_link_11:57:01.353797
Note: directory "/tmp/topotests/" is created by topotests by default, making
use of same directory to save execution logs.
Guidelines
-##########
+==========
Writing New Tests
-=================
-
+-----------------
-This section will guide you in all recommended steps to produce a standard topology test.
+This section will guide you in all recommended steps to produce a standard
+topology test.
This is the recommended test writing routine:
-
* Create a json file , which will have routers and protocol configurations
* Create topology from json
* Create configuration from json
@@ -61,7 +61,7 @@ This is the recommended test writing routine:
* Create a Pull Request
File Hierarchy
-==============
+--------------
Before starting to write any tests one must know the file hierarchy. The
repository hierarchy looks like this:
@@ -85,292 +85,289 @@ repository hierarchy looks like this:
./lib/bgp.py # library to create only bgp configurations
Defining the Topology and initial configuration in JSON file
-""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The first step to write a new test is to define the topology and initial
configuration. User has to define topology and initial configuration in JSON
-file. Here is an example of JSON file.
-
-.. code-block::
-
- BGP neihghborship with single phy-link, sample JSON file:
- {
- "ipv4base": "192.168.0.0",
- "ipv4mask": 30,
- "ipv6base": "fd00::",
- "ipv6mask": 64,
- "link_ip_start": {"ipv4": "192.168.0.0", "v4mask": 30, "ipv6": "fd00::", "v6mask": 64},
- "lo_prefix": {"ipv4": "1.0.", "v4mask": 32, "ipv6": "2001:DB8:F::", "v6mask": 128},
- "routers": {
- "r1": {
- "links": {
- "lo": {"ipv4": "auto", "ipv6": "auto", "type": "loopback"},
- "r2": {"ipv4": "auto", "ipv6": "auto"},
- "r3": {"ipv4": "auto", "ipv6": "auto"}
- },
- "bgp": {
- "local_as": "64512",
- "address_family": {
- "ipv4": {
- "unicast": {
- "neighbor": {
- "r2": {
- "dest_link": {
- "r1": {}
- }
- },
- "r3": {
- "dest_link": {
- "r1": {}
- }
- }
- }
- }
- }
- }
- }
- },
- "r2": {
- "links": {
- "lo": {"ipv4": "auto", "ipv6": "auto", "type": "loopback"},
- "r1": {"ipv4": "auto", "ipv6": "auto"},
- "r3": {"ipv4": "auto", "ipv6": "auto"}
- },
- "bgp": {
- "local_as": "64512",
- "address_family": {
- "ipv4": {
- "unicast": {
- "redistribute": [
- {
- "redist_type": "static"
- }
- ],
- "neighbor": {
- "r1": {
- "dest_link": {
- "r2": {}
- }
- },
- "r3": {
- "dest_link": {
- "r2": {}
- }
- }
- }
- }
- }
- }
- }
- }
- ...
-
-
- BGP neighboship with loopback interface, sample JSON file:
- {
- "ipv4base": "192.168.0.0",
- "ipv4mask": 30,
- "ipv6base": "fd00::",
- "ipv6mask": 64,
- "link_ip_start": {"ipv4": "192.168.0.0", "v4mask": 30, "ipv6": "fd00::", "v6mask": 64},
- "lo_prefix": {"ipv4": "1.0.", "v4mask": 32, "ipv6": "2001:DB8:F::", "v6mask": 128},
- "routers": {
- "r1": {
- "links": {
- "lo": {"ipv4": "auto", "ipv6": "auto", "type": "loopback",
- "add_static_route":"yes"},
- "r2": {"ipv4": "auto", "ipv6": "auto"}
- },
- "bgp": {
- "local_as": "64512",
- "address_family": {
- "ipv4": {
- "unicast": {
- "neighbor": {
- "r2": {
- "dest_link": {
- "lo": {
- "source_link": "lo"
- }
- }
- }
- }
- }
- }
- }
- },
- "static_routes": [
- {
- "network": "1.0.2.17/32",
- "next_hop": "192.168.0.1
- }
- ]
- },
- "r2": {
- "links": {
- "lo": {"ipv4": "auto", "ipv6": "auto", "type": "loopback",
- "add_static_route":"yes"},
- "r1": {"ipv4": "auto", "ipv6": "auto"},
- "r3": {"ipv4": "auto", "ipv6": "auto"}
- },
- "bgp": {
- "local_as": "64512",
- "address_family": {
- "ipv4": {
- "unicast": {
- "redistribute": [
- {
- "redist_type": "static"
- }
- ],
- "neighbor": {
- "r1": {
- "dest_link": {
- "lo": {
- "source_link": "lo"
- }
- }
- },
- "r3": {
- "dest_link": {
- "lo": {
- "source_link": "lo"
- }
- }
- }
- }
- }
- }
- }
- },
- "static_routes": [
- {
- "network": "192.0.20.1/32",
- "no_of_ip": 9,
- "admin_distance": 100,
- "next_hop": "192.168.0.1",
- "tag": 4001
- }
- ],
- }
- ...
-
- BGP neighborship with Multiple phy-links, sample JSON file:
- {
- "ipv4base": "192.168.0.0",
- "ipv4mask": 30,
- "ipv6base": "fd00::",
- "ipv6mask": 64,
- "link_ip_start": {"ipv4": "192.168.0.0", "v4mask": 30, "ipv6": "fd00::", "v6mask": 64},
- "lo_prefix": {"ipv4": "1.0.", "v4mask": 32, "ipv6": "2001:DB8:F::", "v6mask": 128},
- "routers": {
- "r1": {
- "links": {
- "lo": {"ipv4": "auto", "ipv6": "auto", "type": "loopback"},
- "r2-link1": {"ipv4": "auto", "ipv6": "auto"},
- "r2-link2": {"ipv4": "auto", "ipv6": "auto"}
- },
- "bgp": {
- "local_as": "64512",
- "address_family": {
- "ipv4": {
- "unicast": {
- "neighbor": {
- "r2": {
- "dest_link": {
- "r1-link1": {}
- }
- }
- }
- }
- }
- }
- }
- },
- "r2": {
- "links": {
- "lo": {"ipv4": "auto", "ipv6": "auto", "type": "loopback"},
- "r1-link1": {"ipv4": "auto", "ipv6": "auto"},
- "r1-link2": {"ipv4": "auto", "ipv6": "auto"},
- "r3-link1": {"ipv4": "auto", "ipv6": "auto"},
- "r3-link2": {"ipv4": "auto", "ipv6": "auto"}
- },
- "bgp": {
- "local_as": "64512",
- "address_family": {
- "ipv4": {
- "unicast": {
- "redistribute": [
- {
- "redist_type": "static"
- }
- ],
- "neighbor": {
- "r1": {
- "dest_link": {
- "r2-link1": {}
- }
- },
- "r3": {
- "dest_link": {
- "r2-link1": {}
- }
- }
- }
- }
- }
- }
- }
- }
- ...
-
-
-JSON file explained
+file. Here is an example of JSON file::
+
+ BGP neihghborship with single phy-link, sample JSON file:
+ {
+ "ipv4base": "192.168.0.0",
+ "ipv4mask": 30,
+ "ipv6base": "fd00::",
+ "ipv6mask": 64,
+ "link_ip_start": {"ipv4": "192.168.0.0", "v4mask": 30, "ipv6": "fd00::", "v6mask": 64},
+ "lo_prefix": {"ipv4": "1.0.", "v4mask": 32, "ipv6": "2001:DB8:F::", "v6mask": 128},
+ "routers": {
+ "r1": {
+ "links": {
+ "lo": {"ipv4": "auto", "ipv6": "auto", "type": "loopback"},
+ "r2": {"ipv4": "auto", "ipv6": "auto"},
+ "r3": {"ipv4": "auto", "ipv6": "auto"}
+ },
+ "bgp": {
+ "local_as": "64512",
+ "address_family": {
+ "ipv4": {
+ "unicast": {
+ "neighbor": {
+ "r2": {
+ "dest_link": {
+ "r1": {}
+ }
+ },
+ "r3": {
+ "dest_link": {
+ "r1": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "r2": {
+ "links": {
+ "lo": {"ipv4": "auto", "ipv6": "auto", "type": "loopback"},
+ "r1": {"ipv4": "auto", "ipv6": "auto"},
+ "r3": {"ipv4": "auto", "ipv6": "auto"}
+ },
+ "bgp": {
+ "local_as": "64512",
+ "address_family": {
+ "ipv4": {
+ "unicast": {
+ "redistribute": [
+ {
+ "redist_type": "static"
+ }
+ ],
+ "neighbor": {
+ "r1": {
+ "dest_link": {
+ "r2": {}
+ }
+ },
+ "r3": {
+ "dest_link": {
+ "r2": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ...
+
+
+BGP neighboship with loopback interface, sample JSON file::
+
+ {
+ "ipv4base": "192.168.0.0",
+ "ipv4mask": 30,
+ "ipv6base": "fd00::",
+ "ipv6mask": 64,
+ "link_ip_start": {"ipv4": "192.168.0.0", "v4mask": 30, "ipv6": "fd00::", "v6mask": 64},
+ "lo_prefix": {"ipv4": "1.0.", "v4mask": 32, "ipv6": "2001:DB8:F::", "v6mask": 128},
+ "routers": {
+ "r1": {
+ "links": {
+ "lo": {"ipv4": "auto", "ipv6": "auto", "type": "loopback",
+ "add_static_route":"yes"},
+ "r2": {"ipv4": "auto", "ipv6": "auto"}
+ },
+ "bgp": {
+ "local_as": "64512",
+ "address_family": {
+ "ipv4": {
+ "unicast": {
+ "neighbor": {
+ "r2": {
+ "dest_link": {
+ "lo": {
+ "source_link": "lo"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "static_routes": [
+ {
+ "network": "1.0.2.17/32",
+ "next_hop": "192.168.0.1
+ }
+ ]
+ },
+ "r2": {
+ "links": {
+ "lo": {"ipv4": "auto", "ipv6": "auto", "type": "loopback",
+ "add_static_route":"yes"},
+ "r1": {"ipv4": "auto", "ipv6": "auto"},
+ "r3": {"ipv4": "auto", "ipv6": "auto"}
+ },
+ "bgp": {
+ "local_as": "64512",
+ "address_family": {
+ "ipv4": {
+ "unicast": {
+ "redistribute": [
+ {
+ "redist_type": "static"
+ }
+ ],
+ "neighbor": {
+ "r1": {
+ "dest_link": {
+ "lo": {
+ "source_link": "lo"
+ }
+ }
+ },
+ "r3": {
+ "dest_link": {
+ "lo": {
+ "source_link": "lo"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "static_routes": [
+ {
+ "network": "192.0.20.1/32",
+ "no_of_ip": 9,
+ "admin_distance": 100,
+ "next_hop": "192.168.0.1",
+ "tag": 4001
+ }
+ ],
+ }
+ ...
+
+BGP neighborship with Multiple phy-links, sample JSON file::
+
+ {
+ "ipv4base": "192.168.0.0",
+ "ipv4mask": 30,
+ "ipv6base": "fd00::",
+ "ipv6mask": 64,
+ "link_ip_start": {"ipv4": "192.168.0.0", "v4mask": 30, "ipv6": "fd00::", "v6mask": 64},
+ "lo_prefix": {"ipv4": "1.0.", "v4mask": 32, "ipv6": "2001:DB8:F::", "v6mask": 128},
+ "routers": {
+ "r1": {
+ "links": {
+ "lo": {"ipv4": "auto", "ipv6": "auto", "type": "loopback"},
+ "r2-link1": {"ipv4": "auto", "ipv6": "auto"},
+ "r2-link2": {"ipv4": "auto", "ipv6": "auto"}
+ },
+ "bgp": {
+ "local_as": "64512",
+ "address_family": {
+ "ipv4": {
+ "unicast": {
+ "neighbor": {
+ "r2": {
+ "dest_link": {
+ "r1-link1": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "r2": {
+ "links": {
+ "lo": {"ipv4": "auto", "ipv6": "auto", "type": "loopback"},
+ "r1-link1": {"ipv4": "auto", "ipv6": "auto"},
+ "r1-link2": {"ipv4": "auto", "ipv6": "auto"},
+ "r3-link1": {"ipv4": "auto", "ipv6": "auto"},
+ "r3-link2": {"ipv4": "auto", "ipv6": "auto"}
+ },
+ "bgp": {
+ "local_as": "64512",
+ "address_family": {
+ "ipv4": {
+ "unicast": {
+ "redistribute": [
+ {
+ "redist_type": "static"
+ }
+ ],
+ "neighbor": {
+ "r1": {
+ "dest_link": {
+ "r2-link1": {}
+ }
+ },
+ "r3": {
+ "dest_link": {
+ "r2-link1": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ...
+
+
+JSON File Explained
"""""""""""""""""""
Mandatory keywords/options in JSON:
-
-* "ipv4base" : base ipv4 address to generate ips, ex - 192.168.0.0
-* "ipv4mask" : mask for ipv4 address, ex - 30
-* "ipv6base" : base ipv6 address to generate ips, ex - fd00:
-* "ipv6mask" : mask for ipv6 address, ex - 64
-* "link_ip_start" : physical interface base ipv4 and ipv6 address
-* "lo_prefix" : loopback interface base ipv4 and ipv6 address
-* "routers" : user can add number of routers as per topology, router's name
+* ``ipv4base`` : base ipv4 address to generate ips, ex - 192.168.0.0
+* ``ipv4mask`` : mask for ipv4 address, ex - 30
+* ``ipv6base`` : base ipv6 address to generate ips, ex - fd00:
+* ``ipv6mask`` : mask for ipv6 address, ex - 64
+* ``link_ip_start`` : physical interface base ipv4 and ipv6 address
+* ``lo_prefix`` : loopback interface base ipv4 and ipv6 address
+* ``routers`` : user can add number of routers as per topology, router's name
can be any logical name, ex- r1 or a0.
-* "r1" : name of the router
-* "lo" : loopback interface dict, ipv4 and/or ipv6 addresses generated automatically
-* "type" : type of interface, to identify loopback interface
-* "links" : physical interfaces dict, ipv4 and/or ipv6 addresses generated
+* ``r1`` : name of the router
+* ``lo`` : loopback interface dict, ipv4 and/or ipv6 addresses generated automatically
+* ``type`` : type of interface, to identify loopback interface
+* ``links`` : physical interfaces dict, ipv4 and/or ipv6 addresses generated
automatically
-* "r2-link1" : it will be used when routers have multiple links. 'r2' is router
+* ``r2-link1`` : it will be used when routers have multiple links. 'r2' is router
name, 'link' is any logical name, '1' is to identify link number,
- router name and link must be seperated by hyphen ("-"), ex- a0-peer1
+ router name and link must be seperated by hyphen (``-``), ex- a0-peer1
Optional keywords/options in JSON:
-* "bgp" : bgp configuration
-* "local_as" : Local AS number
-* "unicast" : All SAFI configuration
-* "neighbor": All neighbor details
-* "dest_link" : Destination link to which router will connect
-* "router_id" : bgp router-id
-* "source_link" : if user wants to establish bgp neighborship with loopback
- interface, add "source_link": "lo"
-* "keepalivetimer" : Keep alive timer for BGP neighbor
-* "holddowntimer" : Hold down timer for BGP neighbor
-* "static_routes" : create static routes for routers
-* "redistribute" : redistribute static and/or connected routes
-* "prefix_lists" : create Prefix-lists for routers
+* ``bgp`` : bgp configuration
+* ``local_as`` : Local AS number
+* ``unicast`` : All SAFI configuration
+* ``neighbor``: All neighbor details
+* ``dest_link`` : Destination link to which router will connect
+* ``router_id`` : bgp router-id
+* ``source_link`` : if user wants to establish bgp neighborship with loopback
+ interface, add ``source_link``: ``lo``
+* ``keepalivetimer`` : Keep alive timer for BGP neighbor
+* ``holddowntimer`` : Hold down timer for BGP neighbor
+* ``static_routes`` : create static routes for routers
+* ``redistribute`` : redistribute static and/or connected routes
+* ``prefix_lists`` : create Prefix-lists for routers
Building topology and configurations
""""""""""""""""""""""""""""""""""""
Topology and initial configuration will be created in setup_module(). Following
-is the sample code:
-
-.. code-block::
+is the sample code::
class TemplateTopo(Topo):
def build(self, *_args, **_opts):
@@ -438,38 +435,38 @@ to be used to reference the routers configuration file location
Example:
-* The topology class that inherits from Mininet Topo class
+* The topology class that inherits from Mininet Topo class;
-.. code-block::
-
- class TemplateTopo(Topo):
- def build(self, *_args, **_opts):
- tgen = get_topogen(self)
- # topology build code
+ .. code-block:: python
+ class TemplateTopo(Topo):
+ def build(self, *_args, **_opts):
+ tgen = get_topogen(self)
+ # topology build code
-* pytest setup_module() and teardown_module() to start the topology
-.. code-block::
+* pytest setup_module() and teardown_module() to start the topology:
- def setup_module(_m):
- tgen = Topogen(TemplateTopo)
+ .. code-block:: python
- # Starting topology, create tmp files which are loaded to routers
- # to start deamons and then start routers
- start_topology(tgen, CWD)
+ def setup_module(_m):
+ tgen = Topogen(TemplateTopo)
- def teardown_module(_m):
- tgen = get_topogen()
+ # Starting topology, create tmp files which are loaded to routers
+ # to start deamons and then start routers
+ start_topology(tgen, CWD)
- # Stop toplogy and Remove tmp files
- stop_topology(tgen, CWD)
+ def teardown_module(_m):
+ tgen = get_topogen()
+ # Stop toplogy and Remove tmp files
+ stop_topology(tgen, CWD)
-* __main__ initialization code (to support running the script directly)
-.. code-block::
+* ``__main__`` initialization code (to support running the script directly)
- if **name** == '\ **main**\ ':
- sys.exit(pytest.main(["-s"]))
+ .. code-block:: python
+
+ if **name** == '\ **main**\ ':
+ sys.exit(pytest.main(["-s"]))
diff --git a/doc/developer/workflow.rst b/doc/developer/workflow.rst
index 93d01bfbc1..c2e3724df2 100644
--- a/doc/developer/workflow.rst
+++ b/doc/developer/workflow.rst
@@ -113,6 +113,9 @@ Security fixes are backported to all releases less than or equal to at least one
year old. Security fixes may also be backported to older releases depending on
severity.
+For detailed instructions on how to produce an FRR release, refer to
+:ref:`frr-release-procedure`.
+
Long term support branches ( LTS )
-----------------------------------------