Merge branch 'CLR-DOCS-THEME' into staging

Merges the Docs theme brance with staging.

Signed-off-by: Rodrigo Caballero <rodrigo.caballero.abraham@intel.com>

Conflicts:
	source/_themes/clearlinux/breadcrumbs.html
	source/_themes/clearlinux/footer.html
	source/_themes/clearlinux/header.html
	source/_themes/clearlinux/layout.html
	source/_themes/clearlinux/navigation.html
	source/_themes/clearlinux/static/css/main.css
	source/_themes/clearlinux/static/css/vendor/bootstrap-theme.min.css
	source/_themes/clearlinux/static/css/vendor/bootstrap.min.css
	source/_themes/clearlinux/static/fonts/ClearSans-Bold.eot
	source/_themes/clearlinux/static/fonts/ClearSans-Bold.svg
	source/_themes/clearlinux/static/fonts/ClearSans-Bold.ttf
	source/_themes/clearlinux/static/fonts/ClearSans-Bold.woff
	source/_themes/clearlinux/static/fonts/ClearSans-BoldItalic.eot
	source/_themes/clearlinux/static/fonts/ClearSans-BoldItalic.svg
	source/_themes/clearlinux/static/fonts/ClearSans-BoldItalic.ttf
	source/_themes/clearlinux/static/fonts/ClearSans-BoldItalic.woff
	source/_themes/clearlinux/static/fonts/ClearSans-Italic.eot
	source/_themes/clearlinux/static/fonts/ClearSans-Italic.svg
	source/_themes/clearlinux/static/fonts/ClearSans-Italic.ttf
	source/_themes/clearlinux/static/fonts/ClearSans-Italic.woff
	source/_themes/clearlinux/static/fonts/ClearSans-Light.eot
	source/_themes/clearlinux/static/fonts/ClearSans-Light.svg
	source/_themes/clearlinux/static/fonts/ClearSans-Light.ttf
	source/_themes/clearlinux/static/fonts/ClearSans-Light.woff
	source/_themes/clearlinux/static/fonts/ClearSans-Medium.eot
	source/_themes/clearlinux/static/fonts/ClearSans-Medium.svg
	source/_themes/clearlinux/static/fonts/ClearSans-Medium.ttf
	source/_themes/clearlinux/static/fonts/ClearSans-Medium.woff
	source/_themes/clearlinux/static/fonts/ClearSans-MediumItalic.eot
	source/_themes/clearlinux/static/fonts/ClearSans-MediumItalic.svg
	source/_themes/clearlinux/static/fonts/ClearSans-MediumItalic.ttf
	source/_themes/clearlinux/static/fonts/ClearSans-MediumItalic.woff
	source/_themes/clearlinux/static/fonts/ClearSans-Regular.eot
	source/_themes/clearlinux/static/fonts/ClearSans-Regular.svg
	source/_themes/clearlinux/static/fonts/ClearSans-Regular.ttf
	source/_themes/clearlinux/static/fonts/ClearSans-Regular.woff
	source/_themes/clearlinux/static/fonts/ClearSans-Thin.eot
	source/_themes/clearlinux/static/fonts/ClearSans-Thin.svg
	source/_themes/clearlinux/static/fonts/ClearSans-Thin.ttf
	source/_themes/clearlinux/static/fonts/ClearSans-Thin.woff
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_Bd.eot
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_Bd.ttf
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_Bd.woff
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_BdIt.eot
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_BdIt.ttf
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_BdIt.woff
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_It.eot
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_It.ttf
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_It.woff
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_Lt.eot
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_Lt.ttf
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_Lt.woff
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_LtIt.eot
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_LtIt.ttf
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_LtIt.woff
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_Rg.eot
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_Rg.ttf
	source/_themes/clearlinux/static/fonts/IntelClear_WLat_Rg.woff
	source/_themes/clearlinux/static/images/favicons/favicon_android_192x192.ico
	source/_themes/clearlinux/static/images/favicons/favicon_android_192x192.png
	source/_themes/clearlinux/static/images/favicons/favicon_apple_114x144.ico
	source/_themes/clearlinux/static/images/favicons/favicon_apple_114x144.png
	source/_themes/clearlinux/static/images/favicons/favicon_apple_120x120.ico
	source/_themes/clearlinux/static/images/favicons/favicon_apple_120x120.png
	source/_themes/clearlinux/static/images/favicons/favicon_apple_144x144.ico
	source/_themes/clearlinux/static/images/favicons/favicon_apple_144x144.png
	source/_themes/clearlinux/static/images/favicons/favicon_apple_152x152.ico
	source/_themes/clearlinux/static/images/favicons/favicon_apple_152x152.png
	source/_themes/clearlinux/static/images/favicons/favicon_apple_180x180.ico
	source/_themes/clearlinux/static/images/favicons/favicon_apple_180x180.png
	source/_themes/clearlinux/static/images/favicons/favicon_apple_57x57.ico
	source/_themes/clearlinux/static/images/favicons/favicon_apple_57x57.png
	source/_themes/clearlinux/static/images/favicons/favicon_apple_60x60.ico
	source/_themes/clearlinux/static/images/favicons/favicon_apple_60x60.png
	source/_themes/clearlinux/static/images/favicons/favicon_apple_72x72.ico
	source/_themes/clearlinux/static/images/favicons/favicon_apple_72x72.png
	source/_themes/clearlinux/static/images/favicons/favicon_apple_76x76.ico
	source/_themes/clearlinux/static/images/favicons/favicon_apple_76x76.png
	source/_themes/clearlinux/static/images/favicons/favicon_microsoft_144x144.ico
	source/_themes/clearlinux/static/images/favicons/favicon_microsoft_144x144.png
	source/_themes/clearlinux/static/images/favicons/favicon_web_16x16.ico
	source/_themes/clearlinux/static/images/favicons/favicon_web_16x16.png
	source/_themes/clearlinux/static/images/favicons/favicon_web_32x32.ico
	source/_themes/clearlinux/static/images/favicons/favicon_web_32x32.png
	source/_themes/clearlinux/static/images/favicons/favicon_web_96x96.ico
	source/_themes/clearlinux/static/images/favicons/favicon_web_96x96.png
	source/_themes/clearlinux/static/js/project.js
	source/_themes/clearlinux/theme.conf
	source/conf.py
	source/index-openstack.rst
	source/index.rst
	source/index_bundles.rst
	source/index_gs.rst
	source/index_sw_update.rst
This commit is contained in:
Rodrigo Caballero
2015-11-26 10:53:18 -06:00
28 changed files with 822 additions and 1490 deletions
+54 -18
View File
@@ -1,8 +1,7 @@
{# TEMPLATE VAR SETTINGS #}
{%- set css_files = css_files + ['../_themes/clearlinux/static/css/main.css'] %}
{%- set css_files = css_files + ['../_themes/clearlinux/static/css/vendor/font-awesome.min.css'] %}
{%- set script_files = script_files + ['../_themes/clearlinux/static/js/project.js'] %}
{%- set script_files = script_files + ['../_themes/clearlinux/static/js/modernizr.custom.19994.js'] %}
{% set script_files = script_files + ['_static/js/affix.js'] %}
{% set script_files = script_files + ['_static/js/project.js'] %}
{% set script_files = script_files + ['_static/js/main.js'] %}
{%- set url_root = pathto('', 1) %}
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
@@ -72,7 +71,12 @@
<link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}"/>
{%- endif %}
{%- endblock %}
{%- block extrahead %} {% endblock %}
{%- block extrahead %}
{% if theme_touch_icon %}
<link rel="apple-touch-icon" href="{{ pathto('_static/' ~ theme_touch_icon, 1) }}" />
{% endif %}
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9">
{% endblock %}
{# Keep modernizr in head - http://modernizr.com/docs/#installing #}
<script src="{{ pathto('_static/js/modernizr.min.js', 1) }}"></script>
@@ -94,7 +98,10 @@
<div class="content">
<div class="container-fluid">
<div class="row">
<div class="col-md-3 col-sm-3 col-xs-3">{% include "navigation.html" %}</div>
<div class="col-md-3 col-sm-3 col-xs-3">
<div class="row"><div class="col-md-12 col-sm-12 col-xs-12">{% include "navigation.html" %}</div></div>
<div class="row"><div class="col-md-12 col-sm-12 col-xs-12">{% include "searchbox.html" %}</div></div>
</div>
<div class="col-md-9 col-sm-9 col-xs-9">{% block body %}{% endblock %}</div>
</div>
</div>
@@ -106,20 +113,49 @@
</div>
{% include "footer.html" %}
</div>
{% if not embedded %}
{% if not embedded %}
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'{{ url_root }}',
VERSION:'{{ release|e }}',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'{{ '' if no_search_suffix else file_suffix }}',
HAS_SOURCE: {{ has_source|lower }}
};
</script>
{%- for scriptfile in script_files %}
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
{%- endfor %}
{% endif %}
{# RTD hosts this file, so just load on non RTD builds #}
{% if not READTHEDOCS %}
<script type="text/javascript" src="{{ pathto('_static/js/theme.js', 1) }}"></script>
{% endif %}
{# STICKY NAVIGATION #}
{% if theme_sticky_navigation %}
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'{{ url_root }}',
VERSION:'{{ release|e }}',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'{{ '' if no_search_suffix else file_suffix }}',
HAS_SOURCE: {{ has_source|lower }}
};
jQuery(function () {
SphinxRtdTheme.StickyNav.enable();
});
</script>
{%- for scriptfile in script_files %}
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
{%- endfor %}
{% endif %}
{% endif %}
<script type="text/javascript">
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
</script>
{# this is used when loading the search index using $.ajax fails,
such as on Chrome for documents on localhost #}
<script type="text/javascript" id="searchindexloader"></script>
{# Disable base theme's top+bottom related navs; we have our own in sidebar #}
{%- block relbar1 %}{% endblock %}
{%- block relbar2 %}{% endblock %}
{%- block footer %} {% endblock %}
</body>
</html>
+10 -8
View File
@@ -1,10 +1,12 @@
<sidebar>
<ul class="custom-dropdown-menu">
<li class="menu-item-open parent-item">
<a href="#" class="active">Table Of Contents</a>
{{ toctree(includehidden=theme_sidebar_includehidden) }}
<ul></ul>
</li>
</ul>
<h1>Content Map</h1>
{% set toctree = toctree(maxdepth=2, collapse=theme_collapse_navigation, includehidden=True) %}
{% set toctree = toctree|replace("<ul>", "<ul class=\"custom-dropdown-menu\">", -1) %}
{% set toctree = toctree|replace("<ul class=\"current\">", "<ul class=\"custom-dropdown-menu\">", -1) %}
{% set toctree = toctree|replace("<li class=\"toctree-l1 current\">", "<li class=\"menu-item-open parent-item\">", -1) %}
{% set toctree = toctree|replace("<li class=\"toctree-l1\">", "<li class=\"menu-item-closed parent-item\">", -1) %}
{% set toctree = toctree|replace("<a class=\"current reference internal\" href=\"\">", "<a class=\"active\">", -1) %}
{% set toctree = toctree|replace("<li class=\"toctree-l2\">", "<li class=\"child-item first-level no-childs\">", -1) %}
{% set toctree = toctree|replace("<li class=\"toctree-l2 current\">", "<li class=\"child-item first-level no-childs\">", -1) %}
{{ toctree }}
</sidebar>
+50
View File
@@ -0,0 +1,50 @@
{#
basic/search.html
~~~~~~~~~~~~~~~~~
Template for the search page.
:copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
#}
{%- extends "layout.html" %}
{% set title = _('Search') %}
{% set script_files = script_files + ['_static/searchtools.js'] %}
{% block footer %}
<script type="text/javascript">
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
</script>
{# this is used when loading the search index using $.ajax fails,
such as on Chrome for documents on localhost #}
<script type="text/javascript" id="searchindexloader"></script>
{{ super() }}
{% endblock %}
{% block body %}
<noscript>
<div id="fallback" class="admonition warning">
<p class="last">
{% trans %}Please activate JavaScript to enable the search
functionality.{% endtrans %}
</p>
</div>
</noscript>
{% if search_performed %}
<h2>{{ _('Search Results') }}</h2>
{% if not search_results %}
<p>{{ _('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.') }}</p>
{% endif %}
{% endif %}
<div id="search-results">
{% if search_results %}
<ul>
{% for href, caption, context in search_results %}
<li>
<a href="{{ pathto(item.href) }}">{{ caption }}</a>
<p class="context">{{ context|e }}</p>
</li>
{% endfor %}
</ul>
{% endif %}
</div>
{% endblock %}
+12
View File
@@ -0,0 +1,12 @@
{%- if builder != 'singlehtml' %}
<br />
<div id="searchbox" role="search">
<h1>Quick Search</h1>
<form class="search" action="{{ pathto('search') }}" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
<input type="submit" value="Go" class="pull-right">
</form>
</div>
{%- endif %}
Binary file not shown.
Binary file not shown.
@@ -1,2 +0,0 @@
#Ignore css files ands sass cache
.sass-cache
+35 -5
View File
@@ -1415,7 +1415,7 @@
border: 1px solid #D1D3D5; }
sidebar .custom-dropdown-menu {
margin: 0;
margin-bottom: 5px;
padding: 0; }
@media (max-width: 767px) {
sidebar .custom-dropdown-menu {
@@ -1461,6 +1461,9 @@ sidebar .custom-dropdown-menu {
position: absolute;
right: 5px;
top: 10px; }
sidebar .custom-dropdown-menu li.parent-item a.active .fa {
color: #fff !important;
}
sidebar .custom-dropdown-menu li.parent-item > a {
background-color: #D1D3D5;
color: #2d3237 !important;
@@ -1470,7 +1473,7 @@ sidebar .custom-dropdown-menu {
color: #fff !important; }
sidebar .custom-dropdown-menu li.parent-item a.active {
background-color: #00AEFF;
color: #fff !important; }
color: #fff; }
sidebar .custom-dropdown-menu li ul {
background-color: #F0F2F4;
margin-left: 0 !important;
@@ -1490,10 +1493,10 @@ sidebar .custom-dropdown-menu {
color: #2d3237 !important;
border-bottom: none !important;
}
sidebar .custom-dropdown-menu li.menu-item-open.parent-item > a.active, sidebar .custom-dropdown-menu li.menu-item-open.parent-item > a:hover {
sidebar .custom-dropdown-menu li.menu-item-open.parent-item > a, sidebar .custom-dropdown-menu li.menu-item-open.parent-item > a:hover {
background-color: #00AEFF;
color: #fff !important; }
sidebar .custom-dropdown-menu li.menu-item-open > ul {
sidebar .custom-dropdown-menu li.menu-item-open > ul{
height: auto;
padding: 0;
visibility: visible; }
@@ -1502,6 +1505,21 @@ sidebar .custom-dropdown-menu {
float: right;
top: -3px; }
sidebar .custom-dropdown-menu li.menu-item-open a > .fa {
color: #fff !important;
}
sidebar .custom-dropdown-menu li.menu-item-open li.child-item a:active {
color: #000 !important;
}
li.child-item > a.active {
background-color: #D1D3D5 !important;
color: #000 !important;
border-bottom: none !important;
border-right: 2px solid #00AEFF !important;
}
.faq-question {
color: #57c9f7;
cursor: pointer;
@@ -1877,7 +1895,7 @@ pre, code {
-moz-border-radius: 4px;
border-radius: 4px;
color: #333333;
display: block;
display: inline-block;
font-family: Monaco,Menlo,Consolas,"Courier New",monospace;
padding: 9.5px;
margin: 0 0 10px;
@@ -2572,4 +2590,16 @@ a.button {
-o-transition: all 100ms ease-in-out;
transition: all 100ms ease-in-out; }
#clear-linux-project-for-intel-architecture-documentation li.toctree-l1{
list-style-type: none;
}
#clear-linux-project-for-intel-architecture-documentation li.toctree-l1 > a{
display: none;
}
#clear-linux-project-for-intel-architecture-documentation li.toctree-l2{
list-style-type: disc;
margin-left: -40px;
}
/*# sourceMappingURL=main.css.map */
+1
View File
@@ -0,0 +1 @@
// Put all css overrides below
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
+162
View File
@@ -0,0 +1,162 @@
/* ========================================================================
* Bootstrap: affix.js v3.3.5
* http://getbootstrap.com/javascript/#affix
* ========================================================================
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// AFFIX CLASS DEFINITION
// ======================
var Affix = function (element, options) {
this.options = $.extend({}, Affix.DEFAULTS, options)
this.$target = $(this.options.target)
.on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
.on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
this.$element = $(element)
this.affixed = null
this.unpin = null
this.pinnedOffset = null
this.checkPosition()
}
Affix.VERSION = '3.3.5'
Affix.RESET = 'affix affix-top affix-bottom'
Affix.DEFAULTS = {
offset: 0,
target: window
}
Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
var scrollTop = this.$target.scrollTop()
var position = this.$element.offset()
var targetHeight = this.$target.height()
if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
if (this.affixed == 'bottom') {
if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
}
var initializing = this.affixed == null
var colliderTop = initializing ? scrollTop : position.top
var colliderHeight = initializing ? targetHeight : height
if (offsetTop != null && scrollTop <= offsetTop) return 'top'
if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
return false
}
Affix.prototype.getPinnedOffset = function () {
if (this.pinnedOffset) return this.pinnedOffset
this.$element.removeClass(Affix.RESET).addClass('affix')
var scrollTop = this.$target.scrollTop()
var position = this.$element.offset()
return (this.pinnedOffset = position.top - scrollTop)
}
Affix.prototype.checkPositionWithEventLoop = function () {
setTimeout($.proxy(this.checkPosition, this), 1)
}
Affix.prototype.checkPosition = function () {
if (!this.$element.is(':visible')) return
var height = this.$element.height()
var offset = this.options.offset
var offsetTop = offset.top
var offsetBottom = offset.bottom
var scrollHeight = Math.max($(document).height(), $(document.body).height())
if (typeof offset != 'object') offsetBottom = offsetTop = offset
if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
if (this.affixed != affix) {
if (this.unpin != null) this.$element.css('top', '')
var affixType = 'affix' + (affix ? '-' + affix : '')
var e = $.Event(affixType + '.bs.affix')
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
this.affixed = affix
this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
this.$element
.removeClass(Affix.RESET)
.addClass(affixType)
.trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
}
if (affix == 'bottom') {
this.$element.offset({
top: scrollHeight - height - offsetBottom
})
}
}
// AFFIX PLUGIN DEFINITION
// =======================
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.affix')
var options = typeof option == 'object' && option
if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
if (typeof option == 'string') data[option]()
})
}
var old = $.fn.affix
$.fn.affix = Plugin
$.fn.affix.Constructor = Affix
// AFFIX NO CONFLICT
// =================
$.fn.affix.noConflict = function () {
$.fn.affix = old
return this
}
// AFFIX DATA-API
// ==============
$(window).on('load', function () {
$('[data-spy="affix"]').each(function () {
var $spy = $(this)
var data = $spy.data()
data.offset = data.offset || {}
if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
if (data.offsetTop != null) data.offset.top = data.offsetTop
Plugin.call($spy, data)
})
})
}(jQuery);
+254
View File
@@ -0,0 +1,254 @@
jQuery(document).ready(function($) {
// Global vars
// TODO: clean-up this ASAP!
var $window = $(window);
var wrapper = $('div#wrapper');
var mobileMenu = $('nav#main-menu-mobile');
var mobileMenuBars = $('span#nav-bars');
var searchButton = $('span#nav-search');
var searchContainer = $('div#search-container');
var overlayClass = '-overlay';
var $document = $(document);
var $header = $('header');
var $footerHeight = $('footer').height();
var $body = $('body');
var currentPos = $document.scrollTop();
var calculateWindowSize
// returns the latest position in range that is smaller or equal than n
var inRange = function(n, range) {
var lastCheckpoint = null
range.forEach(function(val, idx) {
if (n >= val)
lastCheckpoint = idx;
});
return (lastCheckpoint != null) ? lastCheckpoint : false
};
// fades in content as the user scrolls
var halfScreenElement= function() {
return document.elementFromPoint(0, $window.height()*.66);
}
// This function alternates the different status of the header in body.front
var headerEffect = function(header, position) {
var $elements = [];
var fadeInElements = [];
var checkpoints = [];
var lastCheckpoint = null;
var currentHalfScreenElement = null;
$elements.push($('img.logo-region-highlighted'));
$('div.region-homepage > div.block').each(function(i) {
$elements.push($(this));
fadeInElements.push($(this).attr('id'));
});
$elements.forEach(function(e, idx) {
checkpoints.push(e.offset().top);
});
lastCheckpoint = inRange(position, checkpoints);
currentHalfScreenElement = halfScreenElement();
if ($.inArray(currentHalfScreenElement.id, fadeInElements) != -1) {
$('div#' + currentHalfScreenElement.id + ' div.container').addClass('-fade-in');
}
if (lastCheckpoint !== false) {
switch(lastCheckpoint) {
case 0:
if ($header.hasClass('-full-header')) {
$header.addClass('-hidden-full-header');
} else {
$header.addClass('-hidden');
}
break;
case 1:
$header.addClass('-full-header');
$header.removeClass('-hidden -hidden-full-header');
break;
default:
}
} else {
$header.removeClass('-hidden -full-header -hidden-full-header');
}
};
var sidebarEffect = function (sidebar, position, topOffset, bottomOffset) {
bottomOffset = $document.height() - bottomOffset - sidebar.height();
console.log(position);
if (position <= topOffset) {
sidebar.addClass('sidebar-top');
sidebar.removeClass('sidebar-fixed sidebar-bottom');
sidebar.css('top', '');
} else if (position < bottomOffset) {
sidebar.removeClass('sidebar-top sidebar-bottom');
sidebar.addClass('sidebar-fixed');
sidebar.css('top', '');
} else {
lastPosition = sidebar.offset().top - sidebar.parent().offset().top
if (!sidebar.hasClass('sidebar-bottom')) {
sidebar.removeClass('sidebar-fixed sidebar-top');
sidebar.addClass('sidebar-bottom');
sidebar.css('top', lastPosition);
}
}
};
var onReadyExec = function() {
if ($body.hasClass('front')) {
headerEffect($header, currentPos);
}
};
onReadyExec();
/*
if ($('body').hasClass('wy-body-for-nav')) {
$sidebar = $('.wy-side-scroll');
currentPos = $window.scrollTop();
$(window).scroll(function() {
currentPos = $(this).scrollTop();
console.log(currentPos);
sidebarEffect($sidebar, currentPos, 0, 630);
})
}
*/
//
var overlayBehavior = function(action) {
cssClass = '-overlay';
}
var menuMobile = function(action) {
}
var resized = false;
$window.resize(function() {
if ($window.width() > 768 && !resized) {
resized = true;
} else {
resized = false;
}
});
mobileMenuBars.click(function() {
if (mobileMenu.is(':visible')) {
mobileMenu.slideUp(200);
$body.removeClass('-expanded-mobile-menu');
if (!$body.hasClass('-expanded-search-box')) {
$body.removeClass('-expanded-header');
wrapper.removeClass(overlayClass);
}
} else {
mobileMenu.slideDown(200);
$body.addClass('-expanded-header -expanded-mobile-menu');
wrapper.addClass(overlayClass);
}
});
// shows and hides the search text box
searchButton.click(function() {
if (searchContainer.is(':visible')) {
searchContainer.slideUp(200);
$('body').removeClass('-expanded-search-box');
if (!$('body').hasClass('-expanded-mobile-menu')) {
$('body').removeClass('-expanded-header');
wrapper.removeClass(overlayClass);
}
} else {
searchContainer.slideDown(200);
$('body').addClass('-expanded-header -expanded-search-box');
wrapper.addClass(overlayClass);
}
});
var normalHeaderState = function() {
body = $('body');
if (body.hasClass('-expanded-header')) {
if (searchContainer.is(':visible')) {
searchContainer.slideUp()
body.removeClass('-expanded-search-box');
}
if (mobileMenu.is(':visible')) {
mobileMenu.slideUp();
body.removeClass('-expanded-mobile-menu');
}
wrapper.removeClass(overlayClass);
$('body').removeClass('-expanded-header');
}
}
$('html').click(function() {
normalHeaderState();
});
$('header').click(function(event){
event.stopPropagation();
});
$('span#secondary-menu-button').click(function() {
if ($(window).width() < 768) {
$('div.container-sidebar').toggleClass('-expanded-submenu');
}
});
// when esc key is keyup
$(document).on('keyup', function(e) {
if (e.keyCode == 27 && wrapper.hasClass('-overlay')) {
normalHeaderState();
}
});
// This event listens for a mousedown event on all a.trap-link elements
// If the user right-clicks the link, the page will scroll to the anchor
// found on attribute data-hash
$('a.trap-link').click(function(e) {
// only do this where body.page-about
if ($('body').hasClass('page-about')) {
e.preventDefault();
var hash = $(this).data('hash');
$(this).closest('ul.menu').find('a.active').removeClass('active');
$(this).addClass('active');
$('html, body').animate({
scrollTop: $('#' + hash).offset().top - 80
}, 500);
}
});
// Listens for position and updates global variable
$window.scroll(function() {
currentPos = $(this).scrollTop();
console.log(currentPos);
if ($body.hasClass('front')) {
headerEffect($header, currentPos);
}
});
// TODO: Use global currentPos for scroll position
if ($('body').hasClass('page-about')) {
var $menuLinks = [];
var checkpoints = [];
var currentPos = 0;
var lastCheckpoint = null;
$('div.region-sidebar ul.menu a.trap-link').each(function(i) {
$menuLinks.push($(this));
checkpoints[i] = $('#' + $menuLinks[i].data('hash')).offset().top - 100;
});
$(window).scroll(function() {
currentPos = $(this).scrollTop();
lastCheckpoint = inRange(currentPos, checkpoints);
if (lastCheckpoint !== false) {
$menuLinks.forEach(function(e, idx) {
if (idx != lastCheckpoint)
e.removeClass('active');
});
$menuLinks[lastCheckpoint].addClass('active');
}
});
}
$('div.sticky-container').affix({
offset: {
top: 0,
bottom: 635
}
});
});
File diff suppressed because one or more lines are too long
@@ -1,4 +1,16 @@
jQuery(document).ready(function($){
<<<<<<< HEAD
=======
var classItem = $('.custom-dropdown-menu li.parent-item').attr('class');
if(classItem == 'menu-item-open parent-item'){
$('.custom-dropdown-menu li.parent-item a').append('<span class="fa fa-chevron-down"></span>');
}
else{
$('.custom-dropdown-menu li.parent-item a').append('<span class="fa fa-chevron-up"></span>');
}
>>>>>>> CLR-DOCS-THEME
$('header .mobile-menu').click(function(){
$(this).parent().toggleClass('menu-open');
$('.o1-logo-container-mobile').toggleClass('menu-open');
@@ -9,10 +21,17 @@ jQuery(document).ready(function($){
$(this).parent().toggleClass('menu-open');
});
<<<<<<< HEAD
$('.custom-dropdown-menu li .fa').click(function(evt){
evt.stopPropagation();
$(this).toggleClass('fa-angle-down fa-angle-up');
$(this).closest('li').toggleClass('menu-item-open menu-item-closed');
=======
$('.custom-dropdown-menu li.parent-item .fa').click(function(evt){
evt.stopPropagation();
$(this).toggleClass('fa-chevron-up fa-chevron-down');
$(this).closest('li').toggleClass('menu-item-closed menu-item-open');
>>>>>>> CLR-DOCS-THEME
return false;
});
+153
View File
@@ -0,0 +1,153 @@
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"sphinx-rtd-theme":[function(require,module,exports){
var jQuery = (typeof(window) != 'undefined') ? window.jQuery : require('jquery');
// Sphinx theme nav state
function ThemeNav () {
var nav = {
navBar: null,
win: null,
winScroll: false,
winResize: false,
linkScroll: false,
winPosition: 0,
winHeight: null,
docHeight: null,
isRunning: null
};
nav.enable = function () {
var self = this;
jQuery(function ($) {
self.init($);
self.reset();
self.win.on('hashchange', self.reset);
// Set scroll monitor
self.win.on('scroll', function () {
if (!self.linkScroll) {
self.winScroll = true;
}
});
setInterval(function () { if (self.winScroll) self.onScroll(); }, 25);
// Set resize monitor
self.win.on('resize', function () {
self.winResize = true;
});
setInterval(function () { if (self.winResize) self.onResize(); }, 25);
self.onResize();
});
};
nav.init = function ($) {
var doc = $(document),
self = this;
this.navBar = $('div.wy-side-scroll:first');
this.win = $(window);
// Set up javascript UX bits
$(document)
// Shift nav in mobile when clicking the menu.
.on('click', "[data-toggle='wy-nav-top']", function() {
$("[data-toggle='wy-nav-shift']").toggleClass("shift");
$("[data-toggle='rst-versions']").toggleClass("shift");
})
// Nav menu link click operations
.on('click', ".wy-menu-vertical .current ul li a", function() {
var target = $(this);
// Close menu when you click a link.
$("[data-toggle='wy-nav-shift']").removeClass("shift");
$("[data-toggle='rst-versions']").toggleClass("shift");
// Handle dynamic display of l3 and l4 nav lists
self.toggleCurrent(target);
self.hashChange();
})
.on('click', "[data-toggle='rst-current-version']", function() {
$("[data-toggle='rst-versions']").toggleClass("shift-up");
})
// Make tables responsive
$("table.docutils:not(.field-list)")
.wrap("<div class='wy-table-responsive'></div>");
// Add expand links to all parents of nested ul
$('.wy-menu-vertical ul').not('.simple').siblings('a').each(function () {
var link = $(this);
expand = $('<span class="toctree-expand"></span>');
expand.on('click', function (ev) {
self.toggleCurrent(link);
ev.stopPropagation();
return false;
});
link.prepend(expand);
});
};
nav.reset = function () {
// Get anchor from URL and open up nested nav
var anchor = encodeURI(window.location.hash);
if (anchor) {
try {
var link = $('.wy-menu-vertical')
.find('[href="' + anchor + '"]');
$('.wy-menu-vertical li.toctree-l1 li.current')
.removeClass('current');
link.closest('li.toctree-l2').addClass('current');
link.closest('li.toctree-l3').addClass('current');
link.closest('li.toctree-l4').addClass('current');
}
catch (err) {
console.log("Error expanding nav for anchor", err);
}
}
};
nav.onScroll = function () {
this.winScroll = false;
var newWinPosition = this.win.scrollTop(),
winBottom = newWinPosition + this.winHeight,
navPosition = this.navBar.scrollTop(),
newNavPosition = navPosition + (newWinPosition - this.winPosition);
if (newWinPosition < 0 || winBottom > this.docHeight) {
return;
}
this.navBar.scrollTop(newNavPosition);
this.winPosition = newWinPosition;
};
nav.onResize = function () {
this.winResize = false;
this.winHeight = this.win.height();
this.docHeight = $(document).height();
};
nav.hashChange = function () {
this.linkScroll = true;
this.win.one('hashchange', function () {
this.linkScroll = false;
});
};
nav.toggleCurrent = function (elem) {
var parent_li = elem.closest('li');
parent_li.siblings('li.current').removeClass('current');
parent_li.siblings().find('li.current').removeClass('current');
parent_li.find('> ul li.current').removeClass('current');
parent_li.toggleClass('current');
}
return nav;
};
module.exports.ThemeNav = ThemeNav();
if (typeof(window) != 'undefined') {
window.SphinxRtdTheme = { StickyNav: module.exports.ThemeNav };
}
},{"jquery":"jquery"}]},{},["sphinx-rtd-theme"]);
+1 -1
View File
@@ -2,7 +2,6 @@
inherit = basic
stylesheet = css/main.css
[options]
logo =
logo_name = false
@@ -65,3 +64,4 @@ head_font_family = 'Garamond', 'Georgia', serif
code_highlight = #FFC
page_width = 940px
sidebar_width = 220px
-773
View File
@@ -1,773 +0,0 @@
.. _bundles_in_clr_html:
Bundles in ClearLinux
#####################
.. raw:: html
<head>
<title>Bundles in ClearLinux</title>
<style media="screen" type="text/css">
table { margin: 2em; border-collapse: collapse; }
td, th { padding: .5em; border: 1px #ccc solid; }
thead { background: #fc9; }
</style>
</head>
<table border: 1px; callpadding: 15>
<thead>
<th align=left>Bundle Name</th>
<th align=center>Status</th>
<th align=left>Description</th>
<!-- <th align=left>Capabilities</th> -->
<!-- <th align=left>Maintainer</th> -->
</thead>
<tbody>
<tr>
<td align=left> bat</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides the neccesary bundles to perform BAT succesfully</p>
<li>Includes (devtools-basic) bundle.</p>
<li>Includes (openstack-test-suite) bundle.</p>
<li>Includes (os-testsuite) bundle.</p>
<li>Includes (pnp-tools-basic) bundle.</p>
<li>Includes (openstack-all-in-one) bundle.</p>
<li>Includes (storage-utils) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> bootloader</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> UEFI bootloaders</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> clr-devops</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides build/release tools for Clear devops team</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> containers-basic</td>
<td align=center> WIP</td>
<td align=left>
<p> Installs rkt base for Clear Containers</p>
<li>Includes (storage-utils) bundle.</p>
<li>Includes (network-basic) bundle.</p>
<li>Includes (kernel-container) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> cryptography</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Cryptographic tools</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> database-mariadb</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides components needed to run MariaDB</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> database-mongodb</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides components needed to run mongodb</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> devtools-basic</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides basic set of languages and tools for development</p>
<li>Includes (R-basic) bundle.</p>
<li>Includes (go-basic) bundle.</p>
<li>Includes (hpc-basic) bundle.</p>
<li>Includes (os-core-dev) bundle.</p>
<li>Includes (perl-basic) bundle.</p>
<li>Includes (python-basic) bundle.</p>
<li>Includes (ruby-basic) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> devtools-extras</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides extra set of languages and tools for development</p>
<li>Includes (R-extras) bundle.</p>
<li>Includes (devtools-basic) bundle.</p>
<li>Includes (go-extras) bundle.</p>
<li>Includes (perl-extras) bundle.</p>
<li>Includes (python-extras) bundle.</p>
<li>Includes (ruby-extras) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> dev-utils</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides a limited set of development utilities</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> dpdk-dev</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> All headers and libraries necessary to develop with the Data Plane Development Kit.</p>
<li>Includes (os-core-dev) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> editors</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides popular text editors</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> file-utils</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides basic set of file manipulation utilities</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> go-basic</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides basic Go language development</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> go-extras</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Most popular Golang libraries</p>
<li>Includes (go-basic) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> hpc-basic</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides basic suite of MPI/HPC development tools</p>
<li>Includes (os-core-dev) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> iot</td>
<td align=center> WIP</td>
<td align=left>
<p> The IoT (Internet of Things) base bundle</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> kernel-container</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides a Linux kernel appropriate for a Clear Container</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> kernel-kvm</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides a Linux kernel appropriate for running under KVM</p>
<li>Includes (bootloader) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> kernel-native</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides a Linux kernel appropriate for physical machines</p>
<li>Includes (bootloader) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> kernel-pxe</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides a Linux kernel linking an initramfs as root</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> koji</td>
<td align=center> WIP</td>
<td align=left>
<p> Sets up a koji build service (builder-only, for now) based on NFS mounts.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> kvm-host</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides necessary tools to run usable virtual machines with QEMU-KVM (independently of OpenStack).</p>
<li>Includes (kernel-kvm) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> lamp-basic</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Basic LAMP Server (apache2, mariadb, php5)</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> mail-utils</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides utilities for reading and sending email</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> message-broker-rabbitmq</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides the RabbitMQ messaging service</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> net-utils</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides an essential suite of core networking configuration and debug tools</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> network-advanced</td>
<td align=center> WIP</td>
<td align=left>
<p> More utilities for advanced host-level networking; bridge, switch, netfilter, vpn etc.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> network-basic</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides a basic suite of networking utilities</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> network-proxy-client</td>
<td align=center> WIP</td>
<td align=left>
<p> Tools for dealing with client-side network proxy settings.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openssh-server</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides an SSH server (and client)</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-all-in-one</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides an All-in-one OpenStack deployment</p>
<li>Includes (database-mariadb) bundle.</p>
<li>Includes (database-mongodb) bundle.</p>
<li>Includes (message-broker-rabbitmq) bundle.</p>
<li>Includes (openstack-block-storage) bundle.</p>
<li>Includes (openstack-block-storage-controller) bundle.</p>
<li>Includes (openstack-compute) bundle.</p>
<li>Includes (openstack-compute-controller) bundle.</p>
<li>Includes (openstack-dashboard) bundle.</p>
<li>Includes (openstack-database) bundle.</p>
<li>Includes (openstack-identity) bundle.</p>
<li>Includes (openstack-image) bundle.</p>
<li>Includes (openstack-lbaas) bundle.</p>
<li>Includes (openstack-network) bundle.</p>
<li>Includes (openstack-object-storage) bundle.</p>
<li>Includes (openstack-orchestration) bundle.</p>
<li>Includes (openstack-python-clients) bundle.</p>
<li>Includes (openstack-telemetry-controller) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-block-storage</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides an OpenStack Cinder service</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-block-storage-controller</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides an OpenStack Cinder controller service</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-compute</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides an OpenStack nova-compute node</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-compute-controller</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides an OpenStack Nova control server</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-configure</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides a suggested default configuration for OpenStack on Clear Linux.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-controller</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides an OpenStack multi-service control server</p>
<li>Includes (database-mariadb) bundle.</p>
<li>Includes (message-broker-rabbitmq) bundle.</p>
<li>Includes (openstack-identity) bundle.</p>
<li>Includes (openstack-image) bundle.</p>
<li>Includes (openstack-compute-controller) bundle.</p>
<li>Includes (openstack-dashboard) bundle.</p>
<li>Includes (openstack-python-clients) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-dashboard</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides an OpenStack Horizon server</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-database</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides a Database as a Service server</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-identity</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides an OpenStack Keystone server</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-image</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides an OpenStack Glance server</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-lbaas</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides Load Balancing as a Service</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-network</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides an OpenStack Neutron server</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-object-storage</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides an OpenStack Swift service</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-orchestration</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides an OpenStack Heat service</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-python-clients</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides OpenStack command-line utilities</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-telemetry-controller</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides an OpenStack Telemetry server</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> openstack-test-suite</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides an OpenStack Tempest/test suite </p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> os-cloudguest</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides cloud-init cloud guest configuration utilities</p>
<li>Includes (openssh-server) bundle.</p>
<li>Includes (telemetrics) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> os-clr-on-clr</td>
<td align=center> WIP</td>
<td align=left>
<p> content for development of the Clear Linux OS on the Clear Linux OS</p>
<li>Includes (storage-utils) bundle.</p>
<li>Includes (mail-utils) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> os-core</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> The basic core OS components of Clear Linux for iA </p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> os-core-dev</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Basic development tools</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> os-core-update</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides basic suite for running the Clear Linux for iA Updater</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> os-installer</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides an installer for Clear Linux for iA</p>
<li>Includes (telemetrics) bundle.</p>
<li>Includes (network-proxy-client) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> os-testsuite</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides basic test suite for Clear Linux for iA</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> os-testsuite-phoronix</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> All the required pieces for running the Phoronix Test Suite</p>
<li>Includes (os-utils) bundle.</p>
<li>Includes (devtools-basic) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> os-utils</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides a core set of OS utilities</p>
<li>Includes (editors) bundle.</p>
<li>Includes (dev-utils) bundle.</p>
<li>Includes (sysadmin) bundle.</p>
<li>Includes (network-basic) bundle.</p>
<li>Includes (file-utils) bundle.</p>
<li>Includes (network-proxy-client) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> os-utils-gui</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides a graphical desktop environment </p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> perl-basic</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides essential Perl language and dev tools</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> perl-extras</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides extra libraries for Perl</p>
<li>Includes (perl-basic) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> pnp-tools-advanced</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides advanced Power and Performance measurement tools</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> pnp-tools-basic</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides basic Power and Performance testing tools</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> pnp-tools-intermediate</td>
<td align=center> WIP</td>
<td align=left>
<p> Provides a deeper-level suite of Power and Performance testing tools</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> python-basic</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides core Python language and libraries</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> python-extras</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides extra libraries for Python</p>
<li>Includes (python-basic) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> R-basic</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides core R language and libraries</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> R-extras</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides deeper functionality R language libraries</p>
<li>Includes (R-basic) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> ruby-basic</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Top 3 basic Ruby Libraries</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> ruby-extras</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Top 3 to 6 basic Ruby Libraries</p>
<li>Includes (ruby-basic) bundle.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> shells</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> All available shell programs for Clear, along with ancillary files</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> storage-utils</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides basic storage-related utilities</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> sysadmin</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides a basic set of system administration utilities.</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> telemetrics</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Provides the Telemetrics client for Clear Linux for iA</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
<tr>
<td align=left> virtualbox-guest</td>
<td align=center> ACTIVE</td>
<td align=left>
<p> Include the modules and binaries meant to be used as a VirtualBox instance</p>
</td>
<!-- <td align=left><p></p></td> -->
<!-- <td align=left><p></p></td> -->
</tr>
</tbody>
</table>
+32 -22
View File
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
#
# ClearLinux Documentation documentation build configuration file, created by
# sphinx-quickstart on Fri Nov 13 12:23:35 2015.
# Clear Linux documentation build configuration file, created by
# sphinx-quickstart on Fri May 8 11:43:01 2015.
#
# This file is execfile()d with the current directory set to its
# containing dir.
@@ -29,7 +29,13 @@ import shlex
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = []
#extensions = [
# 'sphinx.ext.autodoc', 'breathe', 'sphinx.ext.todo'
#]
extensions = [
'sphinx.ext.autodoc', 'sphinx.ext.todo'
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
@@ -46,18 +52,18 @@ source_suffix = '.rst'
master_doc = 'index'
# General information about the project.
project = u'ClearLinux Documentation'
copyright = u'2015, Intel OTC'
author = u'Intel OTC'
project = u'Clear Linux* Project for Intel® Architecture'
copyright = u'2015, many'
author = u'many'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '1.0.1'
version = '0.1'
# The full version, including alpha/beta/rc tags.
release = '1.0.1'
release = '0.1'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
@@ -103,12 +109,16 @@ pygments_style = 'sphinx'
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
rst_epilog = """
.. include:: /substitutions.rst
"""
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'clearlinux'
#html_theme = 'zephyr'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
@@ -120,7 +130,7 @@ html_theme_path = ['_themes']
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
html_title = "Documentation for Clear Linux* Project for Intel(r) Architecture"
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
@@ -146,11 +156,11 @@ html_static_path = ['_static']
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
#html_use_smartypants =
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
@@ -160,22 +170,22 @@ html_static_path = ['_static']
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
html_domain_indices = False
# If false, no index is generated.
#html_use_index = True
html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
html_split_index = True
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
#html_show_sourcelink =
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
@@ -200,7 +210,7 @@ html_static_path = ['_static']
#html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder.
htmlhelp_basename = 'ClearLinuxDocumentationdoc'
htmlhelp_basename = 'clrdoc'
# -- Options for LaTeX output ---------------------------------------------
@@ -222,8 +232,8 @@ latex_elements = {
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'ClearLinuxDocumentation.tex', u'ClearLinux Documentation Documentation',
u'Intel OTC', 'manual'),
(master_doc, 'clr.tex', u'Documentation for Clear Linux* Project for Intel® Architecture',
u'many', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
@@ -252,7 +262,7 @@ latex_documents = [
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'clearlinuxdocumentation', u'ClearLinux Documentation Documentation',
(master_doc, 'clearlinux', u'Documentation for Clear Linux* Project for Intel® Architecture',
[author], 1)
]
@@ -266,8 +276,8 @@ man_pages = [
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'ClearLinuxDocumentation', u'ClearLinux Documentation Documentation',
author, 'ClearLinuxDocumentation', 'One line description of project.',
(master_doc, 'clearlinux', u'Documentation for Clear Linux* Project for Intel® Architecture',
author, 'Clear Linux', 'One line description of project.',
'Miscellaneous'),
]
+20
View File
@@ -15,11 +15,17 @@ Starter script
To start the image, run the ``start_qemu.sh`` script from
`here <http://download.clearlinux.org/image/start_qemu.sh>`_, or modify
the following script for your needs and run it from the command line
<<<<<<< HEAD
with ``$ script clr_image``::
#!/bin/bash
=======
with ``$ script clr_image``
.. code-block:: bash
#!/bin/bash
>>>>>>> staging
if [ $# -eq 0 ] ; then
echo "Please provide an image to emulate as first argument"
exit 1
@@ -41,7 +47,11 @@ with ``$ script clr_image``
To run this script, connect from host via SSH. Take note that SSH is not
enabled by default. To enable it, log in through serial console with the
username ``root``. After setting the password, enable root login via SSH
<<<<<<< HEAD
by configuring ``/etc/ssh/sshd_config`` with this content::
=======
by configuring :file:`/etc/ssh/sshd_config` with this content::
>>>>>>> staging
PermitRootLogin yes
@@ -49,16 +59,26 @@ Now you may connect from host via SSH through 2223::
$ ssh -p 2223 root@localhost
<<<<<<< HEAD
Alternately, there are a few other ways to approach this.
=======
Alternatively, there are a few other ways to approach this.
>>>>>>> staging
- To run the script without modifying its permissions::
$ bash start_qemu.sh clr_image
- To run it as a background process::
<<<<<<< HEAD
$ `bash start_qemu.sh clr_image` &
=======
$ bash start_qemu.sh clr_image &
>>>>>>> staging
- If you'd like to run the script with execute permission::
$ chmod +x start_qemu.sh
+2 -1
View File
@@ -1,4 +1,5 @@
.. rubric:: OpenStack* implementation
OpenStack* implementation
#########################
.. toctree::
:maxdepth: 1
+4 -4
View File
@@ -11,7 +11,7 @@ Getting started
***************
.. toctree::
:maxdepth: 1
:maxdepth: 2
index_gs.rst
@@ -20,7 +20,7 @@ Software update
***************
.. toctree::
:maxdepth: 1
:maxdepth: 2
index_sw_update.rst
@@ -29,7 +29,7 @@ Bundles
*******
.. toctree::
:maxdepth: 1
:maxdepth: 2
index_bundles.rst
@@ -38,7 +38,7 @@ OpenStack* implementation
*************************
.. toctree::
:maxdepth: 1
:maxdepth: 2
index-openstack.rst
+3 -2
View File
@@ -1,7 +1,8 @@
.. rubric:: Bundles
Bundles
#######
.. toctree::
:maxdepth: 1
:maxdepth: 2
bundles_overview
bundles_in_clr
+3 -2
View File
@@ -1,7 +1,8 @@
.. rubric:: Getting started
Getting started
###############
.. toctree::
:maxdepth: 1
:maxdepth: 2
gs_getting_started
gs_supported_hardware
+3 -2
View File
@@ -1,7 +1,8 @@
.. rubric:: Software update
Software update
###############
.. toctree::
:maxdepth: 1
:maxdepth: 2
swupdate_about_sw_update
swupdate_how_to_run_the_updater
-626
View File
@@ -1,626 +0,0 @@
.. _openstack_object_storage:
Object Storage
#########################
Install and configure the controller node
-----------------------------------------
This section describes how to install and configure the proxy service
that handles requests for the account, container, and object services
operating on the storage nodes. For simplicity, this guide installs and
configures the proxy service on the controller node. However, you can
run the proxy service on any node with network connectivity to the
storage nodes. Additionally, you can install and configure the proxy
service on multiple nodes to increase performance and redundancy.
To configure prerequisites
~~~~~~~~~~~~~~~~~~~~~~~~~~
The proxy service relies on an authentication and authorization
mechanism such as the Identity service. However, unlike other services,
it also offers an internal mechanism that allows it to operate without
any other OpenStack* services. However, for simplicity, this guide
references the Identity service OpenStack Identity Service. Before you
configure the Object Storage service, you must create service
credentials and an API endpoint.
#. Source the ``admin`` credentials to gain access to admin-only CLI
commands::
$ source admin-openrc.sh
#. To create the Identity service credentials, complete these steps:
* Create the swift user::
$ openstack user create --password-prompt swift
User Password:
Repeat User Password:
+----------+----------------------------------+ 
| Field    | Value                            | 
+----------+----------------------------------+ 
| email    | None                             | 
| enabled  | True                             | 
| id       | d535e5cbd2b74ac7bfb97db9cced3ed6 | 
| name     | swift                            | 
| username | swift                            | 
+----------+----------------------------------+
* Add the admin role to the swift user::
$ openstack role add --project service --user swift admin
+-------+----------------------------------+
| Field | Value                            |
+-------+----------------------------------+
| id    | cd2cb9a39e874ea69e5d4b896eb16128 |
| name  | admin                            |
+-------+----------------------------------+
* Create the swift service entity::
$ openstack service create --name swift \
--description "OpenStack Object Storage" object-store
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Object Storage         |
| enabled     | True                             |
| id          | 75ef509da2c340499d454ae96a2c5c34 |
| name        | swift                            |
| type        | object-store                     |
+-------------+----------------------------------+
#. Create the Object Storage service API endpoint::
$ openstack endpoint create \
--publicurl 'http://controller:8080/v1/AUTH_%(tenant_id)s' \
--internalurl 'http://controller:8080/v1/AUTH_%(tenant_id)s' \
--adminurl http://controller:8080 \
--region RegionOne \
object-store
+--------------+----------------------------------------------+
| Field        | Value                                        |
+--------------+----------------------------------------------+
| adminurl     | http://controller:8080/                      |
| id           | af534fb8b7ff40a6acf725437c586ebe             |
| internalurl  | http://controller:8080/v1/AUTH_%(tenant_id)s |
| publicurl    | http://controller:8080/v1/AUTH_%(tenant_id)s |
| region       | RegionOne                                    |
| service_id   | 75ef509da2c340499d454ae96a2c5c34             |
| service_name | swift                                        |
| service_type | object-store                                 |
+--------------+----------------------------------------------+
To install and configure the controller node components
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#. Install the bundle::
# clr_bundle_add openstack-object-storage
#. Create the directory ``/etc/swift`` if does not exist::
# mkdir /etc/swift
#. Copy the sample proxy-server config file to the configuration
directory::
# cp /usr/share/defaults/swift/proxy-server.conf /etc/swift
#. Edit the ``/etc/swift/proxy-server.conf`` file and complete the
following actions:
* In the ``[pipeline:main]`` section, enable the appropriate
modules::
[pipeline:main]
pipeline = catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk ratelimit authtoken keystoneauth container-quotas account-quotas slo dlo proxy-logging proxy-server
* In the ``[app:proxy-server]`` section, enable automatic account
creation::
[app:proxy-server]
...
account_autocreate = true
* In the ``[filter:keystoneauth]`` section, configure the operator
roles::
[filter:keystoneauth]
use = egg:swift#keystoneauth
...
operator_roles = admin,user
* In the ``[filter:authtoken]`` section, configure Identity service
access. Replace SWIFT\_PASS with the password you chose for the
swift user in the Identity service::
[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
...
auth_uri = http://controller:5000
auth_url = http://controller:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = swift
password = SWIFT_PASS
delay_auth_decision = true
* In the ``[filter:cache]`` section, configure the memcached
location::
[filter:cache]
...
memcache_servers = 127.0.0.1:11211
Install and configure the storage nodes
---------------------------------------
This section describes how to install and configure storage nodes that
operate the account, container, and object services. For simplicity,
this configuration references two storage nodes, each containing two
empty local block storage devices. Each of the devices, ``/dev/sdb`` and
``/dev/sdc``, must contain a suitable partition table with one partition
occupying the entire device. Although the Object Storage service
supports any file system with extended attributes (xattr), testing and
benchmarking indicate the best performance and reliability on XFS.
To configure prerequisites
~~~~~~~~~~~~~~~~~~~~~~~~~~
You must configure each storage node before you install and configure
the Object Storage service on it. Similar to the controller node, each
storage node contains one network interface on the management network.
Optionally, each storage node can contain a second network interface on
a separate network for replication.
#. Configure unique items on the first storage node:
* Configure the management interface::
IP address: 10.0.0.51
Network mask: 255.255.255.0 (or /24)
Default gateway: 10.0.0.1
* Set the hostname of the node to ``object1``.
#. Configure unique items on the second storage node:
* Configure the management interface::
IP address: 10.0.0.52
Network mask: 255.255.255.0 (or /24)
Default gateway: 10.0.0.1
* Set the hostname of the node to ``object2``.
#. Configure shared items on both storage nodes:
* Copy the contents of the ``/etc/hosts`` file from the controller
node and add the following to it::
# object1
10.0.0.51 object1
# object2
10.0.0.52 object2
Also add this content to the ``/etc/hosts`` file on all other nodes in your environment.
* Install the OpenStack Object Storage bundle::
# clr\_bundle\_add openstack-object-storage
* Format the ``/dev/sdb1`` and ``/dev/sdc1`` partitions as XFS::
# mkfs.xfs /dev/sdb1
# mkfs.xfs /dev/sdc1
* Create the mount point directory structure::
# mkdir -p /srv/node/sdb1
# mkdir -p /srv/node/sdc1
* Edit the ``/etc/fstab`` file and add the following to it::
/dev/sdb1 /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 2
/dev/sdc1 /srv/node/sdc1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 2
* Mount the devices::
# mount /srv/node/sdb1
# mount /srv/node/sdc1
#. Edit the ``/etc/rsyncd.conf`` file and add the following to it::
uid = swift
gid = swift
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
address = MANAGEMENT\_INTERFACE\_IP\_ADDRESS
[account]
max connections = 2
path = /srv/node/
read only = false
lock file = /var/lock/account.lock
[container]
max connections = 2
path = /srv/node/
read only = false
lock file = /var/lock/container.lock
[object]
max connections = 2
path = /srv/node/
read only = false
lock file = /var/lock/object.lock
Replace ``MANAGEMENT_INTERFACE_IP_ADDRESS`` with the IP address of
the management network on the storage node.
Note: The ``rsync`` service requires no authentication, so consider
running it on a private network.
#. Start the ``rsyncd`` service and configure it to start when the
system boots::
# systemctl enable rsyncd.service
# systemctl start rsyncd.service
Install and configure storage node components
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#. Copy the accounting, container, object, container-reconciler, and
object-expirer service configuration files to the configuration
directory::
# cp /usr/share/defaults/swift/account-server.conf /etc/swift
# cp /usr/share/defaults/swift/container-server.conf /etc/swift
# cp /usr/share/defaults/swift/object-server.conf /etc/swift
# cp /usr/share/defaults/swift/container-reconciler.conf/etc/swift
# cp /usr/share/defaults/swift/object-expirer.conf /etc/swift
#. Edit the ``/etc/swift/account-server.conf`` file and complete the
following actions:
* In the ``[DEFAULT]`` section, configure the bind IP address and
mount point directory::
[DEFAULT]
...
bind\_ip = MANAGEMENT\_INTERFACE\_IP\_ADDRESS
devices = /srv/node
Replace ``MANAGEMENT_INTERFACE_IP_ADDRESS`` with the IP
address of the management network on the storage node.
* In the ``[pipeline:main]`` section, enable the appropriate
modules::
[pipeline:main]
pipeline = healthcheck recon account-server
* In the ``[filter:recon]`` section, configure the recon (metrics)
cache directory::
[filter:recon]
...
recon\_cache\_path = /var/cache/swift
#. Edit the ``/etc/swift/container-server.conf`` file and complete the
following actions:
* In the ``[DEFAULT]`` section, configure the bind IP address and
mount point directory::
[DEFAULT]
...
bind\_ip = MANAGEMENT\_INTERFACE\_IP\_ADDRESS
devices = /srv/node
Replace ``MANAGEMENT_INTERFACE_IP_ADDRESS`` with the IP
address of the management network on the storage node.
* modules::
[pipeline:main]
pipeline = healthcheck recon container-server
* In the ``[filter:recon]`` section, configure the recon (metrics)
cache directory::
[filter:recon]
...
recon\_cache\_path = /var/cache/swift
#. Edit the ``/etc/swift/object-server.conf`` file and complete the
following actions:
* In the ``[DEFAULT]`` section, configure the bind IP address and
mount point directory::
[DEFAULT]
...
bind\_ip = MANAGEMENT\_INTERFACE\_IP\_ADDRESS
devices = /srv/node
Replace ``MANAGEMENT_INTERFACE_IP_ADDRESS`` with the IP
address of the management network on the storage node.
* In the ``[pipeline:main]`` section, enable the appropriate
modules::
[pipeline:main]
pipeline = healthcheck recon object-server
* In the ``[filter:recon]`` section, configure the recon (metrics)
cache and lock directories::
[filter:recon]
...
recon\_cache\_path = /var/cache/swift
recon\_lock\_path = /var/lock
#. Ensure proper ownership of the mount point directory structure::
# systemctl restart update-triggers.target
About Creating initial rings
----------------------------
Before starting the Object Storage services, you must create the initial
account, container, and object rings. The ring builder creates
configuration files that each node uses to determine and deploy the
storage architecture. For simplicity, this guide uses one region and
zone with 2^10 (1024) maximum partitions, 3 replicas of each object, and
1 hour minimum time between moving a partition more than once. For
Object Storage, a partition indicates a directory on a storage device
rather than a conventional partition table.
Create Account Ring
-------------------
The account server uses the account ring to maintain lists of
containers.
To create the ring
~~~~~~~~~~~~~~~~~~
#. Change to the /etc/swift directory.
#. Create the base account.builder file::
# swift-ring-builder account.builder create 10 3 1
#. Add each storage node to the ring::
# swift-ring-builder account.builder \
add r1z1-STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS:6002/DEVICE_NAME DEVICE_WEIGHT
Replace *STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS* with the
IP address of the management network on the storage node. Replace
*DEVICE_NAME* with a storage device name on the same storage node.
For example, using the first storage node with the ``/dev/sdb1`` storage
device and weight of 100::
# swift-ring-builder account.builder add r1z1-10.0.0.51:6002/sdb1 100
Repeat this command for each storage device on each storage node. In
the example architecture, use the command in four variations::
# swift-ring-builder account.builder add r1z1-10.0.0.51:6002/sdb1 100
Device d0r1z1-10.0.0.51:6002R10.0.0.51:6002/sdb1_"" with 100.0 weight got id 0
# swift-ring-builder account.builder add r1z2-10.0.0.51:6002/sdc1 100
Device d1r1z2-10.0.0.51:6002R10.0.0.51:6002/sdc1_"" with 100.0 weight got id 1
# swift-ring-builder account.builder add r1z3-10.0.0.52:6002/sdb1 100
Device d2r1z3-10.0.0.52:6002R10.0.0.52:6002/sdb1_"" with 100.0 weight got id 2
# swift-ring-builder account.builder add r1z4-10.0.0.52:6002/sdc1 100
Device d3r1z4-10.0.0.52:6002R10.0.0.52:6002/sdc1_"" with 100.0 weight got id 3
#. Verify the ring contents::
# swift-ring-builder account.builder account.builder, build version 4
1024 partitions, 3.000000 replicas, 1 regions, 4 zones, 4 devices, 100.00 balance, 0.00 dispersion
The minimum number of hours before a partition can be reassigned is 1
The overload factor is 0.00% (0.000000)
Devices:    id  region  zone      ip address  port  replication ip  replication port      name weight partitions balance meta
             0       1     1       10.0.0.51  6002       10.0.0.51              6002      sdb1 100.00          0 -100.00
             1       1     2       10.0.0.51  6002       10.0.0.51              6002      sdc1 100.00          0 -100.00
             2       1     3       10.0.0.52  6002       10.0.0.52              6002      sdb1 100.00          0 -100.00
             3       1     4       10.0.0.52  6002       10.0.0.52              6002      sdc1 100.00          0 -100.00
#. Rebalance the ring::
# swift-ring-builder account.builder rebalance
Reassigned 1024 (100.00%) partitions. Balance is now 0.00. Dispersion is now 0.00
Create Container Ring
---------------------
The container server uses the container ring to maintain lists of
objects. However, it does not track object locations.
To create the ring
~~~~~~~~~~~~~~~~~~
#. Change to the ``/etc/swift`` directory.
#. Create the base container.builder file::
# swift-ring-builder container.builder create 10 3 1
#. Add each storage node to the ring::
# swift-ring-builder container.builder \
add r1z1-STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS:6001/DEVICE_NAME DEVICE_WEIGHT
Replace *STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS* with the
IP address of the management network on the storage node. Replace
*DEVICE_NAME* with a storage device name on the same storage node.
For example, using the first storage node with the /dev/sdb1 storage
device and weight of 100::
# swift-ring-builder container.builder add r1z1-10.0.0.51:6001/sdb1 100
Repeat this command for each storage device on each storage node. In
the example architecture, use the command in four variations::
# swift-ring-builder container.builder add r1z1-10.0.0.51:6001/sdb1 100
Device d0r1z1-10.0.0.51:6002R10.0.0.51:6002/sdb1_"" with 100.0 weight got id 0
# swift-ring-builder container.builder add r1z2-10.0.0.51:6001/sdc1 100
Device d1r1z2-10.0.0.51:6002R10.0.0.51:6002/sdc1_"" with 100.0 weight got id 1
# swift-ring-builder container.builder add r1z3-10.0.0.52:6001/sdb1 100
Device d2r1z3-10.0.0.52:6002R10.0.0.52:6002/sdb1_"" with 100.0 weight got id 2
# swift-ring-builder container.builder add r1z4-10.0.0.52:6001/sdc1 100
Device d3r1z4-10.0.0.52:6002R10.0.0.52:6002/sdc1_"" with 100.0 weight got id 3
#. Verify the ring contents::
# swift-ring-builder container.builder
container.builder, build version 4
1024 partitions, 3.000000 replicas, 1 regions, 4 zones, 4 devices, 100.00 balance, 0.00 dispersion
The minimum number of hours before a partition can be reassigned is 1
The overload factor is 0.00% (0.000000)
Devices:    id  region  zone      ip address  port  replication ip  replication port      name weight partitions balance meta
             0       1     1       10.0.0.51  6001       10.0.0.51              6001      sdb1 100.00          0 -100.00
             1       1     2       10.0.0.51  6001       10.0.0.51              6001      sdc1 100.00          0 -100.00
             2       1     3       10.0.0.52  6001       10.0.0.52              6001      sdb1 100.00          0 -100.00
             3       1     4       10.0.0.52  6001       10.0.0.52              6001      sdc1 100.00          0 -100.00
#. Rebalance the ring::
# swift-ring-builder container.builder rebalance
Reassigned 1024 (100.00%) partitions. Balance is now 0.00. Dispersion is now 0.00
Create Object Ring
------------------
The object server uses the object ring to maintain lists of object
locations on local devices.
To create the ring
~~~~~~~~~~~~~~~~~~
#. Change to the ``/etc/swift`` directory.
#. Create the base ``object.builder`` file::
# swift-ring-builder object.builder create 10 3 1
#. Add each storage node to the ring::
# swift-ring-builder object.builder \
add r1z1-STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS:6000/DEVICE_NAME DEVICE_WEIGHT
Replace *STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS* with the
IP address of the management network on the storage node. Replace
*DEVICE_NAME* with a storage device name on the same storage node.
For example, using the first storage node with the /dev/sdb1 storage
device and weight of 100::
# swift-ring-builder object.builder add r1z1-10.0.0.51:6000/sdb1 100
Repeat this command for each storage device on each storage node. In
the example architecture, use the command in four variations::
# swift-ring-builder object.builder add r1z1-10.0.0.51:6000/sdb1 100
Device d0r1z1-10.0.0.51:6002R10.0.0.51:6002/sdb1_"" with 100.0 weight got id 0
# swift-ring-builder object.builder add r1z2-10.0.0.51:6000/sdc1 100
Device d1r1z2-10.0.0.51:6002R10.0.0.51:6002/sdc1_"" with 100.0 weight got id 1
# swift-ring-builder object.builder add r1z3-10.0.0.52:6000/sdb1 100
Device d2r1z3-10.0.0.52:6002R10.0.0.52:6002/sdb1_"" with 100.0 weight got id 2
# swift-ring-builder object.builder add r1z4-10.0.0.52:6000/sdc1 100
Device d3r1z4-10.0.0.52:6002R10.0.0.52:6002/sdc1_"" with 100.0 weight got id 3
#. Verify the ring contents::
# swift-ring-builder object.builder
object.builder, build version 4
1024 partitions, 3.000000 replicas, 1 regions, 4 zones, 4 devices, 100.00 balance, 0.00 dispersion
The minimum number of hours before a partition can be reassigned is 1
The overload factor is 0.00% (0.000000)
Devices:    id  region  zone      ip address  port  replication ip  replication port      name weight partitions balance meta
             0       1     1       10.0.0.51  6000       10.0.0.51              6000      sdb1 100.00          0 -100.00
             1       1     2       10.0.0.51  6000       10.0.0.51              6000      sdc1 100.00          0 -100.00
             2       1     3       10.0.0.52  6000       10.0.0.52              6000      sdb1 100.00          0 -100.00
             3       1     4       10.0.0.52  6000       10.0.0.52              6000      sdc1 100.00          0 -100.00
#. Rebalance the ring::
# swift-ring-builder object.builder rebalance
Reassigned 1024 (100.00%) partitions. Balance is now 0.00. Dispersion is now 0.00
Distribute ring configuration files
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Copy the account.ring.gz, container.ring.gz, and object.ring.gz files to
the /etc/swift directory on each storage node and any additional nodes
running the proxy service.
Finalize installation
---------------------
Configure hashes and default storage policy
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#. Copy the swift service configuration file to the configuration directory::
# cp /usr/share/defaults/swift/swift.conf /etc/swift
#. Edit the ``/etc/swift/swift.conf`` file and complete the following
actions:
* In the ``[swift-hash]`` section, configure the hash path prefix and
suffix for your environment::
[swift-hash]
...
swift_hash_path_suffix = HASH_PATH_PREFIX
swift_hash_path_prefix = HASH_PATH_SUFFIX
* In the ``[storage-policy:0]`` section, configure the default storage
policy::
[storage-policy:0]
...
name = Policy-0
default = yes
#. Copy the swift.conf file to the ``/etc/swift`` directory on each storage
node and any additional nodes running the proxy service.
#. On all nodes, ensure proper ownership of the configuration directory::
# systemctl restart update-triggers.target
#. On the controller node and any other nodes running the proxy service,
start the Object Storage proxy service including its dependencies and
configure them to start when the system boots::
# systemctl enable swift-proxy.service memcached.service
# systemctl start swift-proxy.service memcached.service
#. On the storage nodes, start the Object Storage services and configure
them to start when the system boots::
# systemctl enable swift-account.service \
                swift-account-auditor.service \
                swift-account-reaper.service \
                swift-account-replicator.service \
                swift-container.service \
                swift-container-auditor.service \
                swift-container-replicator.service \
                swift-container-updater.service \
                swift-object.service \
                swift-object-auditor.service \
                swift-object-replicator.service \
                swift-object-updater.service
# systemctl start swift-account.service \
                swift-account-auditor.service \
                swift-account-reaper.service \
                swift-account-replicator.service \
                swift-container.service \
                swift-container-auditor.service \
                swift-container-replicator.service \
                swift-container-updater.service \
                swift-object.service \
                swift-object-auditor.service \
                swift-object-replicator.service \
                swift-object-updater.service