CINXE.COM

2022-02-10 Release Cadence Adjustment — OpenStack Technical Committee Governance Documents

<!DOCTYPE html> <html lang="en" data-content_root="../"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <title>2022-02-10 Release Cadence Adjustment &#8212; OpenStack Technical Committee Governance Documents</title> <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=639405c8" /> <link rel="stylesheet" type="text/css" href="../_static/basic.css?v=5c69cfe2" /> <script src="../_static/documentation_options.js?v=5929fcd5"></script> <script src="../_static/doctools.js?v=9bcbadda"></script> <script src="../_static/sphinx_highlight.js?v=dc90522c"></script> <link rel="search" title="Search" href="../search.html" /> <link rel="next" title="2021-12-24 Removal of the tags framework" href="20211224-tags-framework-removal.html" /> <link rel="prev" title="2022-04-14 Drop Lower Constraints Maintenance" href="20220414-drop-lower-constraints.html" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- Bootstrap CSS --> <link href="../_static/css/bootstrap.min.css" rel="stylesheet"> <!-- Fonts --> <link href="../_static/css/font-awesome.min.css" rel="stylesheet"> <!-- Custom CSS --> <link href="../_static/css/combined.css" rel="stylesheet"> <!-- Search CSS --> <link href="../_static/css/search.css" rel="stylesheet"> <!-- Pygments CSS --> <link href="../_static/pygments.css" rel="stylesheet"> <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> <![endif]--> <!-- Google Analytics --> <script> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-17511903-1', 'auto'); ga('send', 'pageview'); </script> <!-- End Google Analytics --> </head><body> <!-- SOURCE_FILE: https://opendev.org/openstack/governance/src/doc/source/resolutions/20220210-release-cadence-adjustment.rst --> <script> (function (window, document) { var loader = function () { var script = document.createElement("script"), tag = document.getElementsByTagName("script")[0]; script.src = "https://search.openstack.org/widget/embed.min.js?t="+Date.now(); tag.parentNode.insertBefore(script, tag); }; window.addEventListener ? window.addEventListener("load", loader, false) : window.attachEvent("onload", loader); })(window, document); </script> <nav class="navbar navbar-default" role="navigation"> <div class="container"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button class="navbar-toggle" data-target="#bs-example-navbar-collapse-1" data-toggle="collapse" type="button"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <div class="brand-wrapper"> <a class="navbar-brand" href="https://www.openstack.org/"></a> </div> <div class="search-icon show"><i class="fa fa-search"></i> Search</div></div> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <div class="search-container tiny"> <div class="openstack-search-bar" data-baseUrl="search.openstack.org" data-context="docs-openstack"></div> </div> <ul class="nav navbar-nav navbar-main show"> <li class="search-container-mobile"> <div class="openstack-search-bar" data-baseUrl="search.openstack.org" data-context="docs-openstack"></div> </li> <li> <!--Software --> <a href="https://www.openstack.org/software/" class="drop" id="dropdownMenuSoftware">Software <i class="fa fa-caret-down"></i></a> <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenuSoftware"> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/software/">Overview</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/software/project-navigator/openstack-components">OpenStack Components</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/software/project-navigator/sdks">SDKs</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/software/project-navigator/deployment-tools">Deployment Tools</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/assets/software/projectmap/openstack-map.pdf" target="_blank">OpenStack Map</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/software/sample-configs/">Sample Configs</a></li> </ul> </li> <li> <!-- Use Cases --> <a href="https://www.openstack.org/use-cases/" class="drop" id="dropdownMenuUsers">Use Cases <i class="fa fa-caret-down"></i></a> <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenuUsers"> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/use-cases/">Users in Production</a></li> <li role="presentation" class="divider"></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/use-cases/bare-metal/">Ironic Bare Metal</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/use-cases/edge-computing/">Edge Computing</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/use-cases/telecoms-and-nfv/">Telecom &amp; NFV</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/use-cases/science/">Science and HPC</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/use-cases/containers/">Containers</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/use-cases/enterprise/">Enterprise</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/surveys/landing">User Survey</a></li> </ul> </li> <li> <!-- Events --> <a href="https://openinfra.dev/summit" class="drop" id="dropdownMenuEvents">Events <i class="fa fa-caret-down"></i></a> <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenuEvents"> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://openinfra.dev/summit">OpenInfra Summit</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/ptg/">Project Teams Gathering</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/events/opendev-2020/">OpenDev</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/events/community-events/">Community Events</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/events/openstackdays">OpenStack &amp; OpenInfra Days</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/videos/">Summit Videos</a></li> </ul> </li> <li><!-- Community --> <a href="https://www.openstack.org/community/" class="drop" id="dropdownMenuCommunity">Community <i class="fa fa-caret-down"></i></a> <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenuCommunity"> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/community/">Welcome! Start Here</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/community/tech-committee">OpenStack Technical Committee</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/community/speakers/">Speakers Bureau</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="http://wiki.openstack.org">OpenStack Wiki</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/coa/">Get Certified (COA)</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/community/jobs/">Jobs</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/marketing/">Marketing Resources</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/news/">Community News</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="http://superuser.openstack.org">Superuser Magazine</a></li> <li role="presentation" class="divider"></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/community/supporting-organizations/">OpenInfra Foundation Supporting Organizations</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://openinfra.dev">OpenInfra Foundation</a></li> </ul> </li> <li><!-- Marketplace --> <a href="https://www.openstack.org/marketplace/" class="drop" id="dropdownMenuLearn">Marketplace <i class="fa fa-caret-down"></i></a> <ul class="dropdown-menu dropdown-hover" role="menu" aria-labelledby="dropdownMenuEvents"> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/marketplace/training/">Training</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/marketplace/distros/">Distros &amp; Appliances</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/marketplace/public-clouds/">Public Clouds</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/marketplace/hosted-private-clouds/">Hosted Private Clouds</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/marketplace/remotely-managed-private-clouds/">Remotely Managed Private Clouds</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/marketplace/consulting/">Consulting &amp; Integrators</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://www.openstack.org/marketplace/drivers/">Drivers</a></li> </ul> </li> <li><!-- Blog --> <a href="https://www.openstack.org/blog/">Blog</a> </li> <li><!-- Docs --> <a href="http://docs.openstack.org/">Docs</a> </li> <li class="join-nav-section"> <!-- Join --> <a href="https://openinfra.dev/join/" id="dropdownMenuJoin">Join <i class="fa fa-caret-down"></i></a> <ul class="dropdown-menu dropdown-hover" role="menu" aria-labelledby="dropdownMenuJoin" style="display: none;"> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://openinfra.dev/join/">Sign up for Foundation Membership</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://openinfra.dev/join/">Sponsor the Foundation</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://openinfra.dev">More about the Foundation</a></li> </ul> </li> <li> <!-- Login --> <a href="https://www.openstack.org/Security/login/?BackURL=/home/" class="sign-in-btn">Log In</a> </li> </ul> </div> </div> <!-- /.container --> </nav> <div class="container docs-book-wrapper"> <div class="row"> <div class="col-lg-9 col-md-8 col-sm-8 col-lg-push-3 col-md-push-4 col-sm-push-4"> <div class="row docs-title"> <div class="col-lg-8"> <h1>2022-02-10 Release Cadence Adjustment</h1> </div> <div class="docs-actions"> <a href="20220414-drop-lower-constraints.html"><i class="fa fa-angle-double-left" data-toggle="tooltip" data-placement="top" title="Previous: 2022-04-14 Drop Lower Constraints Maintenance"></i></a> <a href="20211224-tags-framework-removal.html"><i class="fa fa-angle-double-right" data-toggle="tooltip" data-placement="top" title="Next: 2021-12-24 Removal of the tags framework"></i></a> </div> </div> <div class="row"> <div class="col-lg-12"> <div class="docs-body" role="main"> <section id="release-cadence-adjustment"> <h1>2022-02-10 Release Cadence Adjustment<a class="headerlink" href="#release-cadence-adjustment" title="Link to this heading">¶</a></h1> <section id="history"> <h2>History<a class="headerlink" href="#history" title="Link to this heading">¶</a></h2> <p>OpenStack has historically used a six month release cycle cadence for the projects which participate in the coordinated release. Further, upgrades were tested and supported between two adjacent coordinated releases only, requiring deployers and distributions to either upgrade every six months to stay current, or perform Fast Forward Upgrades (FFUs) to move between non-adjacent releases at runtime. The latter is an activity enabled by testing the individual upgrade steps, and is not something we test specifically.</p> </section> <section id="challenges"> <h2>Challenges<a class="headerlink" href="#challenges" title="Link to this heading">¶</a></h2> <p>Some deployers and distributions have indicated that six month upgrades are difficult, infeasible, or undesirable, especially in large environments where the process itself takes long enough that upgrades are constantly occurring. The FFU process can be laborious and also requires running parts of a release that may have never been deployed, productized, or tested in a given environment - purely because each release must be used stepwise during the operation.</p> <p>A number of opinions have been expressed about changing the release cycle to either a slower (one year) or much slower (18 month) cadence to address these concerns. The lack of consensus around what that slower cadence should be makes it difficult to choose one that will be beneficial, as one cycle length may cause people on a slower cycle to need to wait much longer between upgrades. Further, community involvement in a very long release can be difficult when attrition, turnover, contract obligations and volunteer realities make slowing down unpalatable in many cases. The community already struggles to find candidates for six month (PTL) and one year (TC) duties. Further, for environments that do need to move quickly, adopt new features and deploy new technologies, double-digit months between landing a feature and having it testable and usable in production is too long.</p> </section> <section id="proposed-solution"> <h2>Proposed Solution<a class="headerlink" href="#proposed-solution" title="Link to this heading">¶</a></h2> <p>It is very difficult to settle on any one change to the release cadence that will address all of the above problems and concerns. As such, the TC proposes an incremental change in release upgrade expectations to help improve the slow-moving deployer experience, without sacrificing the release-early-release-often goal.</p> <p>The fundamental change comes to the expectation that upgrades are only supported between adjacent coordinated releases. The TC will designate major releases in a new arrangement, such that every other release will be considered to be a “SLURP (Skip Level Upgrade Release Process)” release. Upgrades will be supported between “SLURP” releases, in addition to between adjacent major releases (as they are today). Deployments wishing to stay on the six-month cycle will deploy every “SLURP” and “not-SLURP” release as they always have. Deployments wishing to move to a one year upgrade cycle will synchronize on a “SLURP” release, and then skip the following “not-SLURP” release, upgrading when the subsequent “SLURP” is released.</p> <p>Our letter-based release naming scheme is about to wrap back around to A, so the proposal is that the “new A” release be the first one where we enforce this scheme. Y-&gt;A should be a “dress rehearsal” where we have the jobs enabled to help smoke out any issues, but where hard guarantees are not yet made.</p> <p>Occasionally, individual releases are chosen by a large number of deployers and distributors by chance, which results in a larger than normal community of maintainers that keep the release “alive” in extended maintenance for longer. The expectation with this proposal is that this will amplify that effect by increasing the likelihood that “SLURP” releases will be chosen in this way and thus end up with more focus on those releases for long-term community support.</p> </section> <section id="details"> <h2>Details<a class="headerlink" href="#details" title="Link to this heading">¶</a></h2> <ol class="arabic simple"> <li><p><strong>Testing</strong>: Just as we test and guarantee that upgrades are supported between adjacent releases today, we will <em>also</em> test and guarantee that upgrades between two “SLURP” releases are supported. Upgrades are tested for most projects today with grenade. A skip-level job will be maintained in the grenade repository that tests a normal configuration between the last two “SLURP” releases. The job will be updated on every new “SLURP” release, and there will always be a regular single-release grenade job testing between the previous release and current one, as we have today.</p></li> <li><p><strong>Not-SLURP upgrades</strong>: Upgrades from “not-SLURP” to “not-SLURP” will not be tested nor required. On a given “not-SLURP” release, the only upgrade path will be to the following release (which would be a “SLURP”). This is unchanged from today.</p></li> <li><p><strong>Intervals</strong>: Upgrades that span more than one “SLURP” cycle are not tested or required. For example to move from “SLURP A” to “SLURP E” will still require an FFU style arrangement, but where “SLURP C” is the only intermediate step required.</p></li> <li><p><strong>Deprecations</strong>: Projects currently deprecate features and config for at least one cycle before removal. This change affects <em>when</em> that can happen, so that no required changes occur in a “not-SLURP” release which may be skipped. Effectively the same rules that we have today (both written and tribally-understood) apply to the new arrangement, with the exception that “cycle” refers to a “SLURP to SLURP” cycle and not a single pair of adjacent coordinated releases. Since the deprecation, waiting, and removal can only happen in “SLURP” releases, the result is also that the minimum <em>length</em> of time that things may be deprecated before removal will increase as well.</p></li> <li><p><strong>Support</strong>: We will expect to support both the most recent “SLURP” release as well as the one prior. During a “not-SLURP” release, that would effectively be similar to what we support today, which is 18 months of “maintained” releases. See the example sequence below.</p></li> <li><p><strong>Rolling Upgrades</strong>: This scheme does not necessarily dictate that live or rolling upgrades need to be supported between “SLURP” releases. Meaning RPC compatibility between N to N-1 guarantees can remain, resulting in deployments that are on a “SLURP to SLURP” release schedule requiring some downtime during an upgrade because components will be spanning more than two actual releases.</p></li> <li><p><strong>Data migrations</strong>: Part of supporting “SLURP to SLURP” upgrades involves keeping a stable (read “compatible” not “unchanging”) database schema from “SLURP to SLURP”. This includes data migrations which need to do work in “SLURP” releases, and while they may do work in “not-SLURP” releases, the work done in “not-SLURP” releases cannot be <em>mandatory</em>. This can be solved (as it is today) by requiring operators to (force-)complete data migrations on a supported release before moving to one that drops compatibility. The “SLURP”, “not-SLURP” arrangement described in this resolution would require attention to those migrations to make sure they happen (automatically or manually) on the source “SLURP” before upgrading to the target “SLURP”, for example.</p></li> <li><p><strong>Communication</strong>: We will use “SLURP” word to designate a SLURP release in release page, release notes page or any other place we want to communicate it. We can also use its full form “Skip Level Upgrade Release Process” if needed. A “not-SLURP” release will not be designated with anything and not having “SLURP” word is enough to communicate that this is not “SLURP” release. Also, the number schema in the release naming process will help all of us to relate which release is “SLURP”.</p></li> </ol> </section> <section id="example-sequence"> <h2>Example sequence<a class="headerlink" href="#example-sequence" title="Link to this heading">¶</a></h2> <p>Assuming that A is the first release of this new arrangement, the following examples help demonstrate the support lifecycle expectation.</p> <table class="docutils align-default"> <tbody> <tr class="row-odd"><td><p>Release</p></td> <td><p>Type</p></td> <td><p>Supported</p></td> <td><p>EM</p></td> </tr> <tr class="row-even"><td><p>A</p></td> <td><p>SLURP</p></td> <td><p>X,Y,Z</p></td> <td><p>W</p></td> </tr> <tr class="row-odd"><td><p>B</p></td> <td></td> <td><p>Y,Z,A</p></td> <td><p>W,X</p></td> </tr> <tr class="row-even"><td><p>C</p></td> <td><p>SLURP</p></td> <td><p>A,B,C</p></td> <td><p>W,X,Y,Z</p></td> </tr> <tr class="row-odd"><td><p>D</p></td> <td></td> <td><p>A,B,C,D</p></td> <td><p>X,Y,Z</p></td> </tr> <tr class="row-even"><td><p>E</p></td> <td><p>SLURP</p></td> <td><p>C,D,E</p></td> <td><p>Y,Z,A,B</p></td> </tr> <tr class="row-odd"><td><p>F</p></td> <td></td> <td><p>C,D,E,F</p></td> <td><p>Z,A,B</p></td> </tr> <tr class="row-even"><td><p>G</p></td> <td><p>SLURP</p></td> <td><p>E,F,G</p></td> <td><p>A,B,C</p></td> </tr> </tbody> </table> <p>(EM releases are arbitrarily pruned in the above example for brevity, but no such change in how long they may be supported is made in this resolution)</p> </section> </section> </div> </div> </div> <div class="docs-actions"> <a href="20220414-drop-lower-constraints.html"><i class="fa fa-angle-double-left" data-toggle="tooltip" data-placement="top" title="Previous: 2022-04-14 Drop Lower Constraints Maintenance"></i></a> <a href="20211224-tags-framework-removal.html"><i class="fa fa-angle-double-right" data-toggle="tooltip" data-placement="top" title="Next: 2021-12-24 Removal of the tags framework"></i></a> </div> <div class="row docs-byline bottom"> <div class="docs-updated">this page last updated: 2024-10-08 08:49:53</div> </div> <div class="row"> <div class="col-lg-8 col-md-8 col-sm-8 docs-license"> <a href="https://creativecommons.org/licenses/by/3.0/"> <img src="../_static/images/docs/license.png" alt="Creative Commons Attribution 3.0 License"/> </a> <p> Except where otherwise noted, this document is licensed under <a href="https://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 License</a>. See all <a href="https://www.openstack.org/legal"> OpenStack Legal Documents</a>. </p> </div> <div class="col-lg-4 col-md-4 col-sm-4 docs-actions-wrapper"> <!-- ID buglinkbottom added so that pre-filled doc bugs are sent to Launchpad projects related to the document --> </div> </div> </div> <div class="col-lg-3 col-md-4 col-sm-4 col-lg-pull-9 col-md-pull-8 col-sm-pull-8 docs-sidebar"> <div class="btn-group docs-sidebar-releases"> <button onclick="location.href='/'" class="btn docs-sidebar-home" data-toggle="tooltip" data-placement="top" title="OpenStack Governance Home"><i class="fa fa-arrow-circle-o-left"></i></button> <button href="#" type="button" data-toggle="dropdown" class="btn docs-sidebar-release-select">OpenStack Governance<i class="fa fa-caret-down"></i></button> <ul class="dropdown-menu docs-sidebar-dropdown" role="menu" aria-labelledby="dLabel"> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://wiki.openstack.org/wiki/Governance/Foundation">Board of Directors</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://governance.openstack.org/tc/">Technical Committee</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://governance.openstack.org/uc/">User Committee</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://governance.openstack.org/sigs/">SIGs</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://governance.openstack.org/election/">Elections</a></li> <li role="presentation"><a role="menuitem" tabindex="-1" href="https://governance.openstack.org/ideas/">Ideas</a></li> </ul> </div> <div class="docs-sidebar-toc"> <div class="docs-sidebar-toc"> <div class="docs-sidebar-section" id="local-table-of-contents"> <h4 class="docs-sidebar-section-title">Contents</h4> <ul> <li><a class="reference internal" href="#">2022-02-10 Release Cadence Adjustment</a><ul> <li><a class="reference internal" href="#history">History</a></li> <li><a class="reference internal" href="#challenges">Challenges</a></li> <li><a class="reference internal" href="#proposed-solution">Proposed Solution</a></li> <li><a class="reference internal" href="#details">Details</a></li> <li><a class="reference internal" href="#example-sequence">Example sequence</a></li> </ul> </li> </ul> </div> </div> </div> </div> </div> </div> <footer> <div class="container"> <div class="row footer-links"> <div class="col-lg-2 col-sm-2"> <h3>OpenStack</h3> <ul> <li><a href="https://www.openstack.org/software/project-navigator/">Projects</a></li> <li><a href="https://security.openstack.org/">OpenStack Security</a></li> <li><a href="https://openstack.org/blog/">Blog</a></li> <li><a href="https://openstack.org/news/">News</a></li> </ul> </div> <div class="col-lg-2 col-sm-2"> <h3>Community</h3> <ul> <li><a href="https://www.meetup.com/pro/openinfradev/">User Groups</a></li> <li><a href="https://openstack.org/community/events/">Events</a></li> <li><a href="https://openstack.org/community/jobs/">Jobs</a></li> <li><a href="https://openinfra.dev/members/">Companies</a></li> <li><a href="https://docs.openstack.org/contributors">Contribute</a></li> </ul> </div> <div class="col-lg-2 col-sm-2"> <h3>Documentation</h3> <ul> <li><a href="https://docs.openstack.org">OpenStack Manuals</a></li> <li><a href="https://openstack.org/software/start/">Getting Started</a></li> <li><a href="https://developer.openstack.org">API Documentation</a></li> <li><a href="https://wiki.openstack.org">Wiki</a></li> </ul> </div> <div class="col-lg-2 col-sm-2"> <h3>Branding &amp; Legal</h3> <ul> <li><a href="https://openinfra.dev/legal">Legal Docs</a></li> <li><a href="https://openstack.org/brand/">Logos &amp; Guidelines</a></li> <li><a href="https://openinfra.dev/legal/trademark-policy">Trademark Policy</a></li> <li><a href="https://openinfra.dev/privacy-policy">Privacy Policy</a></li> <li><a href="https://docs.openstack.org/contributors/common/setup-gerrit.html#individual-contributor-license-agreement">OpenInfra CLA</a></li> </ul> </div> <div class="col-lg-4 col-sm-4"> <h3>Stay In Touch</h3> <a href="https://twitter.com/OpenStack" target="_blank" class="social-icons footer-twitter"></a> <a href="https://www.facebook.com/openinfradev" target="_blank" class="social-icons footer-facebook"></a> <a href="https://www.linkedin.com/company/open-infrastructure-foundation" target="_blank" class="social-icons footer-linkedin"></a> <a href="https://www.youtube.com/user/OpenStackFoundation" target="_blank" class="social-icons footer-youtube"></a> <p class="fine-print"> The OpenStack project is provided under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 license</a>. Docs.openstack.org is powered by <a href="https://rackspace.com" target="_blank">Rackspace Cloud Computing</a>. </p> </div> </div> </div> </footer> <!-- jQuery --> <script src="../_static/js/jquery-3.2.1.min.js"></script> <!-- Bootstrap JavaScript --> <script src="../_static/js/bootstrap.min.js"></script> <!-- The rest of the JS --> <script src="../_static/js/navigation.js"></script> <!-- Docs JS --> <script src="../_static/js/docs.js"></script> <!-- Javascript for page --> <script> /* Build a description of this page including SHA, source location on git * repo, build time and the project's launchpad bug tag. Set the HREF of the * bug buttons */ </script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10