<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.openstack.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Xarses</id>
		<title>OpenStack - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.openstack.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Xarses"/>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/wiki/Special:Contributions/Xarses"/>
		<updated>2026-07-10T10:54:26Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=CrossProjectLiaisons&amp;diff=123317</id>
		<title>CrossProjectLiaisons</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=CrossProjectLiaisons&amp;diff=123317"/>
				<updated>2016-03-31T18:18:59Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Many of our cross-project teams need focused help for communicating with the other project teams. This page lists the people who have volunteered for that work.&lt;br /&gt;
&lt;br /&gt;
== Oslo ==&lt;br /&gt;
&lt;br /&gt;
There are now more projects consuming code from the Oslo incubator than we have Oslo contributors. That means we are going to need your help to make these migrations happen. We are asking for one person from each project to serve as a liaison between the project and Oslo, and to assist with integrating changes as we move code out of the incubator into libraries.&lt;br /&gt;
&lt;br /&gt;
* The liaison should be active in the project and familiar with the project-specific requirements for having patches accepted, but does not need to be a core reviewer or the PTL.&lt;br /&gt;
* The liaison should be prepared to assist with writing and reviewing patches in their project as libraries are adopted, and with discussions of API changes to the libraries to make them easier to use within the project.&lt;br /&gt;
* Liaisons should pay attention to [Oslo] tagged messages on the openstack-dev mailing list.&lt;br /&gt;
* It is also useful for liaisons to be able to attend the Oslo team meeting ([[Meetings/Oslo]]) to participate in discussions and raise issues for real-time discussion.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Liaison !! IRC Handle&lt;br /&gt;
|-&lt;br /&gt;
| Barbican || Douglas Mendizábal || redrobot&lt;br /&gt;
|-&lt;br /&gt;
| Ceilometer || Julien Danjou || jd__&lt;br /&gt;
|-&lt;br /&gt;
| Cinder || Jay Bryant  || jungleboyj&lt;br /&gt;
|-&lt;br /&gt;
| Congress || Tim Hinrichs  || thinrichs&lt;br /&gt;
|-&lt;br /&gt;
| Cue || Min Pae  || sputnik13&lt;br /&gt;
|-&lt;br /&gt;
| Designate ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Glance || Flavio Percoco || flaper87&lt;br /&gt;
|-&lt;br /&gt;
| Heat || Thomas Herve || therve&lt;br /&gt;
|-&lt;br /&gt;
| Horizon || Kirill Zaitsev || kzaitsev_&lt;br /&gt;
|-&lt;br /&gt;
| Ironic || Lin Tan  || lintan&lt;br /&gt;
|-&lt;br /&gt;
| Keystone || Brant Knudson || bknudson&lt;br /&gt;
|-&lt;br /&gt;
| Manila || Thomas Bechtold || toabctl&lt;br /&gt;
|-&lt;br /&gt;
| Murano || Kirill Zaitsev || kzaitsev_&lt;br /&gt;
|-&lt;br /&gt;
| Neutron || Ihar Hrachyshka || ihrachyshka&lt;br /&gt;
|-&lt;br /&gt;
| Nova || ChangBo Guo &amp;lt;glongwave@gmail.com&amp;gt; || gcb&lt;br /&gt;
|-&lt;br /&gt;
| [[Octavia]] || Michael Johnson || johnsom&lt;br /&gt;
|-&lt;br /&gt;
| Sahara || Andrey Pavlov || AndreyPavlov&lt;br /&gt;
|-&lt;br /&gt;
| Senlin || Yanyan Hu || Yanyanhu&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Swift ||  || &lt;br /&gt;
|-&lt;br /&gt;
| TripleO || Ben Nemec || bnemec&lt;br /&gt;
|-&lt;br /&gt;
| Trove || Amrith Kumar ||  amrith&lt;br /&gt;
|-&lt;br /&gt;
| Zaqar || Flavio Percoco || flaper87&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Release management ==&lt;br /&gt;
&lt;br /&gt;
The Release Management Liaison is responsible for communication with the Release Management team, attending the weekly 1:1 syncs in #openstack-relmgr-office, keeping milestone plans up to date, and signing off milestone and release tags. That task has been [[PTL_Guide#Interactions_with_the_Release_team|traditionally filled by the PTL]], but they may now delegate this task if they wish.&lt;br /&gt;
&lt;br /&gt;
* By default, the liaison will be the PTL.&lt;br /&gt;
* The Release Management Liaison is considered a contributor to the Release Cycle Management Program and therefore is allowed to vote in election its PTL.&lt;br /&gt;
* The liaison may further delegate work to other subject matter experts&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Liaison !! IRC Handle&lt;br /&gt;
|-&lt;br /&gt;
| Barbican || Douglas Mendizábal || redrobot&lt;br /&gt;
|-&lt;br /&gt;
| Ceilometer || gordon chung || gordc&lt;br /&gt;
|-&lt;br /&gt;
| Cinder || Sean McGinnis || smcginnis&lt;br /&gt;
|-&lt;br /&gt;
| Congress || Tim Hinrichs || thinrichs&lt;br /&gt;
|-&lt;br /&gt;
| Designate || Graham Hayes || mugsie&lt;br /&gt;
|-&lt;br /&gt;
| Glance || Flavio Percoco || flaper87&lt;br /&gt;
|-&lt;br /&gt;
| Heat || Sergey Kraynev || skraynev&lt;br /&gt;
|-&lt;br /&gt;
| Horizon || David Lyle  || david-lyle&lt;br /&gt;
|-&lt;br /&gt;
| Ironic || Jim Rollenhagen || jroll&lt;br /&gt;
|-&lt;br /&gt;
| Keystone || Steve Martinelli || stevemar&lt;br /&gt;
|-&lt;br /&gt;
| Manila || Ben Swartzlander || bswartz&lt;br /&gt;
|-&lt;br /&gt;
| Mistral || Lingxian Kong || kong&lt;br /&gt;
|-&lt;br /&gt;
| Murano ||Kirill Zaitsev || kzaitsev_&lt;br /&gt;
|-&lt;br /&gt;
| Neutron || Ihar Hrachyshka || ihrachys&lt;br /&gt;
|-&lt;br /&gt;
| Nova || Sylvain Bauza || bauzas&lt;br /&gt;
|-&lt;br /&gt;
| Oslo || Davanum Srinivas ||  dims&lt;br /&gt;
|-&lt;br /&gt;
| Sahara || Sergey Lukjanov  || SergeyLukjanov&lt;br /&gt;
|-&lt;br /&gt;
| Searchlight || Travis Tripp  || TravT&lt;br /&gt;
|-&lt;br /&gt;
| Senlin || Qiming Teng  || Qiming&lt;br /&gt;
|-&lt;br /&gt;
| Swift || John Dickinson  || notmyname&lt;br /&gt;
|-&lt;br /&gt;
| Trove || Amrith Kumar || amrith&lt;br /&gt;
|-&lt;br /&gt;
| Zaqar ||  || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== QA ==&lt;br /&gt;
&lt;br /&gt;
There are now more projects that are being tested by Tempest, and Grenade or a part deployable by Devstack than we have QA contributors. That means we are going to need your help to keep on top of everything. We are asking for one person from each project to serve as a liaison between the project and QA, and to assist with integrating changes as we move forward.&lt;br /&gt;
&lt;br /&gt;
The liaison should be a core reviewer for the project, but does not need to be the PTL. The liaison should be prepared to assist with writing and reviewing patches that interact with their project, and with discussions of changes to the QA projects to make them easier to use within the project.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Liaison !! IRC Handle&lt;br /&gt;
|-&lt;br /&gt;
| Barbican || Steve Heyman || hockeynut &lt;br /&gt;
|-&lt;br /&gt;
| Ceilometer ||  Chris Dent || cdent&lt;br /&gt;
|-&lt;br /&gt;
| Cinder ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Glance || Nikhil Komawar  || nikhil_k&lt;br /&gt;
|-&lt;br /&gt;
| Heat || Steve Baker || stevebaker&lt;br /&gt;
|-&lt;br /&gt;
| Horizon || Timur Sufiev || tsufiev&lt;br /&gt;
|-&lt;br /&gt;
| Ironic || John Villalovos || jlvillal&lt;br /&gt;
|-&lt;br /&gt;
| Keystone || David Stanek || dstanek&lt;br /&gt;
|-&lt;br /&gt;
| Manila || Valeriy Ponomaryov || vponomaryov&lt;br /&gt;
|-&lt;br /&gt;
| Neutron || Salvatore Orlando || salv-orlando&lt;br /&gt;
|-&lt;br /&gt;
| Nova || Matt Riedemann || mriedem&lt;br /&gt;
|-&lt;br /&gt;
| Oslo ||  Davanum Srinivas || dims &lt;br /&gt;
|-&lt;br /&gt;
| Sahara || Luigi Toscano || tosky&lt;br /&gt;
|-&lt;br /&gt;
| Senlin || Haiwei Xu || haiwei-xu&lt;br /&gt;
|-&lt;br /&gt;
| Swift ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Trove || Craig Vyvial and Nirav Shah || cp16net and nshah&lt;br /&gt;
|-&lt;br /&gt;
| Zaqar ||  || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
The OpenStack Documentation is centralized on docs.openstack.org but often there's a need for specialty information when reviewing patches or triaging doc bugs. A doc liaison should be available to triage doc bugs when the docs team members don't know enough to triage accurately, and be added to doc reviews that affect your project. You'd be notified through email when you're added either to a doc bug or a doc review. We also would appreciate attendance at the [https://wiki.openstack.org/wiki/Meetings/DocTeamMeeting weekly doc team meeting], We meet weekly in #openstack-meeting every Wednesday at alternating times for different timezones:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Liaison !! IRC Handle&lt;br /&gt;
|-&lt;br /&gt;
| Barbican || Constanze Kratel || constanze &lt;br /&gt;
|-&lt;br /&gt;
| Ceilometer || Ildiko Vancsa || ildikov&lt;br /&gt;
|-&lt;br /&gt;
| Cinder || Sean Mcginnis || smcginnis &lt;br /&gt;
|-&lt;br /&gt;
| Congress ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
| Designate ||   ||  &lt;br /&gt;
|-&lt;br /&gt;
| Glance || Brian Rosmaita || rosmaita&lt;br /&gt;
|-&lt;br /&gt;
| Heat || Randall Burt || randallburt&lt;br /&gt;
|-&lt;br /&gt;
| Horizon || Rob Cresswell || robcresswell&lt;br /&gt;
|-&lt;br /&gt;
| Ironic || Mitsuhiro SHIGEMATSU || pshige&lt;br /&gt;
|-&lt;br /&gt;
| Keystone || Lance Bragstad || lbragstad&lt;br /&gt;
|-&lt;br /&gt;
| Magnum ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Manila || Dustin Schoenbrun || dustins&lt;br /&gt;
|-&lt;br /&gt;
| Mistral ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Murano || Ekaterina Chernova || katyafervent &lt;br /&gt;
|-&lt;br /&gt;
| Neutron || Edgar Magana || emagana &lt;br /&gt;
|-&lt;br /&gt;
| Nova || Joe Gordon or Michael Still || Jog0 or mikal&lt;br /&gt;
|-&lt;br /&gt;
| Oslo || Doug Hellmann  || dhellmann&lt;br /&gt;
|-&lt;br /&gt;
| Rally ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Sahara ||  Chad Roberts || crobertsrh&lt;br /&gt;
|-&lt;br /&gt;
| Senlin || Cindia Blue  || lixinhui&lt;br /&gt;
|-&lt;br /&gt;
| Swift ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Tripleo ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Trove || Laurel Michaels || laurelm&lt;br /&gt;
|-&lt;br /&gt;
| Zaqar ||  || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Stable Branch ==&lt;br /&gt;
&lt;br /&gt;
The Stable Branch Liaison is responsible for making sure backports are proposed for critical issues in their project, and make sure proposed backports&lt;br /&gt;
are reviewed. They are also the contact point for stable branch release managers around point release times.&lt;br /&gt;
&lt;br /&gt;
* By default, the liaison will be the PTL.&lt;br /&gt;
* The Stable Branch Liaison is considered a contributor to the Release Cycle Management Program and therefore is allowed to vote in its PTL election.&lt;br /&gt;
* The liaison may further delegate work to other subject matter experts&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Liaison !! IRC Handle&lt;br /&gt;
|-&lt;br /&gt;
| Ceilometer || Eoghan Glynn || eglynn&lt;br /&gt;
|-&lt;br /&gt;
| Cinder || Jay Bryant  || jungleboyj&lt;br /&gt;
|-&lt;br /&gt;
| Glance || Erno Kuvaja || jokke_&lt;br /&gt;
|-&lt;br /&gt;
| Heat || Zane Bitter || zaneb&lt;br /&gt;
|-&lt;br /&gt;
| Horizon || Matthias Runge || mrunge  &lt;br /&gt;
|-&lt;br /&gt;
| Ironic || Dmitry Tantsur || dtantsur &lt;br /&gt;
|-&lt;br /&gt;
| Keystone || Dolph Mathews || dolphm&lt;br /&gt;
|-&lt;br /&gt;
| Murano || Kirill Zaitsev || kzaitsev_&lt;br /&gt;
|-&lt;br /&gt;
| Neutron || Ihar Hrachyshka || ihrachys&lt;br /&gt;
|-&lt;br /&gt;
| Nova ||  Matt Riedemann || mriedem &lt;br /&gt;
|-&lt;br /&gt;
| Sahara ||  Sergey Lukjanov || SergeyLukjanov&lt;br /&gt;
|-&lt;br /&gt;
| Senlin||  Qiming Teng || Qiming&lt;br /&gt;
|-&lt;br /&gt;
| Swift ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Trove || Amrith Kumar || amrith&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Vulnerability management ==&lt;br /&gt;
&lt;br /&gt;
The [[Vulnerability Management]] Team needs domain specialists to help assessing the impact of reported issues, coordinate the development of patches, review proposed patches and propose backports. The liaison should be familiar with the [[Vulnerability Management]] process and embargo rules, and have a good grasp of security issues in software design.&lt;br /&gt;
&lt;br /&gt;
* The liaison should be a core reviewer for the project, but does not need to be the PTL.&lt;br /&gt;
* By default, the liaison will be the PTL.&lt;br /&gt;
* The liaison is the first line of contact for the Vulnerability Management team members&lt;br /&gt;
* The liaison is considered a contributor to the Release Cycle Management Program and therefore is allowed to vote in election its PTL&lt;br /&gt;
* The liaison may further delegate work to other subject matter experts&lt;br /&gt;
* The liaison maintains the members of the $PROJECT-coresec team in Launchpad (which can be given access to embargoed vulnerabilities)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Liaison !! IRC Handle&lt;br /&gt;
|-&lt;br /&gt;
| Barbican || Douglas Mendizábal or Charles Neill || redrobot / ccneill&lt;br /&gt;
|-&lt;br /&gt;
| Ceilometer || Lianhao Lu or Gordon Chung || llu/gordc &lt;br /&gt;
|-&lt;br /&gt;
| Cinder ||   || &lt;br /&gt;
|-&lt;br /&gt;
| Glance || Stuart McLaren or Nikhil Komawar  || mclaren or nikhil_k &lt;br /&gt;
|-&lt;br /&gt;
| Heat || Steve Hardy || shardy&lt;br /&gt;
|-&lt;br /&gt;
| Horizon || Lin Hua Cheng || lhcheng &lt;br /&gt;
|-&lt;br /&gt;
| Ironic || Jim Rollenhagen || jroll&lt;br /&gt;
|-&lt;br /&gt;
| Keystone || Dolph Mathews || dolphm&lt;br /&gt;
|-&lt;br /&gt;
| Neutron || Salvatore Orlando || salv-orlando&lt;br /&gt;
|-&lt;br /&gt;
| Nova || Michael Still || mikal&lt;br /&gt;
|-&lt;br /&gt;
| Sahara || Michael McCune or Sergey Lukjanov || elmiko or SergeyLukjanov&lt;br /&gt;
|-&lt;br /&gt;
| Searchlight || Travis Tripp or Steve McLellan || TravT or sjmc7&lt;br /&gt;
|-&lt;br /&gt;
| Senlin || Qiming Teng  || Qiming&lt;br /&gt;
|-&lt;br /&gt;
| Swift ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Trove || Craig Vyvial or Nikhil Manchanda || cp16net or SlickNik &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== API Working Group ==&lt;br /&gt;
&lt;br /&gt;
The [[API_Working_Group|API Working Group]] seeks API subject matter experts for each project  to communicate plans for API updates, review API guidelines with their project's view in mind, and review the API Working Group guidelines as they are drafted. The liaison should be familiar with the project's REST API design and future planning for changes to it.&lt;br /&gt;
&lt;br /&gt;
The members of the [http://specs.openstack.org/openstack/api-wg/liaisons.html API Working Group Cross-Project Liaisons] are maintained in our repo.  If you want to read the entire list of CPLs or add/remove yourself from the list, you'll need to update the [http://git.openstack.org/cgit/openstack/api-wg/tree/doc/source/liaisons.json liaisons.json] file. If you don't want to make the update yourself, please ask in #openstack-sdks on IRC and someone can make the change for you.&lt;br /&gt;
&lt;br /&gt;
== Logging Working Group ==&lt;br /&gt;
&lt;br /&gt;
The [[LogWorkingGroup|Log Working Group]] seeks experts for each project  to assist with making the logging in projects match the new [http://specs.openstack.org/openstack/openstack-specs/specs/log-guidelines.html Logging Guidelines]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Liaison !! IRC Handle&lt;br /&gt;
|-&lt;br /&gt;
| Glance || Erno Kuvaja || jokke_&lt;br /&gt;
|-&lt;br /&gt;
| Oslo || Doug Hellmann || dhellmann&lt;br /&gt;
|-&lt;br /&gt;
| Nova || John Garbutt || johnthetubaguy&lt;br /&gt;
|-&lt;br /&gt;
| Murano || Nikolay Starodubtsev || Nikolay_St&lt;br /&gt;
|-&lt;br /&gt;
| Sahara || Andrey Pavlov || AndreyPavlov&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Infra ==&lt;br /&gt;
&lt;br /&gt;
These are the project specific groups of people that Infra will look to ACK changes to that project's test configuration. Changes to project-config and devstack-gate should be +1'd by these groups when they are related to their project. Note that in an emergency this may not always be possible and Infra will ask for forgiveness but generally we should look for these +1s.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Liaison !! IRC Handle&lt;br /&gt;
|-&lt;br /&gt;
| Glance || Flavio Percoco, Nikhil Komawar|| flaper87, nikhil_k&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Neutron || Kyle Mestery, Armando Migliaccio, Doug Wiegley|| mestery, armax, dougwig&lt;br /&gt;
|-&lt;br /&gt;
| Documentation || Andreas Jaeger|| AJaeger&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Trove || Nikhil Manchanda || SlickNik&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Sahara || Sergey Lukjanov || SergeyLukjanov&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Fuel || Aleksandra Fedorova, Igor Belikov || bookwar, igorbelikov&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Puppet OpenStack || Emilien Macchi || EmilienM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Product Working Group ==&lt;br /&gt;
The product working group consists of product managers, technologists, and operators from a diverse set of organizations.  The group is working to aggregate user stories from the market-focused teams (Enterprise, Telco, etc.) and cross-project functional teams (e.g. logging, upgrades, etc.), partner with the development community on resourcing, and help gather data to generate a multi-release roadmap.  Most of the user stories being tracked by this team consists of items that can span multiple releases and usually have cross-project dependencies.  &lt;br /&gt;
&lt;br /&gt;
More information about the team can be found on the [[ProductTeam|Product WG wiki]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Liaison !! IRC Handle&lt;br /&gt;
|-&lt;br /&gt;
| Ceilometer ||Krish Ragurham || &lt;br /&gt;
|-&lt;br /&gt;
| Cinder || Shamail Tahir  || shamail&lt;br /&gt;
|-&lt;br /&gt;
| Glance || Nate Ziemann || nate_zman&lt;br /&gt;
|-&lt;br /&gt;
| Horizon || Carol Barrett || barrett1&lt;br /&gt;
|-&lt;br /&gt;
| Keystone || || &lt;br /&gt;
|-&lt;br /&gt;
| Kolla || Carol Barrett || barrett1&lt;br /&gt;
|-&lt;br /&gt;
| Magnum || Steve Gordon  || sgordon&lt;br /&gt;
|-&lt;br /&gt;
| Manilla ||Pete Chadwick || &lt;br /&gt;
|-&lt;br /&gt;
| Neutron || Mike Cohen, Duane DeCapite || DuaneDeC7&lt;br /&gt;
|-&lt;br /&gt;
| Nova || Hugh Blemings || hughhalf &lt;br /&gt;
|-&lt;br /&gt;
| OSClient || Megan Rossetti || MeganR&lt;br /&gt;
|-&lt;br /&gt;
| Stable Release|| Rochelle Grober || rockig&lt;br /&gt;
|-&lt;br /&gt;
| Sahara || Ethan Gafford || egafford&lt;br /&gt;
|-&lt;br /&gt;
| Senlin || Qiming Teng || Qiming&lt;br /&gt;
|-&lt;br /&gt;
| Swift || Phil Williams  || philipw&lt;br /&gt;
|-&lt;br /&gt;
| Tempest || Arkady Kanevsky || arkady_kanevsky&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== I18n ==&lt;br /&gt;
I18n team is responsible for making OpenStack ubiquitously accessible to people of all language backgrounds. The team have translators from all over the world to translate OpenStack into different languages. &lt;br /&gt;
&lt;br /&gt;
If you want to communicate with translators in I18n team, send email to openstack-i18n@lists.openstack.org.&lt;br /&gt;
&lt;br /&gt;
* The liaison should be a core reviewer for the project and understand i18n status of the project.&lt;br /&gt;
* The liaison should understand project release schedule very well.&lt;br /&gt;
* The liaison should notify I18n team happens of important moments in the project release in time. For example, happen of soft string freeze, happen of hard string freeze, and happen of RC1 cutting.&lt;br /&gt;
* The liaison should take care of translation patches to the project, and make sure the patches are successfully merged to the final release version. When the translation patch is failed, the liaison should notify I18n team.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Liaison !! IRC Handle&lt;br /&gt;
|-&lt;br /&gt;
| Glance ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Keystone || || &lt;br /&gt;
|-&lt;br /&gt;
| Neutron || Akihiro Motoki || amotoki&lt;br /&gt;
|-&lt;br /&gt;
| Nova || Augustina Ragwitz || auggy &lt;br /&gt;
|-&lt;br /&gt;
| Cinder ||   || &lt;br /&gt;
|-&lt;br /&gt;
| Swift ||   ||&lt;br /&gt;
|-&lt;br /&gt;
| Horizon || Doug Fish / Akihiro Motoki || doug-fish / amotoki&lt;br /&gt;
|-&lt;br /&gt;
| Telemetry ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Designate || Graham Hayes  || mugsie&lt;br /&gt;
|-&lt;br /&gt;
| Heat ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Magnum ||  Shu Muto || shu-mutou&lt;br /&gt;
|-&lt;br /&gt;
| Murano || Kirill Zaitsev || kzaitsev_&lt;br /&gt;
|-&lt;br /&gt;
| Sahara || Chad Roberts || crobertsrh &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Inter-project Liaisons ==&lt;br /&gt;
&lt;br /&gt;
In some cases, it is useful to have liaisons between projects. [http://lists.openstack.org/pipermail/openstack-dev/2015-April/062327.html For example, it is useful for the Nova and Neutron projects to have liaisons, because the projects have complex interactions and dependencies.] Ideally, a cross-project effort should have two members, one from each project, to facilitate communication and knowledge transfer.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Projects !! Name !! IRC Handle !! Role&lt;br /&gt;
|-&lt;br /&gt;
| Nova / Neutron || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || Sean M. Collins  || sc68cal || Neutron liaison for Nova&lt;br /&gt;
|-&lt;br /&gt;
| Nova / Glance || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || Flavio Percoco, Mike Fedosin  || flaper87, mfedosin || Glance liaison for Nova&lt;br /&gt;
|-&lt;br /&gt;
| || Jay Pipes  || jaypipes || Nova liaison for Glance&lt;br /&gt;
|-&lt;br /&gt;
| Nova / Cinder || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || Scott DAngelo || scottda || Cinder liaison for Nova&lt;br /&gt;
|-&lt;br /&gt;
| || Matt Riedemann || mriedem || Nova liason for Cinder&lt;br /&gt;
|-&lt;br /&gt;
| Nova / Ironic || John Villalovos || jlvillal || Ironic liaison for Nova&lt;br /&gt;
|-&lt;br /&gt;
| || Michael Davies || mrda || Ironic liaison for Nova&lt;br /&gt;
|-&lt;br /&gt;
| Neutron / Ironic || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || Sukhdev Kapur  || sukhdev || Neutron liaison for Ironic&lt;br /&gt;
|-&lt;br /&gt;
| || Mitsuhiro SHIGEMATSU and Jim Rollenhagen   || pshige and jroll  || Ironic liaison for Neutron&lt;br /&gt;
|-&lt;br /&gt;
| Murano / Glance || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || Alexander Tivelkov  || ativelkov || Glance liaison for Murano, Murano liaison for Glance&lt;br /&gt;
|-&lt;br /&gt;
| Horizon / i18n || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || Doug Fish  || doug-fish || Horizon liaison for i18n&lt;br /&gt;
|-&lt;br /&gt;
| Sahara / Heat || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || Vitaly Gridnev || vgridnev || Sahara liaison for Heat&lt;br /&gt;
|-&lt;br /&gt;
| || TBD || || Heat liaison for Sahara&lt;br /&gt;
|-&lt;br /&gt;
| Sahara / Trove || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || Ethan Gafford || egafford || Sahara liaison for Trove&lt;br /&gt;
|-&lt;br /&gt;
| || Amrith Kumar || amrith || Trove liaison for Sahara&lt;br /&gt;
|-&lt;br /&gt;
| Fuel / Puppet || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || Alex Schultz || mwhahaha || Fuel liaison for Puppet&lt;br /&gt;
|-&lt;br /&gt;
| Fuel / Ironic || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || Evgeny L || evgenyl || Fuel liaison for Ironic&lt;br /&gt;
|-&lt;br /&gt;
| Bareon / Ironic || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || Evgeny L || evgenyl || Bareon liaison for Ironic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Etherpads ===&lt;br /&gt;
&lt;br /&gt;
The following is a list of etherpads that are used for inter-project liaisons, and are continuously updated.&lt;br /&gt;
&lt;br /&gt;
Nova - Neutron: https://etherpad.openstack.org/p/nova-neutron&lt;br /&gt;
&lt;br /&gt;
== Cross-Project Spec Liaisons ==&lt;br /&gt;
&lt;br /&gt;
The OpenStack project relies on the cross-project spec liaisons from each participating project to help with coordination and cross-project spec related tasks. See full set of [http://docs.openstack.org/project-team-guide/cross-project.html#cross-project-specification-liaisons responsibilities] The liaison defaults to the PTL, but the PTL can also delegate the responsibilities to someone else on the team by updating this tableː&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Liaison !! IRC Handle&lt;br /&gt;
|-&lt;br /&gt;
| Astara|| Adam Gandelman || adam_g&lt;br /&gt;
|-&lt;br /&gt;
| Barbican || Douglas Mendizabal || redrobot&lt;br /&gt;
|-&lt;br /&gt;
| Cinder || Kendall Nelson || diablo_rojo&lt;br /&gt;
|-&lt;br /&gt;
| Congress || Tim Hinrichs || thinrichs&lt;br /&gt;
|-&lt;br /&gt;
| Designate || Graham hayes || mugsie&lt;br /&gt;
|-&lt;br /&gt;
| Fuel || Andrew Woodward || xarses&lt;br /&gt;
|-&lt;br /&gt;
| Glance || Nikhil Komawar || nikhil&lt;br /&gt;
|-&lt;br /&gt;
| Heat || Rico Lin || ricolin&lt;br /&gt;
|-&lt;br /&gt;
| Horizon || David Lyle || david-lyle&lt;br /&gt;
|-&lt;br /&gt;
| Infrastructure || Matthew Wagoner || olaph&lt;br /&gt;
|-&lt;br /&gt;
| Ironic || Jim Rollenhagen || jroll&lt;br /&gt;
|-&lt;br /&gt;
| Keystone || Samuel de Medeiros Queiroz || samueldmq&lt;br /&gt;
|-&lt;br /&gt;
| Magnum || Adrian Otto || adria̠n_otto&lt;br /&gt;
|-&lt;br /&gt;
| Manila || Ben Swartzlander || bswartz&lt;br /&gt;
|-&lt;br /&gt;
| Mistral || Renat Akhmerov || rakhmerov&lt;br /&gt;
|-&lt;br /&gt;
| Murano || Serg Melikyan || smelikyan&lt;br /&gt;
|-&lt;br /&gt;
| Neutron || Armando Migliaccio || armax&lt;br /&gt;
|-&lt;br /&gt;
| Nova || Chris Dent || cdent&lt;br /&gt;
|-&lt;br /&gt;
| Oslo || Davanum Srinivas || dims&lt;br /&gt;
|-&lt;br /&gt;
| Sahara || Michael McCune or Sergey Lukjanov || elmiko or SergeyLukjanov&lt;br /&gt;
|-&lt;br /&gt;
| Searchlight || Travis Tripp || TravT&lt;br /&gt;
|-&lt;br /&gt;
| Senlin || Qiming Teng || Qiming&lt;br /&gt;
|-&lt;br /&gt;
| Swift || John Dickinson || notmyname&lt;br /&gt;
|-&lt;br /&gt;
| Telemetry || Gordon Chung || gordc&lt;br /&gt;
|-&lt;br /&gt;
| Trove || Amrith Kumar || amrith&lt;br /&gt;
|-&lt;br /&gt;
| Watcher || Susanne Balle || sballe &lt;br /&gt;
|-&lt;br /&gt;
| Zaqar || Fei Long Wang || flwang&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Stackforge_Namespace_Retirement&amp;diff=91125</id>
		<title>Stackforge Namespace Retirement</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Stackforge_Namespace_Retirement&amp;diff=91125"/>
				<updated>2015-09-25T22:17:38Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: /* Active Projects to Move */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Background ===&lt;br /&gt;
&lt;br /&gt;
The stackforge/ git namespace is being retired, and active projects are being moved to the openstack/ namespace.  See this mailing list post for [http://lists.openstack.org/pipermail/openstack-dev/2015-August/071816.html full background].  These changes are scheduled to occur on October 17, 2015.&lt;br /&gt;
&lt;br /&gt;
There are two lists below, one for active projects that should be moved, and a second for inactive projects that should become read-only.  Please update them to add your project to the correct list.&lt;br /&gt;
&lt;br /&gt;
=== Active Projects to Move ===&lt;br /&gt;
Active stackforge projects that wish to move into the openstack/ namespace should be added to this list.  Projects in this list will be automatically moved by the Infrastructure team to openstack/ on October 17.  Please note that no other renames can happen during this move -- projects will strictly be moved from stackforge/ to openstack/ with their existing names.  &lt;br /&gt;
&lt;br /&gt;
* aeromancer&lt;br /&gt;
* anvil&lt;br /&gt;
* blazar&lt;br /&gt;
* blazar-nova&lt;br /&gt;
* ceilometer-powervm&lt;br /&gt;
* ceilometer-zvm&lt;br /&gt;
* cloud-init&lt;br /&gt;
* cloudbase-init&lt;br /&gt;
* clouddocs-maven-plugin&lt;br /&gt;
* cloudkitty&lt;br /&gt;
* cloudkitty-dashboard&lt;br /&gt;
* cloudpulse&lt;br /&gt;
* cognitive&lt;br /&gt;
* compass-adapters&lt;br /&gt;
* compass-core&lt;br /&gt;
* compass-specs&lt;br /&gt;
* compass-web&lt;br /&gt;
* compute-hyperv&lt;br /&gt;
* doc8&lt;br /&gt;
* driverlog&lt;br /&gt;
* ec2-api&lt;br /&gt;
* faafo&lt;br /&gt;
* fuel-agent&lt;br /&gt;
* fuel-astute&lt;br /&gt;
* fuel-dev-tools&lt;br /&gt;
* fuel-devops&lt;br /&gt;
* fuel-docs&lt;br /&gt;
* fuel-library&lt;br /&gt;
* fuel-main&lt;br /&gt;
* fuel-mirror&lt;br /&gt;
* fuel-nailgun-agent&lt;br /&gt;
* fuel-octane&lt;br /&gt;
* fuel-ostf&lt;br /&gt;
* fuel-ostf-plugin&lt;br /&gt;
* fuel-plugin-availability-zones&lt;br /&gt;
* fuel-plugin-calamari&lt;br /&gt;
* fuel-plugin-calico&lt;br /&gt;
* fuel-plugin-ceilometer-redis&lt;br /&gt;
* fuel-plugin-cinder-netapp&lt;br /&gt;
* fuel-plugin-cisco-aci&lt;br /&gt;
* fuel-plugin-contrail&lt;br /&gt;
* fuel-plugin-dbaas-trove&lt;br /&gt;
* fuel-plugin-detach-database&lt;br /&gt;
* fuel-plugin-detach-keystone&lt;br /&gt;
* fuel-plugin-detach-rabbitmq&lt;br /&gt;
* fuel-plugin-elasticsearch-kibana&lt;br /&gt;
* fuel-plugin-external-emc&lt;br /&gt;
* fuel-plugin-external-glusterfs&lt;br /&gt;
* fuel-plugin-external-zabbix&lt;br /&gt;
* fuel-plugin-glance-nfs&lt;br /&gt;
* fuel-plugin-ha-fencing&lt;br /&gt;
* fuel-plugin-influxdb-grafana&lt;br /&gt;
* fuel-plugin-ironic&lt;br /&gt;
* fuel-plugin-ldap&lt;br /&gt;
* fuel-plugin-lma-collector&lt;br /&gt;
* fuel-plugin-lma-infrastructure-alerting&lt;br /&gt;
* fuel-plugin-mellanox&lt;br /&gt;
* fuel-plugin-midonet&lt;br /&gt;
* fuel-plugin-neutron-fwaas&lt;br /&gt;
* fuel-plugin-neutron-lbaas&lt;br /&gt;
* fuel-plugin-neutron-vpnaas&lt;br /&gt;
* fuel-plugin-nova-nfs&lt;br /&gt;
* fuel-plugin-nsxv&lt;br /&gt;
* fuel-plugin-opendaylight&lt;br /&gt;
* fuel-plugin-saltstack&lt;br /&gt;
* fuel-plugin-solidfire-cinder&lt;br /&gt;
* fuel-plugin-swiftstack&lt;br /&gt;
* fuel-plugin-tintri-cinder&lt;br /&gt;
* fuel-plugin-tls&lt;br /&gt;
* fuel-plugin-vmware-dvs&lt;br /&gt;
* fuel-plugin-vxlan&lt;br /&gt;
* fuel-plugin-zabbix-monitoring-emc&lt;br /&gt;
* fuel-plugin-zabbix-monitoring-extreme-networks&lt;br /&gt;
* fuel-plugin-zabbix-snmptrapd&lt;br /&gt;
* fuel-plugins&lt;br /&gt;
* fuel-provision&lt;br /&gt;
* fuel-qa&lt;br /&gt;
* fuel-specs&lt;br /&gt;
* fuel-stats&lt;br /&gt;
* fuel-tasklib&lt;br /&gt;
* fuel-upgrade&lt;br /&gt;
* fuel-web&lt;br /&gt;
* gce-api&lt;br /&gt;
* gerrit-dash-creator&lt;br /&gt;
* git-upstream&lt;br /&gt;
* golang-client&lt;br /&gt;
* intel-nfv-ci-tests&lt;br /&gt;
* merlin&lt;br /&gt;
* monasca-agent&lt;br /&gt;
* monasca-api&lt;br /&gt;
* monasca-ceilometer&lt;br /&gt;
* monasca-common&lt;br /&gt;
* monasca-log-api&lt;br /&gt;
* monasca-notification&lt;br /&gt;
* monasca-persister&lt;br /&gt;
* monasca-statsd&lt;br /&gt;
* monasca-thresh&lt;br /&gt;
* monasca-ui&lt;br /&gt;
* monasca-vagrant&lt;br /&gt;
* namos&lt;br /&gt;
* networking-hyperv&lt;br /&gt;
* networking-ovs-dpdk&lt;br /&gt;
* networking-zvm&lt;br /&gt;
* nova-docker&lt;br /&gt;
* nova-powervm&lt;br /&gt;
* nova-solver-scheduler&lt;br /&gt;
* nova-zvm-virt-driver&lt;br /&gt;
* ops-tags-team&lt;br /&gt;
* ospurge&lt;br /&gt;
* packstack&lt;br /&gt;
* puppet-autossh&lt;br /&gt;
* puppet-ceph&lt;br /&gt;
* puppet-n1k-vsm&lt;br /&gt;
* puppet-setproxy&lt;br /&gt;
* python-blazarclient&lt;br /&gt;
* python-cloudkittyclient&lt;br /&gt;
* python-cloudpulseclient&lt;br /&gt;
* python-cognitiveclient&lt;br /&gt;
* python-fuelclient&lt;br /&gt;
* python-monascaclient&lt;br /&gt;
* python-openstacksdk&lt;br /&gt;
* python-senlinclient&lt;br /&gt;
* python-tackerclient&lt;br /&gt;
* senlin&lt;br /&gt;
* senlin-dashboard&lt;br /&gt;
* shaker&lt;br /&gt;
* sqlalchemy-migrate&lt;br /&gt;
* stackalytics&lt;br /&gt;
* swift3&lt;br /&gt;
* tacker&lt;br /&gt;
* tacker-horizon&lt;br /&gt;
* tacker-specs&lt;br /&gt;
* telcowg-usecases&lt;br /&gt;
* terracotta&lt;br /&gt;
* third-party-ci-tools&lt;br /&gt;
* tricircle&lt;br /&gt;
* vmtp&lt;br /&gt;
* wsme&lt;br /&gt;
* xenapi-os-testing&lt;br /&gt;
* yaql&lt;br /&gt;
&lt;br /&gt;
=== Inactive Projects to Retire ===&lt;br /&gt;
Inactive projects that should be retired should be added to this list.  These projects will have a commit merged removing their content and replacing it with a message indicating the project is no longer maintained and will become read-only in Gerrit.&lt;br /&gt;
&lt;br /&gt;
* fuel-plugin-availability-zones&lt;br /&gt;
* mercador-pub&lt;br /&gt;
* mercador-sub&lt;br /&gt;
* MRaaS&lt;br /&gt;
* openstackdroid&lt;br /&gt;
* python-mercadorclient&lt;br /&gt;
* rubick&lt;br /&gt;
* sahara-guestagent&lt;br /&gt;
* libra&lt;br /&gt;
* python-libraclient&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Stackforge_Namespace_Retirement&amp;diff=91121</id>
		<title>Stackforge Namespace Retirement</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Stackforge_Namespace_Retirement&amp;diff=91121"/>
				<updated>2015-09-25T22:06:10Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: /* Active Projects to Move */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Background ===&lt;br /&gt;
&lt;br /&gt;
The stackforge/ git namespace is being retired, and active projects are being moved to the openstack/ namespace.  See this mailing list post for [http://lists.openstack.org/pipermail/openstack-dev/2015-August/071816.html full background].  These changes are scheduled to occur on October 17, 2015.&lt;br /&gt;
&lt;br /&gt;
There are two lists below, one for active projects that should be moved, and a second for inactive projects that should become read-only.  Please update them to add your project to the correct list.&lt;br /&gt;
&lt;br /&gt;
=== Active Projects to Move ===&lt;br /&gt;
Active stackforge projects that wish to move into the openstack/ namespace should be added to this list.  Projects in this list will be automatically moved by the Infrastructure team to openstack/ on October 17.  Please note that no other renames can happen during this move -- projects will strictly be moved from stackforge/ to openstack/ with their existing names.  &lt;br /&gt;
&lt;br /&gt;
* aeromancer&lt;br /&gt;
* anvil&lt;br /&gt;
* blazar&lt;br /&gt;
* blazar-nova&lt;br /&gt;
* ceilometer-powervm&lt;br /&gt;
* ceilometer-zvm&lt;br /&gt;
* cloud-init&lt;br /&gt;
* cloudbase-init&lt;br /&gt;
* clouddocs-maven-plugin&lt;br /&gt;
* cloudkitty&lt;br /&gt;
* cloudkitty-dashboard&lt;br /&gt;
* cloudpulse&lt;br /&gt;
* compass-adapters&lt;br /&gt;
* compass-core&lt;br /&gt;
* compass-specs&lt;br /&gt;
* compass-web&lt;br /&gt;
* compute-hyperv&lt;br /&gt;
* doc8&lt;br /&gt;
* driverlog&lt;br /&gt;
* ec2-api&lt;br /&gt;
* faafo&lt;br /&gt;
* fuel-octane&lt;br /&gt;
* fuel-plugin-calico&lt;br /&gt;
* fuel-plugin-ceilometer-redis&lt;br /&gt;
* fuel-plugin-elasticsearch-kibana&lt;br /&gt;
* fuel-plugin-external-emc&lt;br /&gt;
* fuel-plugin-external-zabbix&lt;br /&gt;
* fuel-plugin-ha-fencing&lt;br /&gt;
* fuel-plugin-influxdb-grafana&lt;br /&gt;
* fuel-plugin-lma-collector&lt;br /&gt;
* fuel-plugin-lma-infrastructure-alerting&lt;br /&gt;
* fuel-plugin-mellanox&lt;br /&gt;
* fuel-plugin-midonet&lt;br /&gt;
* fuel-plugin-opendaylight&lt;br /&gt;
* fuel-plugin-swiftstack&lt;br /&gt;
* fuel-plugin-tintri-cinder&lt;br /&gt;
* fuel-plugin-vmware-dvs&lt;br /&gt;
* fuel-plugin-zabbix-monitoring-emc&lt;br /&gt;
* fuel-plugin-zabbix-monitoring-extreme-networks&lt;br /&gt;
* fuel-plugin-zabbix-snmptrapd&lt;br /&gt;
* gce-api&lt;br /&gt;
* gerrit-dash-creator&lt;br /&gt;
* git-upstream&lt;br /&gt;
* golang-client&lt;br /&gt;
* intel-nfv-ci-tests&lt;br /&gt;
* merlin&lt;br /&gt;
* monasca-agent&lt;br /&gt;
* monasca-api&lt;br /&gt;
* monasca-ceilometer&lt;br /&gt;
* monasca-common&lt;br /&gt;
* monasca-notification&lt;br /&gt;
* monasca-persister&lt;br /&gt;
* monasca-statsd&lt;br /&gt;
* monasca-thresh&lt;br /&gt;
* monasca-ui&lt;br /&gt;
* monasca-vagrant&lt;br /&gt;
* namos&lt;br /&gt;
* networking-hyperv&lt;br /&gt;
* networking-ovs-dpdk&lt;br /&gt;
* networking-zvm&lt;br /&gt;
* nova-docker&lt;br /&gt;
* nova-powervm&lt;br /&gt;
* nova-solver-scheduler&lt;br /&gt;
* nova-zvm-virt-driver&lt;br /&gt;
* ops-tags-team&lt;br /&gt;
* ospurge&lt;br /&gt;
* packstack&lt;br /&gt;
* puppet-autossh&lt;br /&gt;
* puppet-ceph&lt;br /&gt;
* puppet-n1k-vsm&lt;br /&gt;
* puppet-setproxy&lt;br /&gt;
* python-blazarclient&lt;br /&gt;
* python-cloudkittyclient&lt;br /&gt;
* python-cloudpulseclient&lt;br /&gt;
* python-fuelclient&lt;br /&gt;
* python-monascaclient&lt;br /&gt;
* python-openstacksdk&lt;br /&gt;
* python-senlinclient&lt;br /&gt;
* python-tackerclient&lt;br /&gt;
* senlin&lt;br /&gt;
* senlin-dashboard&lt;br /&gt;
* shaker&lt;br /&gt;
* sqlalchemy-migrate&lt;br /&gt;
* stackalytics&lt;br /&gt;
* swift3&lt;br /&gt;
* tacker&lt;br /&gt;
* tacker-horizon&lt;br /&gt;
* tacker-specs&lt;br /&gt;
* telcowg-usecases&lt;br /&gt;
* terracotta&lt;br /&gt;
* third-party-ci-tools&lt;br /&gt;
* tricircle&lt;br /&gt;
* vmtp&lt;br /&gt;
* wsme&lt;br /&gt;
* xenapi-os-testing&lt;br /&gt;
* yaql&lt;br /&gt;
&lt;br /&gt;
=== Inactive Projects to Retire ===&lt;br /&gt;
Inactive projects that should be retired should be added to this list.  These projects will have a commit merged removing their content and replacing it with a message indicating the project is no longer maintained and will become read-only in Gerrit.&lt;br /&gt;
&lt;br /&gt;
* cognitive&lt;br /&gt;
* fuel-plugin-availability-zones&lt;br /&gt;
* mercador-pub&lt;br /&gt;
* mercador-sub&lt;br /&gt;
* MRaaS&lt;br /&gt;
* openstackdroid&lt;br /&gt;
* python-cognitiveclient&lt;br /&gt;
* python-mercadorclient&lt;br /&gt;
* rubick&lt;br /&gt;
* sahara-guestagent&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Fuel/How_to_contribute&amp;diff=86087</id>
		<title>Fuel/How to contribute</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Fuel/How_to_contribute&amp;diff=86087"/>
				<updated>2015-07-15T20:09:48Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Join the Fuel team=&lt;br /&gt;
=== First steps ===&lt;br /&gt;
Read the [http://docs.openstack.org/infra/manual/developers.html Developer's Guide] and learn how to setup the accounts and git.&lt;br /&gt;
&lt;br /&gt;
Clone the repositories:&lt;br /&gt;
* git clone git://github.com/stackforge/fuel-main.git&lt;br /&gt;
* git clone git://github.com/stackforge/fuel-web.git&lt;br /&gt;
* git clone git://github.com/stackforge/fuel-astute.git&lt;br /&gt;
* git clone git://github.com/stackforge/fuel-ostf.git&lt;br /&gt;
* git clone git://github.com/stackforge/fuel-library.git&lt;br /&gt;
* git clone git://github.com/stackforge/fuel-docs.git&lt;br /&gt;
&lt;br /&gt;
You can [https://review.openstack.org/#/q/project:%255Estackforge/fuel-.*,n,z search gerrit for all reviews related to Fuel], or use the [https://review.openstack.org/#/dashboard/?foreach=%28project%3A^stackforge%2Ffuel-.*%29+status%3Aopen+NOT+label%3AWorkflow%3C%3D-1+NOT+label%3ACode-Review%3C%3D-2&amp;amp;title=Fuel+Inbox&amp;amp;My+Patches+Requiring+Attention=owner%3Aself+%28label%3AVerified-1+OR+label%3ACode-Review-1+OR+label%3AWorkflow%3C%3D-1%29&amp;amp;Fuel+Specs=NOT+label%3AWorkflow%3E%3D1+NOT+owner%3Aself+project%3Astackforge%2Ffuel-specs&amp;amp;Needs+Approval=NOT+label%3AWorkflow%3E%3D1+NOT+label%3AWorkflow%3C%3D-1+NOT+label%3AVerified%3C%3D-1+NOT+owner%3Aself+label%3ACode-Review%3E%3D2+NOT+label%3ACode-Review-1&amp;amp;5+Days+Without+Feedback=NOT+label%3AWorkflow%3E%3D1+NOT+label%3AWorkflow%3C%3D-1+NOT+label%3AVerified%3C%3D-1+NOT+owner%3Aself+NOT+project%3Astackforge%2Ffuel-specs+NOT+label%3ACode-Review%3C%3D2+age%3A5d&amp;amp;No+Negative+Feedback=NOT+label%3AWorkflow%3E%3D1+NOT+label%3AWorkflow%3C%3D-1+NOT+label%3AVerified%3C%3D-1+NOT+owner%3Aself+NOT+project%3Astackforge%2Ffuel-specs+NOT+label%3ACode-Review%3C%3D-1+NOT+label%3ACode-Review%3E%3D2+limit%3A50&amp;amp;Other=NOT+label%3AVerified%3C%3D-1+NOT+owner%3Aself+NOT+project%3Astackforge%2Ffuel-specs+label%3ACode-Review-1+limit%3A20 gerrit dashboard for Fuel] for a prioritized list of open reviews (this URL was generated using [https://github.com/stackforge/gerrit-dash-creator/blob/master/dashboards/fuel.dash Gerrit dashboard generator], you need to be logged into Gerrit for it to work).&lt;br /&gt;
&lt;br /&gt;
Please note that OpenStack Infra uses strict checks on your git commit messages. The most important rules are:&lt;br /&gt;
* Keep your commit title short (&amp;lt;80 symbols). It must not end with dot.&lt;br /&gt;
* Body of commit message should be separated from title by one empty line&lt;br /&gt;
* If patch closes bug, then it must have in a body &amp;quot;Closes-Bug: #12345&amp;quot;, where 12345 is your LP bug number&lt;br /&gt;
* If patch relates to bug, but doesn't completely solve an issue, then you must use &amp;quot;Related-Bug: #12345&amp;quot;&lt;br /&gt;
See the [[GitCommitMessages|Git commit messages]] wiki page for more details.&lt;br /&gt;
&lt;br /&gt;
=How and where to get help=&lt;br /&gt;
=== Subscribe to mailing lists ===&lt;br /&gt;
* [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev OpenStack developers mailing list]. If you are hacking on Fuel, or have technical question about Fuel internals, you are very welcome in this ML with subject containing &amp;quot;[Fuel]&amp;quot;.&lt;br /&gt;
* [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack OpenStack users mailing list]. Fuel traffic is there with subject containing &amp;quot;[Fuel]&amp;quot;. You are welcome to ask questions related to Fuel usage, including errors, etc.&lt;br /&gt;
* [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-announce OpenStack announcements mailing list]. Announcements about the OpenStack project like product release information, security advisories, important discussions. This is a low-traffic, read-only list.&lt;br /&gt;
* There are even more mailing lists out there, visit [[MailingLists]] to see the other OpenStack related lists.&lt;br /&gt;
&lt;br /&gt;
=== IRC at freenode.net ===&lt;br /&gt;
* The general Fuel channel is called &amp;quot;#fuel&amp;quot;, and it is logged [http://irclog.perlgeek.de/fuel/ here].&lt;br /&gt;
* The Fuel development channel is called &amp;quot;#fuel-dev&amp;quot;, and it is logged [http://irclog.perlgeek.de/fuel-dev/ here].&lt;br /&gt;
&lt;br /&gt;
=== Quick reference dev links ===&lt;br /&gt;
* Development environment [http://docs.mirantis.com/fuel-dev/develop/env.html http://docs.mirantis.com/fuel-dev/develop/env.html]&lt;br /&gt;
* How to build your Fuel ISO [http://docs.mirantis.com/fuel-dev/develop/env.html#building-the-fuel-iso http://docs.mirantis.com/fuel-dev/develop/env.html#building-the-fuel-iso]&lt;br /&gt;
* Nailgun development [http://docs.mirantis.com/fuel-dev/develop/nailgun.html http://docs.mirantis.com/fuel-dev/develop/nailgun.html]&lt;br /&gt;
* Health Check (OSTF) contributors guide [http://docs.mirantis.com/fuel-dev/develop/ostf_contributors_guide.html http://docs.mirantis.com/fuel-dev/develop/ostf_contributors_guide.html]&lt;br /&gt;
* Contributing to Fuel Library (puppet modules) [http://docs.mirantis.com/fuel-dev/develop/module_structure.html http://docs.mirantis.com/fuel-dev/develop/module_structure.html]&lt;br /&gt;
* Devops framework - distributed testing of Fuel envs [http://docs.mirantis.com/fuel-dev/devops.html http://docs.mirantis.com/fuel-dev/devops.html]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Contributing=&lt;br /&gt;
Fuel is large project within which Programming, Linux and Networking intersect. It is written in Python, Ruby and JavaScript. It also has a number of build scripts in bash &amp;amp; make. Documentation is written in Sphinx. New contributors are always welcome.&lt;br /&gt;
&lt;br /&gt;
==Fuel library for puppet manifests==&lt;br /&gt;
===Adding new puppet modules to fuel-library===&lt;br /&gt;
'''Case A. Pulling in changes from an existing module'''&lt;br /&gt;
&lt;br /&gt;
If you are pulling in changes to an existing fork from a module that is the work of another project and is already tracked in separate repo then:&lt;br /&gt;
1. Create a review request with a unmodified copy of the upstream module from whichever point you are working from and no other related modifications.&lt;br /&gt;
* This review should also contain the commit hash from the upstream repo in the commit message.&lt;br /&gt;
* The review should be evaluated to determine its suitability and either rejected (for licensing, code quality, outdated version requested) or accepted without requiring modifications.&lt;br /&gt;
* The review should not include code that calls this new module.&lt;br /&gt;
2. Any changes necessary to make it work with Fuel should then be proposed as a dependent change(s).&lt;br /&gt;
&lt;br /&gt;
'''Case B. Adding a new module'''&lt;br /&gt;
&lt;br /&gt;
If you are adding a new module that is a work purely for Fuel and will not be tracked in a separate repo then submit incremental reviews that consist of working implementation of features for your module.&lt;br /&gt;
If you have features that are necessary, but do not work fully yet, then prevent them from running during the deployment. Once your feature is complete, submit a review to activate the module during deployment.&lt;br /&gt;
&lt;br /&gt;
If you are going to add a new fork of upstream module - please don't do. Instead, follow the upstream module's contribution rules and provide this module as an additional plug-able component for Fuel. This can be done as a part of [[Fuel/Plugins|plug-able architecture]] and distributed as a package. Note, if upstream module doesn't fit your requirements, you should first adapt the module for your needs upstream or,  for emergency cases, provide custom patch-sets as a part of module as a Fuel plugin distribution.&lt;br /&gt;
&lt;br /&gt;
Modules with licenses incompatible with Apache 2.0 (GPL, etc.) will not be accepted. *Please pay attention to the license information.*&lt;br /&gt;
&lt;br /&gt;
===Contributing to existing fuel-library modules===&lt;br /&gt;
As developers of Puppet modules, we tend to collaborate with the Puppet OpenStack community. As a result, we contribute to upstream modules all of the improvements, fixes and customizations we make to improve Fuel as well. That implies that every contributor must follow Puppet DSL basics, [[Puppet-openstack#Developer_documentation|puppet-openstack dev docs]] and [[Puppet-openstack#Rspec_puppet_tests|Puppet rspec tests requirements]].&lt;br /&gt;
&lt;br /&gt;
The most common and general rule is that upstream modules should be modified only when bugfixes and improvements could benefit everyone in the community. And appropriate patch should be proposed to the upstream project prior to Fuel project.&lt;br /&gt;
&lt;br /&gt;
In other cases (like applying some very specific custom logic or settings) contributor should submit patches to openstack::* classes&lt;br /&gt;
&lt;br /&gt;
Fuel library includes custom modules as well as ones forked from upstream sources. Note that Modulefile (or metadata.json), if any exists, should be used in order to recognize either given module is forked upstream one or not. In case there is no Modulefile in module’s directory, the contributor may submit a patch directly to this module in Fuel library. Otherwise, he or she should submit patch to upstream module first, and once merged or +2 recieved from a core reviewer, the patch should be backported to Fuel library as well. Note that the patch submitted for Fuel library should contain in commit message the upstream commit SHA or link to github pull-request (if the module is not on stackforge) or Change-Id of gerrit patch.&lt;br /&gt;
&lt;br /&gt;
=Fuel development environments=&lt;br /&gt;
===VirtualBox===&lt;br /&gt;
The quickest way to get started with Fuel is to set up an environment under VirtualBox. This is a great way start testing, for instance by using the nightly builds to try to verify, confirm or triage bugs. A quick-start script and instructions can be found at https://software.mirantis.com/quick-start/.&lt;br /&gt;
&lt;br /&gt;
===Fuel ISO-build and development environment===&lt;br /&gt;
Setting up an environment to build the Fuel ISO will allow you to easily build against specific commits in order to do more complicated bug test/confirm/triage/fix work, or augmenting Fuel with new features. In addition to preparing the environment for ISO building, the steps necessary to prepare a dev environment for the other Fuel components (nailgun, astute and doc building) can be found there. Instructions for preparing the environment can be found at http://docs.mirantis.com/fuel-dev/develop/env.html.&lt;br /&gt;
&lt;br /&gt;
===Fuel DevOps environment===&lt;br /&gt;
Setting up a Linux machine as a Fuel DevOps environment will allow you to automate the build/verify/test process, in addition to building the ISO and doing other Fuel-related development. Using libvirt, the devops environment is able to deploy multiple complete OpenStack environments on VMs. Instructions for preparing a devops environment can be found at http://docs.mirantis.com/fuel-dev/devops.html.&lt;br /&gt;
&lt;br /&gt;
=Documentation=&lt;br /&gt;
There are two types of documentation in Fuel: [http://docs.mirantis.com/fuel-dev/ development] and [http://docs.mirantis.com/ user]. Source code of the development documentation can be found at [https://github.com/stackforge/fuel-web/tree/master/docs fuel-web repository]; users, at [https://github.com/stackforge/fuel-docs fuel-docs repository]. Both repositories use the [http://sphinx-doc.org/rest.html reStructuredText format]. Documentation is treated as source code, we use the same [[Fuel/How_to_contribute#First_steps|development process]] for updating documentation as we do for Fuel code.&lt;br /&gt;
&lt;br /&gt;
=== Writing documentation ===&lt;br /&gt;
Keeping the Documentation up to date is hard and it is a critical part in every project. Fuel developers use the OpenStack [https://wiki.openstack.org/wiki/Documentation/DocImpact DocImpact] process to highlight code changes that need to be reflected in documentation. When a patchset should be documented or requires documentation changes, the reviewer should ask the commiter to add 'DocImpact' tag to their commit message, and makes sure the commit message provides enough information about the impact of the code change. When a commit with a DocImpact tag is merged, a new bug will be automatically created and assigned to the Fuel Documentation team. Technical writers then work with the commiter to reflect the commit in the documentation.&lt;br /&gt;
&lt;br /&gt;
A bug generated from a DocImpact commit should be assigned to fuel-docs team until a technical writer picks it up. Technical writer collects information from the original commit author, and adds it to the right documentation areas. It's commit author's responsibility to provide an informative commit message in the first place, to answer technical writer's questions, and to review documentation commits that address that DocImpact bug.&lt;br /&gt;
&lt;br /&gt;
=== Update and expand current documentation ===&lt;br /&gt;
Feel free to file bug if you find a problem with the documentation, and provide with a fix for it via same code contribution policy and procedures. There is [http://docs.mirantis.com/fuel-dev/develop/env.html#building-documentation building documentation page] to help with an environment setup for development documentation.&lt;br /&gt;
&lt;br /&gt;
=== Writing release notes ===&lt;br /&gt;
==== New features ====&lt;br /&gt;
For every blueprint listed on the milestone page in Launchpad (e.g. https://launchpad.net/fuel/+milestone/5.1), find answers to the following questions:&lt;br /&gt;
* What is the visible impact of the change for a user?&lt;br /&gt;
* Was this previously documented as a Known Issue?&lt;br /&gt;
&lt;br /&gt;
If it is a user visible improvement, add a New Features entry about it. Explain when this feature is important, how it can be enabled, and what are the current expectations and limitations.&lt;br /&gt;
&lt;br /&gt;
If it was a Known Issue before, add a Resolved Issues entry.&lt;br /&gt;
&lt;br /&gt;
==== Known and Resolved issues ====&lt;br /&gt;
Scan the release milestone page (e.g. [https://launchpad.net/fuel/+milestone/6.0 fuel 6.0]). Review all bugs targeted for the current milestone that satisfy one of the following conditions:&lt;br /&gt;
* &amp;quot;release-notes&amp;quot; tag&lt;br /&gt;
* Critical priority&lt;br /&gt;
* High priority and &amp;quot;customer-found&amp;quot; tag.&lt;br /&gt;
&lt;br /&gt;
Sort the bugs table on the milestone page by Number from highest to lowest, so that you can see when you've reached the bugs that you have already reviewed. If bug status for the current milestone is Fix Committed or Fix Released, consider it for Resolved Issues list. Find answers to:&lt;br /&gt;
* Was this problem present in the previous GA release? (If it was, it will be targeted for at least one previous release series, with target milestone set to a maintenance release in that series.)&lt;br /&gt;
* How does one confirm if their environment is affected? (Identify specific configurations affected by the bug, include error messages or other symptoms that distinguish this bug from others.)&lt;br /&gt;
* If you're affected, how do you recover?&lt;br /&gt;
* What was the root cause and what had to be changed to resolve the issue?&lt;br /&gt;
&lt;br /&gt;
If bug status for the current milestone is Won't Fix and it meets the criteria above, consider it for the Known Issues list. Questions to answer are:&lt;br /&gt;
* How does one confirm if their environment is affected?&lt;br /&gt;
* Is there a workaround? (How do you prevent this problem from affecting you?)&lt;br /&gt;
* What is the recovery procedure?&lt;br /&gt;
&lt;br /&gt;
==== Reviewing the release notes ====&lt;br /&gt;
Responsibility for every section of release notes is assigned to a technical writer. The writer identifies features and bugs that have to be reflected in their section. For each feature and bug, the writer finds a responsible software engineer: either feature owner, or committer of the most recent bugfix.&lt;br /&gt;
&lt;br /&gt;
If sufficient description (see question lists above) cannot be derived from bug description, blueprint description and specification, and commit messages of related commits, the writer contacts the engineer privately with a request for more information. When a description of a feature or bug is published in a gerrit review, the writer subscribes the engineer to that review, and once again privately sends a request with a link to the documentation review in Gerrit and instructions on how to identify specific documentation files and lines that this engineer must review (e.g. LP bug number, specific RST file, section header or label, etc.)&lt;br /&gt;
&lt;br /&gt;
Fuel engineers must prioritize such information and review requests so that they are able to respond within one week during normal development process, and within one business day during the period between Hard Code Freeze and GA release. Standard escalation process is used when no response to request for information or request for review is received in time. Technical writer is responsible for tracking status of information and review requests and escalations for their section of release notes.&lt;br /&gt;
&lt;br /&gt;
=Bugs=&lt;br /&gt;
===Verify bugs===&lt;br /&gt;
This is very easy to get started, but help here is actually very valuable. Especially when it comes to bugfixes which are relevant to only certain types of hardware. When bugfix is merged, bug is automatically moves to &amp;quot;Fix Committed&amp;quot; status. In Fuel, we set &amp;quot;Fix Released&amp;quot; status for a bug only when it was verified by someone else than a developer. You can simple check out [https://bugs.launchpad.net/fuel/+bugs?field.status%3Alist=FIXCOMMITTED all fix committed bugs] and start verifying them. It is required to be in fuel-bugs LP group to be able to change bug status. However you can leave a comment in bug report, and it will be enough for bug supervisors to change bug status. By your request, you can be included into fuel-bugs team to manage bugs yourself.&lt;br /&gt;
&lt;br /&gt;
=== Test and report bugs ===&lt;br /&gt;
You can always build a developers ISO from master following instructions at http://docs.mirantis.com/fuel-dev/develop/env.html#building-the-fuel-iso. Test different deployment modes, and file bugs. Please do not hesitate to share your findings in IRC for any details you would want to know. Feel free to file bug in a format you want, however it would be great to see a bug in a certain format, with all details in place - to easily reproduce and save a time of developers. You can follow the following simple guidance, which a little bit extend official OpenStack [[Bugs]] page.&lt;br /&gt;
&lt;br /&gt;
The bugs you report for Fuel can be either “Public” or “Private”. Private bugs become visible only for Dev, QA, and Support teams. The guidance is as follows:&lt;br /&gt;
* Normally you would want to report a “Public” bug&lt;br /&gt;
* However, if a bug contains any sensitive information, or security vulnerability information, please report a “Private” bug&lt;br /&gt;
&lt;br /&gt;
Before creating a new bug, it's always a good idea to check if a bug like that already exists in the project, and update an existing bug instead of creating something that will later have to be discarded as a duplicate. However, it is important to make sure that both bugs are really related, dealing with a duplicate is much easier than untangling several unrelated lines of investigation mixed into one bug. Do not ever reopen bugs with generic catch-all titles like &amp;quot;Horizon crashed&amp;quot; or &amp;quot;HA doesn't work&amp;quot; that can cover whole ranges of root causes. Do not create new bugs with such titles, either: be as specific about the nature of the problem as you can.&lt;br /&gt;
&lt;br /&gt;
Here is how you file a bug:&lt;br /&gt;
* Go to https://launchpad.net/fuel&lt;br /&gt;
* Select “Report a bug” on the right&lt;br /&gt;
* Fill in “Summary” field for a bug. It is going to be the headline. Please be descriptive but short and to the point.&lt;br /&gt;
** Bad - &amp;quot;Savanna doesn’t install&amp;quot;&lt;br /&gt;
** Good - &amp;quot;Savanna fails to install in HA mode when “Neutron with VLANs” network is  selected&amp;quot;&lt;br /&gt;
* Enter “Further information”. This is a bug description. It should contain the following sections:&lt;br /&gt;
** Steps to reproduce&lt;br /&gt;
*** Bad: Run the deployment in HA configuration&lt;br /&gt;
*** Good:&lt;br /&gt;
***# Create a new cluster&lt;br /&gt;
***# Select HA mode, “Neutron with VLANs” for network, and choose to install Savanna&lt;br /&gt;
***# Leave defaults the rest of the settings. Run cluster installation&lt;br /&gt;
** Expected result:&lt;br /&gt;
*** Good: Savanna is deployed, up and running.&lt;br /&gt;
** Actual result:&lt;br /&gt;
*** Bad: Savanna fails to install.&lt;br /&gt;
*** Good: Savanna installation fails with the error message “xxx”. Please see the attached screenshot which shows the errors on “Logs” tab.&lt;br /&gt;
** Workaround&lt;br /&gt;
*** Bad: Don’t use “Neutron with VLANs”&lt;br /&gt;
*** Good: Switch network mode to “Neutron with GRE” for the deployment to complete successfully.&lt;br /&gt;
** Impact&lt;br /&gt;
*** Bad: Needs to be fixed.&lt;br /&gt;
*** Good: deployment cannot be completed, because customer requires us to implement a use case for Savanna and “Neutron with VLANs”. Changing configuration to “Neutron with GRE” is not as acceptable option here so this has to be addressed as soon as possible.&lt;br /&gt;
** Description of the environment. Provide enough relevant information:&lt;br /&gt;
*** Output of http://fuel-master-node:8000/api/version/&lt;br /&gt;
*** Operating System&lt;br /&gt;
*** Reference Architecture (HA / non-HA)&lt;br /&gt;
*** Network model (Nova-network, Neutron+VLAN, Neutron+GRE, etc.)&lt;br /&gt;
*** Related Projects installed (Savanna, Murano, Ceilometer)&lt;br /&gt;
* Select visibility for the bug under “This bug contains information that is” field. Either leave it as “Public” (default) or set it to “Private” per the above guidance&lt;br /&gt;
* Add attachments under “Extra Options” section&lt;br /&gt;
** Logs&lt;br /&gt;
** Diagnostic snapshot&lt;br /&gt;
** Screenshots&lt;br /&gt;
* After everything is entered, select the “Submit bug report” button&lt;br /&gt;
&lt;br /&gt;
=== Confirm and triage bugs ===&lt;br /&gt;
Fuel project uses the same bug management practices as in other OpenStack projects. Please follow [[Bugs]] and [[BugTriage]] pages.&lt;br /&gt;
&lt;br /&gt;
When triaging the bugs in the Fuel deployment process (as opposed to bugs in OpenStack components deployed by Fuel), use following additional criteria for bug importance:&lt;br /&gt;
&lt;br /&gt;
* Critical = can't deploy anything and there's no trivial workaround; data loss; or security vulnerability&lt;br /&gt;
* High = specific hardware, configurations, or components are unusable and there's no workaround; or everything is broken but there's a workaround&lt;br /&gt;
* Medium = specific hardware, configurations, or components are working incorrectly; or is completely unusable but there's a workaround&lt;br /&gt;
* Low = minor feature is broken and can be fixed with a trivial workaround; or a cosmetic defect&lt;br /&gt;
* Wishlist = not a bug, either close as Won't Fix, or associate with a blueprint (create new blueprint if no existing blueprint covers the feature requested in the bug)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Additional guidelines for User eXperience (UX) issues:&lt;br /&gt;
&lt;br /&gt;
In some cases a bug may cause significant impact to UX in these cases we can use additional criteria to set bug priority&lt;br /&gt;
* Critical = Requires massive effort to work around, including un/under-documented commands and edits to config files&lt;br /&gt;
* High = Requires modification of config files, interfaces that users aren't expected to use (ie the API when it's _intended_ to work in the CLI / UI (exclusive of interfaces that are intended to only be available via API) or requires custom node yaml (again except when it should exclusively be available)&lt;br /&gt;
* Medium: Straight forward commands in the CLI&lt;br /&gt;
* Low and Wishlist = as above&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Additional guidelines for documentation bugs:&lt;br /&gt;
&lt;br /&gt;
* Critical = following the instructions from documentation can cause outage or data loss&lt;br /&gt;
* High = documentation includes information that is not true, or instructions that yield the advertised outcome&lt;br /&gt;
* Medium = important information is missing from documentation (e.g. new feature description)&lt;br /&gt;
* Low = additional information would improve reader's understanding of a feature&lt;br /&gt;
* Wishlist = cosmetic formatting and grammar issues&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Also Fuel uses different meaning for two bug states:&lt;br /&gt;
&lt;br /&gt;
* Confirmed = somebody who is not submitter looked into the bug and made sure that it is properly triaged. The person must made sure that milestone, importance and assignee are properly set. Still the bug '''could be not''' reproduced or confirmed as genuine.&lt;br /&gt;
* Fix Released = somebody who is not assignee verified that the issue does not reproduce after it was fixed. The status is left for QA to mark bugs as verified after they are fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When triaging bugs, please use the following routine:&lt;br /&gt;
&lt;br /&gt;
# Review all '''New''' bugs.&lt;br /&gt;
# Assign each New bug to the release series under development (focus of development according to [https://launchpad.net/fuel/+series Fuel project timeline]) and set corresponding bug status and milestone for that release series.&lt;br /&gt;
# Consider changing the bug title to be more specific, replace generic statements like &amp;quot;deployment timeout exceeded&amp;quot; with description of the root cause (if identified) or symptops that are unique for that bug.&lt;br /&gt;
# Consider visibility status of the bug. If it contains sensitive information, set it to '''Private'''. If it describes a security vulnerability, set it to '''Private Security'''.&lt;br /&gt;
# If the bug does not contain sufficient information as described in [[Fuel/How_to_contribute#Test_and_report_bugs]], request the missing information, and set the bug status to '''Incomplete'''. Add a comment using the following template: ''We didn't receive required details in order to correctly troubleshoot the problem, so we are setting this bug into Incomplete state. Please provide reqested information and we will investigate this issue further. If you think it was incorrectly set to Incomplete, please comment in the bug''.&lt;br /&gt;
# If there is sufficient information on how to reproduce the bug and milestone, importance and assignee are properly set, set the status to '''Confirmed'''.&lt;br /&gt;
# If there is sufficient information to start implementing a fix, set the status to '''Triaged'''.&lt;br /&gt;
# If the root cause of the bug is identified, include it in the bug description.&lt;br /&gt;
# Review all '''Incomplete''' bugs&lt;br /&gt;
# If an Incomplete bug has new updates, use the same steps as described above for New bugs.&lt;br /&gt;
# If an Incomplete bug did not have any updates for '''4 weeks''', close it as '''Invalid'''. Add a comment using the following template: ''This bug was incomplete for more than 4 weeks. We cannot investigate it further so we are setting the status to Invalid. If you think it is not correct, please feel free to provide requested information and reopen the bug, and we will look into it further.''&lt;br /&gt;
# During '''Code Freeze''' for a release, review all bugs targeted at that release milestone, make sure it is updated daily by the assignee (or bug reporter if the bug is not assigned to a person).&lt;br /&gt;
# If you know that the bug is related to some blueprints, link this bug to these blueprints. To do this, go to corresponding blueprints page and hit 'Link a bug report' link.&lt;br /&gt;
&lt;br /&gt;
Remember that every status change of a bug should be accompanied by a comment explaining the reason why the change was made.&lt;br /&gt;
&lt;br /&gt;
Useful LaunchPad searches and tools:&lt;br /&gt;
&lt;br /&gt;
* [https://bugs.launchpad.net/fuel/+bugs?field.status=NEW&amp;amp;field.project=FUEL New bugs]&lt;br /&gt;
* [https://bugs.launchpad.net/fuel/+bugs?field.searchtext=&amp;amp;orderby=-importance&amp;amp;field.status%3Alist=INCOMPLETE_WITH_RESPONSE&amp;amp;field.status%3Alist=INCOMPLETE_WITHOUT_RESPONSE&amp;amp;assignee_option=any&amp;amp;field.assignee=&amp;amp;field.bug_reporter=&amp;amp;field.bug_commenter=&amp;amp;field.subscriber=&amp;amp;field.structural_subscriber=&amp;amp;field.tag=&amp;amp;field.tags_combinator=ANY&amp;amp;field.has_cve.used=&amp;amp;field.omit_dupes.used=&amp;amp;field.omit_dupes=on&amp;amp;field.affects_me.used=&amp;amp;field.has_patch.used=&amp;amp;field.has_branches.used=&amp;amp;field.has_branches=on&amp;amp;field.has_no_branches.used=&amp;amp;field.has_no_branches=on&amp;amp;field.has_blueprints.used=&amp;amp;field.has_blueprints=on&amp;amp;field.has_no_blueprints.used=&amp;amp;field.has_no_blueprints=on&amp;amp;search=Search Incomplete bugs]&lt;br /&gt;
* [https://bugs.launchpad.net/fuel/+bugs?field.searchtext=&amp;amp;orderby=-importance&amp;amp;field.status%3Alist=NEW&amp;amp;field.status%3Alist=CONFIRMED&amp;amp;field.status%3Alist=TRIAGED&amp;amp;field.status%3Alist=INPROGRESS&amp;amp;field.status%3Alist=INCOMPLETE_WITH_RESPONSE&amp;amp;field.status%3Alist=INCOMPLETE_WITHOUT_RESPONSE&amp;amp;assignee_option=none&amp;amp;field.assignee=&amp;amp;field.bug_reporter=&amp;amp;field.bug_commenter=&amp;amp;field.subscriber=&amp;amp;field.structural_subscriber=&amp;amp;field.tag=&amp;amp;field.tags_combinator=ANY&amp;amp;field.has_cve.used=&amp;amp;field.omit_dupes.used=&amp;amp;field.omit_dupes=on&amp;amp;field.affects_me.used=&amp;amp;field.has_patch.used=&amp;amp;field.has_branches.used=&amp;amp;field.has_branches=on&amp;amp;field.has_no_branches.used=&amp;amp;field.has_no_branches=on&amp;amp;field.has_blueprints.used=&amp;amp;field.has_blueprints=on&amp;amp;field.has_no_blueprints.used=&amp;amp;field.has_no_blueprints=on&amp;amp;search=Search Unassigned bugs]&lt;br /&gt;
* [https://bugs.launchpad.net/fuel/+bugs?field.searchtext=&amp;amp;field.status%3Alist=NEW&amp;amp;field.status%3Alist=CONFIRMED&amp;amp;field.status%3Alist=TRIAGED&amp;amp;field.status%3Alist=INPROGRESS&amp;amp;field.status%3Alist=INCOMPLETE_WITH_RESPONSE&amp;amp;field.status%3Alist=INCOMPLETE_WITHOUT_RESPONSE&amp;amp;assignee_option=choose&amp;amp;field.assignee=fuel-library&amp;amp;field.bug_reporter=&amp;amp;field.bug_commenter=&amp;amp;field.subscriber=&amp;amp;field.structural_subscriber=&amp;amp;field.tag=&amp;amp;field.tags_combinator=ANY&amp;amp;field.has_cve.used=&amp;amp;field.omit_dupes.used=&amp;amp;field.omit_dupes=on&amp;amp;field.affects_me.used=&amp;amp;field.has_patch.used=&amp;amp;field.has_branches.used=&amp;amp;field.has_branches=on&amp;amp;field.has_no_branches.used=&amp;amp;field.has_no_branches=on&amp;amp;field.has_blueprints.used=&amp;amp;field.has_blueprints=on&amp;amp;field.has_no_blueprints.used=&amp;amp;field.has_no_blueprints=on&amp;amp;search=Search&amp;amp;orderby=milestone_name&amp;amp;start=0 Bugs in fuel-library, sorted by milestone]&lt;br /&gt;
* Launchpad Report Tool with bugs SLA by Mirantis https://launchpad-reports-summary.mirantis.com/project/bugs_lifecycle_report/6.1&lt;br /&gt;
* [https://addons.mozilla.org/en-US/firefox/addon/launchpad-helper/?src=cb-dl-created Launchpad Helper for Firefox]&lt;br /&gt;
* [https://chrome.google.com/webstore/detail/launchpad-helper/kjelakmoldahcakikjnfebiolcliigah?hl=en Launchpad Helper for Chrome]&lt;br /&gt;
&lt;br /&gt;
=== Fix bugs ===&lt;br /&gt;
The most simple and easy way to contribute code into Fuel is to start with bug fixes. First of all, check out [https://bugs.launchpad.net/fuel/+bugs?field.status%3Alist=NEW&amp;amp;field.status%3Alist=CONFIRMED&amp;amp;field.status%3Alist=TRIAGED&amp;amp;field.tag=low-hanging-fruit+&amp;amp;field.tags_combinator=ANY bugs with &amp;quot;low-hanging-fruit&amp;quot; tag]. You can also take any other bug. For easier management of bugs, Fuel uses multiple functional groups, and you will see bugs assigned to fuel-python, fuel-library, fuel-qa and other teams. Feel free to pick any of those. It is assigned to group, so group can get an email notification about a bug. Unless it is reassigned to particular engineer to work on that bug, then it means the bug is not taken by anyone yet, so feel free to take it. Bugs with assignee set to a person are not yet imply that someone works on them (but it should in ideal world). If it is even in &amp;quot;in progress&amp;quot; state, feel free to ping a person and ask if he really works on that bug, and feel free to assign yourself otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Backport bugfixes to stable release series ===&lt;br /&gt;
When you create a new bug with High or Critical priority or upgrade an existing bug, always check if this bug is present in the supported stable release series (at least one most recent stable release). If it is present there, target it to all affected series (even if you don't expect to be able to eventually backport a fix). If it's not present in stable releases, document that on the bug so that other people don't have to re-check.&lt;br /&gt;
&lt;br /&gt;
When you propose a fix for a bug, always start with fixing it in the master branch. If the fix only applies to the stable branch and is not relevant in master, explain that in the commit message. For a bug targeted for stable release series, cherry-pick the fix commit onto the stable/x.x branch for each series it is targeted for, '''after''' the fix was merged to master (creating backports prematurely leads to possible inconsistency between master and stable/x.x versions of the same commit). Use the same Change-Id and topic (git review -t bug/&amp;lt;id&amp;gt;) to make it easier to track down all backports for that bug. You can also use &amp;quot;Cherry Pick To&amp;quot; button in Gerrit if the commit can be applied to the stable branch without conflicts.&lt;br /&gt;
&lt;br /&gt;
When you approve a bugfix commit for master branch, use the information available so far on the bug and in the review request to review and maybe update backporting status of the bug. Is its priority high enough to need a backport? Is it targeted to all affected release series? Are there backport commits already? If yes, are they up to date with the commit that was merged to master?&lt;br /&gt;
* For all series where backport should exist and doesn't, create a backport review request yourself.&lt;br /&gt;
* For all other affected series, change bug status to Won't Fix and explain in bug comments.&lt;br /&gt;
* Do not merge commits into stable branches until it was merged into master, unless commit message explicitly documents why it doesn't apply to master.&lt;br /&gt;
&lt;br /&gt;
When you find a bug in a stable release, do not simply target it to the next release in that maintenance release series. Instead, target it to the release designated as &amp;quot;current focus&amp;quot; on the [https://launchpad.net/fuel/ Fuel home page in Launchpad]. If it's a High or Critical priority bug, additionally target it to the releases series it was originally found in, and, if applicable, all release series in between.&lt;br /&gt;
&lt;br /&gt;
If a bug is present in a maintenance release and not present in current release series, it should have one of the following statuses in the current release series:&lt;br /&gt;
* Incomplete if root cause analysis is not finished&lt;br /&gt;
* Fix Committed if root cause analysis shows that the bug is fixed by changes merged after the maintenance release the bug was found in&lt;br /&gt;
* Invalid if root cause analysis shows that the bug was introduced by a change specific to this maintenance release series&lt;br /&gt;
&lt;br /&gt;
=Enhancements=&lt;br /&gt;
=== Propose enhancements ===&lt;br /&gt;
&lt;br /&gt;
Enhancements for Fuel are proposed using the mechanism of blueprints. The process is very similar to the bugs:&lt;br /&gt;
&lt;br /&gt;
* Select &amp;quot;Register a Blueprint&amp;quot;.  Typically, you’ll find this link on the right side of the launchpad page.&lt;br /&gt;
** Enter a Name for the blueprint. If possible, include the name of the sub-component of fuel as the first word of the name (or just fuel for a broader blueprint), then a very short descriptor using dashes between words.  For example, [https://blueprints.launchpad.net/fuel/+spec/ui-declarative-wizard ui-declarative-wizard] or [https://blueprints.launchpad.net/fuel/+spec/fuel-stop-deployment fuel-stop-deployment].&lt;br /&gt;
** Enter a Title for the blueprint.  The title should describe the feature as clearly as possible in up to 70 characters. This title is displayed in every feature list or report.&lt;br /&gt;
* Enter a Summary of the blueprint.&lt;br /&gt;
** Summarize the idea of the blueprint in a user story.  If you have an existing user story in a public document, include the link.&lt;br /&gt;
** If a public document isn’t yet created and the user story is extensive, you can use https://etherpad.openstack.org/ to document the full user story.   You can use the Name that you used for the blueprint as the Pad name.&lt;br /&gt;
* Propose your blueprint by selecting the milestone in which you plan to complete the blueprint.&lt;br /&gt;
* You won’t need to enter any other fields, so now just choose Register Blueprint.&lt;br /&gt;
&lt;br /&gt;
If you’re just entering a new idea without a design, you can leave the specification URL field blank. If you have a design, here is how you get it published and approved:&lt;br /&gt;
&lt;br /&gt;
* Upload a design specification in the &amp;quot;specs/&amp;lt;release&amp;gt;&amp;quot; folder in fuel-specs&lt;br /&gt;
** e.g. [https://review.openstack.org/96429 access-control-master-node]&lt;br /&gt;
** it should be based on the [http://git.openstack.org/cgit/stackforge/fuel-specs/tree/specs/template.rst template], see the instructions in the template for more details&lt;br /&gt;
** get it reviewed by submitting your patch using Gerrit, in the usual way: [http://docs.openstack.org/infra/manual/developers.html#development-workflow Development Workflow]&lt;br /&gt;
** at the end of each release, non-completed specs will be removed&lt;br /&gt;
** you need to re-submit for the following release, should the blueprint slip&lt;br /&gt;
&lt;br /&gt;
* In order to get your spec approved, it usually requires to get +1 from the following folks:&lt;br /&gt;
** All mandatory design reviewers (it's usually people who familiar with the area of the proposed enhancement)&lt;br /&gt;
** Topic expert if any (e.g your enhancement somehow affects Fuel Web UI then you need to get +1 from the Fuel Web UI team)&lt;br /&gt;
** QA&lt;br /&gt;
** For cross-component enhancements, it also requires to have +1 from core of affected components.&lt;br /&gt;
&lt;br /&gt;
* Once your design specification has been approved and merged into fuel-specs git repo:&lt;br /&gt;
** Update your blueprint's specification URL to point to the design specification in fuel-specs git&lt;br /&gt;
** Note, this should link to git (as in the template link above), not to the gerrit change&lt;br /&gt;
&lt;br /&gt;
When done, drop an email about the new blueprint to the mailing list to attract attention of Fuel developers, who are likely to provide early feedback and request additional information.&lt;br /&gt;
&lt;br /&gt;
Please read [[Blueprints|OpenStack Blueprints]] page for detailed definition of blueprints and their lifecycle.&lt;br /&gt;
&lt;br /&gt;
=== Implement new features ===&lt;br /&gt;
To implement a new feature, you will need to address the following:&lt;br /&gt;
# File a blueprint, with all required feature details, as described in [[Fuel/Where_to_contribute#Propose_enhancements|Propose enhancements]] section above and on [[Blueprints]] page&lt;br /&gt;
# PTL or core developers of Fuel should approve a blueprint, when all required information is provided.&lt;br /&gt;
# Please no active contribution unless there is an agreement on design. To get an approval, you can discuss a feature in the mailing list.&lt;br /&gt;
# Every new feature must not break other features, and whether work fine with features we had before, or be disabled in combination with features which do not work with the new one. Short list of features to check compatibility with:&lt;br /&gt;
#* All distributions (currently CentOS &amp;amp; Ubuntu)&lt;br /&gt;
#* Networking (nova-network, Neutron)&lt;br /&gt;
#* Combination with other roles on a node. For example, MongoDB role should not be placed with Ceph.&lt;br /&gt;
#* Disk partitioning (will it use existing partition or new one needs to be created?)&lt;br /&gt;
#* Network verification&lt;br /&gt;
# Other requirements for features:&lt;br /&gt;
#* logging of services should be done via rsyslog for Fuel Library contributions&lt;br /&gt;
#* implementation should be scalable, or otherwise limitations should be clearly stated in a design doc. It is unacceptable to degrade scalability and performance of already existing features.&lt;br /&gt;
# Start implementation and propose code changes frequently and by small pieces. This is the only way to successful merge - it is unrealistic to review changesets with 1000+ lines of code.&lt;br /&gt;
# Every feature should have a set of tests:&lt;br /&gt;
#* [https://github.com/stackforge/fuel-web/tree/master/nailgun/ui_tests CasperJS] and [https://github.com/stackforge/fuel-main/tree/master/fuelweb_ui_test Selenium] tests are for Fuel Web UI&lt;br /&gt;
#* [https://github.com/stackforge/fuel-web/tree/master/nailgun/nailgun/test Nailgun uses Python Unit Test framework] for unit and integration tests&lt;br /&gt;
#* [https://github.com/stackforge/fuel-astute/tree/master/spec Astute uses RSpec] for unit and integration tests&lt;br /&gt;
#* Consider extending [http://docs.mirantis.com/fuel-dev/develop/ostf_contributors_guide.html OSTF tests] for implemented feature&lt;br /&gt;
#* [https://github.com/stackforge/fuel-main/tree/master/fuelweb_test System tests], which use [http://docs.mirantis.com/fuel-dev/devops.html Devops framework], are run against an ISO, i.e. when all components are integrated. System tests last for up to 6-8 hours and run every night. As these tests are ran against integrated environment, their result represents a higher interest. Every large feature which has pieces in more than one Fuel component must be covered by system tests.&lt;br /&gt;
#* If feature requires special hardware, or special deployment setup, then existing CI should be extended with such hardware and required changes into devops framework. It should be discussed with the Fuel community in mailing list in order to come up with a joint decision.&lt;br /&gt;
# Documentation. New features must be well documented in both [[Fuel/Where_to_contribute#Documentation|user and development documentation]].&lt;br /&gt;
# Please propose changes for a feature before feature freeze date. Otherwise, changes won't be even reviewed before code freeze, and we will not let changes to land into master before milestone proposed branch is created. This will allow Fuel team to concentrate on stabilization of the current release, and put all the force into squashing bugs. Rules are similar to core OpenStack projects, see [[FeatureFreeze]] and [[ReleaseCycle]].&lt;br /&gt;
&lt;br /&gt;
=Tests=&lt;br /&gt;
=== Unit and integration tests for Nailgun ===&lt;br /&gt;
[https://github.com/stackforge/fuel-web/tree/master/nailgun/nailgun/test Nailgun uses Python Unit Test framework] for unit and integration tests. Help in writing test is highly appreciated - we always want better coverage! Please checkout [http://docs.mirantis.com/fuel-dev/develop/env.html#setup-for-nailgun-unit-tests how to setup development environment for Nailgun tests], and follow [[Fuel/How_to_Test_Your_Code|How to Test Your Code]] guidance.&lt;br /&gt;
&lt;br /&gt;
= Code review rules =&lt;br /&gt;
When contributing code changes to Fuel, please use the [http://docs.openstack.org/infra/manual/developers.html#development-workflow development workflow] and follow [[Fuel/Code_Review_Rules|Fuel specific rules and recommendations]].&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Fuel&amp;diff=47965</id>
		<title>Fuel</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Fuel&amp;diff=47965"/>
				<updated>2014-04-07T23:49:39Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: /* Join Fuel team */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= What is Fuel? =&lt;br /&gt;
&lt;br /&gt;
Fuel is an all-in-one control plane for automated hardware discovery, network verification, operating systems provisioning and deployment of OpenStack. It provides user-friendly Web interface for installations management, simplifying OpenStack installation up to a few clicks.&lt;br /&gt;
&lt;br /&gt;
This installer has been battle-tested during 2013 in a number of OpenStack deployments on platforms like as Dell (C6220 &amp;amp; R320), HP (DL380), Supermicro (6027TR-HTRF), Lenovo ThinkServer (RD530) and Cisco UCS-C.&lt;br /&gt;
&lt;br /&gt;
The key features are:&lt;br /&gt;
* hardware discovery&lt;br /&gt;
* hardware configuration in UI (networks &amp;amp; disk partitioning)&lt;br /&gt;
* ability to spin up and manage multiple OpenStack clusters&lt;br /&gt;
* support for non-HA and HA OpenStack deployment configurations&lt;br /&gt;
* pre-deployment checks and network validation&lt;br /&gt;
* post-deployment checks and running a set of tests for validating deployed OpenStack&lt;br /&gt;
* view logs in real-time through UI&lt;br /&gt;
* support for CentOS and Ubuntu, and it can be extended to support other distributions too&lt;br /&gt;
* support for multiple OpenStack distributions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mirantis uses Fuel as a part of their Openstack related solutions and they are our major contributor. For more details look at  http://software.mirantis.com/&lt;br /&gt;
&lt;br /&gt;
=Fuel architecture=&lt;br /&gt;
Fuel is not monolithic. It consists of several independent components. Some of those components are Fuel specific components, while others are third-party services like Cobbler, Puppet, Mcollective, etc. &lt;br /&gt;
* The heart of Fuel project is Nailgun. Nailgun as other Openstack projects is written in Python programming language. It implements REST API as well as deployment data management. It manage disk volumes configuration data, networks configuration data and any other environment specific data which are necessary for successful deployment. It has required orchestration logic to build instructions for provisioning and deployment in a right order. Nailgun uses SQL database to store its data and AMQP service to interact with workers.&lt;br /&gt;
* Another important component codenamed Astute implements Nailgun's workers, and it's function is to run certain actions according to the instructions provided from Nailgun. In fact, Astute is nothing more than just a layer which encapsulates all the details about interaction with a variety of services such as Cobbler, Puppet, shell scripts, etc. and provides universal asynchronous interface to those services. Depending on what we need to do we can either manage service directly via its native protocol (for example XML-RPC protocol is used for Cobbler) or we can use Mcollective agents to perform specific tasks such as launching &amp;quot;puppet apply&amp;quot; on a remote node or running a script. Astute is implemented as Ruby library and it is used in thin manager Naily, which represents AMQP consumer.&lt;br /&gt;
* Our provisioning service at the moment is Cobbler. There is a POC ready for move to Ironic, and production version is being implemented.&lt;br /&gt;
* Puppet is our only deployment service at the moment. It is possible to create MCollective agent to manage other configuration management frameworks, such as Chef, SaltStack, etc.&lt;br /&gt;
* We also have a set of Mcollective agents which allow us to perform specific tasks like hard drives clearing, network connectivity probing etc. &lt;br /&gt;
* OSTF (OpenStack Testing Framework, or Health Check) is separated component, which can be easily removed and reused without Fuel. It implements post-deployment verification of OpenStack. It's main goal is to verify maximum of functionality taking minimum of time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[File:Fuel-architecture.png|850px]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Fuel components=&lt;br /&gt;
&lt;br /&gt;
====Web UI====&lt;br /&gt;
To get an idea about what Fuel web user interface looks like you can watch this video http://www.youtube.com/watch?v=PppYpbCg4AU This is the recording of Mike Scherbakov's speech at Openstack Summit in Portland in April 2013. Since that time a lot of new features were added but this video gives good introduction.&lt;br /&gt;
&lt;br /&gt;
====CLI====&lt;br /&gt;
&lt;br /&gt;
[[Fuel CLI|Understanding Environment deployment with Fuel CLI]]&lt;br /&gt;
&lt;br /&gt;
====Nailgun====&lt;br /&gt;
This component is written in Python. It provides REST API and manages all the data about Openstack clusters deployment and management. It is the heart of Fuel.&lt;br /&gt;
&lt;br /&gt;
====Astute====&lt;br /&gt;
Astute is written in Ruby. It is a wrapper around Mcollective. The majority of its functionality is implemented as Mcollective agents. It is mostly for launching arbitrary commands on remote nodes. For example we use it for launching &amp;quot;puppet apply&amp;quot; in order to install all necessary packages and configure services. Besides, it has driver for interaction with Cobbler.&lt;br /&gt;
&lt;br /&gt;
=Join Fuel team=&lt;br /&gt;
==== Greeting ====&lt;br /&gt;
If you like the idea of free opensource software, if you like the idea of cloud computing, if you like the idea of making the world better, we certainly want you to join. We try to be as much open as possible. We are always glad to share our own experience as well as to adopt incoming ideas. Join us!  &lt;br /&gt;
&lt;br /&gt;
==== Weekly meeting ====&lt;br /&gt;
Fuel team holds weekly [https://wiki.openstack.org/wiki/Meetings/Fuel meetings] on Tuesdays at [http://www.worldtimebuddy.com/?qm=1&amp;amp;lid=100&amp;amp;h=100&amp;amp;date=2014-3-27&amp;amp;sln=16-17 1600 UTC] in IRC, at the #openstack-meeting-alt channel. If you have a topic to discuss, you can add it to the [https://etherpad.openstack.org/p/fuel-weekly-meeting-agenda agenda].&lt;br /&gt;
&lt;br /&gt;
==== IRC at freenode.net ====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|  #fuel  &lt;br /&gt;
| General channel&lt;br /&gt;
|-&lt;br /&gt;
|  #fuel-dev &lt;br /&gt;
| Development channel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Source code ====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
| Build system   &lt;br /&gt;
| https://github.com/stackforge/fuel-main&lt;br /&gt;
|-&lt;br /&gt;
| REST API + CLI + UI&lt;br /&gt;
| https://github.com/stackforge/fuel-web&lt;br /&gt;
|-&lt;br /&gt;
| Deployment orchestrator&lt;br /&gt;
| https://github.com/stackforge/fuel-astute&lt;br /&gt;
|-&lt;br /&gt;
| Puppet modules&lt;br /&gt;
| https://github.com/stackforge/fuel-library&lt;br /&gt;
|-&lt;br /&gt;
| User documentation&lt;br /&gt;
| https://github.com/stackforge/fuel-docs&lt;br /&gt;
|-&lt;br /&gt;
| Openstack Healthcheck&lt;br /&gt;
| https://github.com/stackforge/fuel-ostf&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Development related links ====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
| Launchpad project &lt;br /&gt;
| https://launchpad.net/fuel&lt;br /&gt;
|-&lt;br /&gt;
| Review in progress&lt;br /&gt;
| https://review.openstack.org/#/q/status:open+fuel,n,z&lt;br /&gt;
|-&lt;br /&gt;
| Development documentation&lt;br /&gt;
| http://docs.mirantis.com/fuel-dev&lt;br /&gt;
|-&lt;br /&gt;
| Slides&lt;br /&gt;
| https://docs.google.com/file/d/0B5VvW7EEta1WMTdFajRzY0lGbkU&lt;br /&gt;
|-&lt;br /&gt;
| Feature Design template&lt;br /&gt;
| https://docs.google.com/a/mirantis.com/document/d/1KlTTM0X-v9nVxyG1ZSdOEpf_yj4EtzNL1Q9Sd4v5DX0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Roadmap ====&lt;br /&gt;
* Client python library to make third-party applications to use Fuel&lt;br /&gt;
* Pluggable architecture in order to easily add specific functionality &lt;br /&gt;
* Patching / Upgrade of Fuel itself&lt;br /&gt;
* Patching / Upgrade of Openstack (w/o or w/ minimal downtime)&lt;br /&gt;
* Closer integration with other Openstack services&lt;br /&gt;
&lt;br /&gt;
==== Hacking ====&lt;br /&gt;
Please review this hacking section for some guidance into some come code contribution practices we use.&lt;br /&gt;
&lt;br /&gt;
===== Adding new modules to fuel-library =====&lt;br /&gt;
&lt;br /&gt;
====== Pulling in an existing module ======&lt;br /&gt;
&lt;br /&gt;
If you are adding a module that is the work of another project and is already tracked in separate repo then:&lt;br /&gt;
&lt;br /&gt;
#. Create a review request with a un-modified copy of the upstream module from what ever point you are working from and _no_ other related modifications.&lt;br /&gt;
* This review should also contain the commit hash from the upstream repo in the commit message. &lt;br /&gt;
* The review should be looked over for reasons for rejecting the entire module (Like license.)&lt;br /&gt;
Forbearing such issues it should be accepted with out requiring modifications. &lt;br /&gt;
#.  Any changes necessary to make it work with fuel can then be proposed as a dependent change(s)&lt;br /&gt;
&lt;br /&gt;
====== Adding a new module ======&lt;br /&gt;
&lt;br /&gt;
If you are adding a new module that is a work purely for fuel and will not be tracked in a separate repo then&lt;br /&gt;
&lt;br /&gt;
Submit either a complete single review (Large commits will delay review) OR&lt;br /&gt;
&lt;br /&gt;
Submit incremental reviews that consist of working implementation of features for your module. If you have features that are necessary, but do not work fully yet, then prevent them from running during the deployment. Once you are feature complete, submit a review to activate the module during deployment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Keywords ====&lt;br /&gt;
openstack deploy deployment havana grizzly cobbler install installation provisioning puppet mcollective tripleo ironic web cli ui opensource centos ubuntu redhat rhel distribution discovering python ruby diskimage-builder&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Puppet/ceph-blueprint&amp;diff=34815</id>
		<title>Puppet/ceph-blueprint</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Puppet/ceph-blueprint&amp;diff=34815"/>
				<updated>2013-11-04T21:03:37Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
This document is intended to capture requirements for a single [https://launchpad.net/puppet-ceph puppet-ceph module].&lt;br /&gt;
&lt;br /&gt;
Very much like vswitch, Ceph is not exclusively used in the context of OpenStack. There is however a significant community relying on puppet to deploy Ceph in the context of OpenStack, as is shown in the [[#Related_tools_and_implementations inventory|of the existing efforts]] Having a puppet ceph module under the umbrella of the stackforge infrastructure helps federate the efforts while providing a workflow that will improve the overall quality of the module.&lt;br /&gt;
&lt;br /&gt;
* [https://review.openstack.org/#/q/status:open+project:stackforge/puppet-ceph,n,z gerrit review page]&lt;br /&gt;
* [https://launchpad.net/puppet-ceph puppet-ceph at launchpad]&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
Almost each component of this module deserve a discussion and it would take a long time to agree on everything before getting something useful. The following list sets the order in which each module is going to be implemented. Each step must be a useable puppet module, unit tested and including integration tests.&lt;br /&gt;
&lt;br /&gt;
* [[#conf|conf]]&lt;br /&gt;
* [[#key|key]]&lt;br /&gt;
* [[#mon|mon]]&lt;br /&gt;
* [[#osd|osd]]&lt;br /&gt;
* [[#pool|pool]]&lt;br /&gt;
* [[#rbd|rbd]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
=== I want to try this module, heard of ceph, want to see it in action ===&lt;br /&gt;
&lt;br /&gt;
    /node/ { &lt;br /&gt;
     ceph::conf { auth_enable: false };&lt;br /&gt;
     ceph::mon; &lt;br /&gt;
     ceph::osd { '/srv/osd1' }; &lt;br /&gt;
     ceph::osd { '/srv/osd2' }; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
* install puppet, &lt;br /&gt;
* paste this in site.pp and replace /node/ with the name of your current node, &lt;br /&gt;
* puppet apply site.pp , &lt;br /&gt;
* ceph -s and see that it works&lt;br /&gt;
&lt;br /&gt;
=== I want to run benchmarks on three new machines ===&lt;br /&gt;
&lt;br /&gt;
* There are four machines, 3 OSD, 1 MON and one machine that is the client from which the user runs commands.&lt;br /&gt;
* install puppetmaster and create site.pp with:&lt;br /&gt;
&lt;br /&gt;
    /ceph-default/ {&lt;br /&gt;
      ceph::conf { 'global':&lt;br /&gt;
         auth_enable =&amp;gt; false,&lt;br /&gt;
         'mon host' =&amp;gt; 'node1'&lt;br /&gt;
       };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /node1/ inherits ceph-default { &lt;br /&gt;
     ceph::mon; &lt;br /&gt;
     ceph::osd { disk =&amp;gt; 'discover' }; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /node2/, /node3/ inherits ceph-default { &lt;br /&gt;
     ceph::osd { disk =&amp;gt; 'discover' }; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /client/ inherits ceph-default { &lt;br /&gt;
     ceph::client;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
* ssh client&lt;br /&gt;
* rados bench &lt;br /&gt;
* interpret the results&lt;br /&gt;
&lt;br /&gt;
=== I want to operate a production cluster ===&lt;br /&gt;
&lt;br /&gt;
    $admin_key = 'AQCTg71RsNIHORAAW+O6FCMZWBjmVfMIPk3MhQ=='&lt;br /&gt;
    $mon_key = 'AQDesGZSsC7KJBAAw+W/Z4eGSQGAIbxWjxjvfw=='&lt;br /&gt;
    $boostrap_osd_key = 'AQABsWZSgEDmJhAAkAGSOOAJwrMHrM5Pz5On1A=='&lt;br /&gt;
&lt;br /&gt;
    /ceph-default/ {&lt;br /&gt;
      ceph::conf { 'mon host' =&amp;gt; 'mon1,mon2,mon3' }; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /mon[123]/ inherits ceph-default { &lt;br /&gt;
     ceph::mon { key =&amp;gt; $mon_key }&lt;br /&gt;
     ceph::key { 'client.admin':&lt;br /&gt;
         secret =&amp;gt; $admin_key,&lt;br /&gt;
         caps_mon =&amp;gt; '*',&lt;br /&gt;
         caps_osd =&amp;gt; '*',&lt;br /&gt;
         inject =&amp;gt; true,&lt;br /&gt;
     }&lt;br /&gt;
     ceph::key { 'client.bootstrap-osd': &lt;br /&gt;
          secret =&amp;gt; $bootstrap_osd_key,&lt;br /&gt;
          caps_mon =&amp;gt; 'profile bootstrap-osd'&lt;br /&gt;
          inject =&amp;gt; true,&lt;br /&gt;
     }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /osd*/ inherits ceph-default { &lt;br /&gt;
     ceph::osd { disk =&amp;gt; 'discover' }; &lt;br /&gt;
     ceph::key { 'client.bootstrap-osd':&lt;br /&gt;
          keyring =&amp;gt; '/var/lib/ceph/bootstrap-osd/ceph.keyring',&lt;br /&gt;
          secret =&amp;gt; $bootstrap_osd_key,&lt;br /&gt;
     }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /client/ inherits ceph-default { &lt;br /&gt;
      ceph::key { 'client.admin':&lt;br /&gt;
        secret =&amp;gt; $admin_key&lt;br /&gt;
     }&lt;br /&gt;
     ceph::client;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
* the '''osd*''' nodes only contain disks that are used for OSD and using the '''discover''' option to automatically use new disks and provision them as part of the cluster is acceptable, there is no risk of destroying unrelated data.&lt;br /&gt;
* when a node dies, all its disks can be placed in another machines and the OSDs will automatically be re-inserted in the cluster, even if an external journal is used&lt;br /&gt;
&lt;br /&gt;
===  I want to spawn a cluster configured with a puppetmaster as part of a continuous integration effort ===&lt;br /&gt;
&lt;br /&gt;
''Leveraging vagrant, vagrant-openstack, openstack''&lt;br /&gt;
* Ceph is used as a backend storage for various use cases&lt;br /&gt;
* There are tests to make sure the Ceph cluster was instantiated properly&lt;br /&gt;
* There are tests to make sure various other infrastructure components (or products) can use the Ceph cluster&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
=== High level requirements ===&lt;br /&gt;
&lt;br /&gt;
==== No complex cross host orchestration ====&lt;br /&gt;
&lt;br /&gt;
All cross host orchestration should be assumed to be managed outside of Puppet. Provided that it's dependencies have already been configured and are known, each component should support being adding without having to run Puppet on more than one node.&lt;br /&gt;
&lt;br /&gt;
For example&lt;br /&gt;
&lt;br /&gt;
* cinder-volume instances should be configured to join a Ceph cluster simply by running Puppet on that node&lt;br /&gt;
* OSD instances should be configured to join a cluster simply by running puppet agent on a node and targeting that role.&lt;br /&gt;
&lt;br /&gt;
All cross host orchestration should be assumed to be managed outside of Puppet. The Puppet implementation should only be concerned with&lt;br /&gt;
&lt;br /&gt;
* what components need to be defined (where these are implemented as classes)&lt;br /&gt;
* what data is required for those components (where that data is passed in a class parameters)&lt;br /&gt;
&lt;br /&gt;
==== Supporting versions  ====&lt;br /&gt;
&lt;br /&gt;
The Operating System versions supported must be tested with integration on the actual operating system. Although it is fairly to add support for an Operating System, it is prone to regressions if not tested. The per Operating System support strategy mimics the way OpenStack modules do it. &lt;br /&gt;
&lt;br /&gt;
The supported versions of the components that deal with the environment in which Ceph is used ( OpenStack, Cloudstack, Ganeti etc. ) are handled by each component on a case by case basis. There probably is too much heterogeneity to set a rule.&lt;br /&gt;
&lt;br /&gt;
==== Provide sensible defaults ====&lt;br /&gt;
&lt;br /&gt;
If the high level components ( osd + mon + mds + rgw for instance ) are included without any parameter, the result must be a functional Ceph cluster.&lt;br /&gt;
&lt;br /&gt;
==== Architectured to leverage Ceph to its full potential ====&lt;br /&gt;
&lt;br /&gt;
It means talking to the MON when configuring or modifying the cluster, using ceph-disk as a low level tool to create the storage required for an OSD, creating a minimal /etc/ceph/ceph.conf to allow a client to connect to the Ceph cluster. The MON exposes a very rich API ( either via the ceph cli or a REST API ) and it offers a great flexibility to the system administrator. It is unlikely that the first versions of the puppet module captures all of it. But it should be architectured to allow the casual contributor to add a new feature or a new variation without the need to workaround architectural limitations. &lt;br /&gt;
&lt;br /&gt;
The ceph-deploy utility is developed as part of the ceph project, to help people get up to speed as quickly as possible for test and POCs. Alfredo Deza made a compeling argument against using ceph-deploy as a helper for a puppet module. Because it is designed to hide some of the flexibility ceph offers for the sake of simplicity. An inconvenience that is incompatible with the goal of a puppet module designed to accommodate all use cases. &lt;br /&gt;
&lt;br /&gt;
=== Prefer cli over REST ===&lt;br /&gt;
&lt;br /&gt;
The ceph cli is preferred because the [http://ceph.com/docs/next/man/8/ceph-rest-api/ rest-api] requires the installation of an additional daemon.&lt;br /&gt;
&lt;br /&gt;
=== Module versioning ===&lt;br /&gt;
&lt;br /&gt;
Create a branch for each Ceph release ( stable/cuttlefish, stable/dumpling etc. ) and follow the same pattern as the OpenStack modules&lt;br /&gt;
&lt;br /&gt;
=== Support Ceph versions from cuttlefish ===&lt;br /&gt;
&lt;br /&gt;
Do not support Ceph versions released before cuttlefish&lt;br /&gt;
&lt;br /&gt;
== Integration tests ==&lt;br /&gt;
&lt;br /&gt;
All scenarios can probably be covered with 2 virtual machines, 2 interfaces and one disk attached to one of the machines. A number of scenarios can be based on a single machine, using directories instead of disks and a single interface.&lt;br /&gt;
&lt;br /&gt;
* use https://github.com/puppetlabs/rspec-system-puppet and check that it can be used with the vagrant openstack backend https://github.com/cloudbau/vagrant-openstack-plugin&lt;br /&gt;
* use openstack by running a script like this with a dedicated tenant to prevent breakage ( see http://ci.openstack.org/third_party.html )&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export OS_PASSWORD=admin_pass&lt;br /&gt;
export OS_AUTH_URL=http://127.0.0.1:5000/v2.0/&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_TENANT_NAME=openstack&lt;br /&gt;
&lt;br /&gt;
ssh -p 29418 review.example.com gerrit stream-events |&lt;br /&gt;
 while read event ; do&lt;br /&gt;
   if event is commit ; then&lt;br /&gt;
      git clone puppet-ceph from gerrit&lt;br /&gt;
      cd puppet-ceph &lt;br /&gt;
      bundle exec rake spec:system # https://github.com/puppetlabs/rspec-system-puppet#run-spec-tests&lt;br /&gt;
      if fail ; then&lt;br /&gt;
        ssh -p 29418 review.example.com \&lt;br /&gt;
          gerrit review -m '&amp;quot;Test failed&amp;quot;' --verified=-1 c0ff33&lt;br /&gt;
      fi&lt;br /&gt;
    fi&lt;br /&gt;
 done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Puppet user components ==&lt;br /&gt;
&lt;br /&gt;
This section outlines the roles and well as configuration components that are visible to the puppet user. They must be understandable for the system administrator willing to deploy Ceph for the first time.&lt;br /&gt;
&lt;br /&gt;
=== conf ===&lt;br /&gt;
&lt;br /&gt;
Although the key separator can either be space or underscore, only '''space''' is allowed to help with consistency. &lt;br /&gt;
&lt;br /&gt;
::[[User:Xarses|Xarses]] ([[User talk:Xarses|talk]]) hyphen is a also valid seperator. From my testing i found that the ini_file provider can not tell the difference in keys between &amp;quot;auth supported&amp;quot; and &amp;quot;auth_supported&amp;quot; which will lead to duplicate entries in ceph.conf if we aren't careful.&lt;br /&gt;
&lt;br /&gt;
::[[User:Dachary|Loic Dachary]] ([[User talk:Dachary|talk]]) : since [https://github.com/ceph/ceph-deploy/commit/53f46a8451dd8e10a3b9e8f2b191044f9863ae83 ceph-deploy enforces the use of _] and for the sake of consistency, it is probably better to use undercore instead of space.&lt;br /&gt;
&lt;br /&gt;
::[[User:Dachary|Loic Dachary]] ([[User talk:Dachary|talk]]) : bodep prefers ini, dalgaaf prefers concat, loic does not care but voted ini because there is more expertise, xarses and dmsimard +1 ini, mgagne does not object ini : it is going to be implemented as a provider such as nova_config.&lt;br /&gt;
&lt;br /&gt;
::[[User:Danny Al-Gaaf|Danny Al-Gaaf]] ([[User talk:Danny Al-Gaaf|talk]]) If the ini_file provider has a problems with space and underscore as separator, it would be one more reason to use concat since this would force the type of key separator used in the template. &lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::conf&lt;br /&gt;
* '''purpose''': keeps and writes [http://ceph.com/docs/master/rados/configuration/osd-config-ref/ config] and their options for the top level sections of the ceph config. This includes these sections:&lt;br /&gt;
** [global]&lt;br /&gt;
** [mon]&lt;br /&gt;
** [osd]&lt;br /&gt;
** [mds]&lt;br /&gt;
* '''interface''': every key that is needed to write the base config ... the whole list would be to long to written down here&lt;br /&gt;
* auth_enable - true or false, enables/disables cephx, defaults to true&lt;br /&gt;
::If enable is true, set the following in the [global] section of the conf file:&lt;br /&gt;
&lt;br /&gt;
        auth cluster required = cephx&lt;br /&gt;
        auth service required = cephx&lt;br /&gt;
        auth client required = cephx&lt;br /&gt;
        auth supported = cephx&lt;br /&gt;
&lt;br /&gt;
::If enable is false, set the following in the [global] section of the conf file:&lt;br /&gt;
&lt;br /&gt;
        auth cluster required = none&lt;br /&gt;
        auth service required = none&lt;br /&gt;
        auth client required = none&lt;br /&gt;
        auth supported = none&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::It should support [http://ceph.com/docs/master/rados/operations/authentication/#disabling-cephx disabling] or [http://ceph.com/docs/master/rados/operations/authentication/#enabling-cephx enabling] cephx when the values change. If it does not support updating, it must fail when changed on an existing Ceph cluster.&lt;br /&gt;
&lt;br /&gt;
Using a [https://github.com/puppetlabs/puppetlabs-inifile inifile] child provider ( such as [https://github.com/stackforge/puppet-cinder/blob/master/lib/puppet/provider/cinder_config/ini_setting.rb cinder_config] ) a setting would look like&lt;br /&gt;
&lt;br /&gt;
    ceph_conf {&lt;br /&gt;
      'GLOBAL/fsid': value =&amp;gt; $fsid;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
And create '''/etc/ceph/ceph.conf''' such as:&lt;br /&gt;
&lt;br /&gt;
    [global]&lt;br /&gt;
        fsid = 918340183294812038&lt;br /&gt;
&lt;br /&gt;
Improvements to be implemented later:&lt;br /&gt;
* If a key/value pair is modified in the *mon*, *osd* or *mds* sections, all daemons are [http://ceph.com/docs/master/rados/configuration/ceph-conf/#runtime-changes notified of the change] with ceph {daemon} tell * ....&lt;br /&gt;
&lt;br /&gt;
=== osd ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::osd &lt;br /&gt;
* '''purpose''': configures a ceph OSD using the ceph-disk helper and update the /etc/ceph/ceph.conf file with [osd.X] sections matching the osd found in /var/lib/ceph/osd&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** directory/disk - a disk or a directory to be used as a storage for the OSD.&lt;br /&gt;
** bootstrap-osd - the bootstrap-osd secret key (optional if cephx = none )&lt;br /&gt;
** dmcrypt - options needed to encrypt disks (optional)&lt;br /&gt;
&lt;br /&gt;
The generated [osd.X] section must contain the host and disk so that rcscript run the osd daemon at boot time.&lt;br /&gt;
&lt;br /&gt;
If the directory/disk is set to '''discover''', ceph-disk list is used to find unknown disks or partitions. All unknown disks are prepared with ceph-disk prepare. That effectively allows someone to say : use whatever disks are not in use for ceph and leave the rest alone. An operator would only have to add new disk and way for the next puppet client pass to have them integrated in the cluster. If a disk is removed, the OSD is  not launched at boot time and there is nothing to do. &lt;br /&gt;
&lt;br /&gt;
Support [https://github.com/ceph/ceph/blob/v0.61.9/src/ceph-disk#L2027 ceph-disk suppress]&lt;br /&gt;
&lt;br /&gt;
Here is what should happen on a node with at least one OSD&lt;br /&gt;
* common to all OSD on the same node:&lt;br /&gt;
** the /etc/ceph/ceph.conf file is setup with the IPs of the monitors&lt;br /&gt;
** [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/osd.py#L47 the /var/lib/ceph/bootstrap-osd/{cluster}.bootstrap-osd.keyring] file contains a user/key that is used to to create an OSD. The bootstrap-osd user key is usually the same for all OSD. For instance:&lt;br /&gt;
    [client.bootstrap-osd]&lt;br /&gt;
        key = AQCUg71RYEi7DxAAxlyC1KExxSnNJgim6lmuGA==&lt;br /&gt;
** The  user bootstrap-osd with this key with caps to bootstrap an OSD:&lt;br /&gt;
    $ ceph auth list&lt;br /&gt;
    ...&lt;br /&gt;
    client.bootstrap-osd&lt;br /&gt;
        key: AQCUg71RYEi7DxAAxlyC1KExxSnNJgim6lmuGA==&lt;br /&gt;
        caps: [mon] allow profile bootstrap-osd&lt;br /&gt;
* for each OSD &lt;br /&gt;
** in the same way [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/osd.py#L104 ceph-deploy prepare the disk] call ceph-disk-prepare that will [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L1031 set magic partition uuid] and trigger [https://github.com/ceph/ceph/blob/master/udev/95-ceph-osd.rules#L11 udev rules] to [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L453 ceph osd create]. When udev settles, the new osd is integrated into the cluster and uses its own key, created, registered to the MON and stored locally as a side effect of [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L1301 --mkkey]. The osd daemon is also run as a side effect of udev detecting the disk and calling [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L1414 /etc/init/ceph-osd.conf]. ceph-disk contains a [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L18 high level description of the process]&lt;br /&gt;
** '''dmcrypt''' is also handled by the udev logic ( details ??? keys ??? )&lt;br /&gt;
&lt;br /&gt;
At boot time the [https://github.com/ceph/ceph/blob/master/src/upstart/ceph-osd-all-starter.conf#L14 /var/lib/ceph/osd directory is explored] to discover all OSDs that need to be started. Operating systems for which the same logic is not implemented will need an additional script run at boot time to perform the same exploration until the default script is updated to add this capability.&lt;br /&gt;
&lt;br /&gt;
=== mds ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::mds &lt;br /&gt;
* '''purpose''': configures a ceph MDS, setup /etc/ceph/ceph.conf with the MONs IPs, declare the MDS to the cluster via the MON, optionaly set the key to allow the MDS to connect to the MONs&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** monitor_ips - list of ip addresses used to connect to the monitor servers&lt;br /&gt;
** key - the secret key for the id user&lt;br /&gt;
** id - the id of the user&lt;br /&gt;
&lt;br /&gt;
=== mon ===&lt;br /&gt;
&lt;br /&gt;
Creates the files and keyring supporting a mon, runs the daemon&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::mon&lt;br /&gt;
* '''purpose''': configures a ceph MON&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** cluster - cluster name ( defaults to ceph )&lt;br /&gt;
** id - the id of the mon&lt;br /&gt;
** ip_address - the ip addresses of the mon&lt;br /&gt;
** key - the mon. user key&lt;br /&gt;
&lt;br /&gt;
* add a [mon.$id] section to the conf file (depends on ceph::conf to write the base part of the config)&lt;br /&gt;
* if auth == cephx&lt;br /&gt;
** the mon. key is mandatory and need to be set by the user to be a valid ceph key. The documentation should contain an example key and explanations about how to [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/new.py#L20 create an auth key].&lt;br /&gt;
** [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/new.py#L86 writes the keyring] &lt;br /&gt;
*  installs the packages&lt;br /&gt;
* ceph-mon --id 0 --mkfs&lt;br /&gt;
* runs the mon daemon&lt;br /&gt;
&lt;br /&gt;
=== rbd ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::rbd&lt;br /&gt;
* '''purpose''': maps and mounts a rbd image, taking care of dependencies (packages, rbd kernel module, /etc/ceph/rbdmap, fstab)&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** name - the name of the image&lt;br /&gt;
** pool - the pool in which the image is&lt;br /&gt;
** mount_point - where the image will be mounted&lt;br /&gt;
** key - the secret key for the id user&lt;br /&gt;
** id - the id of the user&lt;br /&gt;
::[[User:dmsimard|David Moreau Simard]] ([[User talk:David Moreau Simard|talk]]) Should ceph::client be a dependency ?&lt;br /&gt;
&lt;br /&gt;
=== cephfs ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::cephfs&lt;br /&gt;
* '''purpose''': mounts a cephfs filesystem, taking care of dependencies (e.g, fstab, packages)&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** Lots - See http://ceph.com/docs/next/man/8/mount.ceph/&lt;br /&gt;
::[[User:dmsimard|David Moreau Simard]] ([[User talk:David Moreau Simard|talk]]) Should ceph::client be a dependency ?&lt;br /&gt;
&lt;br /&gt;
== Implementor components ==&lt;br /&gt;
&lt;br /&gt;
These components are dependencies of the Puppet user components and can be used by other components. They should be a library of components where the code common to at least two independant components ( think OpenStack and Cloudstack ) is included.&lt;br /&gt;
&lt;br /&gt;
=== repository  === &lt;br /&gt;
&lt;br /&gt;
Inspired by [https://github.com/stackforge/puppet-openstack/blob/master/manifests/repo.pp openstack::repo].&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::repo&lt;br /&gt;
* '''purpose''': use puppetlabs/apt to configure the official ceph repository so we can install ceph packages&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** release: target ceph release (cuttlefish, dumpling, etc)&lt;br /&gt;
&lt;br /&gt;
=== ceph client implementation ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::client &lt;br /&gt;
* '''purpose''': setup /etc/ceph/ceph.conf to connect to the Ceph cluster and install the ceph cli &lt;br /&gt;
* '''interface''':&lt;br /&gt;
** monitor_ips - list of ip addresses used to connect to the monitor servers&lt;br /&gt;
** client_id - name of the client to find the correct id for key&lt;br /&gt;
** keypath - path to the clients key file&lt;br /&gt;
&lt;br /&gt;
=== key ===&lt;br /&gt;
&lt;br /&gt;
Keyring management, authentication. It would be a class to create keys for new users (e.g. a user that can create RBDs or use the Objectstore) which may require special access rights. But would also be used by the other classes like ceph::mon or ceph::osd to place e.g. the shared 'client.admin' or 'mon.' keys. &lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::key&lt;br /&gt;
* '''purpose''': handles ceph keys (cephx), generates keys, creates keyring files, inject keys into or delete keys from the cluster/keyring via ceph and ceph-authtool tools.&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** secret - key secret&lt;br /&gt;
** keyring_path - path to the keyring&lt;br /&gt;
** cap_mon/cap_osd/cap_mds - cephx capabilities&lt;br /&gt;
** user/group/mode: settings for the keyring file if needed&lt;br /&gt;
** inject - options to inject a key into the cluster&lt;br /&gt;
&lt;br /&gt;
See [https://github.com/TelekomCloud/puppet-ceph/blob/rc/eisbrecher/manifests/key.pp key.pp] for an example implementation of this semantic.&lt;br /&gt;
&lt;br /&gt;
=== pool ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::pool&lt;br /&gt;
* '''purpose''': manage operations on the pools in the cluster such as: create/delete pools, set PG/PGP number&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** pool_name - name of the pool&lt;br /&gt;
** create - if to create a new pool&lt;br /&gt;
** delete - if to delete an existing pool&lt;br /&gt;
** pg_num - number of Placement Groups (PGs) for a pool, if the pool already exists this may increase the number of PGs if the current value is lower&lt;br /&gt;
** pgp_num - same as for pg_num&lt;br /&gt;
** replica_level - increase or decrease the replica level of a pool&lt;br /&gt;
&lt;br /&gt;
== OpenStack components ==&lt;br /&gt;
&lt;br /&gt;
ceph specific configuration for cinder/glance (already provided by the puppet-cinder and puppet-glance modules in the volume/rdb and backend/rdb classes). RGW Keystone is noted below&lt;br /&gt;
&lt;br /&gt;
:: --[[User:Xarses|xarses]] ([[User talk:Xarses|talk]]) RGW keystone should be included in the ceph module as RGW is the consumer of the keystone service. Unlike cinder/glance where they are consumers of ceph.&lt;br /&gt;
&lt;br /&gt;
== RadosGW components ==&lt;br /&gt;
&lt;br /&gt;
The RadosGW is developped as an integral part of Ceph. It is however not required to deploy a cluster and should be treated as any client application of the cluster.&lt;br /&gt;
&lt;br /&gt;
=== rgw ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::rgw&lt;br /&gt;
* '''purpose''': configures a ceph radosgw , setup /etc/ceph/ceph.conf with the MONs IPs, optionaly set the key to allow the OSD to connect to the MONs&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** monitor_ips - list of ip addresses used to connect to the monitor servers &lt;br /&gt;
** key - the secret key for the id user&lt;br /&gt;
** id - the id of the user&lt;br /&gt;
** rgw_data - the path where the radosgw data should be stored&lt;br /&gt;
** fcgi_file - path to the fcgi file e.g. /var/www/s3gw.fcgi&lt;br /&gt;
:: [[User:Danny Al-Gaaf|Danny Al-Gaaf]] ([[User talk:Danny Al-Gaaf|talk]]) the monitor_ips are not needed: IMO ceph::conf should provide these information to all other&lt;br /&gt;
:: --[[User:Xarses|xarses]] ([[User talk:Xarses|talk]]) agree with Danny; we are missing:&lt;br /&gt;
** user - user to run rados as as well as own files&lt;br /&gt;
** host - hostname for this ini section&lt;br /&gt;
** keyring_path - path to key file&lt;br /&gt;
** log_file - where to write logs to&lt;br /&gt;
** rgw_dns_name - dns name (may include wildcard ) to use with s3 api calls&lt;br /&gt;
** rgw_socket_path - path to socket file&lt;br /&gt;
** rgw_print_continue - (bool) if we are going to send 100 codes to the client&lt;br /&gt;
&lt;br /&gt;
:: --[[User:Xarses|xarses]] ([[User talk:Xarses|talk]]) also we should include apache magic here to setup vhost and script-server. in which case we should also support *port* param.&lt;br /&gt;
&lt;br /&gt;
=== rgw kestone ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::rgw::keystone&lt;br /&gt;
* '''purpose''': extends radosgw configuration to be able to retrieve auth from keystone tokens and setup keystone endpoint&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** rgw_keystone_url - the internal or admin url for keystone&lt;br /&gt;
** rgw_keystone_admin_token - the admin token for keystone&lt;br /&gt;
** rgw_keystone_accepted_roles - which roles should we accept from keystone&lt;br /&gt;
** rgw_keystone_token_cache_size - how many tokens to keep cached, not useful if not using PKI as every token is checked &lt;br /&gt;
** rgw_keystone_revocation_interval - interval to check for expired tokens, not useful if not using PKI tokens (if not, set to high value)&lt;br /&gt;
** use_pki - (bool) to determine if keystone is using token_format = PKI and if so do PKI signing parts&lt;br /&gt;
** nss_db_path - path to NSS &amp;lt; - &amp;gt; keystone tokens db files&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== rgw_user ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::rgw_user&lt;br /&gt;
* '''purpose''': create/remove users and Swift users for the RadosGW S3/Swift API&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** user - username&lt;br /&gt;
** key - secret key (could get generated if needed)&lt;br /&gt;
** swift_user - username for the Swift API user&lt;br /&gt;
** swift_key - secret key for the Swift API user&lt;br /&gt;
&lt;br /&gt;
== Related tools and implementations ==&lt;br /&gt;
&lt;br /&gt;
* deploy ceph : ceph-deploy&lt;br /&gt;
&lt;br /&gt;
  for test / POC purposes&lt;br /&gt;
  https://github.com/ceph/ceph-deploy&lt;br /&gt;
&lt;br /&gt;
  maintainer: Alfredo Deza&lt;br /&gt;
&lt;br /&gt;
* deploy ceph with puppet : puppet-cephdeploy&lt;br /&gt;
&lt;br /&gt;
  relies on ceph-deploy&lt;br /&gt;
  https://github.com/dontalton/puppet-cephdeploy/&lt;br /&gt;
&lt;br /&gt;
  maintainer: Don Talton&lt;br /&gt;
&lt;br /&gt;
* deploy ceph with puppet : puppet-ceph&lt;br /&gt;
&lt;br /&gt;
  developped in 2012 but still useful, upstream&lt;br /&gt;
  https://github.com/enovance/puppet-ceph&lt;br /&gt;
&lt;br /&gt;
  maintainer: community&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  fork of puppet-ceph, updated recently&lt;br /&gt;
  https://github.com/TelekomCloud/puppet-ceph/tree/rc/eisbrecher&lt;br /&gt;
&lt;br /&gt;
  maintainer: Deutsche Telekom AG (DTAG)&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack : ceph docs&lt;br /&gt;
&lt;br /&gt;
  manual integration&lt;br /&gt;
  http://ceph.com/docs/next/rbd/rbd-openstack/&lt;br /&gt;
   maintainer: John Wilkins + Josh Durgin&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack with puppet : stackforge&lt;br /&gt;
&lt;br /&gt;
  https://github.com/stackforge/puppet-glance/blob/stable/grizzly/manifests/backend/rbd.pp&lt;br /&gt;
  https://github.com/stackforge/puppet-cinder/blob/stable/grizzly/manifests/volume/rbd.pp&lt;br /&gt;
&lt;br /&gt;
  maintainer: community&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack with puppet : COI&lt;br /&gt;
&lt;br /&gt;
  targeting Cisco use case&lt;br /&gt;
  https://github.com/CiscoSystems/puppet-coe/tree/grizzly/manifests/ceph&lt;br /&gt;
  http://docwiki.cisco.com/wiki/OpenStack:Ceph-COI-Installation&lt;br /&gt;
&lt;br /&gt;
  maintainer : Don Talton + Robert Starmer&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack with puppet : mirantis&lt;br /&gt;
&lt;br /&gt;
  in the context of Fuel&lt;br /&gt;
  https://github.com/Mirantis/fuel/tree/master/deployment/puppet/ceph&lt;br /&gt;
  https://github.com/Mirantis/fuel/blob/master/deployment/puppet/cinder/manifests/volume/ceph.pp&lt;br /&gt;
  https://github.com/Mirantis/fuel/blob/master/deployment/puppet/glance/manifests/backend/ceph.pp&lt;br /&gt;
&lt;br /&gt;
  maintainer : Andrew Woodward&lt;br /&gt;
&lt;br /&gt;
* openstack with puppet : openstack-installer&lt;br /&gt;
&lt;br /&gt;
  data driven approach to deploy OpenStack&lt;br /&gt;
  https://github.com/CiscoSystems/openstack-installer/&lt;br /&gt;
&lt;br /&gt;
  maintainer: Robert Starmer + Dan Bode&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=34384</id>
		<title>Puppet/bp-cinder-volume-multi-backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=34384"/>
				<updated>2013-10-29T22:15:08Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: /* Use two or more cinder-volume backends and assign them to different types */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
&lt;br /&gt;
We should be able to support [[Cinder-multi-backend]]&lt;br /&gt;
&lt;br /&gt;
This moving this way would allow us to support multiple concurent backends.&lt;br /&gt;
&lt;br /&gt;
==user story==&lt;br /&gt;
&lt;br /&gt;
===Use a single cinder-volume backend===&lt;br /&gt;
currently you can&lt;br /&gt;
&lt;br /&gt;
    class { 'cinder::volume': }&lt;br /&gt;
    &lt;br /&gt;
    class { 'cinder::volume::iscsi':&lt;br /&gt;
      iscsi_ip_address =&amp;gt; '10.0.0.2',&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
===Use two or more cinder-volume backends and assign them to different types===&lt;br /&gt;
&lt;br /&gt;
  class { 'cinder::volume': }&lt;br /&gt;
  &lt;br /&gt;
  cinder::backend::rbd {'images':&lt;br /&gt;
    rbd_user =&amp;gt; 'images',&lt;br /&gt;
    rbd_pool =&amp;gt; 'images',&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  cinder::backend::iscsi {'local-lvm':&lt;br /&gt;
    iscsi_ip_address =&amp;gt; '10.0.0.2',&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  cinder::volume_type {'standard':&lt;br /&gt;
    backends =&amp;gt; ['images', 'local-lvm']&lt;br /&gt;
&lt;br /&gt;
===Use three or more cinder-volume backends and assign them two to one type and the other to another ===&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
&lt;br /&gt;
# must configure as many supported backends as possible&lt;br /&gt;
# must be comptible with only defining one single backend&lt;br /&gt;
# must configure cinder volume_type [http://www.sebastien-han.fr/blog/2013/04/25/ceph-and-cinder-multi-backend/ example]&lt;br /&gt;
# if types are default, must allow for a default type (so scheduler can consider multiple seperate providers equally)&lt;br /&gt;
&lt;br /&gt;
==Components==&lt;br /&gt;
&lt;br /&gt;
===backends===&lt;br /&gt;
===volume_types===&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=34383</id>
		<title>Puppet/bp-cinder-volume-multi-backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=34383"/>
				<updated>2013-10-29T22:14:47Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
&lt;br /&gt;
We should be able to support [[Cinder-multi-backend]]&lt;br /&gt;
&lt;br /&gt;
This moving this way would allow us to support multiple concurent backends.&lt;br /&gt;
&lt;br /&gt;
==user story==&lt;br /&gt;
&lt;br /&gt;
===Use a single cinder-volume backend===&lt;br /&gt;
currently you can&lt;br /&gt;
&lt;br /&gt;
    class { 'cinder::volume': }&lt;br /&gt;
    &lt;br /&gt;
    class { 'cinder::volume::iscsi':&lt;br /&gt;
      iscsi_ip_address =&amp;gt; '10.0.0.2',&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
===Use two or more cinder-volume backends and assign them to different types===&lt;br /&gt;
&lt;br /&gt;
  class { 'cinder::volume': }&lt;br /&gt;
  &lt;br /&gt;
  cinder::backend::rbd {'images':&lt;br /&gt;
    rbd_user =&amp;gt; 'images',&lt;br /&gt;
    rbd_pool =&amp;gt; 'images',&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  cinder::backend::iscsi {'local-lvm':&lt;br /&gt;
    iscsi_ip_address =&amp;gt; '10.0.0.2',&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  cinder::volume_type {'standard':&lt;br /&gt;
    backends =&amp;gt; ['images', 'local-lvm']&lt;br /&gt;
  &lt;br /&gt;
  cinder::backend::rbd {'images':&lt;br /&gt;
    rbd_user =&amp;gt; 'images',&lt;br /&gt;
    rbd_pool =&amp;gt; 'images',&lt;br /&gt;
    type = 'silver',&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Use three or more cinder-volume backends and assign them two to one type and the other to another ===&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
&lt;br /&gt;
# must configure as many supported backends as possible&lt;br /&gt;
# must be comptible with only defining one single backend&lt;br /&gt;
# must configure cinder volume_type [http://www.sebastien-han.fr/blog/2013/04/25/ceph-and-cinder-multi-backend/ example]&lt;br /&gt;
# if types are default, must allow for a default type (so scheduler can consider multiple seperate providers equally)&lt;br /&gt;
&lt;br /&gt;
==Components==&lt;br /&gt;
&lt;br /&gt;
===backends===&lt;br /&gt;
===volume_types===&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33819</id>
		<title>Puppet/bp-cinder-volume-multi-backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33819"/>
				<updated>2013-10-23T23:08:50Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
&lt;br /&gt;
We should be able to support [[Cinder-multi-backend]]&lt;br /&gt;
&lt;br /&gt;
This moving this way would allow us to support multiple concurent backends.&lt;br /&gt;
&lt;br /&gt;
==user story==&lt;br /&gt;
&lt;br /&gt;
===Use a single cinder-volume backend===&lt;br /&gt;
currently you can&lt;br /&gt;
&lt;br /&gt;
    class { 'cinder::volume': }&lt;br /&gt;
    &lt;br /&gt;
    class { 'cinder::volume::iscsi':&lt;br /&gt;
      iscsi_ip_address =&amp;gt; '10.0.0.2',&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
===Use two or more cinder-volume backends and assign them to different types===&lt;br /&gt;
&lt;br /&gt;
  class { 'cinder::volume': }&lt;br /&gt;
  &lt;br /&gt;
  cinder::backend::rbd {'images':&lt;br /&gt;
    rbd_user =&amp;gt; 'images',&lt;br /&gt;
    rbd_pool =&amp;gt; 'images',&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  cinder::backend::iscsi {'local-lvm':&lt;br /&gt;
    iscsi_ip_address =&amp;gt; '10.0.0.2',&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  cinder::volume_type {'standard':&lt;br /&gt;
    backends =&amp;gt; ['images', 'local-lvm']&lt;br /&gt;
&lt;br /&gt;
alternatly&lt;br /&gt;
&lt;br /&gt;
  #init cinder-volume and config&lt;br /&gt;
  class { '::cinder::volume': }&lt;br /&gt;
  &lt;br /&gt;
  #different backends have different settings so they should be called alone&lt;br /&gt;
  cinder::backend::iscsi { 'local-lvm':&lt;br /&gt;
    iscsi_ip_address =&amp;gt; '10.108.1.1',&lt;br /&gt;
    type =&amp;gt; 'bronze',&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  cinder::backend::rbd {'images':&lt;br /&gt;
    rbd_user =&amp;gt; 'images',&lt;br /&gt;
    rbd_pool =&amp;gt; 'images',&lt;br /&gt;
    type = 'silver',&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Use three or more cinder-volume backends and assign them two to one type and the other to another ===&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
&lt;br /&gt;
# must configure as many supported backends as possible&lt;br /&gt;
# must be comptible with only defining one single backend&lt;br /&gt;
# must configure cinder volume_type [http://www.sebastien-han.fr/blog/2013/04/25/ceph-and-cinder-multi-backend/ example]&lt;br /&gt;
# if types are default, must allow for a default type (so scheduler can consider multiple seperate providers equally)&lt;br /&gt;
&lt;br /&gt;
==Components==&lt;br /&gt;
&lt;br /&gt;
===backends===&lt;br /&gt;
===volume_types===&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33648</id>
		<title>Puppet/bp-cinder-volume-multi-backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33648"/>
				<updated>2013-10-22T23:46:35Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
&lt;br /&gt;
We should be able to support [[Cinder-multi-backend]]&lt;br /&gt;
&lt;br /&gt;
This moving this way would allow us to support multiple concurent backends.&lt;br /&gt;
&lt;br /&gt;
==user story==&lt;br /&gt;
&lt;br /&gt;
===Use a single cinder-volume backend===&lt;br /&gt;
currently you can&lt;br /&gt;
&lt;br /&gt;
    class { 'cinder::volume': }&lt;br /&gt;
    &lt;br /&gt;
    class { 'cinder::volume::iscsi':&lt;br /&gt;
      iscsi_ip_address =&amp;gt; '10.0.0.2',&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
===Use two or more cinder-volume backends and assign them to different types===&lt;br /&gt;
&lt;br /&gt;
  class { 'cinder::volume': }&lt;br /&gt;
  &lt;br /&gt;
  cinder::backend::rbd {'images':&lt;br /&gt;
    rbd_user =&amp;gt; 'images',&lt;br /&gt;
    rbd_pool =&amp;gt; 'images',&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  cinder::backend::iscsi {'local-lvm':&lt;br /&gt;
    iscsi_ip_address =&amp;gt; '10.0.0.2',&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  cinder::volume_type {'standard':&lt;br /&gt;
    backends =&amp;gt; ['images', 'local-lvm']&lt;br /&gt;
&lt;br /&gt;
===Use three or more cinder-volume backends and assign them two to one type and the other to another ===&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
&lt;br /&gt;
# must configure as many supported backends as possible&lt;br /&gt;
# must be comptible with only defining one single backend&lt;br /&gt;
# must configure cinder volume_type [http://www.sebastien-han.fr/blog/2013/04/25/ceph-and-cinder-multi-backend/ example]&lt;br /&gt;
# if types are default, must allow for a default type (so scheduler can consider multiple seperate providers equally)&lt;br /&gt;
&lt;br /&gt;
==Components==&lt;br /&gt;
&lt;br /&gt;
===backends===&lt;br /&gt;
===volume_types===&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33647</id>
		<title>Puppet/bp-cinder-volume-multi-backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33647"/>
				<updated>2013-10-22T23:30:33Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: /* Use two or more cinder-volume backends and assign them to different types */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
&lt;br /&gt;
We should be able to support [https://wiki.openstack.org/wiki/Cinder-multi-backend Cinder-multi-backend]&lt;br /&gt;
&lt;br /&gt;
This moving this way would allow us to support multiple concurent backends.&lt;br /&gt;
&lt;br /&gt;
==user story==&lt;br /&gt;
&lt;br /&gt;
===Use a single cinder-volume backend===&lt;br /&gt;
currently you can&lt;br /&gt;
&lt;br /&gt;
    class { 'cinder::volume': }&lt;br /&gt;
    &lt;br /&gt;
    class { 'cinder::volume::iscsi':&lt;br /&gt;
      iscsi_ip_address =&amp;gt; '10.0.0.2',&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
===Use two or more cinder-volume backends and assign them to different types===&lt;br /&gt;
&lt;br /&gt;
  class { 'cinder::volume': }&lt;br /&gt;
  &lt;br /&gt;
  cinder::backend::rbd {'images':&lt;br /&gt;
    rbd_user =&amp;gt; 'images',&lt;br /&gt;
    rbd_pool =&amp;gt; 'images',&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  cinder::backend::iscsi {'local-lvm':&lt;br /&gt;
    iscsi_ip_address =&amp;gt; '10.0.0.2',&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  cinder::type {'standard':&lt;br /&gt;
    backends =&amp;gt; ['images', 'local-lvm']&lt;br /&gt;
&lt;br /&gt;
===Use three or more cinder-volume backends and assign them two to one type and the other to another ===&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
&lt;br /&gt;
# must configure as many supported backends as possible&lt;br /&gt;
# must be comptible with only defining one single backend&lt;br /&gt;
# must configure cinder type [http://www.sebastien-han.fr/blog/2013/04/25/ceph-and-cinder-multi-backend/ example]&lt;br /&gt;
# if types are default, must allow for a default type (so scheduler can consider multiple seperate providers equally)&lt;br /&gt;
&lt;br /&gt;
==Components==&lt;br /&gt;
&lt;br /&gt;
===backends===&lt;br /&gt;
===storage_types===&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33645</id>
		<title>Puppet/bp-cinder-volume-multi-backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33645"/>
				<updated>2013-10-22T23:19:30Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: /* Use a single cinder-volume backend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
&lt;br /&gt;
We should be able to support [https://wiki.openstack.org/wiki/Cinder-multi-backend Cinder-multi-backend]&lt;br /&gt;
&lt;br /&gt;
This moving this way would allow us to support multiple concurent backends.&lt;br /&gt;
&lt;br /&gt;
==user story==&lt;br /&gt;
&lt;br /&gt;
===Use a single cinder-volume backend===&lt;br /&gt;
currently you can&lt;br /&gt;
&lt;br /&gt;
    class { 'cinder::volume': }&lt;br /&gt;
    &lt;br /&gt;
    class { 'cinder::volume::iscsi':&lt;br /&gt;
      iscsi_ip_address =&amp;gt; '10.0.0.2',&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
===Use two or more cinder-volume backends and assign them to different types===&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
===Use three or more cinder-volume backends and assign them two to one type and the other to another ===&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
&lt;br /&gt;
# must configure as many supported backends as possible&lt;br /&gt;
# must be comptible with only defining one single backend&lt;br /&gt;
# must configure cinder type [http://www.sebastien-han.fr/blog/2013/04/25/ceph-and-cinder-multi-backend/ example]&lt;br /&gt;
# if types are default, must allow for a default type (so scheduler can consider multiple seperate providers equally)&lt;br /&gt;
&lt;br /&gt;
==Components==&lt;br /&gt;
&lt;br /&gt;
===backends===&lt;br /&gt;
===storage_types===&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33644</id>
		<title>Puppet/bp-cinder-volume-multi-backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33644"/>
				<updated>2013-10-22T23:17:02Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: /* Use a single cinder-volume backend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
&lt;br /&gt;
We should be able to support [https://wiki.openstack.org/wiki/Cinder-multi-backend Cinder-multi-backend]&lt;br /&gt;
&lt;br /&gt;
This moving this way would allow us to support multiple concurent backends.&lt;br /&gt;
&lt;br /&gt;
==user story==&lt;br /&gt;
&lt;br /&gt;
===Use a single cinder-volume backend===&lt;br /&gt;
&lt;br /&gt;
    class { 'cinder::volume': }&lt;br /&gt;
    &lt;br /&gt;
    class { 'cinder::volume::iscsi':&lt;br /&gt;
      iscsi_ip_address =&amp;gt; '10.0.0.2',&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
===Use two or more cinder-volume backends and assign them to different types===&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
===Use three or more cinder-volume backends and assign them two to one type and the other to another ===&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
&lt;br /&gt;
# must configure as many supported backends as possible&lt;br /&gt;
# must be comptible with only defining one single backend&lt;br /&gt;
# must configure cinder type [http://www.sebastien-han.fr/blog/2013/04/25/ceph-and-cinder-multi-backend/ example]&lt;br /&gt;
# if types are default, must allow for a default type (so scheduler can consider multiple seperate providers equally)&lt;br /&gt;
&lt;br /&gt;
==Components==&lt;br /&gt;
&lt;br /&gt;
===backends===&lt;br /&gt;
===storage_types===&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33643</id>
		<title>Puppet/bp-cinder-volume-multi-backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33643"/>
				<updated>2013-10-22T22:52:54Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
&lt;br /&gt;
We should be able to support [https://wiki.openstack.org/wiki/Cinder-multi-backend Cinder-multi-backend]&lt;br /&gt;
&lt;br /&gt;
This moving this way would allow us to support multiple concurent backends.&lt;br /&gt;
&lt;br /&gt;
==user story==&lt;br /&gt;
&lt;br /&gt;
===Use a single cinder-volume backend===&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
===Use two or more cinder-volume backends and assign them to different types===&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
===Use three or more cinder-volume backends and assign them two to one type and the other to another ===&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
&lt;br /&gt;
# must configure as many supported backends as possible&lt;br /&gt;
# must be comptible with only defining one single backend&lt;br /&gt;
# must configure cinder type [http://www.sebastien-han.fr/blog/2013/04/25/ceph-and-cinder-multi-backend/ example]&lt;br /&gt;
# if types are default, must allow for a default type (so scheduler can consider multiple seperate providers equally)&lt;br /&gt;
&lt;br /&gt;
==Components==&lt;br /&gt;
&lt;br /&gt;
===backends===&lt;br /&gt;
===storage_types===&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33640</id>
		<title>Puppet/bp-cinder-volume-multi-backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33640"/>
				<updated>2013-10-22T22:12:07Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Blueprint for cinder-volume to support multiple concurent storage drivers=&lt;br /&gt;
&lt;br /&gt;
We should be able to support [https://wiki.openstack.org/wiki/Cinder-multi-backend Cinder-multi-backend]&lt;br /&gt;
&lt;br /&gt;
This page has been created to start tracking discussion on direction prior to implmentation.&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33638</id>
		<title>Puppet/bp-cinder-volume-multi-backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33638"/>
				<updated>2013-10-22T22:10:59Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Blueprint for cinder-volume to support multiple concurent storage drivers=&lt;br /&gt;
&lt;br /&gt;
We should be able to support [[https://wiki.openstack.org/wiki/Cinder-multi-backend]]&lt;br /&gt;
&lt;br /&gt;
This page has been created to start tracking discussion on direction prior to implmentation.&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33637</id>
		<title>Puppet/bp-cinder-volume-multi-backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Puppet/bp-cinder-volume-multi-backend&amp;diff=33637"/>
				<updated>2013-10-22T22:08:02Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: init&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;init.&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Puppet/ceph-blueprint&amp;diff=33452</id>
		<title>Puppet/ceph-blueprint</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Puppet/ceph-blueprint&amp;diff=33452"/>
				<updated>2013-10-21T21:01:21Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: remove stupid dupes i added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
This document is intended to capture requirements for a single [https://launchpad.net/puppet-ceph puppet-ceph module].&lt;br /&gt;
&lt;br /&gt;
Very much like vswitch, Ceph is not exclusively used in the context of OpenStack. There is however a significant community relying on puppet to deploy Ceph in the context of OpenStack, as is shown in the [#Related_tools_and_implementations|inventory of the existing efforts] Having a puppet ceph module under the umbrella of the stackforge infrastructure helps federate the efforts while providing a workflow that will improve the overall quality of the module.&lt;br /&gt;
&lt;br /&gt;
* [https://review.openstack.org/#/q/status:open+project:stackforge/puppet-ceph,n,z gerrit review page]&lt;br /&gt;
* [https://launchpad.net/puppet-ceph puppet-ceph at launchpad]&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
Almost each component of this module deserve a discussion and it would take a long time to agree on everything before getting something useful. The following list sets the order in which each module is going to be implemented. Each step must be a useable puppet module, unit tested and including integration tests.&lt;br /&gt;
&lt;br /&gt;
* [[#conf|conf]]&lt;br /&gt;
* [[#key|key]]&lt;br /&gt;
* [[#mon|mon]]&lt;br /&gt;
* [[#osd|osd]]&lt;br /&gt;
* [[#pool|pool]]&lt;br /&gt;
* [[#rbd|rbd]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
=== I want to try this module, heard of ceph, want to see it in action ===&lt;br /&gt;
&lt;br /&gt;
    /node/ { &lt;br /&gt;
     ceph::conf { auth_enable: false };&lt;br /&gt;
     ceph::mon; &lt;br /&gt;
     ceph::osd { '/srv/osd1' }; &lt;br /&gt;
     ceph::osd { '/srv/osd2' }; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
* install puppet, &lt;br /&gt;
* paste this in site.pp and replace /node/ with the name of your current node, &lt;br /&gt;
* puppet apply site.pp , &lt;br /&gt;
* ceph -s and see that it works&lt;br /&gt;
&lt;br /&gt;
=== I want to run benchmarks on three new machines ===&lt;br /&gt;
&lt;br /&gt;
* There are four machines, 3 OSD, 1 MON and one machine that is the client from which the user runs commands.&lt;br /&gt;
* install puppetmaster and create site.pp with:&lt;br /&gt;
&lt;br /&gt;
    /ceph-default/ {&lt;br /&gt;
      ceph::conf { auth_enable: false };&lt;br /&gt;
      ceph::conf { 'mon host': 'node1' }; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /node1/ inherits ceph-default { &lt;br /&gt;
     ceph::mon; &lt;br /&gt;
     ceph::osd; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /node2/, /node3/ inherits ceph-default { &lt;br /&gt;
     ceph::osd; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /client/ inherits ceph-default { &lt;br /&gt;
     ceph::client;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
* ssh client&lt;br /&gt;
* rados bench &lt;br /&gt;
* interpret the results&lt;br /&gt;
&lt;br /&gt;
===  I want to spawn a cluster configured with a puppetmaster as part of a continuous integration effort ===&lt;br /&gt;
&lt;br /&gt;
''Leveraging vagrant, vagrant-openstack, openstack''&lt;br /&gt;
* Ceph is used as a backend storage for various use cases&lt;br /&gt;
* There are tests to make sure the Ceph cluster was instantiated properly&lt;br /&gt;
* There are tests to make sure various other infrastructure components (or products) can use the Ceph cluster&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
=== High level requirements ===&lt;br /&gt;
&lt;br /&gt;
==== No complex cross host orchestration ====&lt;br /&gt;
&lt;br /&gt;
All cross host orchestration should be assumed to be managed outside of Puppet. Provided that it's dependencies have already been configured and are known, each component should support being adding without having to run Puppet on more than one node.&lt;br /&gt;
&lt;br /&gt;
For example&lt;br /&gt;
&lt;br /&gt;
* cinder-volume instances should be configured to join a Ceph cluster simply by running Puppet on that node&lt;br /&gt;
* OSD instances should be configured to join a cluster simply by running puppet agent on a node and targeting that role.&lt;br /&gt;
&lt;br /&gt;
All cross host orchestration should be assumed to be managed outside of Puppet. The Puppet implementation should only be concerned with&lt;br /&gt;
&lt;br /&gt;
* what components need to be defined (where these are implemented as classes)&lt;br /&gt;
* what data is required for those components (where that data is passed in a class parameters)&lt;br /&gt;
&lt;br /&gt;
==== Supporting versions  ====&lt;br /&gt;
&lt;br /&gt;
The Operating System versions supported must be tested with integration on the actual operating system. Although it is fairly to add support for an Operating System, it is prone to regressions if not tested. The per Operating System support strategy mimics the way OpenStack modules do it. &lt;br /&gt;
&lt;br /&gt;
The supported versions of the components that deal with the environment in which Ceph is used ( OpenStack, Cloudstack, Ganeti etc. ) are handled by each component on a case by case basis. There probably is too much heterogeneity to set a rule.&lt;br /&gt;
&lt;br /&gt;
==== Provide sensible defaults ====&lt;br /&gt;
&lt;br /&gt;
If the high level components ( osd + mon + mds + rgw for instance ) are included without any parameter, the result must be a functional Ceph cluster.&lt;br /&gt;
&lt;br /&gt;
==== Architectured to leverage Ceph to its full potential ====&lt;br /&gt;
&lt;br /&gt;
It means talking to the MON when configuring or modifying the cluster, using ceph-disk as a low level tool to create the storage required for an OSD, creating a minimal /etc/ceph/ceph.conf to allow a client to connect to the Ceph cluster. The MON exposes a very rich API ( either via the ceph cli or a REST API ) and it offers a great flexibility to the system administrator. It is unlikely that the first versions of the puppet module captures all of it. But it should be architectured to allow the casual contributor to add a new feature or a new variation without the need to workaround architectural limitations. &lt;br /&gt;
&lt;br /&gt;
The ceph-deploy utility is developed as part of the ceph project, to help people get up to speed as quickly as possible for test and POCs. Alfredo Deza made a compeling argument against using ceph-deploy as a helper for a puppet module. Because it is designed to hide some of the flexibility ceph offers for the sake of simplicity. An inconvenience that is incompatible with the goal of a puppet module designed to accommodate all use cases. &lt;br /&gt;
&lt;br /&gt;
=== Prefer cli over REST ===&lt;br /&gt;
&lt;br /&gt;
The ceph cli is preferred because the [http://ceph.com/docs/next/man/8/ceph-rest-api/ rest-api] requires the installation of an additional daemon.&lt;br /&gt;
&lt;br /&gt;
=== Module versioning ===&lt;br /&gt;
&lt;br /&gt;
Create a branch for each Ceph release ( stable/cuttlefish, stable/dumpling etc. ) and follow the same pattern as the OpenStack modules&lt;br /&gt;
&lt;br /&gt;
=== Support Ceph versions from cuttlefish ===&lt;br /&gt;
&lt;br /&gt;
Do not support Ceph versions released before cuttlefish&lt;br /&gt;
&lt;br /&gt;
== Integration tests ==&lt;br /&gt;
&lt;br /&gt;
All scenarios can probably be covered with 2 virtual machines, 2 interfaces and one disk attached to one of the machines. A number of scenarios can be based on a single machine, using directories instead of disks and a single interface.&lt;br /&gt;
&lt;br /&gt;
Use https://github.com/puppetlabs/rspec-system-puppet&lt;br /&gt;
&lt;br /&gt;
::[[User:Dachary|Loic Dachary]] ([[User talk:Dachary|talk]]) :  I mean it would have to somehow leverage things ( what ? how ? ) in the openstack-ci infrastructure ?&lt;br /&gt;
&lt;br /&gt;
== Puppet user components ==&lt;br /&gt;
&lt;br /&gt;
This section outlines the roles and well as configuration components that are visible to the puppet user. They must be understandable for the system administrator willing to deploy Ceph for the first time.&lt;br /&gt;
&lt;br /&gt;
=== conf ===&lt;br /&gt;
&lt;br /&gt;
Although the key separator can either be space or underscore, only '''space''' is allowed to help with consistency. &lt;br /&gt;
&lt;br /&gt;
::[[User:Xarses|Xarses]] ([[User talk:Xarses|talk]]) hyphen is a also valid seperator. From my testing i found that the ini_file provider can not tell the difference in keys between &amp;quot;auth supported&amp;quot; and &amp;quot;auth_supported&amp;quot; which will lead to duplicate entries in ceph.conf if we aren't careful.&lt;br /&gt;
&lt;br /&gt;
::[[User:Dachary|Loic Dachary]] ([[User talk:Dachary|talk]]) : since [https://github.com/ceph/ceph-deploy/commit/53f46a8451dd8e10a3b9e8f2b191044f9863ae83 ceph-deploy enforces the use of _] and for the sake of consistency, it is probably better to use undercore instead of space.&lt;br /&gt;
&lt;br /&gt;
::[[User:Dachary|Loic Dachary]] ([[User talk:Dachary|talk]]) : bodep prefers ini, dalgaaf prefers concat, loic does not care but voted ini because there is more expertise, xarses and dmsimard +1 ini, mgagne does not object ini : it is going to be implemented as a provider such as nova_config.&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::conf&lt;br /&gt;
* '''purpose''': keeps and writes [http://ceph.com/docs/master/rados/configuration/osd-config-ref/ config] and their options for the top level sections of the ceph config. This includes these sections:&lt;br /&gt;
** [global]&lt;br /&gt;
** [mon]&lt;br /&gt;
** [osd]&lt;br /&gt;
** [mds]&lt;br /&gt;
* '''interface''': every key that is needed to write the base config ... the whole list would be to long to written down here&lt;br /&gt;
* auth_enable - true or false, enables/disables cephx, defaults to true&lt;br /&gt;
::If enable is true, set the following in the [global] section of the conf file:&lt;br /&gt;
&lt;br /&gt;
        auth cluster required = cephx&lt;br /&gt;
        auth service required = cephx&lt;br /&gt;
        auth client required = cephx&lt;br /&gt;
        auth supported = cephx&lt;br /&gt;
&lt;br /&gt;
::If enable is false, set the following in the [global] section of the conf file:&lt;br /&gt;
&lt;br /&gt;
        auth cluster required = none&lt;br /&gt;
        auth service required = none&lt;br /&gt;
        auth client required = none&lt;br /&gt;
        auth supported = none&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::It should support [http://ceph.com/docs/master/rados/operations/authentication/#disabling-cephx disabling] or [http://ceph.com/docs/master/rados/operations/authentication/#enabling-cephx enabling] cephx when the values change. If it does not support updating, it must fail when changed on an existing Ceph cluster.&lt;br /&gt;
&lt;br /&gt;
Using a [https://github.com/puppetlabs/puppetlabs-inifile inifile] child provider ( such as [https://github.com/stackforge/puppet-cinder/blob/master/lib/puppet/provider/cinder_config/ini_setting.rb cinder_config] ) a setting would look like&lt;br /&gt;
&lt;br /&gt;
    ceph_conf {&lt;br /&gt;
      'GLOBAL/fsid': value =&amp;gt; $fsid;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
And create '''/etc/ceph/ceph.conf''' such as:&lt;br /&gt;
&lt;br /&gt;
    [global]&lt;br /&gt;
        fsid = 918340183294812038&lt;br /&gt;
&lt;br /&gt;
Improvements to be implemented later:&lt;br /&gt;
* If a key/value pair is modified in the *mon*, *osd* or *mds* sections, all daemons are [http://ceph.com/docs/master/rados/configuration/ceph-conf/#runtime-changes notified of the change] with ceph {daemon} tell * ....&lt;br /&gt;
&lt;br /&gt;
=== osd ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::osd &lt;br /&gt;
* '''purpose''': configures a ceph OSD using the ceph-disk helper&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** directory/disk - a disk or a directory to be used as a storage for the OSD (optional)&lt;br /&gt;
** bootstrap-osd - the bootstrap-osd secret key (optional if cephx = none )&lt;br /&gt;
** dmcrypt - options needed to encrypt disks (optional)&lt;br /&gt;
&lt;br /&gt;
If the directory/disk is omitted, ceph-disk list is used to find unknown disks or partitions. All unknown disks are prepared with ceph-disk prepare. That effectively allows someone to say : use whatever disks are not in use for ceph and leave the rest alone. An operator would only have to add new disk and way for the next puppet client pass to have them integrated in the cluster. If a disk is removed, the OSD is  not launched at boot time and there is nothing to do. &lt;br /&gt;
&lt;br /&gt;
Here is what should happen on a node with at least one OSD&lt;br /&gt;
* common to all OSD on the same node:&lt;br /&gt;
** the /etc/ceph/ceph.conf file is setup with the IPs of the monitors&lt;br /&gt;
** [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/osd.py#L47 the /var/lib/ceph/bootstrap-osd/{cluster}.bootstrap-osd.keyring] file contains a user/key that is used to to create an OSD. The bootstrap-osd user key is usually the same for all OSD. For instance:&lt;br /&gt;
    [client.bootstrap-osd]&lt;br /&gt;
        key = AQCUg71RYEi7DxAAxlyC1KExxSnNJgim6lmuGA==&lt;br /&gt;
** The  user bootstrap-osd with this key with caps to bootstrap an OSD:&lt;br /&gt;
    $ ceph auth list&lt;br /&gt;
    ...&lt;br /&gt;
    client.bootstrap-osd&lt;br /&gt;
        key: AQCUg71RYEi7DxAAxlyC1KExxSnNJgim6lmuGA==&lt;br /&gt;
        caps: [mon] allow profile bootstrap-osd&lt;br /&gt;
* for each OSD &lt;br /&gt;
** in the same way [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/osd.py#L104 ceph-deploy prepare the disk] call ceph-disk-prepare that will [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L1031 set magic partition uuid] and trigger [https://github.com/ceph/ceph/blob/master/udev/95-ceph-osd.rules#L11 udev rules] to [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L453 ceph osd create]. When udev settles, the new osd is integrated into the cluster and uses its own key, created, registered to the MON and stored locally as a side effect of [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L1301 --mkkey]. The osd daemon is also run as a side effect of udev detecting the disk and calling [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L1414 /etc/init/ceph-osd.conf]. ceph-disk contains a [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L18 high level description of the process]&lt;br /&gt;
** '''dmcrypt''' is also handled by the udev logic ( details ??? keys ??? )&lt;br /&gt;
&lt;br /&gt;
At boot time the [https://github.com/ceph/ceph/blob/master/src/upstart/ceph-osd-all-starter.conf#L14 /var/lib/ceph/osd directory is explored] to discover all OSDs that need to be started. Operating systems for which the same logic is not implemented will need an additional script run at boot time to perform the same exploration until the default script is updated to add this capability.&lt;br /&gt;
&lt;br /&gt;
=== mds ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::mds &lt;br /&gt;
* '''purpose''': configures a ceph MDS, setup /etc/ceph/ceph.conf with the MONs IPs, declare the MDS to the cluster via the MON, optionaly set the key to allow the MDS to connect to the MONs&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** monitor_ips - list of ip addresses used to connect to the monitor servers&lt;br /&gt;
** key - the secret key for the id user&lt;br /&gt;
** id - the id of the user&lt;br /&gt;
&lt;br /&gt;
=== mon ===&lt;br /&gt;
&lt;br /&gt;
Creates the files and keyring supporting a mon, runs the daemon&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::mon&lt;br /&gt;
* '''purpose''': configures a ceph MON&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** cluster - cluster name ( defaults to ceph )&lt;br /&gt;
** id - the id of the mon&lt;br /&gt;
** ip_address - the ip addresses of the mon&lt;br /&gt;
** key - the mon. user key&lt;br /&gt;
&lt;br /&gt;
* add a [mon.$id] section to the conf file (depends on ceph::conf to write the base part of the config)&lt;br /&gt;
* if auth == cephx&lt;br /&gt;
** the mon. key is mandatory and need to be set by the user to be a valid ceph key. The documentation should contain an example key and explanations about how to [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/new.py#L20 create an auth key].&lt;br /&gt;
** [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/new.py#L86 writes the keyring] &lt;br /&gt;
*  installs the packages&lt;br /&gt;
* ceph-mon --id 0 --mkfs&lt;br /&gt;
* runs the mon daemon&lt;br /&gt;
&lt;br /&gt;
=== rbd ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::rbd&lt;br /&gt;
* '''purpose''': maps and mounts a rbd image, taking care of dependencies (packages, rbd kernel module, /etc/ceph/rbdmap, fstab)&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** name - the name of the image&lt;br /&gt;
** pool - the pool in which the image is&lt;br /&gt;
** mount_point - where the image will be mounted&lt;br /&gt;
** key - the secret key for the id user&lt;br /&gt;
** id - the id of the user&lt;br /&gt;
::[[User:dmsimard|David Moreau Simard]] ([[User talk:David Moreau Simard|talk]]) Should ceph::client be a dependency ?&lt;br /&gt;
&lt;br /&gt;
=== cephfs ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::cephfs&lt;br /&gt;
* '''purpose''': mounts a cephfs filesystem, taking care of dependencies (e.g, fstab, packages)&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** Lots - See http://ceph.com/docs/next/man/8/mount.ceph/&lt;br /&gt;
::[[User:dmsimard|David Moreau Simard]] ([[User talk:David Moreau Simard|talk]]) Should ceph::client be a dependency ?&lt;br /&gt;
&lt;br /&gt;
== Implementor components ==&lt;br /&gt;
&lt;br /&gt;
These components are dependencies of the Puppet user components and can be used by other components. They should be a library of components where the code common to at least two independant components ( think OpenStack and Cloudstack ) is included.&lt;br /&gt;
&lt;br /&gt;
=== package  === &lt;br /&gt;
&lt;br /&gt;
Although some distributions include packages for Ceph, it is recommended to install from the packages available from ceph.com http://ceph.com/docs/next/install/. It is not recommended to install the Ceph package provided by the standard repositories. This will change over time and the need to use the repository provided by ceph.com will gradually become less common. &lt;br /&gt;
&lt;br /&gt;
The use of the repositories from ceph.com should be documented in the README.md with a apt {} based example to clarify that the user is expected to get up to date packages repositories.&lt;br /&gt;
&lt;br /&gt;
* Mimic https://github.com/stackforge/puppet-nova/blob/master/manifests/params.pp#L8 for cross distribution package name&lt;br /&gt;
&lt;br /&gt;
=== ceph client implementation ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::client &lt;br /&gt;
* '''purpose''': setup /etc/ceph/ceph.conf to connect to the Ceph cluster and install the ceph cli &lt;br /&gt;
* '''interface''':&lt;br /&gt;
** monitor_ips - list of ip addresses used to connect to the monitor servers&lt;br /&gt;
** client_id - name of the client to find the correct id for key&lt;br /&gt;
** keypath - path to the clients key file&lt;br /&gt;
&lt;br /&gt;
=== key ===&lt;br /&gt;
&lt;br /&gt;
Keyring management, authentication. It would be a class to create keys for new users (e.g. a user that can create RBDs or use the Objectstore) which may special access rights. But would also be used by the other classes like ceph::mon or ceph::osd to place e.g. the shared 'client.admin' or 'mon.' keys. I would handle here all key related tasks. &lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::key&lt;br /&gt;
* '''purpose''': handles ceph keys (cephx), generates keys, creates keyring files, incject keys into or delete keys from the cluster/keyring via ceph and ceph-authtool tools.&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** secret - key secret&lt;br /&gt;
** keyring_path - path to the keyring&lt;br /&gt;
** cap_mon/cap_osd/cap_mds - cephx capabilities&lt;br /&gt;
** user/group/mode: settings for the keyring file if needed&lt;br /&gt;
** inject - options to inject a key into the cluster&lt;br /&gt;
&lt;br /&gt;
=== pool ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::pool&lt;br /&gt;
* '''purpose''': manage operations on the pools in the cluster such as: create/delete pools, set PG/PGP number&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** pool_name - name of the pool&lt;br /&gt;
** create - if to create a new pool&lt;br /&gt;
** delete - if to delete an existing pool&lt;br /&gt;
** pg_num - number of Placement Groups (PGs) for a pool, if the pool already exists this may increase the number of PGs if the current value is lower&lt;br /&gt;
** pgp_num - same as for pg_num&lt;br /&gt;
** replica_level - increase or decrease the replica level of a pool&lt;br /&gt;
&lt;br /&gt;
== OpenStack components ==&lt;br /&gt;
&lt;br /&gt;
ceph specific configuration for cinder/glance (already provided by the puppet-cinder and puppet-glance modules in the volume/rdb and backend/rdb classes)&lt;br /&gt;
&lt;br /&gt;
== RadosGW components ==&lt;br /&gt;
&lt;br /&gt;
The RadosGW is developped as an integral part of Ceph. It is however not required to deploy a cluster and should be treated as any client application of the cluster.&lt;br /&gt;
&lt;br /&gt;
=== rgw ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::rgw&lt;br /&gt;
* '''purpose''': configures a ceph radosgw , setup /etc/ceph/ceph.conf with the MONs IPs, optionaly set the key to allow the OSD to connect to the MONs&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** monitor_ips - list of ip addresses used to connect to the monitor servers &lt;br /&gt;
** key - the secret key for the id user&lt;br /&gt;
** id - the id of the user&lt;br /&gt;
** rgw_data - the path where the radosgw data should be stored&lt;br /&gt;
** fcgi_file - path to the fcgi file e.g. /var/www/s3gw.fcgi&lt;br /&gt;
:: [[User:Danny Al-Gaaf|Danny Al-Gaaf]] ([[User talk:Danny Al-Gaaf|talk]]) the monitor_ips are not needed: IMO ceph::conf should provide these information to all other&lt;br /&gt;
&lt;br /&gt;
=== rgw_user ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::rgw_user&lt;br /&gt;
* '''purpose''': create/remove users and Swift users for the RadosGW S3/Swift API&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** user - username&lt;br /&gt;
** key - secret key (could get generated if needed)&lt;br /&gt;
** swift_user - username for the Swift API user&lt;br /&gt;
** swift_key - secret key for the Swift API user&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Related tools and implementations ==&lt;br /&gt;
&lt;br /&gt;
* deploy ceph : ceph-deploy&lt;br /&gt;
&lt;br /&gt;
  for test / POC purposes&lt;br /&gt;
  https://github.com/ceph/ceph-deploy&lt;br /&gt;
&lt;br /&gt;
  maintainer: Alfredo Deza&lt;br /&gt;
&lt;br /&gt;
* deploy ceph with puppet : puppet-cephdeploy&lt;br /&gt;
&lt;br /&gt;
  relies on ceph-deploy&lt;br /&gt;
  https://github.com/dontalton/puppet-cephdeploy/&lt;br /&gt;
&lt;br /&gt;
  maintainer: Don Talton&lt;br /&gt;
&lt;br /&gt;
* deploy ceph with puppet : puppet-ceph&lt;br /&gt;
&lt;br /&gt;
  developped in 2012 but still useful, upstream&lt;br /&gt;
  https://github.com/enovance/puppet-ceph&lt;br /&gt;
&lt;br /&gt;
  maintainer: community&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  fork of puppet-ceph, updated recently&lt;br /&gt;
  https://github.com/TelekomCloud/puppet-ceph/tree/rc/eisbrecher&lt;br /&gt;
&lt;br /&gt;
  maintainer: Deutsche Telekom AG (DTAG)&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack : ceph docs&lt;br /&gt;
&lt;br /&gt;
  manual integration&lt;br /&gt;
  http://ceph.com/docs/next/rbd/rbd-openstack/&lt;br /&gt;
   maintainer: John Wilkins + Josh Durgin&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack with puppet : stackforge&lt;br /&gt;
&lt;br /&gt;
  https://github.com/stackforge/puppet-glance/blob/stable/grizzly/manifests/backend/rbd.pp&lt;br /&gt;
  https://github.com/stackforge/puppet-cinder/blob/stable/grizzly/manifests/volume/rbd.pp&lt;br /&gt;
&lt;br /&gt;
  maintainer: community&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack with puppet : COI&lt;br /&gt;
&lt;br /&gt;
  targeting Cisco use case&lt;br /&gt;
  https://github.com/CiscoSystems/puppet-coe/tree/grizzly/manifests/ceph&lt;br /&gt;
  http://docwiki.cisco.com/wiki/OpenStack:Ceph-COI-Installation&lt;br /&gt;
&lt;br /&gt;
  maintainer : Don Talton + Robert Starmer&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack with puppet : mirantis&lt;br /&gt;
&lt;br /&gt;
  in the context of Fuel&lt;br /&gt;
  https://github.com/Mirantis/fuel/tree/master/deployment/puppet/ceph&lt;br /&gt;
  https://github.com/Mirantis/fuel/blob/master/deployment/puppet/cinder/manifests/volume/ceph.pp&lt;br /&gt;
  https://github.com/Mirantis/fuel/blob/master/deployment/puppet/glance/manifests/backend/ceph.pp&lt;br /&gt;
&lt;br /&gt;
  maintainer : Andrew Woodward&lt;br /&gt;
&lt;br /&gt;
* openstack with puppet : openstack-installer&lt;br /&gt;
&lt;br /&gt;
  data driven approach to deploy OpenStack&lt;br /&gt;
  https://github.com/CiscoSystems/openstack-installer/&lt;br /&gt;
&lt;br /&gt;
  maintainer: Robert Starmer + Dan Bode&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Puppet/ceph-blueprint&amp;diff=33451</id>
		<title>Puppet/ceph-blueprint</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Puppet/ceph-blueprint&amp;diff=33451"/>
				<updated>2013-10-21T20:59:49Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
This document is intended to capture requirements for a single [https://launchpad.net/puppet-ceph puppet-ceph module].&lt;br /&gt;
&lt;br /&gt;
Very much like vswitch, Ceph is not exclusively used in the context of OpenStack. There is however a significant community relying on puppet to deploy Ceph in the context of OpenStack, as is shown in the [#Related_tools_and_implementations|inventory of the existing efforts] Having a puppet ceph module under the umbrella of the stackforge infrastructure helps federate the efforts while providing a workflow that will improve the overall quality of the module.&lt;br /&gt;
&lt;br /&gt;
* [https://review.openstack.org/#/q/status:open+project:stackforge/puppet-ceph,n,z gerrit review page]&lt;br /&gt;
* [https://launchpad.net/puppet-ceph puppet-ceph at launchpad]&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
Almost each component of this module deserve a discussion and it would take a long time to agree on everything before getting something useful. The following list sets the order in which each module is going to be implemented. Each step must be a useable puppet module, unit tested and including integration tests.&lt;br /&gt;
&lt;br /&gt;
* [[#conf|conf]]&lt;br /&gt;
* [[#key|key]]&lt;br /&gt;
* [[#mon|mon]]&lt;br /&gt;
* [[#osd|osd]]&lt;br /&gt;
* [[#pool|pool]]&lt;br /&gt;
* [[#rbd|rbd]]&lt;br /&gt;
* [[#radosgw|radosgw]&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
=== I want to try this module, heard of ceph, want to see it in action ===&lt;br /&gt;
&lt;br /&gt;
    /node/ { &lt;br /&gt;
     ceph::conf { auth_enable: false };&lt;br /&gt;
     ceph::mon; &lt;br /&gt;
     ceph::osd { '/srv/osd1' }; &lt;br /&gt;
     ceph::osd { '/srv/osd2' }; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
* install puppet, &lt;br /&gt;
* paste this in site.pp and replace /node/ with the name of your current node, &lt;br /&gt;
* puppet apply site.pp , &lt;br /&gt;
* ceph -s and see that it works&lt;br /&gt;
&lt;br /&gt;
=== I want to run benchmarks on three new machines ===&lt;br /&gt;
&lt;br /&gt;
* There are four machines, 3 OSD, 1 MON and one machine that is the client from which the user runs commands.&lt;br /&gt;
* install puppetmaster and create site.pp with:&lt;br /&gt;
&lt;br /&gt;
    /ceph-default/ {&lt;br /&gt;
      ceph::conf { auth_enable: false };&lt;br /&gt;
      ceph::conf { 'mon host': 'node1' }; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /node1/ inherits ceph-default { &lt;br /&gt;
     ceph::mon; &lt;br /&gt;
     ceph::osd; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /node2/, /node3/ inherits ceph-default { &lt;br /&gt;
     ceph::osd; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /client/ inherits ceph-default { &lt;br /&gt;
     ceph::client;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
* ssh client&lt;br /&gt;
* rados bench &lt;br /&gt;
* interpret the results&lt;br /&gt;
&lt;br /&gt;
===  I want to spawn a cluster configured with a puppetmaster as part of a continuous integration effort ===&lt;br /&gt;
&lt;br /&gt;
''Leveraging vagrant, vagrant-openstack, openstack''&lt;br /&gt;
* Ceph is used as a backend storage for various use cases&lt;br /&gt;
* There are tests to make sure the Ceph cluster was instantiated properly&lt;br /&gt;
* There are tests to make sure various other infrastructure components (or products) can use the Ceph cluster&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
=== High level requirements ===&lt;br /&gt;
&lt;br /&gt;
==== No complex cross host orchestration ====&lt;br /&gt;
&lt;br /&gt;
All cross host orchestration should be assumed to be managed outside of Puppet. Provided that it's dependencies have already been configured and are known, each component should support being adding without having to run Puppet on more than one node.&lt;br /&gt;
&lt;br /&gt;
For example&lt;br /&gt;
&lt;br /&gt;
* cinder-volume instances should be configured to join a Ceph cluster simply by running Puppet on that node&lt;br /&gt;
* OSD instances should be configured to join a cluster simply by running puppet agent on a node and targeting that role.&lt;br /&gt;
&lt;br /&gt;
All cross host orchestration should be assumed to be managed outside of Puppet. The Puppet implementation should only be concerned with&lt;br /&gt;
&lt;br /&gt;
* what components need to be defined (where these are implemented as classes)&lt;br /&gt;
* what data is required for those components (where that data is passed in a class parameters)&lt;br /&gt;
&lt;br /&gt;
==== Supporting versions  ====&lt;br /&gt;
&lt;br /&gt;
The Operating System versions supported must be tested with integration on the actual operating system. Although it is fairly to add support for an Operating System, it is prone to regressions if not tested. The per Operating System support strategy mimics the way OpenStack modules do it. &lt;br /&gt;
&lt;br /&gt;
The supported versions of the components that deal with the environment in which Ceph is used ( OpenStack, Cloudstack, Ganeti etc. ) are handled by each component on a case by case basis. There probably is too much heterogeneity to set a rule.&lt;br /&gt;
&lt;br /&gt;
==== Provide sensible defaults ====&lt;br /&gt;
&lt;br /&gt;
If the high level components ( osd + mon + mds + rgw for instance ) are included without any parameter, the result must be a functional Ceph cluster.&lt;br /&gt;
&lt;br /&gt;
==== Architectured to leverage Ceph to its full potential ====&lt;br /&gt;
&lt;br /&gt;
It means talking to the MON when configuring or modifying the cluster, using ceph-disk as a low level tool to create the storage required for an OSD, creating a minimal /etc/ceph/ceph.conf to allow a client to connect to the Ceph cluster. The MON exposes a very rich API ( either via the ceph cli or a REST API ) and it offers a great flexibility to the system administrator. It is unlikely that the first versions of the puppet module captures all of it. But it should be architectured to allow the casual contributor to add a new feature or a new variation without the need to workaround architectural limitations. &lt;br /&gt;
&lt;br /&gt;
The ceph-deploy utility is developed as part of the ceph project, to help people get up to speed as quickly as possible for test and POCs. Alfredo Deza made a compeling argument against using ceph-deploy as a helper for a puppet module. Because it is designed to hide some of the flexibility ceph offers for the sake of simplicity. An inconvenience that is incompatible with the goal of a puppet module designed to accommodate all use cases. &lt;br /&gt;
&lt;br /&gt;
=== Prefer cli over REST ===&lt;br /&gt;
&lt;br /&gt;
The ceph cli is preferred because the [http://ceph.com/docs/next/man/8/ceph-rest-api/ rest-api] requires the installation of an additional daemon.&lt;br /&gt;
&lt;br /&gt;
=== Module versioning ===&lt;br /&gt;
&lt;br /&gt;
Create a branch for each Ceph release ( stable/cuttlefish, stable/dumpling etc. ) and follow the same pattern as the OpenStack modules&lt;br /&gt;
&lt;br /&gt;
=== Support Ceph versions from cuttlefish ===&lt;br /&gt;
&lt;br /&gt;
Do not support Ceph versions released before cuttlefish&lt;br /&gt;
&lt;br /&gt;
== Integration tests ==&lt;br /&gt;
&lt;br /&gt;
All scenarios can probably be covered with 2 virtual machines, 2 interfaces and one disk attached to one of the machines. A number of scenarios can be based on a single machine, using directories instead of disks and a single interface.&lt;br /&gt;
&lt;br /&gt;
Use https://github.com/puppetlabs/rspec-system-puppet&lt;br /&gt;
&lt;br /&gt;
::[[User:Dachary|Loic Dachary]] ([[User talk:Dachary|talk]]) :  I mean it would have to somehow leverage things ( what ? how ? ) in the openstack-ci infrastructure ?&lt;br /&gt;
&lt;br /&gt;
== Puppet user components ==&lt;br /&gt;
&lt;br /&gt;
This section outlines the roles and well as configuration components that are visible to the puppet user. They must be understandable for the system administrator willing to deploy Ceph for the first time.&lt;br /&gt;
&lt;br /&gt;
=== conf ===&lt;br /&gt;
&lt;br /&gt;
Although the key separator can either be space or underscore, only '''space''' is allowed to help with consistency. &lt;br /&gt;
&lt;br /&gt;
::[[User:Xarses|Xarses]] ([[User talk:Xarses|talk]]) hyphen is a also valid seperator. From my testing i found that the ini_file provider can not tell the difference in keys between &amp;quot;auth supported&amp;quot; and &amp;quot;auth_supported&amp;quot; which will lead to duplicate entries in ceph.conf if we aren't careful.&lt;br /&gt;
&lt;br /&gt;
::[[User:Dachary|Loic Dachary]] ([[User talk:Dachary|talk]]) : since [https://github.com/ceph/ceph-deploy/commit/53f46a8451dd8e10a3b9e8f2b191044f9863ae83 ceph-deploy enforces the use of _] and for the sake of consistency, it is probably better to use undercore instead of space.&lt;br /&gt;
&lt;br /&gt;
::[[User:Dachary|Loic Dachary]] ([[User talk:Dachary|talk]]) : bodep prefers ini, dalgaaf prefers concat, loic does not care but voted ini because there is more expertise, xarses and dmsimard +1 ini, mgagne does not object ini : it is going to be implemented as a provider such as nova_config.&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::conf&lt;br /&gt;
* '''purpose''': keeps and writes [http://ceph.com/docs/master/rados/configuration/osd-config-ref/ config] and their options for the top level sections of the ceph config. This includes these sections:&lt;br /&gt;
** [global]&lt;br /&gt;
** [mon]&lt;br /&gt;
** [osd]&lt;br /&gt;
** [mds]&lt;br /&gt;
* '''interface''': every key that is needed to write the base config ... the whole list would be to long to written down here&lt;br /&gt;
* auth_enable - true or false, enables/disables cephx, defaults to true&lt;br /&gt;
::If enable is true, set the following in the [global] section of the conf file:&lt;br /&gt;
&lt;br /&gt;
        auth cluster required = cephx&lt;br /&gt;
        auth service required = cephx&lt;br /&gt;
        auth client required = cephx&lt;br /&gt;
        auth supported = cephx&lt;br /&gt;
&lt;br /&gt;
::If enable is false, set the following in the [global] section of the conf file:&lt;br /&gt;
&lt;br /&gt;
        auth cluster required = none&lt;br /&gt;
        auth service required = none&lt;br /&gt;
        auth client required = none&lt;br /&gt;
        auth supported = none&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::It should support [http://ceph.com/docs/master/rados/operations/authentication/#disabling-cephx disabling] or [http://ceph.com/docs/master/rados/operations/authentication/#enabling-cephx enabling] cephx when the values change. If it does not support updating, it must fail when changed on an existing Ceph cluster.&lt;br /&gt;
&lt;br /&gt;
Using a [https://github.com/puppetlabs/puppetlabs-inifile inifile] child provider ( such as [https://github.com/stackforge/puppet-cinder/blob/master/lib/puppet/provider/cinder_config/ini_setting.rb cinder_config] ) a setting would look like&lt;br /&gt;
&lt;br /&gt;
    ceph_conf {&lt;br /&gt;
      'GLOBAL/fsid': value =&amp;gt; $fsid;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
And create '''/etc/ceph/ceph.conf''' such as:&lt;br /&gt;
&lt;br /&gt;
    [global]&lt;br /&gt;
        fsid = 918340183294812038&lt;br /&gt;
&lt;br /&gt;
Improvements to be implemented later:&lt;br /&gt;
* If a key/value pair is modified in the *mon*, *osd* or *mds* sections, all daemons are [http://ceph.com/docs/master/rados/configuration/ceph-conf/#runtime-changes notified of the change] with ceph {daemon} tell * ....&lt;br /&gt;
&lt;br /&gt;
=== osd ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::osd &lt;br /&gt;
* '''purpose''': configures a ceph OSD using the ceph-disk helper&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** directory/disk - a disk or a directory to be used as a storage for the OSD (optional)&lt;br /&gt;
** bootstrap-osd - the bootstrap-osd secret key (optional if cephx = none )&lt;br /&gt;
** dmcrypt - options needed to encrypt disks (optional)&lt;br /&gt;
&lt;br /&gt;
If the directory/disk is omitted, ceph-disk list is used to find unknown disks or partitions. All unknown disks are prepared with ceph-disk prepare. That effectively allows someone to say : use whatever disks are not in use for ceph and leave the rest alone. An operator would only have to add new disk and way for the next puppet client pass to have them integrated in the cluster. If a disk is removed, the OSD is  not launched at boot time and there is nothing to do. &lt;br /&gt;
&lt;br /&gt;
Here is what should happen on a node with at least one OSD&lt;br /&gt;
* common to all OSD on the same node:&lt;br /&gt;
** the /etc/ceph/ceph.conf file is setup with the IPs of the monitors&lt;br /&gt;
** [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/osd.py#L47 the /var/lib/ceph/bootstrap-osd/{cluster}.bootstrap-osd.keyring] file contains a user/key that is used to to create an OSD. The bootstrap-osd user key is usually the same for all OSD. For instance:&lt;br /&gt;
    [client.bootstrap-osd]&lt;br /&gt;
        key = AQCUg71RYEi7DxAAxlyC1KExxSnNJgim6lmuGA==&lt;br /&gt;
** The  user bootstrap-osd with this key with caps to bootstrap an OSD:&lt;br /&gt;
    $ ceph auth list&lt;br /&gt;
    ...&lt;br /&gt;
    client.bootstrap-osd&lt;br /&gt;
        key: AQCUg71RYEi7DxAAxlyC1KExxSnNJgim6lmuGA==&lt;br /&gt;
        caps: [mon] allow profile bootstrap-osd&lt;br /&gt;
* for each OSD &lt;br /&gt;
** in the same way [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/osd.py#L104 ceph-deploy prepare the disk] call ceph-disk-prepare that will [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L1031 set magic partition uuid] and trigger [https://github.com/ceph/ceph/blob/master/udev/95-ceph-osd.rules#L11 udev rules] to [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L453 ceph osd create]. When udev settles, the new osd is integrated into the cluster and uses its own key, created, registered to the MON and stored locally as a side effect of [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L1301 --mkkey]. The osd daemon is also run as a side effect of udev detecting the disk and calling [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L1414 /etc/init/ceph-osd.conf]. ceph-disk contains a [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L18 high level description of the process]&lt;br /&gt;
** '''dmcrypt''' is also handled by the udev logic ( details ??? keys ??? )&lt;br /&gt;
&lt;br /&gt;
At boot time the [https://github.com/ceph/ceph/blob/master/src/upstart/ceph-osd-all-starter.conf#L14 /var/lib/ceph/osd directory is explored] to discover all OSDs that need to be started. Operating systems for which the same logic is not implemented will need an additional script run at boot time to perform the same exploration until the default script is updated to add this capability.&lt;br /&gt;
&lt;br /&gt;
=== mds ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::mds &lt;br /&gt;
* '''purpose''': configures a ceph MDS, setup /etc/ceph/ceph.conf with the MONs IPs, declare the MDS to the cluster via the MON, optionaly set the key to allow the MDS to connect to the MONs&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** monitor_ips - list of ip addresses used to connect to the monitor servers&lt;br /&gt;
** key - the secret key for the id user&lt;br /&gt;
** id - the id of the user&lt;br /&gt;
&lt;br /&gt;
=== mon ===&lt;br /&gt;
&lt;br /&gt;
Creates the files and keyring supporting a mon, runs the daemon&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::mon&lt;br /&gt;
* '''purpose''': configures a ceph MON&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** cluster - cluster name ( defaults to ceph )&lt;br /&gt;
** id - the id of the mon&lt;br /&gt;
** ip_address - the ip addresses of the mon&lt;br /&gt;
** key - the mon. user key&lt;br /&gt;
&lt;br /&gt;
* add a [mon.$id] section to the conf file (depends on ceph::conf to write the base part of the config)&lt;br /&gt;
* if auth == cephx&lt;br /&gt;
** the mon. key is mandatory and need to be set by the user to be a valid ceph key. The documentation should contain an example key and explanations about how to [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/new.py#L20 create an auth key].&lt;br /&gt;
** [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/new.py#L86 writes the keyring] &lt;br /&gt;
*  installs the packages&lt;br /&gt;
* ceph-mon --id 0 --mkfs&lt;br /&gt;
* runs the mon daemon&lt;br /&gt;
&lt;br /&gt;
=== rbd ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::rbd&lt;br /&gt;
* '''purpose''': maps and mounts a rbd image, taking care of dependencies (packages, rbd kernel module, /etc/ceph/rbdmap, fstab)&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** name - the name of the image&lt;br /&gt;
** pool - the pool in which the image is&lt;br /&gt;
** mount_point - where the image will be mounted&lt;br /&gt;
** key - the secret key for the id user&lt;br /&gt;
** id - the id of the user&lt;br /&gt;
::[[User:dmsimard|David Moreau Simard]] ([[User talk:David Moreau Simard|talk]]) Should ceph::client be a dependency ?&lt;br /&gt;
&lt;br /&gt;
=== cephfs ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::cephfs&lt;br /&gt;
* '''purpose''': mounts a cephfs filesystem, taking care of dependencies (e.g, fstab, packages)&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** Lots - See http://ceph.com/docs/next/man/8/mount.ceph/&lt;br /&gt;
::[[User:dmsimard|David Moreau Simard]] ([[User talk:David Moreau Simard|talk]]) Should ceph::client be a dependency ?&lt;br /&gt;
&lt;br /&gt;
=== radosgw ===&lt;br /&gt;
* '''proposed name''': ceph::radosgw&lt;br /&gt;
* '''purpose''': configures a working radosgw service including a working gw and probably keystone hooks&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** TBD&lt;br /&gt;
&lt;br /&gt;
== Implementor components ==&lt;br /&gt;
&lt;br /&gt;
These components are dependencies of the Puppet user components and can be used by other components. They should be a library of components where the code common to at least two independant components ( think OpenStack and Cloudstack ) is included.&lt;br /&gt;
&lt;br /&gt;
=== package  === &lt;br /&gt;
&lt;br /&gt;
Although some distributions include packages for Ceph, it is recommended to install from the packages available from ceph.com http://ceph.com/docs/next/install/. It is not recommended to install the Ceph package provided by the standard repositories. This will change over time and the need to use the repository provided by ceph.com will gradually become less common. &lt;br /&gt;
&lt;br /&gt;
The use of the repositories from ceph.com should be documented in the README.md with a apt {} based example to clarify that the user is expected to get up to date packages repositories.&lt;br /&gt;
&lt;br /&gt;
* Mimic https://github.com/stackforge/puppet-nova/blob/master/manifests/params.pp#L8 for cross distribution package name&lt;br /&gt;
&lt;br /&gt;
=== ceph client implementation ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::client &lt;br /&gt;
* '''purpose''': setup /etc/ceph/ceph.conf to connect to the Ceph cluster and install the ceph cli &lt;br /&gt;
* '''interface''':&lt;br /&gt;
** monitor_ips - list of ip addresses used to connect to the monitor servers&lt;br /&gt;
** client_id - name of the client to find the correct id for key&lt;br /&gt;
** keypath - path to the clients key file&lt;br /&gt;
&lt;br /&gt;
=== key ===&lt;br /&gt;
&lt;br /&gt;
Keyring management, authentication. It would be a class to create keys for new users (e.g. a user that can create RBDs or use the Objectstore) which may special access rights. But would also be used by the other classes like ceph::mon or ceph::osd to place e.g. the shared 'client.admin' or 'mon.' keys. I would handle here all key related tasks. &lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::key&lt;br /&gt;
* '''purpose''': handles ceph keys (cephx), generates keys, creates keyring files, incject keys into or delete keys from the cluster/keyring via ceph and ceph-authtool tools.&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** secret - key secret&lt;br /&gt;
** keyring_path - path to the keyring&lt;br /&gt;
** cap_mon/cap_osd/cap_mds - cephx capabilities&lt;br /&gt;
** user/group/mode: settings for the keyring file if needed&lt;br /&gt;
** inject - options to inject a key into the cluster&lt;br /&gt;
&lt;br /&gt;
=== pool ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::pool&lt;br /&gt;
* '''purpose''': manage operations on the pools in the cluster such as: create/delete pools, set PG/PGP number&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** pool_name - name of the pool&lt;br /&gt;
** create - if to create a new pool&lt;br /&gt;
** delete - if to delete an existing pool&lt;br /&gt;
** pg_num - number of Placement Groups (PGs) for a pool, if the pool already exists this may increase the number of PGs if the current value is lower&lt;br /&gt;
** pgp_num - same as for pg_num&lt;br /&gt;
** replica_level - increase or decrease the replica level of a pool&lt;br /&gt;
&lt;br /&gt;
== OpenStack components ==&lt;br /&gt;
&lt;br /&gt;
ceph specific configuration for cinder/glance (already provided by the puppet-cinder and puppet-glance modules in the volume/rdb and backend/rdb classes)&lt;br /&gt;
&lt;br /&gt;
== RadosGW components ==&lt;br /&gt;
&lt;br /&gt;
The RadosGW is developped as an integral part of Ceph. It is however not required to deploy a cluster and should be treated as any client application of the cluster.&lt;br /&gt;
&lt;br /&gt;
=== rgw ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::rgw&lt;br /&gt;
* '''purpose''': configures a ceph radosgw , setup /etc/ceph/ceph.conf with the MONs IPs, optionaly set the key to allow the OSD to connect to the MONs&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** monitor_ips - list of ip addresses used to connect to the monitor servers &lt;br /&gt;
** key - the secret key for the id user&lt;br /&gt;
** id - the id of the user&lt;br /&gt;
** rgw_data - the path where the radosgw data should be stored&lt;br /&gt;
** fcgi_file - path to the fcgi file e.g. /var/www/s3gw.fcgi&lt;br /&gt;
:: [[User:Danny Al-Gaaf|Danny Al-Gaaf]] ([[User talk:Danny Al-Gaaf|talk]]) the monitor_ips are not needed: IMO ceph::conf should provide these information to all other&lt;br /&gt;
&lt;br /&gt;
=== rgw_user ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::rgw_user&lt;br /&gt;
* '''purpose''': create/remove users and Swift users for the RadosGW S3/Swift API&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** user - username&lt;br /&gt;
** key - secret key (could get generated if needed)&lt;br /&gt;
** swift_user - username for the Swift API user&lt;br /&gt;
** swift_key - secret key for the Swift API user&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Related tools and implementations ==&lt;br /&gt;
&lt;br /&gt;
* deploy ceph : ceph-deploy&lt;br /&gt;
&lt;br /&gt;
  for test / POC purposes&lt;br /&gt;
  https://github.com/ceph/ceph-deploy&lt;br /&gt;
&lt;br /&gt;
  maintainer: Alfredo Deza&lt;br /&gt;
&lt;br /&gt;
* deploy ceph with puppet : puppet-cephdeploy&lt;br /&gt;
&lt;br /&gt;
  relies on ceph-deploy&lt;br /&gt;
  https://github.com/dontalton/puppet-cephdeploy/&lt;br /&gt;
&lt;br /&gt;
  maintainer: Don Talton&lt;br /&gt;
&lt;br /&gt;
* deploy ceph with puppet : puppet-ceph&lt;br /&gt;
&lt;br /&gt;
  developped in 2012 but still useful, upstream&lt;br /&gt;
  https://github.com/enovance/puppet-ceph&lt;br /&gt;
&lt;br /&gt;
  maintainer: community&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  fork of puppet-ceph, updated recently&lt;br /&gt;
  https://github.com/TelekomCloud/puppet-ceph/tree/rc/eisbrecher&lt;br /&gt;
&lt;br /&gt;
  maintainer: Deutsche Telekom AG (DTAG)&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack : ceph docs&lt;br /&gt;
&lt;br /&gt;
  manual integration&lt;br /&gt;
  http://ceph.com/docs/next/rbd/rbd-openstack/&lt;br /&gt;
   maintainer: John Wilkins + Josh Durgin&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack with puppet : stackforge&lt;br /&gt;
&lt;br /&gt;
  https://github.com/stackforge/puppet-glance/blob/stable/grizzly/manifests/backend/rbd.pp&lt;br /&gt;
  https://github.com/stackforge/puppet-cinder/blob/stable/grizzly/manifests/volume/rbd.pp&lt;br /&gt;
&lt;br /&gt;
  maintainer: community&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack with puppet : COI&lt;br /&gt;
&lt;br /&gt;
  targeting Cisco use case&lt;br /&gt;
  https://github.com/CiscoSystems/puppet-coe/tree/grizzly/manifests/ceph&lt;br /&gt;
  http://docwiki.cisco.com/wiki/OpenStack:Ceph-COI-Installation&lt;br /&gt;
&lt;br /&gt;
  maintainer : Don Talton + Robert Starmer&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack with puppet : mirantis&lt;br /&gt;
&lt;br /&gt;
  in the context of Fuel&lt;br /&gt;
  https://github.com/Mirantis/fuel/tree/master/deployment/puppet/ceph&lt;br /&gt;
  https://github.com/Mirantis/fuel/blob/master/deployment/puppet/cinder/manifests/volume/ceph.pp&lt;br /&gt;
  https://github.com/Mirantis/fuel/blob/master/deployment/puppet/glance/manifests/backend/ceph.pp&lt;br /&gt;
&lt;br /&gt;
  maintainer : Andrew Woodward&lt;br /&gt;
&lt;br /&gt;
* openstack with puppet : openstack-installer&lt;br /&gt;
&lt;br /&gt;
  data driven approach to deploy OpenStack&lt;br /&gt;
  https://github.com/CiscoSystems/openstack-installer/&lt;br /&gt;
&lt;br /&gt;
  maintainer: Robert Starmer + Dan Bode&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Puppet/ceph-blueprint&amp;diff=33450</id>
		<title>Puppet/ceph-blueprint</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Puppet/ceph-blueprint&amp;diff=33450"/>
				<updated>2013-10-21T20:56:29Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: /* Roadmap */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
This document is intended to capture requirements for a single [https://launchpad.net/puppet-ceph puppet-ceph module].&lt;br /&gt;
&lt;br /&gt;
Very much like vswitch, Ceph is not exclusively used in the context of OpenStack. There is however a significant community relying on puppet to deploy Ceph in the context of OpenStack, as is shown in the [#Related_tools_and_implementations|inventory of the existing efforts] Having a puppet ceph module under the umbrella of the stackforge infrastructure helps federate the efforts while providing a workflow that will improve the overall quality of the module.&lt;br /&gt;
&lt;br /&gt;
* [https://review.openstack.org/#/q/status:open+project:stackforge/puppet-ceph,n,z gerrit review page]&lt;br /&gt;
* [https://launchpad.net/puppet-ceph puppet-ceph at launchpad]&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
Almost each component of this module deserve a discussion and it would take a long time to agree on everything before getting something useful. The following list sets the order in which each module is going to be implemented. Each step must be a useable puppet module, unit tested and including integration tests.&lt;br /&gt;
&lt;br /&gt;
* [[#conf|conf]]&lt;br /&gt;
* [[#key|key]]&lt;br /&gt;
* [[#mon|mon]]&lt;br /&gt;
* [[#osd|osd]]&lt;br /&gt;
* [[#pool|pool]]&lt;br /&gt;
* [[#rbd|rbd]]&lt;br /&gt;
* [[#radosgw|radosgw]&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
=== I want to try this module, heard of ceph, want to see it in action ===&lt;br /&gt;
&lt;br /&gt;
    /node/ { &lt;br /&gt;
     ceph::conf { auth_enable: false };&lt;br /&gt;
     ceph::mon; &lt;br /&gt;
     ceph::osd { '/srv/osd1' }; &lt;br /&gt;
     ceph::osd { '/srv/osd2' }; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
* install puppet, &lt;br /&gt;
* paste this in site.pp and replace /node/ with the name of your current node, &lt;br /&gt;
* puppet apply site.pp , &lt;br /&gt;
* ceph -s and see that it works&lt;br /&gt;
&lt;br /&gt;
=== I want to run benchmarks on three new machines ===&lt;br /&gt;
&lt;br /&gt;
* There are four machines, 3 OSD, 1 MON and one machine that is the client from which the user runs commands.&lt;br /&gt;
* install puppetmaster and create site.pp with:&lt;br /&gt;
&lt;br /&gt;
    /ceph-default/ {&lt;br /&gt;
      ceph::conf { auth_enable: false };&lt;br /&gt;
      ceph::conf { 'mon host': 'node1' }; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /node1/ inherits ceph-default { &lt;br /&gt;
     ceph::mon; &lt;br /&gt;
     ceph::osd; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /node2/, /node3/ inherits ceph-default { &lt;br /&gt;
     ceph::osd; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /client/ inherits ceph-default { &lt;br /&gt;
     ceph::client;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
* ssh client&lt;br /&gt;
* rados bench &lt;br /&gt;
* interpret the results&lt;br /&gt;
&lt;br /&gt;
===  I want to spawn a cluster configured with a puppetmaster as part of a continuous integration effort ===&lt;br /&gt;
&lt;br /&gt;
''Leveraging vagrant, vagrant-openstack, openstack''&lt;br /&gt;
* Ceph is used as a backend storage for various use cases&lt;br /&gt;
* There are tests to make sure the Ceph cluster was instantiated properly&lt;br /&gt;
* There are tests to make sure various other infrastructure components (or products) can use the Ceph cluster&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
=== High level requirements ===&lt;br /&gt;
&lt;br /&gt;
==== No complex cross host orchestration ====&lt;br /&gt;
&lt;br /&gt;
All cross host orchestration should be assumed to be managed outside of Puppet. Provided that it's dependencies have already been configured and are known, each component should support being adding without having to run Puppet on more than one node.&lt;br /&gt;
&lt;br /&gt;
For example&lt;br /&gt;
&lt;br /&gt;
* cinder-volume instances should be configured to join a Ceph cluster simply by running Puppet on that node&lt;br /&gt;
* OSD instances should be configured to join a cluster simply by running puppet agent on a node and targeting that role.&lt;br /&gt;
&lt;br /&gt;
All cross host orchestration should be assumed to be managed outside of Puppet. The Puppet implementation should only be concerned with&lt;br /&gt;
&lt;br /&gt;
* what components need to be defined (where these are implemented as classes)&lt;br /&gt;
* what data is required for those components (where that data is passed in a class parameters)&lt;br /&gt;
&lt;br /&gt;
==== Supporting versions  ====&lt;br /&gt;
&lt;br /&gt;
The Operating System versions supported must be tested with integration on the actual operating system. Although it is fairly to add support for an Operating System, it is prone to regressions if not tested. The per Operating System support strategy mimics the way OpenStack modules do it. &lt;br /&gt;
&lt;br /&gt;
The supported versions of the components that deal with the environment in which Ceph is used ( OpenStack, Cloudstack, Ganeti etc. ) are handled by each component on a case by case basis. There probably is too much heterogeneity to set a rule.&lt;br /&gt;
&lt;br /&gt;
==== Provide sensible defaults ====&lt;br /&gt;
&lt;br /&gt;
If the high level components ( osd + mon + mds + rgw for instance ) are included without any parameter, the result must be a functional Ceph cluster.&lt;br /&gt;
&lt;br /&gt;
==== Architectured to leverage Ceph to its full potential ====&lt;br /&gt;
&lt;br /&gt;
It means talking to the MON when configuring or modifying the cluster, using ceph-disk as a low level tool to create the storage required for an OSD, creating a minimal /etc/ceph/ceph.conf to allow a client to connect to the Ceph cluster. The MON exposes a very rich API ( either via the ceph cli or a REST API ) and it offers a great flexibility to the system administrator. It is unlikely that the first versions of the puppet module captures all of it. But it should be architectured to allow the casual contributor to add a new feature or a new variation without the need to workaround architectural limitations. &lt;br /&gt;
&lt;br /&gt;
The ceph-deploy utility is developed as part of the ceph project, to help people get up to speed as quickly as possible for test and POCs. Alfredo Deza made a compeling argument against using ceph-deploy as a helper for a puppet module. Because it is designed to hide some of the flexibility ceph offers for the sake of simplicity. An inconvenience that is incompatible with the goal of a puppet module designed to accommodate all use cases. &lt;br /&gt;
&lt;br /&gt;
=== Prefer cli over REST ===&lt;br /&gt;
&lt;br /&gt;
The ceph cli is preferred because the [http://ceph.com/docs/next/man/8/ceph-rest-api/ rest-api] requires the installation of an additional daemon.&lt;br /&gt;
&lt;br /&gt;
=== Module versioning ===&lt;br /&gt;
&lt;br /&gt;
Create a branch for each Ceph release ( stable/cuttlefish, stable/dumpling etc. ) and follow the same pattern as the OpenStack modules&lt;br /&gt;
&lt;br /&gt;
=== Support Ceph versions from cuttlefish ===&lt;br /&gt;
&lt;br /&gt;
Do not support Ceph versions released before cuttlefish&lt;br /&gt;
&lt;br /&gt;
== Integration tests ==&lt;br /&gt;
&lt;br /&gt;
All scenarios can probably be covered with 2 virtual machines, 2 interfaces and one disk attached to one of the machines. A number of scenarios can be based on a single machine, using directories instead of disks and a single interface.&lt;br /&gt;
&lt;br /&gt;
Use https://github.com/puppetlabs/rspec-system-puppet&lt;br /&gt;
&lt;br /&gt;
::[[User:Dachary|Loic Dachary]] ([[User talk:Dachary|talk]]) :  I mean it would have to somehow leverage things ( what ? how ? ) in the openstack-ci infrastructure ?&lt;br /&gt;
&lt;br /&gt;
== Puppet user components ==&lt;br /&gt;
&lt;br /&gt;
This section outlines the roles and well as configuration components that are visible to the puppet user. They must be understandable for the system administrator willing to deploy Ceph for the first time.&lt;br /&gt;
&lt;br /&gt;
=== conf ===&lt;br /&gt;
&lt;br /&gt;
Although the key separator can either be space or underscore, only '''space''' is allowed to help with consistency. &lt;br /&gt;
&lt;br /&gt;
::[[User:Xarses|Xarses]] ([[User talk:Xarses|talk]]) hyphen is a also valid seperator. From my testing i found that the ini_file provider can not tell the difference in keys between &amp;quot;auth supported&amp;quot; and &amp;quot;auth_supported&amp;quot; which will lead to duplicate entries in ceph.conf if we aren't careful.&lt;br /&gt;
&lt;br /&gt;
::[[User:Dachary|Loic Dachary]] ([[User talk:Dachary|talk]]) : since [https://github.com/ceph/ceph-deploy/commit/53f46a8451dd8e10a3b9e8f2b191044f9863ae83 ceph-deploy enforces the use of _] and for the sake of consistency, it is probably better to use undercore instead of space.&lt;br /&gt;
&lt;br /&gt;
::[[User:Dachary|Loic Dachary]] ([[User talk:Dachary|talk]]) : bodep prefers ini, dalgaaf prefers concat, loic does not care but voted ini because there is more expertise, xarses and dmsimard +1 ini, mgagne does not object ini : it is going to be implemented as a provider such as nova_config.&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::conf&lt;br /&gt;
* '''purpose''': keeps and writes [http://ceph.com/docs/master/rados/configuration/osd-config-ref/ config] and their options for the top level sections of the ceph config. This includes these sections:&lt;br /&gt;
** [global]&lt;br /&gt;
** [mon]&lt;br /&gt;
** [osd]&lt;br /&gt;
** [mds]&lt;br /&gt;
* '''interface''': every key that is needed to write the base config ... the whole list would be to long to written down here&lt;br /&gt;
* auth_enable - true or false, enables/disables cephx, defaults to true&lt;br /&gt;
::If enable is true, set the following in the [global] section of the conf file:&lt;br /&gt;
&lt;br /&gt;
        auth cluster required = cephx&lt;br /&gt;
        auth service required = cephx&lt;br /&gt;
        auth client required = cephx&lt;br /&gt;
        auth supported = cephx&lt;br /&gt;
&lt;br /&gt;
::If enable is false, set the following in the [global] section of the conf file:&lt;br /&gt;
&lt;br /&gt;
        auth cluster required = none&lt;br /&gt;
        auth service required = none&lt;br /&gt;
        auth client required = none&lt;br /&gt;
        auth supported = none&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::It should support [http://ceph.com/docs/master/rados/operations/authentication/#disabling-cephx disabling] or [http://ceph.com/docs/master/rados/operations/authentication/#enabling-cephx enabling] cephx when the values change. If it does not support updating, it must fail when changed on an existing Ceph cluster.&lt;br /&gt;
&lt;br /&gt;
Using a [https://github.com/puppetlabs/puppetlabs-inifile inifile] child provider ( such as [https://github.com/stackforge/puppet-cinder/blob/master/lib/puppet/provider/cinder_config/ini_setting.rb cinder_config] ) a setting would look like&lt;br /&gt;
&lt;br /&gt;
    ceph_conf {&lt;br /&gt;
      'GLOBAL/fsid': value =&amp;gt; $fsid;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
And create '''/etc/ceph/ceph.conf''' such as:&lt;br /&gt;
&lt;br /&gt;
    [global]&lt;br /&gt;
        fsid = 918340183294812038&lt;br /&gt;
&lt;br /&gt;
Improvements to be implemented later:&lt;br /&gt;
* If a key/value pair is modified in the *mon*, *osd* or *mds* sections, all daemons are [http://ceph.com/docs/master/rados/configuration/ceph-conf/#runtime-changes notified of the change] with ceph {daemon} tell * ....&lt;br /&gt;
&lt;br /&gt;
=== osd ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::osd &lt;br /&gt;
* '''purpose''': configures a ceph OSD using the ceph-disk helper&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** directory/disk - a disk or a directory to be used as a storage for the OSD (optional)&lt;br /&gt;
** bootstrap-osd - the bootstrap-osd secret key (optional if cephx = none )&lt;br /&gt;
** dmcrypt - options needed to encrypt disks (optional)&lt;br /&gt;
&lt;br /&gt;
If the directory/disk is omitted, ceph-disk list is used to find unknown disks or partitions. All unknown disks are prepared with ceph-disk prepare. That effectively allows someone to say : use whatever disks are not in use for ceph and leave the rest alone. An operator would only have to add new disk and way for the next puppet client pass to have them integrated in the cluster. If a disk is removed, the OSD is  not launched at boot time and there is nothing to do. &lt;br /&gt;
&lt;br /&gt;
Here is what should happen on a node with at least one OSD&lt;br /&gt;
* common to all OSD on the same node:&lt;br /&gt;
** the /etc/ceph/ceph.conf file is setup with the IPs of the monitors&lt;br /&gt;
** [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/osd.py#L47 the /var/lib/ceph/bootstrap-osd/{cluster}.bootstrap-osd.keyring] file contains a user/key that is used to to create an OSD. The bootstrap-osd user key is usually the same for all OSD. For instance:&lt;br /&gt;
    [client.bootstrap-osd]&lt;br /&gt;
        key = AQCUg71RYEi7DxAAxlyC1KExxSnNJgim6lmuGA==&lt;br /&gt;
** The  user bootstrap-osd with this key with caps to bootstrap an OSD:&lt;br /&gt;
    $ ceph auth list&lt;br /&gt;
    ...&lt;br /&gt;
    client.bootstrap-osd&lt;br /&gt;
        key: AQCUg71RYEi7DxAAxlyC1KExxSnNJgim6lmuGA==&lt;br /&gt;
        caps: [mon] allow profile bootstrap-osd&lt;br /&gt;
* for each OSD &lt;br /&gt;
** in the same way [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/osd.py#L104 ceph-deploy prepare the disk] call ceph-disk-prepare that will [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L1031 set magic partition uuid] and trigger [https://github.com/ceph/ceph/blob/master/udev/95-ceph-osd.rules#L11 udev rules] to [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L453 ceph osd create]. When udev settles, the new osd is integrated into the cluster and uses its own key, created, registered to the MON and stored locally as a side effect of [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L1301 --mkkey]. The osd daemon is also run as a side effect of udev detecting the disk and calling [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L1414 /etc/init/ceph-osd.conf]. ceph-disk contains a [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L18 high level description of the process]&lt;br /&gt;
** '''dmcrypt''' is also handled by the udev logic ( details ??? keys ??? )&lt;br /&gt;
&lt;br /&gt;
At boot time the [https://github.com/ceph/ceph/blob/master/src/upstart/ceph-osd-all-starter.conf#L14 /var/lib/ceph/osd directory is explored] to discover all OSDs that need to be started. Operating systems for which the same logic is not implemented will need an additional script run at boot time to perform the same exploration until the default script is updated to add this capability.&lt;br /&gt;
&lt;br /&gt;
=== mds ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::mds &lt;br /&gt;
* '''purpose''': configures a ceph MDS, setup /etc/ceph/ceph.conf with the MONs IPs, declare the MDS to the cluster via the MON, optionaly set the key to allow the MDS to connect to the MONs&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** monitor_ips - list of ip addresses used to connect to the monitor servers&lt;br /&gt;
** key - the secret key for the id user&lt;br /&gt;
** id - the id of the user&lt;br /&gt;
&lt;br /&gt;
=== mon ===&lt;br /&gt;
&lt;br /&gt;
Creates the files and keyring supporting a mon, runs the daemon&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::mon&lt;br /&gt;
* '''purpose''': configures a ceph MON&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** cluster - cluster name ( defaults to ceph )&lt;br /&gt;
** id - the id of the mon&lt;br /&gt;
** ip_address - the ip addresses of the mon&lt;br /&gt;
** key - the mon. user key&lt;br /&gt;
&lt;br /&gt;
* add a [mon.$id] section to the conf file (depends on ceph::conf to write the base part of the config)&lt;br /&gt;
* if auth == cephx&lt;br /&gt;
** the mon. key is mandatory and need to be set by the user to be a valid ceph key. The documentation should contain an example key and explanations about how to [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/new.py#L20 create an auth key].&lt;br /&gt;
** [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/new.py#L86 writes the keyring] &lt;br /&gt;
*  installs the packages&lt;br /&gt;
* ceph-mon --id 0 --mkfs&lt;br /&gt;
* runs the mon daemon&lt;br /&gt;
&lt;br /&gt;
=== rbd ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::rbd&lt;br /&gt;
* '''purpose''': maps and mounts a rbd image, taking care of dependencies (packages, rbd kernel module, /etc/ceph/rbdmap, fstab)&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** name - the name of the image&lt;br /&gt;
** pool - the pool in which the image is&lt;br /&gt;
** mount_point - where the image will be mounted&lt;br /&gt;
** key - the secret key for the id user&lt;br /&gt;
** id - the id of the user&lt;br /&gt;
::[[User:dmsimard|David Moreau Simard]] ([[User talk:David Moreau Simard|talk]]) Should ceph::client be a dependency ?&lt;br /&gt;
&lt;br /&gt;
=== cephfs ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::cephfs&lt;br /&gt;
* '''purpose''': mounts a cephfs filesystem, taking care of dependencies (e.g, fstab, packages)&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** Lots - See http://ceph.com/docs/next/man/8/mount.ceph/&lt;br /&gt;
::[[User:dmsimard|David Moreau Simard]] ([[User talk:David Moreau Simard|talk]]) Should ceph::client be a dependency ?&lt;br /&gt;
&lt;br /&gt;
== Implementor components ==&lt;br /&gt;
&lt;br /&gt;
These components are dependencies of the Puppet user components and can be used by other components. They should be a library of components where the code common to at least two independant components ( think OpenStack and Cloudstack ) is included.&lt;br /&gt;
&lt;br /&gt;
=== package  === &lt;br /&gt;
&lt;br /&gt;
Although some distributions include packages for Ceph, it is recommended to install from the packages available from ceph.com http://ceph.com/docs/next/install/. It is not recommended to install the Ceph package provided by the standard repositories. This will change over time and the need to use the repository provided by ceph.com will gradually become less common. &lt;br /&gt;
&lt;br /&gt;
The use of the repositories from ceph.com should be documented in the README.md with a apt {} based example to clarify that the user is expected to get up to date packages repositories.&lt;br /&gt;
&lt;br /&gt;
* Mimic https://github.com/stackforge/puppet-nova/blob/master/manifests/params.pp#L8 for cross distribution package name&lt;br /&gt;
&lt;br /&gt;
=== ceph client implementation ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::client &lt;br /&gt;
* '''purpose''': setup /etc/ceph/ceph.conf to connect to the Ceph cluster and install the ceph cli &lt;br /&gt;
* '''interface''':&lt;br /&gt;
** monitor_ips - list of ip addresses used to connect to the monitor servers&lt;br /&gt;
** client_id - name of the client to find the correct id for key&lt;br /&gt;
** keypath - path to the clients key file&lt;br /&gt;
&lt;br /&gt;
=== key ===&lt;br /&gt;
&lt;br /&gt;
Keyring management, authentication. It would be a class to create keys for new users (e.g. a user that can create RBDs or use the Objectstore) which may special access rights. But would also be used by the other classes like ceph::mon or ceph::osd to place e.g. the shared 'client.admin' or 'mon.' keys. I would handle here all key related tasks. &lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::key&lt;br /&gt;
* '''purpose''': handles ceph keys (cephx), generates keys, creates keyring files, incject keys into or delete keys from the cluster/keyring via ceph and ceph-authtool tools.&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** secret - key secret&lt;br /&gt;
** keyring_path - path to the keyring&lt;br /&gt;
** cap_mon/cap_osd/cap_mds - cephx capabilities&lt;br /&gt;
** user/group/mode: settings for the keyring file if needed&lt;br /&gt;
** inject - options to inject a key into the cluster&lt;br /&gt;
&lt;br /&gt;
=== pool ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::pool&lt;br /&gt;
* '''purpose''': manage operations on the pools in the cluster such as: create/delete pools, set PG/PGP number&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** pool_name - name of the pool&lt;br /&gt;
** create - if to create a new pool&lt;br /&gt;
** delete - if to delete an existing pool&lt;br /&gt;
** pg_num - number of Placement Groups (PGs) for a pool, if the pool already exists this may increase the number of PGs if the current value is lower&lt;br /&gt;
** pgp_num - same as for pg_num&lt;br /&gt;
** replica_level - increase or decrease the replica level of a pool&lt;br /&gt;
&lt;br /&gt;
== OpenStack components ==&lt;br /&gt;
&lt;br /&gt;
ceph specific configuration for cinder/glance (already provided by the puppet-cinder and puppet-glance modules in the volume/rdb and backend/rdb classes)&lt;br /&gt;
&lt;br /&gt;
== RadosGW components ==&lt;br /&gt;
&lt;br /&gt;
The RadosGW is developped as an integral part of Ceph. It is however not required to deploy a cluster and should be treated as any client application of the cluster.&lt;br /&gt;
&lt;br /&gt;
=== rgw ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::rgw&lt;br /&gt;
* '''purpose''': configures a ceph radosgw , setup /etc/ceph/ceph.conf with the MONs IPs, optionaly set the key to allow the OSD to connect to the MONs&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** monitor_ips - list of ip addresses used to connect to the monitor servers &lt;br /&gt;
** key - the secret key for the id user&lt;br /&gt;
** id - the id of the user&lt;br /&gt;
** rgw_data - the path where the radosgw data should be stored&lt;br /&gt;
** fcgi_file - path to the fcgi file e.g. /var/www/s3gw.fcgi&lt;br /&gt;
:: [[User:Danny Al-Gaaf|Danny Al-Gaaf]] ([[User talk:Danny Al-Gaaf|talk]]) the monitor_ips are not needed: IMO ceph::conf should provide these information to all other&lt;br /&gt;
&lt;br /&gt;
=== rgw_user ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::rgw_user&lt;br /&gt;
* '''purpose''': create/remove users and Swift users for the RadosGW S3/Swift API&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** user - username&lt;br /&gt;
** key - secret key (could get generated if needed)&lt;br /&gt;
** swift_user - username for the Swift API user&lt;br /&gt;
** swift_key - secret key for the Swift API user&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Related tools and implementations ==&lt;br /&gt;
&lt;br /&gt;
* deploy ceph : ceph-deploy&lt;br /&gt;
&lt;br /&gt;
  for test / POC purposes&lt;br /&gt;
  https://github.com/ceph/ceph-deploy&lt;br /&gt;
&lt;br /&gt;
  maintainer: Alfredo Deza&lt;br /&gt;
&lt;br /&gt;
* deploy ceph with puppet : puppet-cephdeploy&lt;br /&gt;
&lt;br /&gt;
  relies on ceph-deploy&lt;br /&gt;
  https://github.com/dontalton/puppet-cephdeploy/&lt;br /&gt;
&lt;br /&gt;
  maintainer: Don Talton&lt;br /&gt;
&lt;br /&gt;
* deploy ceph with puppet : puppet-ceph&lt;br /&gt;
&lt;br /&gt;
  developped in 2012 but still useful, upstream&lt;br /&gt;
  https://github.com/enovance/puppet-ceph&lt;br /&gt;
&lt;br /&gt;
  maintainer: community&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  fork of puppet-ceph, updated recently&lt;br /&gt;
  https://github.com/TelekomCloud/puppet-ceph/tree/rc/eisbrecher&lt;br /&gt;
&lt;br /&gt;
  maintainer: Deutsche Telekom AG (DTAG)&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack : ceph docs&lt;br /&gt;
&lt;br /&gt;
  manual integration&lt;br /&gt;
  http://ceph.com/docs/next/rbd/rbd-openstack/&lt;br /&gt;
   maintainer: John Wilkins + Josh Durgin&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack with puppet : stackforge&lt;br /&gt;
&lt;br /&gt;
  https://github.com/stackforge/puppet-glance/blob/stable/grizzly/manifests/backend/rbd.pp&lt;br /&gt;
  https://github.com/stackforge/puppet-cinder/blob/stable/grizzly/manifests/volume/rbd.pp&lt;br /&gt;
&lt;br /&gt;
  maintainer: community&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack with puppet : COI&lt;br /&gt;
&lt;br /&gt;
  targeting Cisco use case&lt;br /&gt;
  https://github.com/CiscoSystems/puppet-coe/tree/grizzly/manifests/ceph&lt;br /&gt;
  http://docwiki.cisco.com/wiki/OpenStack:Ceph-COI-Installation&lt;br /&gt;
&lt;br /&gt;
  maintainer : Don Talton + Robert Starmer&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack with puppet : mirantis&lt;br /&gt;
&lt;br /&gt;
  in the context of Fuel&lt;br /&gt;
  https://github.com/Mirantis/fuel/tree/master/deployment/puppet/ceph&lt;br /&gt;
  https://github.com/Mirantis/fuel/blob/master/deployment/puppet/cinder/manifests/volume/ceph.pp&lt;br /&gt;
  https://github.com/Mirantis/fuel/blob/master/deployment/puppet/glance/manifests/backend/ceph.pp&lt;br /&gt;
&lt;br /&gt;
  maintainer : Andrew Woodward&lt;br /&gt;
&lt;br /&gt;
* openstack with puppet : openstack-installer&lt;br /&gt;
&lt;br /&gt;
  data driven approach to deploy OpenStack&lt;br /&gt;
  https://github.com/CiscoSystems/openstack-installer/&lt;br /&gt;
&lt;br /&gt;
  maintainer: Robert Starmer + Dan Bode&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Puppet/ceph-blueprint&amp;diff=33444</id>
		<title>Puppet/ceph-blueprint</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Puppet/ceph-blueprint&amp;diff=33444"/>
				<updated>2013-10-21T20:23:16Z</updated>
		
		<summary type="html">&lt;p&gt;Xarses: /* conf */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
This document is intended to capture requirements for a single [https://launchpad.net/puppet-ceph puppet-ceph module].&lt;br /&gt;
&lt;br /&gt;
Very much like vswitch, Ceph is not exclusively used in the context of OpenStack. There is however a significant community relying on puppet to deploy Ceph in the context of OpenStack, as is shown in the [#Related_tools_and_implementations|inventory of the existing efforts] Having a puppet ceph module under the umbrella of the stackforge infrastructure helps federate the efforts while providing a workflow that will improve the overall quality of the module.&lt;br /&gt;
&lt;br /&gt;
* [https://review.openstack.org/#/q/status:open+project:stackforge/puppet-ceph,n,z gerrit review page]&lt;br /&gt;
* [https://launchpad.net/puppet-ceph puppet-ceph at launchpad]&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
Almost each component of this module deserve a discussion and it would take a long time to agree on everything before getting something useful. The following list sets the order in which each module is going to be implemented. Each step must be a useable puppet module, unit tested and including integration tests.&lt;br /&gt;
&lt;br /&gt;
* [[#conf|conf]]&lt;br /&gt;
* [[#key|key]]&lt;br /&gt;
* [[#mon|mon]]&lt;br /&gt;
* [[#osd|osd]]&lt;br /&gt;
* [[#pool|pool]]&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
=== I want to try this module, heard of ceph, want to see it in action ===&lt;br /&gt;
&lt;br /&gt;
    /node/ { &lt;br /&gt;
     ceph::conf { auth_enable: false };&lt;br /&gt;
     ceph::mon; &lt;br /&gt;
     ceph::osd { '/srv/osd1' }; &lt;br /&gt;
     ceph::osd { '/srv/osd2' }; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
* install puppet, &lt;br /&gt;
* paste this in site.pp and replace /node/ with the name of your current node, &lt;br /&gt;
* puppet apply site.pp , &lt;br /&gt;
* ceph -s and see that it works&lt;br /&gt;
&lt;br /&gt;
=== I want to run benchmarks on three new machines ===&lt;br /&gt;
&lt;br /&gt;
* There are four machines, 3 OSD, 1 MON and one machine that is the client from which the user runs commands.&lt;br /&gt;
* install puppetmaster and create site.pp with:&lt;br /&gt;
&lt;br /&gt;
    /ceph-default/ {&lt;br /&gt;
      ceph::conf { auth_enable: false };&lt;br /&gt;
      ceph::conf { 'mon host': 'node1' }; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /node1/ inherits ceph-default { &lt;br /&gt;
     ceph::mon; &lt;br /&gt;
     ceph::osd; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /node2/, /node3/ inherits ceph-default { &lt;br /&gt;
     ceph::osd; &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /client/ inherits ceph-default { &lt;br /&gt;
     ceph::client;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
* ssh client&lt;br /&gt;
* rados bench &lt;br /&gt;
* interpret the results&lt;br /&gt;
&lt;br /&gt;
===  I want to spawn a cluster configured with a puppetmaster as part of a continuous integration effort ===&lt;br /&gt;
&lt;br /&gt;
''Leveraging vagrant, vagrant-openstack, openstack''&lt;br /&gt;
* Ceph is used as a backend storage for various use cases&lt;br /&gt;
* There are tests to make sure the Ceph cluster was instantiated properly&lt;br /&gt;
* There are tests to make sure various other infrastructure components (or products) can use the Ceph cluster&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
=== High level requirements ===&lt;br /&gt;
&lt;br /&gt;
==== No complex cross host orchestration ====&lt;br /&gt;
&lt;br /&gt;
All cross host orchestration should be assumed to be managed outside of Puppet. Provided that it's dependencies have already been configured and are known, each component should support being adding without having to run Puppet on more than one node.&lt;br /&gt;
&lt;br /&gt;
For example&lt;br /&gt;
&lt;br /&gt;
* cinder-volume instances should be configured to join a Ceph cluster simply by running Puppet on that node&lt;br /&gt;
* OSD instances should be configured to join a cluster simply by running puppet agent on a node and targeting that role.&lt;br /&gt;
&lt;br /&gt;
All cross host orchestration should be assumed to be managed outside of Puppet. The Puppet implementation should only be concerned with&lt;br /&gt;
&lt;br /&gt;
* what components need to be defined (where these are implemented as classes)&lt;br /&gt;
* what data is required for those components (where that data is passed in a class parameters)&lt;br /&gt;
&lt;br /&gt;
==== Supporting versions  ====&lt;br /&gt;
&lt;br /&gt;
The Operating System versions supported must be tested with integration on the actual operating system. Although it is fairly to add support for an Operating System, it is prone to regressions if not tested. The per Operating System support strategy mimics the way OpenStack modules do it. &lt;br /&gt;
&lt;br /&gt;
The supported versions of the components that deal with the environment in which Ceph is used ( OpenStack, Cloudstack, Ganeti etc. ) are handled by each component on a case by case basis. There probably is too much heterogeneity to set a rule.&lt;br /&gt;
&lt;br /&gt;
==== Provide sensible defaults ====&lt;br /&gt;
&lt;br /&gt;
If the high level components ( osd + mon + mds + rgw for instance ) are included without any parameter, the result must be a functional Ceph cluster.&lt;br /&gt;
&lt;br /&gt;
==== Architectured to leverage Ceph to its full potential ====&lt;br /&gt;
&lt;br /&gt;
It means talking to the MON when configuring or modifying the cluster, using ceph-disk as a low level tool to create the storage required for an OSD, creating a minimal /etc/ceph/ceph.conf to allow a client to connect to the Ceph cluster. The MON exposes a very rich API ( either via the ceph cli or a REST API ) and it offers a great flexibility to the system administrator. It is unlikely that the first versions of the puppet module captures all of it. But it should be architectured to allow the casual contributor to add a new feature or a new variation without the need to workaround architectural limitations. &lt;br /&gt;
&lt;br /&gt;
The ceph-deploy utility is developed as part of the ceph project, to help people get up to speed as quickly as possible for test and POCs. Alfredo Deza made a compeling argument against using ceph-deploy as a helper for a puppet module. Because it is designed to hide some of the flexibility ceph offers for the sake of simplicity. An inconvenience that is incompatible with the goal of a puppet module designed to accommodate all use cases. &lt;br /&gt;
&lt;br /&gt;
=== Prefer cli over REST ===&lt;br /&gt;
&lt;br /&gt;
The ceph cli is preferred because the [http://ceph.com/docs/next/man/8/ceph-rest-api/ rest-api] requires the installation of an additional daemon.&lt;br /&gt;
&lt;br /&gt;
=== Module versioning ===&lt;br /&gt;
&lt;br /&gt;
Create a branch for each Ceph release ( stable/cuttlefish, stable/dumpling etc. ) and follow the same pattern as the OpenStack modules&lt;br /&gt;
&lt;br /&gt;
=== Support Ceph versions from cuttlefish ===&lt;br /&gt;
&lt;br /&gt;
Do not support Ceph versions released before cuttlefish&lt;br /&gt;
&lt;br /&gt;
== Integration tests ==&lt;br /&gt;
&lt;br /&gt;
All scenarios can probably be covered with 2 virtual machines, 2 interfaces and one disk attached to one of the machines. A number of scenarios can be based on a single machine, using directories instead of disks and a single interface.&lt;br /&gt;
&lt;br /&gt;
::[[User:Dachary|Loic Dachary]] ([[User talk:Dachary|talk]]) : how are the integration test resource provisioned ? Where to look to learn more ?&lt;br /&gt;
&lt;br /&gt;
== Puppet user components ==&lt;br /&gt;
&lt;br /&gt;
This section outlines the roles and well as configuration components that are visible to the puppet user. They must be understandable for the system administrator willing to deploy Ceph for the first time.&lt;br /&gt;
&lt;br /&gt;
=== conf ===&lt;br /&gt;
&lt;br /&gt;
Although the key separator can either be space or underscore, only '''space''' is allowed to help with consistency. &lt;br /&gt;
&lt;br /&gt;
::[[User:Xarses|Xarses]] ([[User talk:Xarses|talk]]) hyphen is a also valid seperator. From my testing i found that the ini_file provider can not tell the difference in keys between &amp;quot;auth supported&amp;quot; and &amp;quot;auth_supported&amp;quot; which will lead to duplicate entries in ceph.conf if we aren't careful.&lt;br /&gt;
&lt;br /&gt;
::[[User:Dachary|Loic Dachary]] ([[User talk:Dachary|talk]]) : since [https://github.com/ceph/ceph-deploy/commit/53f46a8451dd8e10a3b9e8f2b191044f9863ae83 ceph-deploy enforces the use of _] and for the sake of consistency, it is probably better to use undercore instead of space.&lt;br /&gt;
&lt;br /&gt;
::[[User:Dachary|Loic Dachary]] ([[User talk:Dachary|talk]]) : bodep prefers ini, dalgaaf prefers concat, loic does not care but voted ini because there is more expertise, xarses and dmsimard +1 ini, mgagne does not object ini : it is going to be implemented as a provider such as nova_config.&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::conf&lt;br /&gt;
* '''purpose''': keeps and writes [http://ceph.com/docs/master/rados/configuration/osd-config-ref/ config] and their options for the top level sections of the ceph config. This includes these sections:&lt;br /&gt;
** [global]&lt;br /&gt;
** [mon]&lt;br /&gt;
** [osd]&lt;br /&gt;
** [mds]&lt;br /&gt;
* '''interface''': every key that is needed to write the base config ... the whole list would be to long to written down here&lt;br /&gt;
* auth_enable - true or false, enables/disables cephx, defaults to true&lt;br /&gt;
::If enable is true, set the following in the [global] section of the conf file:&lt;br /&gt;
&lt;br /&gt;
        auth cluster required = cephx&lt;br /&gt;
        auth service required = cephx&lt;br /&gt;
        auth client required = cephx&lt;br /&gt;
        auth supported = cephx&lt;br /&gt;
&lt;br /&gt;
::If enable is false, set the following in the [global] section of the conf file:&lt;br /&gt;
&lt;br /&gt;
        auth cluster required = none&lt;br /&gt;
        auth service required = none&lt;br /&gt;
        auth client required = none&lt;br /&gt;
        auth supported = none&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::It should support [http://ceph.com/docs/master/rados/operations/authentication/#disabling-cephx disabling] or [http://ceph.com/docs/master/rados/operations/authentication/#enabling-cephx enabling] cephx when the values change. If it does not support updating, it must fail when changed on an existing Ceph cluster.&lt;br /&gt;
&lt;br /&gt;
Using a [https://github.com/puppetlabs/puppetlabs-inifile inifile] child provider ( such as [https://github.com/stackforge/puppet-cinder/blob/master/lib/puppet/provider/cinder_config/ini_setting.rb cinder_config] ) a setting would look like&lt;br /&gt;
&lt;br /&gt;
    ceph_conf {&lt;br /&gt;
      'GLOBAL/fsid': value =&amp;gt; $fsid;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
And create '''/etc/ceph/ceph.conf''' such as:&lt;br /&gt;
&lt;br /&gt;
    [global]&lt;br /&gt;
        fsid = 918340183294812038&lt;br /&gt;
&lt;br /&gt;
Improvements to be implemented later:&lt;br /&gt;
* If a key/value pair is modified in the *mon*, *osd* or *mds* sections, all daemons are [http://ceph.com/docs/master/rados/configuration/ceph-conf/#runtime-changes notified of the change] with ceph {daemon} tell * ....&lt;br /&gt;
&lt;br /&gt;
=== osd ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::osd &lt;br /&gt;
* '''purpose''': configures a ceph OSD using the ceph-disk helper&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** directory/disk - a disk or a directory to be used as a storage for the OSD (optional)&lt;br /&gt;
** bootstrap-osd - the bootstrap-osd secret key (optional if cephx = none )&lt;br /&gt;
** dmcrypt - options needed to encrypt disks (optional)&lt;br /&gt;
&lt;br /&gt;
If the directory/disk is omitted, ceph-disk list is used to find unknown disks or partitions. All unknown disks are prepared with ceph-disk prepare. That effectively allows someone to say : use whatever disks are not in use for ceph and leave the rest alone. An operator would only have to add new disk and way for the next puppet client pass to have them integrated in the cluster. If a disk is removed, the OSD is  not launched at boot time and there is nothing to do. &lt;br /&gt;
&lt;br /&gt;
Here is what should happen on a node with at least one OSD&lt;br /&gt;
* common to all OSD on the same node:&lt;br /&gt;
** the /etc/ceph/ceph.conf file is setup with the IPs of the monitors&lt;br /&gt;
** [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/osd.py#L47 the /var/lib/ceph/bootstrap-osd/{cluster}.bootstrap-osd.keyring] file contains a user/key that is used to to create an OSD. The bootstrap-osd user key is usually the same for all OSD. For instance:&lt;br /&gt;
    [client.bootstrap-osd]&lt;br /&gt;
        key = AQCUg71RYEi7DxAAxlyC1KExxSnNJgim6lmuGA==&lt;br /&gt;
** The  user bootstrap-osd with this key with caps to bootstrap an OSD:&lt;br /&gt;
    $ ceph auth list&lt;br /&gt;
    ...&lt;br /&gt;
    client.bootstrap-osd&lt;br /&gt;
        key: AQCUg71RYEi7DxAAxlyC1KExxSnNJgim6lmuGA==&lt;br /&gt;
        caps: [mon] allow profile bootstrap-osd&lt;br /&gt;
* for each OSD &lt;br /&gt;
** in the same way [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/osd.py#L104 ceph-deploy prepare the disk] call ceph-disk-prepare that will [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L1031 set magic partition uuid] and trigger [https://github.com/ceph/ceph/blob/master/udev/95-ceph-osd.rules#L11 udev rules] to [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L453 ceph osd create]. When udev settles, the new osd is integrated into the cluster and uses its own key, created, registered to the MON and stored locally as a side effect of [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L1301 --mkkey]. The osd daemon is also run as a side effect of udev detecting the disk and calling [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L1414 /etc/init/ceph-osd.conf]. ceph-disk contains a [https://github.com/ceph/ceph/blob/master/src/ceph-disk#L18 high level description of the process]&lt;br /&gt;
** '''dmcrypt''' is also handled by the udev logic ( details ??? keys ??? )&lt;br /&gt;
&lt;br /&gt;
At boot time the [https://github.com/ceph/ceph/blob/master/src/upstart/ceph-osd-all-starter.conf#L14 /var/lib/ceph/osd directory is explored] to discover all OSDs that need to be started. Operating systems for which the same logic is not implemented will need an additional script run at boot time to perform the same exploration until the default script is updated to add this capability.&lt;br /&gt;
&lt;br /&gt;
=== mds ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::mds &lt;br /&gt;
* '''purpose''': configures a ceph MDS, setup /etc/ceph/ceph.conf with the MONs IPs, declare the MDS to the cluster via the MON, optionaly set the key to allow the MDS to connect to the MONs&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** monitor_ips - list of ip addresses used to connect to the monitor servers&lt;br /&gt;
** key - the secret key for the id user&lt;br /&gt;
** id - the id of the user&lt;br /&gt;
&lt;br /&gt;
=== mon ===&lt;br /&gt;
&lt;br /&gt;
Creates the files and keyring supporting a mon, runs the daemon&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::mon&lt;br /&gt;
* '''purpose''': configures a ceph MON&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** cluster - cluster name ( defaults to ceph )&lt;br /&gt;
** id - the id of the mon&lt;br /&gt;
** ip_address - the ip addresses of the mon&lt;br /&gt;
** key - the mon. user key&lt;br /&gt;
&lt;br /&gt;
* add a [mon.$id] section to the conf file (depends on ceph::conf to write the base part of the config)&lt;br /&gt;
* if auth == cephx&lt;br /&gt;
** the mon. key is mandatory and need to be set by the user to be a valid ceph key. The documentation should contain an example key and explanations about how to [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/new.py#L20 create an auth key].&lt;br /&gt;
** [https://github.com/ceph/ceph-deploy/blob/v1.2.7/ceph_deploy/new.py#L86 writes the keyring] &lt;br /&gt;
*  installs the packages&lt;br /&gt;
* ceph-mon --id 0 --mkfs&lt;br /&gt;
* runs the mon daemon&lt;br /&gt;
&lt;br /&gt;
=== rbd ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::rbd&lt;br /&gt;
* '''purpose''': maps and mounts a rbd image, taking care of dependencies (packages, rbd kernel module, /etc/ceph/rbdmap, fstab)&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** name - the name of the image&lt;br /&gt;
** pool - the pool in which the image is&lt;br /&gt;
** mount_point - where the image will be mounted&lt;br /&gt;
** key - the secret key for the id user&lt;br /&gt;
** id - the id of the user&lt;br /&gt;
::[[User:dmsimard|David Moreau Simard]] ([[User talk:David Moreau Simard|talk]]) Should ceph::client be a dependency ?&lt;br /&gt;
&lt;br /&gt;
=== cephfs ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::cephfs&lt;br /&gt;
* '''purpose''': mounts a cephfs filesystem, taking care of dependencies (e.g, fstab, packages)&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** Lots - See http://ceph.com/docs/next/man/8/mount.ceph/&lt;br /&gt;
::[[User:dmsimard|David Moreau Simard]] ([[User talk:David Moreau Simard|talk]]) Should ceph::client be a dependency ?&lt;br /&gt;
&lt;br /&gt;
== Implementor components ==&lt;br /&gt;
&lt;br /&gt;
These components are dependencies of the Puppet user components and can be used by other components. They should be a library of components where the code common to at least two independant components ( think OpenStack and Cloudstack ) is included.&lt;br /&gt;
&lt;br /&gt;
=== package  === &lt;br /&gt;
&lt;br /&gt;
Although some distributions include packages for Ceph, it is recommended to install from the packages available from ceph.com http://ceph.com/docs/next/install/. It is not recommended to install the Ceph package provided by the standard repositories. This will change over time and the need to use the repository provided by ceph.com will gradually become less common. &lt;br /&gt;
&lt;br /&gt;
The use of the repositories from ceph.com should be documented in the README.md with a apt {} based example to clarify that the user is expected to get up to date packages repositories.&lt;br /&gt;
&lt;br /&gt;
* Mimic https://github.com/stackforge/puppet-nova/blob/master/manifests/params.pp#L8 for cross distribution package name&lt;br /&gt;
&lt;br /&gt;
=== ceph client implementation ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::client &lt;br /&gt;
* '''purpose''': setup /etc/ceph/ceph.conf to connect to the Ceph cluster and install the ceph cli &lt;br /&gt;
* '''interface''':&lt;br /&gt;
** monitor_ips - list of ip addresses used to connect to the monitor servers&lt;br /&gt;
** client_id - name of the client to find the correct id for key&lt;br /&gt;
** keypath - path to the clients key file&lt;br /&gt;
&lt;br /&gt;
=== key ===&lt;br /&gt;
&lt;br /&gt;
Keyring management, authentication. It would be a class to create keys for new users (e.g. a user that can create RBDs or use the Objectstore) which may special access rights. But would also be used by the other classes like ceph::mon or ceph::osd to place e.g. the shared 'client.admin' or 'mon.' keys. I would handle here all key related tasks. &lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::key&lt;br /&gt;
* '''purpose''': handles ceph keys (cephx), generates keys, creates keyring files, incject keys into or delete keys from the cluster/keyring via ceph and ceph-authtool tools.&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** secret - key secret&lt;br /&gt;
** keyring_path - path to the keyring&lt;br /&gt;
** cap_mon/cap_osd/cap_mds - cephx capabilities&lt;br /&gt;
** user/group/mode: settings for the keyring file if needed&lt;br /&gt;
** inject - options to inject a key into the cluster&lt;br /&gt;
&lt;br /&gt;
=== pool ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::pool&lt;br /&gt;
* '''purpose''': manage operations on the pools in the cluster such as: create/delete pools, set PG/PGP number&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** pool_name - name of the pool&lt;br /&gt;
** create - if to create a new pool&lt;br /&gt;
** delete - if to delete an existing pool&lt;br /&gt;
** pg_num - number of Placement Groups (PGs) for a pool, if the pool already exists this may increase the number of PGs if the current value is lower&lt;br /&gt;
** pgp_num - same as for pg_num&lt;br /&gt;
** replica_level - increase or decrease the replica level of a pool&lt;br /&gt;
&lt;br /&gt;
== OpenStack components ==&lt;br /&gt;
&lt;br /&gt;
ceph specific configuration for cinder/glance (already provided by the puppet-cinder and puppet-glance modules in the volume/rdb and backend/rdb classes)&lt;br /&gt;
&lt;br /&gt;
== RadosGW components ==&lt;br /&gt;
&lt;br /&gt;
The RadosGW is developped as an integral part of Ceph. It is however not required to deploy a cluster and should be treated as any client application of the cluster.&lt;br /&gt;
&lt;br /&gt;
=== rgw ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::rgw&lt;br /&gt;
* '''purpose''': configures a ceph radosgw , setup /etc/ceph/ceph.conf with the MONs IPs, optionaly set the key to allow the OSD to connect to the MONs&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** monitor_ips - list of ip addresses used to connect to the monitor servers &lt;br /&gt;
** key - the secret key for the id user&lt;br /&gt;
** id - the id of the user&lt;br /&gt;
** rgw_data - the path where the radosgw data should be stored&lt;br /&gt;
** fcgi_file - path to the fcgi file e.g. /var/www/s3gw.fcgi&lt;br /&gt;
:: [[User:Danny Al-Gaaf|Danny Al-Gaaf]] ([[User talk:Danny Al-Gaaf|talk]]) the monitor_ips are not needed: IMO ceph::conf should provide these information to all other&lt;br /&gt;
&lt;br /&gt;
=== rgw_user ===&lt;br /&gt;
&lt;br /&gt;
* '''proposed name''': ceph::rgw_user&lt;br /&gt;
* '''purpose''': create/remove users and Swift users for the RadosGW S3/Swift API&lt;br /&gt;
* '''interface''':&lt;br /&gt;
** user - username&lt;br /&gt;
** key - secret key (could get generated if needed)&lt;br /&gt;
** swift_user - username for the Swift API user&lt;br /&gt;
** swift_key - secret key for the Swift API user&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Related tools and implementations ==&lt;br /&gt;
&lt;br /&gt;
* deploy ceph : ceph-deploy&lt;br /&gt;
&lt;br /&gt;
  for test / POC purposes&lt;br /&gt;
  https://github.com/ceph/ceph-deploy&lt;br /&gt;
&lt;br /&gt;
  maintainer: Alfredo Deza&lt;br /&gt;
&lt;br /&gt;
* deploy ceph with puppet : puppet-cephdeploy&lt;br /&gt;
&lt;br /&gt;
  relies on ceph-deploy&lt;br /&gt;
  https://github.com/dontalton/puppet-cephdeploy/&lt;br /&gt;
&lt;br /&gt;
  maintainer: Don Talton&lt;br /&gt;
&lt;br /&gt;
* deploy ceph with puppet : puppet-ceph&lt;br /&gt;
&lt;br /&gt;
  developped in 2012 but still useful, upstream&lt;br /&gt;
  https://github.com/enovance/puppet-ceph&lt;br /&gt;
&lt;br /&gt;
  maintainer: community&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  fork of puppet-ceph, updated recently&lt;br /&gt;
  https://github.com/TelekomCloud/puppet-ceph/tree/rc/eisbrecher&lt;br /&gt;
&lt;br /&gt;
  maintainer: Deutsche Telekom AG (DTAG)&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack : ceph docs&lt;br /&gt;
&lt;br /&gt;
  manual integration&lt;br /&gt;
  http://ceph.com/docs/next/rbd/rbd-openstack/&lt;br /&gt;
   maintainer: John Wilkins + Josh Durgin&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack with puppet : stackforge&lt;br /&gt;
&lt;br /&gt;
  https://github.com/stackforge/puppet-glance/blob/stable/grizzly/manifests/backend/rbd.pp&lt;br /&gt;
  https://github.com/stackforge/puppet-cinder/blob/stable/grizzly/manifests/volume/rbd.pp&lt;br /&gt;
&lt;br /&gt;
  maintainer: community&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack with puppet : COI&lt;br /&gt;
&lt;br /&gt;
  targeting Cisco use case&lt;br /&gt;
  https://github.com/CiscoSystems/puppet-coe/tree/grizzly/manifests/ceph&lt;br /&gt;
  http://docwiki.cisco.com/wiki/OpenStack:Ceph-COI-Installation&lt;br /&gt;
&lt;br /&gt;
  maintainer : Don Talton + Robert Starmer&lt;br /&gt;
&lt;br /&gt;
* ceph + openstack with puppet : mirantis&lt;br /&gt;
&lt;br /&gt;
  in the context of Fuel&lt;br /&gt;
  https://github.com/Mirantis/fuel/tree/master/deployment/puppet/ceph&lt;br /&gt;
  https://github.com/Mirantis/fuel/blob/master/deployment/puppet/cinder/manifests/volume/ceph.pp&lt;br /&gt;
  https://github.com/Mirantis/fuel/blob/master/deployment/puppet/glance/manifests/backend/ceph.pp&lt;br /&gt;
&lt;br /&gt;
  maintainer : Andrew Woodward&lt;br /&gt;
&lt;br /&gt;
* openstack with puppet : openstack-installer&lt;br /&gt;
&lt;br /&gt;
  data driven approach to deploy OpenStack&lt;br /&gt;
  https://github.com/CiscoSystems/openstack-installer/&lt;br /&gt;
&lt;br /&gt;
  maintainer: Robert Starmer + Dan Bode&lt;/div&gt;</summary>
		<author><name>Xarses</name></author>	</entry>

	</feed>