From c54d45f5db0653cc78f22253b77bf1f15e842bc3 Mon Sep 17 00:00:00 2001 From: Abhishek Kekane Date: Tue, 1 Aug 2017 15:12:14 +0530 Subject: [PATCH] Masakari developer's documentation Added documentation for how to get involved, development qucikstart and masakari system architecture. Change-Id: Ie2cbdde7698a79a1b996e485d141eb15dbded4cd --- doc/source/architecture.rst | 44 +++ doc/source/contributing.rst | 4 - doc/source/development.environment.rst | 127 ++++++++ doc/source/how_to_get_involved.rst | 298 +++++++++++++++++ doc/source/images/Masakari_spec_process.svg | 340 ++++++++++++++++++++ doc/source/images/architecture.png | Bin 0 -> 55916 bytes doc/source/index.rst | 68 +++- doc/source/installation.rst | 12 - doc/source/process.rst | 197 ++++++++++++ doc/source/readme.rst | 1 - doc/source/usage.rst | 7 - tox.ini | 4 +- 12 files changed, 1062 insertions(+), 40 deletions(-) create mode 100644 doc/source/architecture.rst delete mode 100644 doc/source/contributing.rst create mode 100644 doc/source/development.environment.rst create mode 100644 doc/source/how_to_get_involved.rst create mode 100644 doc/source/images/Masakari_spec_process.svg create mode 100644 doc/source/images/architecture.png delete mode 100644 doc/source/installation.rst create mode 100644 doc/source/process.rst delete mode 100644 doc/source/readme.rst delete mode 100644 doc/source/usage.rst diff --git a/doc/source/architecture.rst b/doc/source/architecture.rst new file mode 100644 index 00000000..bb865d51 --- /dev/null +++ b/doc/source/architecture.rst @@ -0,0 +1,44 @@ +.. + Copyright 2017 NTT DATA + + Licensed under the Apache License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may obtain + a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + License for the specific language governing permissions and limitations + under the License. + +Masakari System Architecture +============================ + +Masakari is comprised of two services api and engine, each performing different +functions. The user-facing interface is a REST API, while internally Masakari +communicates via an RPC message passing mechanism. + +The API servers process REST requests, which typically involve database +reads/writes, sending RPC messages to other Masakari engine, +and generating responses to the REST calls. +RPC messaging is done via the **oslo.messaging** library, +an abstraction on top of message queues. +Masakari engine will run on same host where masakari api is running, and have +a `manager` that is listening for `RPC` messages. +The manager also, optionally, has periodic tasks. + +Components +---------- + +Below you will find a helpful explanation of the key components +of a typical Masakari deployment. + +.. image:: ./images/architecture.png + :width: 100% + +* DB: sql database for data storage. +* API: component that receives HTTP requests, converts commands and + communicates with masakari engine via the **oslo.messaging** queue. +* Engine: Executes recovery workflow and communicates with nova via HTTP. diff --git a/doc/source/contributing.rst b/doc/source/contributing.rst deleted file mode 100644 index 1728a61c..00000000 --- a/doc/source/contributing.rst +++ /dev/null @@ -1,4 +0,0 @@ -============ -Contributing -============ -.. include:: ../../CONTRIBUTING.rst diff --git a/doc/source/development.environment.rst b/doc/source/development.environment.rst new file mode 100644 index 00000000..c33ed728 --- /dev/null +++ b/doc/source/development.environment.rst @@ -0,0 +1,127 @@ +.. + Copyright 2017 NTT DATA + + Licensed under the Apache License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may obtain + a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + License for the specific language governing permissions and limitations + under the License. + +====================== +Development Quickstart +====================== + +This page describes how to setup and use a working Python development +environment that can be used in developing masakari on Ubuntu. +These instructions assume you're already familiar with git. + +Following these instructions will allow you to build the documentation +and run the masakari unit tests. + +.. note:: For how to contribute to Masakari, see + `How To Contribute `_. + Masakari uses the Gerrit code review system, + See `Gerrit Workflow `_. + +Setup +===== + +There are two ways to create a development environment: using +DevStack, or explicitly installing and cloning just what you need. + + +Using DevStack +-------------- + +To enable Masakari in DevStack, perform the following steps: + + +Download DevStack +~~~~~~~~~~~~~~~~~ + +.. sourcecode:: bash + + export DEVSTACK_DIR=~/devstack + git clone git://git.openstack.org/openstack-dev/devstack.git $DEVSTACK_DIR + +Enable the Masakari plugin +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Enable the plugin by adding the following section to ``$DEVSTACK_DIR/local.conf`` + +.. sourcecode:: bash + + [[local|localrc]] + enable_plugin masakari git://git.openstack.org/openstack/masakari + +Optionally, a git refspec (branch or tag or commit) may be provided as follows: + +.. sourcecode:: bash + + [[local|localrc]] + enable_plugin masakari git://git.openstack.org/openstack/masakari + +Run the DevStack utility +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. sourcecode:: bash + + cd $DEVSTACK_DIR + ./stack.sh + +Explicit Install/Clone +---------------------- + +DevStack installs a complete OpenStack environment. Alternatively, +you can explicitly install and clone just what you need for Masakari +development. + +Getting the code +~~~~~~~~~~~~~~~~ + +Grab the code from git:: + + git clone https://git.openstack.org/openstack/masakari + cd masakari + + +Linux Systems +~~~~~~~~~~~~~ + +The first step of this process is to install the system (not Python) +packages that are required. Following are instructions on how to do +this on Linux. + +On Debian-based distributions (e.g., Debian/Mint/Ubuntu):: + + sudo apt-get install python-pip + sudo pip install tox + tox -e bindep + sudo apt-get install + +Building the Documentation +========================== + +Install the prerequisite packages: graphviz + +To do a full documentation build, issue the following command while +the masakari directory is current. + +.. code-block:: bash + + tox -e docs + +That will create a Python virtual environment, install the needed +Python prerequisites in that environment, and build all the +documentation in that environment. + +Running unit tests +================== + +See `Running Python Unit Tests `_. diff --git a/doc/source/how_to_get_involved.rst b/doc/source/how_to_get_involved.rst new file mode 100644 index 00000000..540cb730 --- /dev/null +++ b/doc/source/how_to_get_involved.rst @@ -0,0 +1,298 @@ +.. + Copyright 2017 NTT DATA + + Licensed under the Apache License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may obtain + a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + License for the specific language governing permissions and limitations + under the License. + +.. _getting_involved: + +======================================== +How to get (more) involved with Masakari +======================================== + +So you want to get more involved with Masakari? Or you are new to Masakari and +wondering where to start? + +We are working on building easy ways for you to get help and ideas on +how to learn more about Masakari and how the Masakari community works. + +How do I get started? +===================== + +There are quite a few global docs on this: + +- http://www.openstack.org/assets/welcome-guide/OpenStackWelcomeGuide.pdf +- https://wiki.openstack.org/wiki/How_To_Contribute +- http://www.openstack.org/community/ + +There is more general info, non Masakari specific info here: + +- https://wiki.openstack.org/wiki/Mentors +- https://wiki.openstack.org/wiki/OpenStack_Upstream_Training + +What should I work on? +~~~~~~~~~~~~~~~~~~~~~~ + +So you are starting out your Masakari journey, where is a good place to +start? + +If you'd like to learn how Masakari works before changing anything +(good idea!), we recommend looking for reviews with -1s and -2s and seeing +why they got down voted. Once you have some understanding, start reviewing +patches. It's OK to ask people to explain things you don't understand. It's +also OK to see some potential problems but put a +0. + +Once you're ready to write code, take a look at some of the work already marked +as low-hanging fruit: + +* https://bugs.launchpad.net/masakari/+bugs?field.tag=low-hanging-fruit + +How do I get my feature in? +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The best way of getting your feature in is... well it depends. + +First concentrate on solving your problem and/or use case, don't fixate +on getting the code you have working merged. It’s likely things will need +significant re-work after you discuss how your needs match up with all +the existing ways Masakari is currently being used. The good news, is this +process should leave you with a feature that's more flexible and doesn't +lock you into your current way of thinking. + +A key part of getting code merged, is helping with reviewing other +people's code. Great reviews of others code will help free up more core +reviewer time to look at your own patches. In addition, you will +understand how the review is thinking when they review your code. + +Also, work out if any ongoing efforts are blocking your feature and +helping out speeding those up. The spec review process should help with +this effort. + +For more details on our process, please see: :ref:`process`. + +What is expected of a good contributor? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +TODO - need more info on this + +Top Tips for working with the Masakari community +================================================ + +Here are some top tips around engaging with the Masakari community: + +- IRC + + - we talk a lot in #openstack-masakari + - do ask us questions in there, and we will try to help you + - not sure about asking questions? feel free to listen in around + other people's questions + - we recommend you setup an IRC bouncer: + https://wiki.openstack.org/wiki/IRC + +- Email + + - Use the [masakari] tag in the mailing lists + - Filtering on [masakari] and [all] can help tame the list + +- Be Open + + - i.e. don't review your teams code in private, do it publicly in + gerrit + - i.e. be ready to talk about openly about problems you are having, + not "theoretical" issues + - that way you can start to gain the trust of the wider community + +- Got a problem? Please ask! + + - Please raise any problems and ask questions early + - we want to help you before you are frustrated or annoyed + - unsure who to ask? Just ask in IRC. + +- Talk about problems first, then solutions + + - Don't think about "merging your patch", instead think about + "solving your problem" + - conversations are more productive that way + +- It's not the decision that's important, it's the reason behind it that's + important + + - Don't like the way the community is going? + - Please ask why we were going that way, and please engage with the + debate + - If you don't, we are unable to learn from what you have to offer + +- No one will decide, this is stuck, who can help me? + + - it's rare, but it happens + - ...but if you don't ask, it's hard for them to help you + +Process +======= + +It can feel like you are faced with a wall of process. We are a big +community, to make sure the right communication happens, we do use a +minimal amount of process. + +If you find something that doesn't make sense, please: + +- ask questions to find out \*why\* it happens +- if you know of a better way to do it, please speak up +- one "better way" might be to remove the process if it no longer helps + +To learn more about Masakari's process, please read :ref:`process`. + +Why bother with any process? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Why is it worth creating a bug or blueprint to track your code review? +This may seem like silly process, but there is usually a good reason +behind it. + +We have lots of code to review, and we have tools to try and get to +really important code reviews first. If yours is really important, but +not picked up by our tools, it's possible you just get lost in the bottom +of a big queue. + +If you have a bug fix, you have done loads of work to identify the +issue, and test out your fix, and submit it. By adding a bug report, you +are making it easier for other folks who hit the same problem to find +your work, possibly saving them the hours of pain you went through. With +any luck that gives all those people the time to fix different bugs, all +that might have affected you, if you had not given them the time go fix +it. + +It's similar with blueprints. You have worked out how to scratch your +itch, lets tell others about that great new feature you have added, so +they can use that. Also, it stops someone with a similar idea going +through all the pain of creating a feature only to find you already have +that feature ready and up for review, or merged into the latest release. + +Hopefully this gives you an idea why we have applied a small layer of +process to what we are doing. Having said all this, we need to unlearn +old habits to move forward, there may be better ways to do things, and +we are open to trying them. Please help be part of the solution. + +.. _why_plus1: + +Why do code reviews if I am not in masakari-core? +================================================= + +Code reviews are the life blood of the developer community. + +There is a good discussion on how you do good reviews, and how anyone +can be a reviewer: +http://docs.openstack.org/infra/manual/developers.html#peer-review + +In the draft process guide, I discuss how doing reviews can help get +your code merged faster: :ref:`process`. + +Let’s look at some of the top reasons why participating with code reviews +really helps you: + +- Doing more reviews, and seeing what other reviewers notice, will help + you better understand what is expected of code that gets merged into + master +- Having more non-core people do great reviews, leaves less review work + for the core reviewers to do, so we are able get more code merged +- Empathy is one of the keys to a happy community. If you are used to + doing code reviews, you will better understand the comments you get + when people review your code. As you do more code reviews, and see + what others notice, you will get a better idea of what people are + looking for when then apply a +2 to your code. + +What are the most useful types of code review comments? Well here are a +few to the top ones: + +- Fundamental flaws are the biggest thing to spot. Does the patch break + a whole set of existing users, or an existing feature? +- Consistency of behavior is really important. Does this bit of code + do things differently to where similar things happen elsewhere in + Masakari? +- Is the code easy to maintain, well tested and easy to read? Code is + read order of magnitude times more than it is written, so optimize + for the reader of the code, not the writer. + +Let's look at some problems people hit when starting out doing code +reviews: + +- My +1 doesn't mean anything, why should I bother? + + - So your +1 really does help. Some really useful -1 votes that lead + to a +1 vote helps get code into a position + +- When to use -1 vs 0 vs +1 + + - Please see the guidelines here: + http://docs.openstack.org/infra/manual/developers.html#peer-review + +- I have already reviewed this code internally, no point in adding a +1 + externally? + + - Please talk to your company about doing all code reviews in the + public, that is a much better way to get involved. Showing how the + code has evolved upstream, is much better than trying to 'perfect' + code internally, before uploading for public review. You can use + Draft mode, and mark things as WIP if you prefer, but please do + the reviews upstream. + +- Where do I start? What should I review? + + - There are various tools, but a good place to start is: + https://etherpad.openstack.org/p/masakari-pike-workitems + - Depending on the time in the cycle, it's worth looking at + NeedsCodeReview blueprints: + https://blueprints.launchpad.net/masakari/ + - Maybe take a look at things you want to see merged, bug fixes and + features, or little code fixes + - Look for things that have been waiting a long time for a review: + - If you get through the above lists, try other tools, such as: + http://status.openstack.org/reviews + +How to do great code reviews? +============================= + +http://docs.openstack.org/infra/manual/developers.html#peer-review + +For more tips, please see: `Why do code reviews if I am not in masakari-core?`_ + +How do I become masakari-core? +============================== + +You don't have to be masakari-core to be a valued member of the Masakari +community. There are many, many ways you can help. Every quality review +that helps someone get their patch closer to being ready to merge helps +everyone get their code merged faster. + +The first step to becoming masakari-core is learning how to be an active +member of the Masakari community, including learning how to do great code +reviews. + +If you feel like you have the time to commit to all the masakari-core +membership expectations, reach out to the Masakari PTL who will be +able to find you an existing member of masakari-core to help mentor you. If +all goes well, and you seem like a good candidate, your mentor will +contact the rest of the masakari-core team to ask them to start looking at +your reviews, so they are able to vote for you, if you get nominated for +join masakari-core. + +We encourage all mentoring, where possible, to occur on #openstack-masakari +so everyone can learn and benefit from your discussions. + +The above mentoring is available to everyone who wants to learn how to +better code reviews, even if you don't ever want to commit to becoming +masakari-core. If you already have a mentor, that's great, the process is +only there for folks who are still trying to find a mentor. Being +admitted to the mentoring program no way guarantees you will become a +member of masakari-core eventually, it's here to help you improve, and help +you have the sort of involvement and conversations that can lead to +becoming a member of masakari-core. diff --git a/doc/source/images/Masakari_spec_process.svg b/doc/source/images/Masakari_spec_process.svg new file mode 100644 index 00000000..0d570ff0 --- /dev/null +++ b/doc/source/images/Masakari_spec_process.svg @@ -0,0 +1,340 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + launchpad + + + + + + + + + + create a bug + + + + + + + + + create a blueprint + + + + + + + + + create a blueprint + + + + + + + End states + + + + + + + + + + out of scope + + + + + + + + + code merged + + + + + + bug fix? + + + + + + + + + + idea + + + + + + REST API change? + + + + + + + + + + submit spec for review + + + + + + a feature? + + + + + + + + + + spec merged + + + + + + + + + blueprint approved for release + + + + + + spec required? + + + + + + + + + + add link on masakari meeting agenda + + + + + + + + + blueprint hit by feature freeze + + + + + + + + + re-submit for next release + + + + + + + + + blueprint unapproved + + + + + + + + + apply procedural -2 + + + + + + + + + upload code for review + + + + + + + + + remove procedural -2 + + + + + + + + + review blueprint in masakari meeting + + + + + + + + + no + + + yes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/source/images/architecture.png b/doc/source/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..bd344e438e0b0dcfe54734bf6931f96dd4c2a786 GIT binary patch literal 55916 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

0Y3tBTXPyz4=Bp=W4cI*7Z>s!mm~t;y=P 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

m3>jtLCw)OUZ+i6FQa6c4g0Q9!7*u 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

$=o0xAG=uJVLz^n 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 K-8sq!&;K7`WFkQT literal 0 HcmV?d00001 diff --git a/doc/source/index.rst b/doc/source/index.rst index 01398204..b4c65d81 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -1,25 +1,63 @@ -.. masakari documentation master file, created by - sphinx-quickstart on Tue Jul 9 22:26:36 2013. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. +.. + Copyright 2017 NTT DATA -Welcome to masakari's documentation! -======================================================== + Licensed under the Apache License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may obtain + a copy of the License at -Contents: + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + License for the specific language governing permissions and limitations + under the License. + +======================================================= +Welcome to Masakari's developer/operator documentation! +======================================================= + +Masakari is an OpenStack project designed to assure high availability of +instances and compute processes running on hosts. + +The developer documentation provided here is continually kept up-to-date +based on the latest code, and may not represent the state of the project at +any specific prior release. + +This documentation is intended to help explain what the Masakari developers +think is the current scope of the Masakari project, as well as the +architectural decisions we have made in order to support that scope. We also +document our plans for evolving our architecture over time. Finally, we +documented our current development process and policies. + +Masakari API References +======================= + +The Masakari API is quite large, we provide a concept guide which +gives some of the high level details, as well as a more detailed API +reference. + +To generate API reference guide issue the following command while +the masakari directory is current. + +.. code-block:: bash + + $ tox -e api-ref + +Developer Guide +=============== + +If you are new to Masakari, this should help you start to understand what +masakari actually does, and why. .. toctree:: - :maxdepth: 2 + :maxdepth: 1 - readme - installation - usage - contributing + how_to_get_involved + architecture + development.environment Indices and tables ================== -* :ref:`genindex` -* :ref:`modindex` * :ref:`search` - diff --git a/doc/source/installation.rst b/doc/source/installation.rst deleted file mode 100644 index 865ffa5e..00000000 --- a/doc/source/installation.rst +++ /dev/null @@ -1,12 +0,0 @@ -============ -Installation -============ - -At the command line:: - - $ pip install masakari - -Or, if you have virtualenvwrapper installed:: - - $ mkvirtualenv masakari - $ pip install masakari diff --git a/doc/source/process.rst b/doc/source/process.rst new file mode 100644 index 00000000..458fad75 --- /dev/null +++ b/doc/source/process.rst @@ -0,0 +1,197 @@ +.. + Copyright 2017 NTT DATA + + Licensed under the Apache License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may obtain + a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + License for the specific language governing permissions and limitations + under the License. + +.. _process: + +===================== +Masakari team process +===================== + +Masakari is always evolving its processes, but it's important to explain why we +have them: so we can all work to ensure that the interactions we need to +happen do happen. The process exists to make productive communication between +all members of our community easier. + +OpenStack Wide Patterns +======================= + +Masakari follows most of the generally adopted norms for OpenStack projects. +You can get more details here: + +* http://docs.openstack.org/infra/manual/developers.html +* http://docs.openstack.org/project-team-guide/ + +If you are new to Masakari, please read this first: :ref:`getting_involved`. + +How do I get my code merged? +============================ + +OK, so you are new to Masakari, and you have been given a feature to +implement. How do I make that happen? + +You can get most of your questions answered here: + +- http://docs.openstack.org/infra/manual/developers.html + +But let's put a Masakari specific twist on things... + +Overview +~~~~~~~~ + +.. image:: ./images/Masakari_spec_process.svg + :alt: Flow chart showing the Masakari bug/feature process + +Where do you track bugs? +~~~~~~~~~~~~~~~~~~~~~~~~ + +We track bugs here: + +- http://bugs.launchpad.net/masakari + +If you fix an issue, please raise a bug so others who spot that issue +can find the fix you kindly created for them. + +Also before submitting your patch it's worth checking to see if someone +has already fixed it for you (Launchpad helps you with that, at little, +when you create the bug report). + +When do I need a blueprint vs. a spec? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To understand this question, we need to understand why blueprints and +specs are useful. + +But here is the rough idea: + +- if it needs a spec, it will need a blueprint. +- if it's an API change, it needs a spec. +- if it's a single small patch that touches a small amount of code, + with limited deployer and doc impact, it probably doesn't need a + spec. + +If you are unsure, please ask PTL or one of the other +masakari-core on IRC. + +How do I get my blueprint approved? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +So you need your blueprint approved? Here is how: + +- if you don't need a spec, please add a link to your blueprint to the + agenda for the next masakari meeting: + https://wiki.openstack.org/wiki/Meetings/Masakari + + - be sure your blueprint description has enough context for the + review in that meeting. + +- if you need a spec, then please submit a masakari-spec for review. + +Got any more questions? Contact samP or one of the other +masakari-core who are awake at the same time as you. IRC is best as +you will often get an immediate response, if they are too busy send +him/her an email. + +How do I get a procedural -2 removed from my patch? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When feature freeze hits, any patches for blueprints that are still in review +get a procedural -2 to stop them merging. In Masakari a blueprint is only +approved for a single release. To have the -2 removed, you need to get the +blueprint approved for the current release +(see `How do I get my blueprint approved?`_). + +My code review seems stuck, what can I do? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +First and foremost - address any -1s and -2s! A few tips: + +- Be precise. Ensure you're not talking at cross purposes. +- Try to understand where the reviewer is coming from. They may have a + very different perspective and/or use-case to you. +- If you don't understand the problem, ask them to explain - this is + common and helpful behavior. +- Be positive. Everyone's patches have issues, including core + reviewers. No-one cares once the issues are fixed. +- Try not to flip-flop. When two reviewers are pulling you in different + directions, stop pushing code and negotiate the best way forward. +- If the reviewer does not respond to replies left on the patchset, + reach out to them on IRC or email. If they still don't respond, you + can try to ask their colleagues if they're on holiday (or simply + wait). Finally, you can ask for mediation in the Masakari meeting by + adding it to the agenda + (https://wiki.openstack.org/wiki/Meetings/Masakari). This is also what + you should do if you are unable to negotiate a resolution to an + issue. + +Eventually you should get some +1s from people working through the +review queue. Expect to get -1s as well. You can ask for reviews within +your company, 1-2 are useful (not more), especially if those reviewers +are known to give good reviews. You can spend some time while you wait +reviewing other people's code - they may reciprocate and you may learn +something (:ref:`Why do code reviews when I'm not core? `). + +If you've waited an appropriate amount of time and you haven't had any ++1s, you can ask on IRC for reviews. Please don't ask for core review +straight away, especially not directly (IRC or email). Core reviewer +time is very valuable and gaining some +1s is a good way to show your +patch meets basic quality standards. + +Once you have a few +1s, be patient. Remember the average wait times. +You can ask for reviews each week in IRC, it helps to ask when cores are +awake. + +Bugs +---- + +It helps to apply correct tracking information. + +- Put "Closes-Bug", "Partial-Bug" or "Related-Bug" in the commit + message tags as necessary. +- If you have to raise a bug in Launchpad first, do it - this helps + someone else find your fix. +- Make sure the bug has the correct priority and tag set. + +Features +-------- + +Again, it helps to apply correct tracking information. For +blueprint-only features: + +- Put your blueprint in the commit message, EG "blueprint + simple-feature". +- Mark the blueprint as NeedsCodeReview if you are finished. +- Maintain the whiteboard on the blueprint so it's easy to understand + which patches need reviews. +- Use a single topic for all related patches. All patches for one + blueprint should share a topic. + +For blueprint and spec features, do everything for blueprint-only +features and also: + +- If it's a project or subteam priority, add it to: + https://etherpad.openstack.org/p/masakari-pike-workitems +- Ensure your spec is approved for the current release cycle. + +If it's not a priority, your blueprint/spec has been approved for the +cycle and you have been patient, you can raise it during the Masakari +meeting. The outcome may be that your spec gets unapproved for the +cycle, so that priority items can take focus. If this happens to you, +sorry - it should not have been approved in the first place, Masakari team +bit off more than they could chew, it is their mistake not yours. You +can re-propose it for the next cycle. + +If it's not a priority and your spec has not been approved, your code +will not merge this cycle. Please re-propose your spec for the next +cycle. diff --git a/doc/source/readme.rst b/doc/source/readme.rst deleted file mode 100644 index a6210d3d..00000000 --- a/doc/source/readme.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../../README.rst diff --git a/doc/source/usage.rst b/doc/source/usage.rst deleted file mode 100644 index e5c30308..00000000 --- a/doc/source/usage.rst +++ /dev/null @@ -1,7 +0,0 @@ -======== -Usage -======== - -To use masakari in a project:: - - import masakari diff --git a/tox.ini b/tox.ini index 32f2da49..690c84b3 100644 --- a/tox.ini +++ b/tox.ini @@ -48,7 +48,9 @@ commands = python setup.py test --coverage --testr-args='{posargs}' coverage report [testenv:docs] -commands = python setup.py build_sphinx +basepython = python2.7 +commands = + python setup.py build_sphinx [testenv:releasenotes] commands =