diff options
Diffstat (limited to 'doc/developer')
| -rw-r--r-- | doc/developer/frr-release-procedure.rst | 181 | ||||
| -rw-r--r-- | doc/developer/maintainer-release-build.rst | 89 | ||||
| -rw-r--r-- | doc/developer/packaging.rst | 8 | ||||
| -rw-r--r-- | doc/developer/release-announcement-template.md | 40 | ||||
| -rw-r--r-- | doc/developer/subdir.am | 3 | ||||
| -rw-r--r-- | doc/developer/topotests-jsontopo.rst | 609 | ||||
| -rw-r--r-- | doc/developer/workflow.rst | 3 |
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 ) ----------------------------------------- |
