├── .coveragerc ├── .gitignore ├── .travis.yml ├── .vscode ├── launch.json ├── settings.json └── spellright.dict ├── LICENSE ├── README.md ├── Vagrantfile ├── _config.yml ├── doc ├── automated-testing.md ├── command-line-interface.md ├── command-line-options.md ├── configuration-file-generator.md ├── configuration-file.md ├── continuous-integration.md ├── deviations.md ├── disaggregation-feature-guide.md ├── docker.md ├── draft-ietf-rift-rift-02---ztp-fsm.dot ├── features.md ├── figures │ ├── disaggregation-feature-guide │ │ ├── convert.sh │ │ └── figures.pptx │ ├── negative-disaggregation-feature-guide │ │ ├── convert.sh │ │ └── figures.pptx │ └── positive-disaggregation-feature-guide │ │ ├── convert.sh │ │ └── figures.pptx ├── flooding-reduction-feature-guide.md ├── installation.md ├── log-visualization.md ├── logging.md ├── negative-disaggregation-feature-guide.md ├── notes.txt ├── positive-disaggregation-feature-guide.md ├── security-feature-guide.md ├── startup.md └── ztp-interop-testing-report.md ├── docker ├── Dockerfile ├── docker-build ├── docker-rift └── docker-shell ├── ietf-102 ├── ietf-102-rift-hackathon-detailed-report.md ├── ietf-102-rift-hackathon-slides.pdf └── ietf-102-rift-hackathon-slides.pptx ├── ietf-103 ├── ietf-103---flooding-oscillations.pdf └── ietf-103---rift-wg---open-source-update.pdf ├── ietf-104 ├── ietf-104---rift-hackathon---chaos-monkey-testing.pdf └── ietf-104---rift-wg---open-source-update.pdf ├── ietf-105 └── ietf-105---rift-wg---open-source-update.pdf ├── ietf-108 └── ietf-108---rift-wg---open-source-update.pdf ├── install └── install.sh ├── meta_topology ├── 2c_1x1.yaml ├── 2c_3x2.yaml ├── 2c_8x8.yaml ├── 3c_k4_r1.yaml ├── 3c_k4_r4.yaml ├── 3c_k6_r1.yaml ├── 3c_k6_r6.yaml ├── clos_1plane_2pod_2leaf_2spine_2super.yaml ├── clos_2plane_2pod_2leaf_2spine_2super.yaml ├── clos_2plane_2pod_2leaf_2spine_2super_parallel_links.yaml ├── clos_2plane_2pod_2leaf_2spine_4super_parallel_links.yaml ├── clos_2plane_4pod_2leaf_2spine_4super.yaml ├── clos_2pod_2leaf_2spine_2super.yaml ├── clos_2pod_4leaf_4spine_4super.yaml ├── clos_3plane_3pod_3leaf_3spine_6super.yaml ├── clos_3plane_3pod_3leaf_3spine_6super_noew.yaml ├── clos_3plane_3pod_3leaf_3spine_6super_parallel_links.yaml └── clos_3pod_3leaf_3spine_4super.yaml ├── pylintrc ├── requirements-3-10.txt ├── rift ├── __init__.py ├── __main__.py ├── cli_listen_handler.py ├── cli_session_handler.py ├── common.thrift ├── common │ ├── __init__.py │ ├── constants.py │ └── ttypes.py ├── config.py ├── constants.py ├── destination.py ├── encoding.thrift ├── encoding │ ├── __init__.py │ ├── constants.py │ └── ttypes.py ├── engine.py ├── fib_route.py ├── forwarding_table.py ├── fsm.py ├── interface.py ├── kernel.py ├── key.py ├── log_record.py ├── msg_queues.py ├── neighbor.py ├── neighbor_lie.py ├── next_hop.py ├── node.py ├── offer.py ├── packet_common.py ├── rib_route.py ├── route_table.py ├── scheduler.py ├── spf_dest.py ├── stats.py ├── table.py ├── timer.py ├── udp_rx_handler.py ├── utils.py └── visualize_log.py ├── tests ├── __init__.py ├── interop.py ├── log_expect_session.py ├── rift_expect_session.py ├── test_config_generator.py ├── test_constants.py ├── test_fsm.py ├── test_kernel.py ├── test_next_hop.py ├── test_node_flood.py ├── test_node_flood_repeater_election.py ├── test_packet_common.py ├── test_real_topology.py ├── test_rib_fib.py ├── test_rib_neg_nhs_to_fib_pos_nhs.py ├── test_stats.py ├── test_sys_2n_l0_l1.py ├── test_sys_2n_l0_l2.py ├── test_sys_2n_l1_l3.py ├── test_sys_2n_un_l0.py ├── test_sys_2n_un_l1.py ├── test_sys_2n_un_l2.py ├── test_sys_3n_l0_l1_l2.py ├── test_sys_cli_commands.py ├── test_sys_keys_match.py ├── test_sys_keys_match_diff_algo.py ├── test_sys_keys_match_inherit.py ├── test_sys_keys_mismatch_algo.py ├── test_sys_keys_mismatch_origin.py ├── test_sys_keys_mismatch_outer.py ├── test_sys_neg_disagg.py ├── test_sys_standalone.py ├── test_table.py ├── test_telnet.py ├── test_timer.py └── test_visualize_log.py ├── tools ├── chaos-test-suite ├── cleanup ├── config_generator.py ├── interface_stats.py ├── multicast_checks.py ├── pre-commit-checks ├── summarize-test-errors.sh └── update_cli_docs.py └── topology ├── 2c_4x4.yaml ├── 2n_l0_l1.yaml ├── 2n_l0_l2.yaml ├── 2n_l1_l3.yaml ├── 2n_un_l0.yaml ├── 2n_un_l1.yaml ├── 2n_un_l2.yaml ├── 3n_l0_l1_l2.yaml ├── 4n_diamond_parallel.yaml ├── keys_match.yaml ├── keys_match_diff_algo.yaml ├── keys_match_inherit.yaml ├── keys_mismatch_algo.yaml ├── keys_mismatch_origin.yaml ├── keys_mismatch_outer.yaml ├── multi_neighbor.yaml ├── multiplane.yaml ├── one.yaml ├── real_1.yaml ├── real_2.yaml ├── two.yaml ├── two_by_two_by_two.yaml ├── two_by_two_by_two_ztp.yaml └── yaml_topology_schema.md /.coveragerc: -------------------------------------------------------------------------------- 1 | [run] 2 | omit = env/* -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | vagrant_env/ 90 | ENV/ 91 | env.bak/ 92 | venv.bak/ 93 | 94 | # Spyder project settings 95 | .spyderproject 96 | .spyproject 97 | 98 | # Rope project settings 99 | .ropeproject 100 | 101 | # mkdocs documentation 102 | /site 103 | 104 | # mypy 105 | .mypy_cache/ 106 | 107 | # Powerpoint backups 108 | ~$* 109 | 110 | # Vagrant temporary files 111 | .vagrant 112 | 113 | # Visualized logs 114 | *.log.html 115 | 116 | # Interop testing results 117 | interop-results-*/* 118 | 119 | # Copied requirements.txt in docker directory 120 | docker/requirements.txt 121 | 122 | # Backups for auto-generated docs updates 123 | *.md.bak 124 | 125 | # IDE settings 126 | # DO NOT add .vscode here. I DO want my VSC preferences version controlled. 127 | .idea/ 128 | 129 | # Generated figures 130 | doc/figures/*/*.pdf 131 | doc/figures/*/*.png 132 | 133 | # Generated diagram and topologies 134 | diagram.html 135 | generated.yaml 136 | generated/* 137 | __generated__/* -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | 3 | os: linux 4 | 5 | jobs: 6 | include: 7 | - dist: jammy 8 | python: 3.10 9 | 10 | install: 11 | - virtualenv env --python=python3 12 | - source env/bin/activate 13 | - pip install -r requirements-3-10.txt 14 | # Python3 needs root and setuid to allow test_kernel to add routes to the kernel 15 | - sudo chown root env/bin/python3 16 | - sudo chmod u+s env/bin/python3 17 | # Insert list of interfaces and their addresses in log 18 | - ifconfig 19 | 20 | script: 21 | - pytest --cov=rift tests || tools/summarize-test-errors.sh 22 | - echo "lint rift" && pylint rift 23 | - echo "lint tests" && pylint tests 24 | - echo "lint tools" && pylint tools 25 | - echo "check cli docs" && tools/update_cli_docs.py -c 26 | - sudo tools/chaos-test-suite --new-venv --iterations 3 && tools/interface_stats.py 27 | 28 | after_success: 29 | - codecov 30 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | 8 | { 9 | "name": "config_generator", 10 | "type": "python", 11 | "request": "launch", 12 | "program": "tools/config_generator.py", 13 | "args": ["-g", 14 | "diagram.html", "meta_topology/clos_2plane_3pod_4leaf_4spine_4super.yaml", 15 | "scripts"] 16 | }, 17 | { 18 | "name": "Interop", 19 | "type": "python", 20 | "request": "launch", 21 | "program": "tests/interop.py", 22 | "args": [""] 23 | }, 24 | { 25 | "name": "Visualize RIFT Log", 26 | "type": "python", 27 | "request": "launch", 28 | "program": "tools/visualize_log.py", 29 | "args": [""] 30 | }, 31 | { 32 | "name": "pytest test_rib_neg_nhs_to_fib_pos_nhs", 33 | "type": "python", 34 | "request": "launch", 35 | "program": "${workspaceFolder}/env/bin/pytest", 36 | "args": ["-vvv", "-s", "tests/test_rib_neg_nhs_to_fib_pos_nhs.py"] 37 | }, 38 | { 39 | "name": "RIFT two_by_two_by_two", 40 | "type": "python", 41 | "request": "launch", 42 | "program": "${workspaceFolder}/rift/__main__.py", 43 | "args": ["topology/two_by_two_by_two.yaml"] 44 | }, 45 | { 46 | "name": "Python: Current File", 47 | "type": "python", 48 | "request": "launch", 49 | "program": "${file}" 50 | }, 51 | { 52 | "name": "Python: Attach", 53 | "type": "python", 54 | "request": "attach", 55 | "localRoot": "${workspaceFolder}", 56 | "remoteRoot": "${workspaceFolder}", 57 | "port": 3000, 58 | "secret": "my_secret", 59 | "host": "localhost" 60 | }, 61 | { 62 | "name": "Python: Terminal (integrated)", 63 | "type": "python", 64 | "request": "launch", 65 | "program": "${file}", 66 | "console": "integratedTerminal" 67 | }, 68 | { 69 | "name": "Python: Terminal (external)", 70 | "type": "python", 71 | "request": "launch", 72 | "program": "${file}", 73 | "console": "externalTerminal" 74 | }, 75 | { 76 | "name": "Python: Django", 77 | "type": "python", 78 | "request": "launch", 79 | "program": "${workspaceFolder}/manage.py", 80 | "args": [ 81 | "runserver", 82 | "--noreload", 83 | "--nothreading" 84 | ], 85 | "debugOptions": [ 86 | "RedirectOutput", 87 | "Django" 88 | ] 89 | }, 90 | { 91 | "name": "Python: Flask (0.11.x or later)", 92 | "type": "python", 93 | "request": "launch", 94 | "module": "flask", 95 | "env": { 96 | "FLASK_APP": "app.py" 97 | }, 98 | "args": [ 99 | "run", 100 | "--no-debugger", 101 | "--no-reload" 102 | ] 103 | }, 104 | { 105 | "name": "Python: Module", 106 | "type": "python", 107 | "request": "launch", 108 | "module": "module.name" 109 | }, 110 | { 111 | "name": "Python: Pyramid", 112 | "type": "python", 113 | "request": "launch", 114 | "args": [ 115 | "${workspaceFolder}/development.ini" 116 | ], 117 | "debugOptions": [ 118 | "RedirectOutput", 119 | "Pyramid" 120 | ] 121 | }, 122 | { 123 | "name": "Python: Watson", 124 | "type": "python", 125 | "request": "launch", 126 | "program": "${workspaceFolder}/console.py", 127 | "args": [ 128 | "dev", 129 | "runserver", 130 | "--noreload=True" 131 | ] 132 | }, 133 | { 134 | "name": "Python: All debug Options", 135 | "type": "python", 136 | "request": "launch", 137 | "python": "${command:python.interpreterPath}", 138 | "program": "${file}", 139 | "module": "module.name", 140 | "env": { 141 | "VAR1": "1", 142 | "VAR2": "2" 143 | }, 144 | "envFile": "${workspaceFolder}/.env", 145 | "args": [ 146 | "arg1", 147 | "arg2" 148 | ], 149 | "debugOptions": [ 150 | "RedirectOutput" 151 | ] 152 | } 153 | ] 154 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.linting.enabled": true, 3 | "python.linting.pylintEnabled": true, 4 | "python.linting.ignorePatterns": [ 5 | "rift/common/**", 6 | "rift/encoding/**" 7 | ], 8 | "python.testing.pytestArgs": [ 9 | "tests" 10 | ], 11 | "python.testing.unittestEnabled": false, 12 | "python.testing.nosetestsEnabled": false, 13 | "python.testing.pytestEnabled": true, 14 | "cSpell.words": [ 15 | "a", 16 | "acff", 17 | "addjacency", 18 | "addresses", 19 | "adjacencies", 20 | "adjs", 21 | "agg", 22 | "and", 23 | "Annelies", 24 | "any", 25 | "anycast", 26 | "appendleft", 27 | "atexit", 28 | "attribs", 29 | "autouse", 30 | "b", 31 | "backports", 32 | "basicvalidation", 33 | "bksp", 34 | "bsd", 35 | "builtins", 36 | "cachedir", 37 | "chmod", 38 | "chown", 39 | "clos", 40 | "CMSG", 41 | "codecov", 42 | "command", 43 | "contentless", 44 | "ctypes", 45 | "cumtime", 46 | "Datagram", 47 | "DEBG", 48 | "deepcopy", 49 | "deque", 50 | "DIGESTMOD", 51 | "Disaggregate", 52 | "disaggregated", 53 | "dmhs", 54 | "does", 55 | "e", 56 | "ECONNREFUSED", 57 | "encap", 58 | "errno", 59 | "error", 60 | "esrch", 61 | "Etingof", 62 | "EWOULDBLOCK", 63 | "executed", 64 | "floodred", 65 | "floodrep", 66 | "following", 67 | "Foxen", 68 | "gainsboro", 69 | "generatename", 70 | "getenv", 71 | "gethostname", 72 | "gmail", 73 | "gprof", 74 | "hackathon", 75 | "heapdict", 76 | "hmtl", 77 | "HOLDDOWN", 78 | "holdtime", 79 | "hrift", 80 | "htmlcov", 81 | "i", 82 | "ICANON", 83 | "if", 84 | "ifconfig", 85 | "ifindex", 86 | "ifinfmsg", 87 | "ifla", 88 | "ifname", 89 | "igmp", 90 | "ilya", 91 | "importlib", 92 | "including", 93 | "interface", 94 | "interop", 95 | "interplane", 96 | "intf", 97 | "ipv", 98 | "is", 99 | "isinstance", 100 | "ixusr", 101 | "kernel", 102 | "keyalgorithm", 103 | "keyvalues", 104 | "keyw", 105 | "lans", 106 | "levelname", 107 | "LIETX", 108 | "linux", 109 | "logline", 110 | "LOOPBACKS", 111 | "mac", 112 | "Maxdelay", 113 | "maxread", 114 | "message", 115 | "misorder", 116 | "misorders", 117 | "mkdir", 118 | "mkrt", 119 | "mouseout", 120 | "multicast", 121 | "multipath", 122 | "multiplane", 123 | "MYTTL", 124 | "nametoindex", 125 | "ncalls", 126 | "netem", 127 | "netlink", 128 | "netns", 129 | "networking", 130 | "nhop", 131 | "nhops", 132 | "NOARP", 133 | "nodeid", 134 | "non", 135 | "not", 136 | "Nushell", 137 | "on", 138 | "os", 139 | "peekitem", 140 | "peername", 141 | "percall", 142 | "pexpect", 143 | "PIDS", 144 | "pkcs", 145 | "PKTINFO", 146 | "platform", 147 | "pluggy", 148 | "polyline", 149 | "popen", 150 | "popleft", 151 | "Posix", 152 | "pptx", 153 | "pre", 154 | "preds", 155 | "prefixlen", 156 | "prefixtype", 157 | "prefsrc", 158 | "proto", 159 | "pstats", 160 | "pton", 161 | "pycache", 162 | "pylint", 163 | "pyroute", 164 | "pytest", 165 | "pytricia", 166 | "pyyaml", 167 | "qdisc", 168 | "reconverge", 169 | "recvmsg", 170 | "recvpktinfo", 171 | "reencode", 172 | "reported", 173 | "REUSEPORT", 174 | "rift", 175 | "rootdir", 176 | "route", 177 | "routing", 178 | "rta", 179 | "rtnl", 180 | "RTPRIORITY", 181 | "rtprot", 182 | "rxsock", 183 | "s", 184 | "sendline", 185 | "setcap", 186 | "setuid", 187 | "setuptools", 188 | "show", 189 | "shutil", 190 | "siftdown", 191 | "simplifiable", 192 | "sockaddr", 193 | "sortedcontainers", 194 | "squirl", 195 | "stmts", 196 | "strftime", 197 | "strptime", 198 | "substep", 199 | "subsubtrees", 200 | "superspine", 201 | "support", 202 | "supported", 203 | "svgfile", 204 | "table", 205 | "tcgetattr", 206 | "TCSADRAIN", 207 | "tcsetattr", 208 | "termios", 209 | "that", 210 | "the", 211 | "this", 212 | "to", 213 | "tottime", 214 | "Tpng", 215 | "traceroute", 216 | "TRIFT", 217 | "tunl", 218 | "txsock", 219 | "ucast", 220 | "uint", 221 | "ulimit", 222 | "unbuffered", 223 | "unicast", 224 | "unregister", 225 | "venv", 226 | "veth", 227 | "virtualenv", 228 | "VMIN", 229 | "VTIME", 230 | "xabc", 231 | "xdef", 232 | "xlarge", 233 | "ydef" 234 | ], 235 | "cSpell.enabled": true, 236 | "cSpell.enabledLanguageIds": [ 237 | "asciidoc", 238 | "c", 239 | "cpp", 240 | "csharp", 241 | "css", 242 | "git-commit", 243 | "go", 244 | "handlebars", 245 | "html", 246 | "jade", 247 | "java", 248 | "javascript", 249 | "javascriptreact", 250 | "json", 251 | "jsonc", 252 | "latex", 253 | "less", 254 | "markdown", 255 | "php", 256 | "plaintext", 257 | "pug", 258 | "python", 259 | "restructuredtext", 260 | "rust", 261 | "scala", 262 | "scss", 263 | "text", 264 | "typescript", 265 | "typescriptreact", 266 | "yaml", 267 | "yml" 268 | ], 269 | "cSpell.ignoreWords": [ 270 | "reconverge" 271 | ] 272 | } -------------------------------------------------------------------------------- /.vscode/spellright.dict: -------------------------------------------------------------------------------- 1 | superspine 2 | nr 3 | py 4 | systemid 5 | rx 6 | mcast 7 | yaml 8 | netns 9 | md 10 | lt 11 | gt 12 | superspines 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Build Status](https://travis-ci.com/brunorijsman/rift-python.svg?branch=master)](https://travis-ci.com/brunorijsman/rift-python) [![Code Coverage](https://codecov.io/gh/brunorijsman/rift-python/branch/master/graph/badge.svg)](https://codecov.io/gh/brunorijsman/rift-python) 2 | 3 | # Routing In Fat Trees (RIFT) 4 | 5 | This repository contains a Python implementation of the Routing In Fat Trees (RIFT) protocol specified in Internet Draft (ID) 6 | [draft-draft-rift-15](https://www.ietf.org/archive/id/draft-ietf-rift-rift-15.pdf) 7 | 8 | The code is currently still a work in progress (see Feature List below for the status). 9 | 10 | # Documentation 11 | 12 | * [Feature List](doc/features.md) 13 | 14 | * [Installation Instructions](doc/installation.md) 15 | 16 | * [Startup Instructions](doc/startup.md) 17 | 18 | * [Command Line Options](doc/command-line-options.md) 19 | 20 | * [Command Line Interface (CLI)](doc/command-line-interface.md) 21 | 22 | * Feature Guides: 23 | 24 | * [Flooding Reduction Feature Guide](doc/flooding-reduction-feature-guide.md) 25 | 26 | * [Disaggregation Feature Guide](doc/disaggregation-feature-guide.md) 27 | 28 | * [Positive Disaggregation Feature Guide](doc/positive-disaggregation-feature-guide.md) 29 | 30 | * [Negative Disaggregation Feature Guide](doc/negative-disaggregation-feature-guide.md) 31 | 32 | * [Security Feature Guide](doc/security-feature-guide.md) 33 | 34 | * [Logging](doc/logging.md) 35 | 36 | * [Log Visualization](doc/log-visualization.md) 37 | 38 | * [Configuration File](doc/configuration-file.md) (Also known as the Topology File) 39 | 40 | * [Configuration File Generator](doc/configuration-file-generator.md) (Also known as the Meta-Topology File) 41 | 42 | * [Implementation Deviations from Specification](doc/deviations.md) 43 | 44 | * [Automated Testing](doc/automated-testing.md) 45 | 46 | * [Continuous Integration](doc/continuous-integration.md) 47 | 48 | * [Docker](doc/docker.md) 49 | 50 | # Presentations and Reports 51 | 52 | ## IETF 102 (Montreal) 53 | 54 | A version of this code (tag ietf-102-rift-hackathon) was used to conduct interoperability testing in the hackathon at the Internet Engineering Task Force (IETF) meeting number 102 in Montreal (July 2018). 55 | 56 | * [IETF 102 RIFT Hackathon: Presentation Slides (Microsoft PowerPoint)](ietf-102/ietf-102-rift-hackathon-slides.pptx) 57 | 58 | * [IETF 102 RIFT Hackathon: Report](ietf-102/ietf-102-rift-hackathon-detailed-report.md) 59 | 60 | ## Interim Zero Touch Provisioning (ZTP) Interoperability Testing 61 | 62 | * [Zero Touch Provisioning (ZTP) Preliminary Interoperability Testing Report](doc/ztp-interop-testing-report.md) 63 | 64 | ## RIFT Security Reviews 65 | 66 | * [RIFT Security Review version 1 (out of date)](http://bit.ly/rift-security-review) 67 | 68 | * [RIFT Security Review version 2](http://bit.ly/rift-security-review-v2) 69 | 70 | ## IETF 103 (Bangkok) 71 | 72 | * [IETF 103 Presentation: Open Source Update (PDF)](ietf-103/ietf-103---rift-wg---open-source-update.pdf) 73 | 74 | * [IETF 103 Background Information: Flooding Oscillation (PDF)](ietf-103/ietf-103---flooding-oscillations.pdf) 75 | 76 | * [Video of IETF 103 Presentation "RIFT Open Source Implementation: Status Update, Lessons Learned, and Interop Testing"](https://youtu.be/YbBlhd-ePWs?t=1897) 77 | 78 | ## IETF 104 (Prague) 79 | 80 | * [IETF 104 Working Group Presentation: Open Source Update (PDF)](ietf-104/ietf-104---rift-wg---open-source-update.pdf) 81 | 82 | * [IETF 104 Working Group Presentation: Open Source Update (YouTube)](https://youtu.be/0OkDLqH4wck?t=3273) 83 | 84 | * [IETF 104 Hackathon Presentation: Chaos Monkey Testing (PDF)](ietf-104/ietf-104---rift-hackathon---chaos-monkey-testing.pdf) 85 | 86 | * [IETF 104 Hackathon Presentation: Chaos Monkey Testing (YouTube)](https://youtu.be/0OkDLqH4wck?t=3788) 87 | 88 | * [IETF 104 Hackathon Instructions Document (PDF)](http://bit.ly/rift-hackathon-ietf-104) 89 | 90 | * [IETF 104 Hackathon Instructions Video (YouTube)](https://www.youtube.com/watch?v=GqebgPmA4Xc) 91 | 92 | ## IETF 105 (Montreal) 93 | 94 | * [IETF 105 Working Group Presentation: Open Source Update (PDF)](ietf-105/ietf-105---rift-wg---open-source-update.pdf) 95 | 96 | ## IETF 108 (Virtual) 97 | 98 | * [IETF 108 Working Group Presentation: Open Source Update (PDF)](ietf-108/ietf-108---rift-wg---open-source-update.pdf) 99 | 100 | * [IETF 108 Working Group Presentation: Open Source Update (Video)](https://www.youtube.com/watch?v=qhiiTDPuku0) 101 | 102 | * [RIFT automatic disaggregation blog](https://hikingandcoding.com/2020/07/22/rift-disaggregation/) 103 | 104 | ## Blogs 105 | 106 | * [Blog post on automatic disaggregation in RIFT](https://hikingandcoding.wordpress.com/2020/07/22/rift-disaggregation/) -------------------------------------------------------------------------------- /Vagrantfile: -------------------------------------------------------------------------------- 1 | # -*- mode: ruby -*- 2 | # vi: set ft=ruby : 3 | 4 | # Vagrantfile API/syntax version 5 | VAGRANTFILE_API_VERSION = "2" 6 | 7 | Vagrant.require_version ">= 1.5.0" 8 | 9 | $install_reqs = <