Masakari developer's documentation
Added documentation for how to get involved, development qucikstart and masakari system architecture. Change-Id: Ie2cbdde7698a79a1b996e485d141eb15dbded4cd
This commit is contained in:
parent
f5e074c9e4
commit
c54d45f5db
44
doc/source/architecture.rst
Normal file
44
doc/source/architecture.rst
Normal file
@ -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.
|
@ -1,4 +0,0 @@
|
||||
============
|
||||
Contributing
|
||||
============
|
||||
.. include:: ../../CONTRIBUTING.rst
|
127
doc/source/development.environment.rst
Normal file
127
doc/source/development.environment.rst
Normal file
@ -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 <http://docs.openstack.org/infra/manual/developers.html>`_.
|
||||
Masakari uses the Gerrit code review system,
|
||||
See `Gerrit Workflow <http://docs.openstack.org/infra/manual/developers.html#development-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 <refspec>
|
||||
|
||||
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 <indicated missing package names>
|
||||
|
||||
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 <https://docs.openstack.org/project-team-guide/project-setup/python.html#running-python-unit-tests>`_.
|
298
doc/source/how_to_get_involved.rst
Normal file
298
doc/source/how_to_get_involved.rst
Normal file
@ -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.
|
340
doc/source/images/Masakari_spec_process.svg
Normal file
340
doc/source/images/Masakari_spec_process.svg
Normal file
@ -0,0 +1,340 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-opacity="1" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="637" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" height="1149" font-family="'Dialog'" font-style="normal" stroke-linejoin="miter" font-size="12" stroke-dashoffset="0" image-rendering="auto">
|
||||
<!--Generated by ySVG 2.5-->
|
||||
<defs id="genericDefs"/>
|
||||
<g>
|
||||
<defs id="defs1">
|
||||
<linearGradient x1="66.9357" gradientUnits="userSpaceOnUse" x2="66.9357" y1="-759.8748" y2="-727.3748" id="linearGradient1" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(230,242,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="183.182" gradientUnits="userSpaceOnUse" x2="183.182" y1="-759.8748" y2="-727.3748" id="linearGradient2" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(230,242,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="329.9673" gradientUnits="userSpaceOnUse" x2="329.9673" y1="-759.8748" y2="-727.3748" id="linearGradient3" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(230,242,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="136.0729" gradientUnits="userSpaceOnUse" x2="136.0729" y1="-31" y2="1.5" id="linearGradient4" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="16.0004" gradientUnits="userSpaceOnUse" x2="16.0004" y1="-31" y2="1.5" id="linearGradient5" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="340.4421" gradientUnits="userSpaceOnUse" x2="340.4421" y1="-1104.6365" y2="-1072.1365" id="linearGradient6" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(230,242,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="256.3125" gradientUnits="userSpaceOnUse" x2="256.3125" y1="-464.8748" y2="-432.3748" id="linearGradient7" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(230,242,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="238.6593" gradientUnits="userSpaceOnUse" x2="238.6593" y1="-389.8748" y2="-357.3748" id="linearGradient8" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="130.2458" gradientUnits="userSpaceOnUse" x2="130.2458" y1="-314.8748" y2="-282.3748" id="linearGradient9" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="125.0589" gradientUnits="userSpaceOnUse" x2="125.0589" y1="-589.8748" y2="-557.3748" id="linearGradient10" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(230,242,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="380.6786" gradientUnits="userSpaceOnUse" x2="380.6786" y1="-31" y2="1.5" id="linearGradient11" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="438.3602" gradientUnits="userSpaceOnUse" x2="438.3602" y1="-664.8748" y2="-632.3748" id="linearGradient12" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(230,242,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="452.3026" gradientUnits="userSpaceOnUse" x2="452.3026" y1="-314.8748" y2="-282.3748" id="linearGradient13" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="457.2567" gradientUnits="userSpaceOnUse" x2="457.2567" y1="-264.8748" y2="-232.3748" id="linearGradient14" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="36.5255" gradientUnits="userSpaceOnUse" x2="36.5255" y1="-189.8748" y2="-157.3748" id="linearGradient15" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(230,242,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="154.6882" gradientUnits="userSpaceOnUse" x2="154.6882" y1="-264.8748" y2="-232.3748" id="linearGradient16" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="126.5706" gradientUnits="userSpaceOnUse" x2="126.5706" y1="-539.8748" y2="-507.3748" id="linearGradient17" spreadMethod="pad">
|
||||
<stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
|
||||
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
|
||||
</linearGradient>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">
|
||||
<path d="M0 0 L637 0 L637 1149 L0 1149 L0 0 Z"/>
|
||||
</clipPath>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">
|
||||
<path d="M-15 -1119 L622 -1119 L622 30 L-15 30 L-15 -1119 Z"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="translate(15,1119)" stroke="white">
|
||||
<rect x="-15" width="637" height="1149" y="-1119" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
</g>
|
||||
<g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(245,245,245)">
|
||||
<rect x="50.9353" y="-795.5408" clip-path="url(#clipPath2)" width="411.8175" rx="4" ry="4" height="81.666" stroke="none"/>
|
||||
<rect x="50.9353" y="-795.5408" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="411.8175" height="21.666" stroke="none"/>
|
||||
</g>
|
||||
<g font-size="15" stroke-linecap="butt" transform="matrix(1,0,0,1,15,1119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
|
||||
<text x="385.3573" xml:space="preserve" y="-779.0388" clip-path="url(#clipPath2)" stroke="none">launchpad</text>
|
||||
<rect x="50.9353" y="-795.5408" clip-path="url(#clipPath2)" fill="none" width="411.8175" stroke-dasharray="6,2" rx="4" ry="4" height="81.666"/>
|
||||
</g>
|
||||
<g fill="rgb(153,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(153,204,0)">
|
||||
<path d="M66.9357 -744.8748 L153.1818 -744.8748 L153.1818 -738.8748 Q153.1818 -728.8748 143.1818 -728.8748 L76.9357 -728.8748 Q66.9357 -728.8748 66.9357 -738.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient1)" d="M66.9357 -748.8748 Q66.9357 -758.8748 76.9357 -758.8748 L143.1818 -758.8748 Q153.1818 -758.8748 153.1818 -748.8748 L153.1818 -743.8748 L66.9357 -743.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M68.9357 -748.8748 Q68.9357 -756.8748 76.9357 -756.8748 L143.1818 -756.8748 Q151.1818 -756.8748 151.1818 -748.8748 L151.1818 -738.8748 Q151.1818 -730.8748 143.1818 -730.8748 L76.9357 -730.8748 Q68.9357 -730.8748 68.9357 -738.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(240,247,217)"/>
|
||||
<path fill="none" d="M68.9357 -748.8748 Q68.9357 -756.8748 76.9357 -756.8748 L143.1818 -756.8748 Q151.1818 -756.8748 151.1818 -748.8748 L151.1818 -738.8748 Q151.1818 -730.8748 143.1818 -730.8748 L76.9357 -730.8748 Q68.9357 -730.8748 68.9357 -738.8748 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="73.9357" xml:space="preserve" y="-739.3396" clip-path="url(#clipPath2)" stroke="none">create a bug</text>
|
||||
</g>
|
||||
<g fill="rgb(153,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(153,204,0)">
|
||||
<path d="M183.182 -744.8748 L299.9672 -744.8748 L299.9672 -738.8748 Q299.9672 -728.8748 289.9672 -728.8748 L193.182 -728.8748 Q183.182 -728.8748 183.182 -738.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient2)" d="M183.182 -748.8748 Q183.182 -758.8748 193.182 -758.8748 L289.9672 -758.8748 Q299.9672 -758.8748 299.9672 -748.8748 L299.9672 -743.8748 L183.182 -743.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M185.182 -748.8748 Q185.182 -756.8748 193.182 -756.8748 L289.9672 -756.8748 Q297.9672 -756.8748 297.9672 -748.8748 L297.9672 -738.8748 Q297.9672 -730.8748 289.9672 -730.8748 L193.182 -730.8748 Q185.182 -730.8748 185.182 -738.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(240,247,217)"/>
|
||||
<path fill="none" d="M185.182 -748.8748 Q185.182 -756.8748 193.182 -756.8748 L289.9672 -756.8748 Q297.9672 -756.8748 297.9672 -748.8748 L297.9672 -738.8748 Q297.9672 -730.8748 289.9672 -730.8748 L193.182 -730.8748 Q185.182 -730.8748 185.182 -738.8748 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="190.182" xml:space="preserve" y="-739.3396" clip-path="url(#clipPath2)" stroke="none">create a blueprint</text>
|
||||
</g>
|
||||
<g fill="rgb(153,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(153,204,0)">
|
||||
<path d="M329.9673 -744.8748 L446.7525 -744.8748 L446.7525 -738.8748 Q446.7525 -728.8748 436.7525 -728.8748 L339.9673 -728.8748 Q329.9673 -728.8748 329.9673 -738.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient3)" d="M329.9673 -748.8748 Q329.9673 -758.8748 339.9673 -758.8748 L436.7525 -758.8748 Q446.7525 -758.8748 446.7525 -748.8748 L446.7525 -743.8748 L329.9673 -743.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M331.9673 -748.8748 Q331.9673 -756.8748 339.9673 -756.8748 L436.7525 -756.8748 Q444.7525 -756.8748 444.7525 -748.8748 L444.7525 -738.8748 Q444.7525 -730.8748 436.7525 -730.8748 L339.9673 -730.8748 Q331.9673 -730.8748 331.9673 -738.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(240,247,217)"/>
|
||||
<path fill="none" d="M331.9673 -748.8748 Q331.9673 -756.8748 339.9673 -756.8748 L436.7525 -756.8748 Q444.7525 -756.8748 444.7525 -748.8748 L444.7525 -738.8748 Q444.7525 -730.8748 436.7525 -730.8748 L339.9673 -730.8748 Q331.9673 -730.8748 331.9673 -738.8748 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="336.9673" xml:space="preserve" y="-739.3396" clip-path="url(#clipPath2)" stroke="none">create a blueprint</text>
|
||||
</g>
|
||||
<g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(245,245,245)">
|
||||
<rect x="0" y="-66.666" clip-path="url(#clipPath2)" width="238.6298" rx="4" ry="4" height="81.666" stroke="none"/>
|
||||
<rect x="0" y="-66.666" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="238.6298" height="21.666" stroke="none"/>
|
||||
</g>
|
||||
<g font-size="15" stroke-linecap="butt" transform="matrix(1,0,0,1,15,1119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
|
||||
<text x="161.8495" xml:space="preserve" y="-50.1641" clip-path="url(#clipPath2)" stroke="none">End states</text>
|
||||
<rect x="0" y="-66.666" clip-path="url(#clipPath2)" fill="none" width="238.6298" stroke-dasharray="6,2" rx="4" ry="4" height="81.666"/>
|
||||
</g>
|
||||
<g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
|
||||
<path d="M136.0729 -16 L222.6295 -16 L222.6295 -10 Q222.6295 0 212.6295 0 L146.0729 0 Q136.0729 0 136.0729 -10 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient4)" d="M136.0729 -20 Q136.0729 -30 146.0729 -30 L212.6295 -30 Q222.6295 -30 222.6295 -20 L222.6295 -15 L136.0729 -15 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M138.0729 -20 Q138.0729 -28 146.0729 -28 L212.6295 -28 Q220.6295 -28 220.6295 -20 L220.6295 -10 Q220.6295 -2 212.6295 -2 L146.0729 -2 Q138.0729 -2 138.0729 -10 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
|
||||
<path fill="none" d="M138.0729 -20 Q138.0729 -28 146.0729 -28 L212.6295 -28 Q220.6295 -28 220.6295 -20 L220.6295 -10 Q220.6295 -2 212.6295 -2 L146.0729 -2 Q138.0729 -2 138.0729 -10 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="143.0729" xml:space="preserve" y="-10.4648" clip-path="url(#clipPath2)" stroke="none">out of scope</text>
|
||||
</g>
|
||||
<g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
|
||||
<path d="M16.0004 -16 L106.0726 -16 L106.0726 -10 Q106.0726 0 96.0726 0 L26.0004 0 Q16.0004 0 16.0004 -10 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient5)" d="M16.0004 -20 Q16.0004 -30 26.0004 -30 L96.0726 -30 Q106.0726 -30 106.0726 -20 L106.0726 -15 L16.0004 -15 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M18.0004 -20 Q18.0004 -28 26.0004 -28 L96.0726 -28 Q104.0726 -28 104.0726 -20 L104.0726 -10 Q104.0726 -2 96.0726 -2 L26.0004 -2 Q18.0004 -2 18.0004 -10 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
|
||||
<path fill="none" d="M18.0004 -20 Q18.0004 -28 26.0004 -28 L96.0726 -28 Q104.0726 -28 104.0726 -20 L104.0726 -10 Q104.0726 -2 96.0726 -2 L26.0004 -2 Q18.0004 -2 18.0004 -10 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="23.0004" xml:space="preserve" y="-10.4648" clip-path="url(#clipPath2)" stroke="none">code merged</text>
|
||||
</g>
|
||||
<g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,204,0)">
|
||||
<path d="M178.4522 -953.1078 L208.7433 -968.1078 L239.0343 -953.1078 L208.7433 -938.1078 Z" fill-rule="evenodd" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="185.4522" xml:space="preserve" y="-948.5726" clip-path="url(#clipPath2)" stroke="none">bug fix?</text>
|
||||
<path fill="none" d="M178.4522 -953.1078 L208.7433 -968.1078 L239.0343 -953.1078 L208.7433 -938.1078 Z" clip-path="url(#clipPath2)" fill-rule="evenodd"/>
|
||||
</g>
|
||||
<g fill="rgb(153,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(153,204,0)">
|
||||
<path d="M340.4421 -1089.6365 L378.7761 -1089.6365 L378.7761 -1083.6365 Q378.7761 -1073.6365 368.7761 -1073.6365 L350.4421 -1073.6365 Q340.4421 -1073.6365 340.4421 -1083.6365 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient6)" d="M340.4421 -1093.6365 Q340.4421 -1103.6365 350.4421 -1103.6365 L368.7761 -1103.6365 Q378.7761 -1103.6365 378.7761 -1093.6365 L378.7761 -1088.6365 L340.4421 -1088.6365 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M342.4421 -1093.6365 Q342.4421 -1101.6365 350.4421 -1101.6365 L368.7761 -1101.6365 Q376.7761 -1101.6365 376.7761 -1093.6365 L376.7761 -1083.6365 Q376.7761 -1075.6365 368.7761 -1075.6365 L350.4421 -1075.6365 Q342.4421 -1075.6365 342.4421 -1083.6365 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(240,247,217)"/>
|
||||
<path fill="none" d="M342.4421 -1093.6365 Q342.4421 -1101.6365 350.4421 -1101.6365 L368.7761 -1101.6365 Q376.7761 -1101.6365 376.7761 -1093.6365 L376.7761 -1083.6365 Q376.7761 -1075.6365 368.7761 -1075.6365 L350.4421 -1075.6365 Q342.4421 -1075.6365 342.4421 -1083.6365 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="347.4421" xml:space="preserve" y="-1084.1013" clip-path="url(#clipPath2)" stroke="none">idea</text>
|
||||
</g>
|
||||
<g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,204,0)">
|
||||
<path d="M302.1072 -1038.6365 L359.6091 -1053.6365 L417.1111 -1038.6365 L359.6091 -1023.6365 Z" fill-rule="evenodd" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="309.1072" xml:space="preserve" y="-1032.1677" clip-path="url(#clipPath2)" stroke="none">REST API change?</text>
|
||||
<path fill="none" d="M302.1072 -1038.6365 L359.6091 -1053.6365 L417.1111 -1038.6365 L359.6091 -1023.6365 Z" clip-path="url(#clipPath2)" fill-rule="evenodd"/>
|
||||
</g>
|
||||
<g fill="rgb(153,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(153,204,0)">
|
||||
<path d="M256.3125 -449.8748 L402.3828 -449.8748 L402.3828 -443.8748 Q402.3828 -433.8748 392.3828 -433.8748 L266.3125 -433.8748 Q256.3125 -433.8748 256.3125 -443.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient7)" d="M256.3125 -453.8748 Q256.3125 -463.8748 266.3125 -463.8748 L392.3828 -463.8748 Q402.3828 -463.8748 402.3828 -453.8748 L402.3828 -448.8748 L256.3125 -448.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M258.3125 -453.8748 Q258.3125 -461.8748 266.3125 -461.8748 L392.3828 -461.8748 Q400.3828 -461.8748 400.3828 -453.8748 L400.3828 -443.8748 Q400.3828 -435.8748 392.3828 -435.8748 L266.3125 -435.8748 Q258.3125 -435.8748 258.3125 -443.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(240,247,217)"/>
|
||||
<path fill="none" d="M258.3125 -453.8748 Q258.3125 -461.8748 266.3125 -461.8748 L392.3828 -461.8748 Q400.3828 -461.8748 400.3828 -453.8748 L400.3828 -443.8748 Q400.3828 -435.8748 392.3828 -435.8748 L266.3125 -435.8748 Q258.3125 -435.8748 258.3125 -443.8748 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="263.3125" xml:space="preserve" y="-444.3396" clip-path="url(#clipPath2)" stroke="none">submit spec for review</text>
|
||||
</g>
|
||||
<g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,204,0)">
|
||||
<path d="M188.5178 -878.1078 L223.8889 -893.1078 L259.26 -878.1078 L223.8889 -863.1078 Z" fill-rule="evenodd" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="195.5178" xml:space="preserve" y="-871.639" clip-path="url(#clipPath2)" stroke="none">a feature?</text>
|
||||
<path fill="none" d="M188.5178 -878.1078 L223.8889 -893.1078 L259.26 -878.1078 L223.8889 -863.1078 Z" clip-path="url(#clipPath2)" fill-rule="evenodd"/>
|
||||
</g>
|
||||
<g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
|
||||
<path d="M238.6593 -374.8748 L327.4776 -374.8748 L327.4776 -368.8748 Q327.4776 -358.8748 317.4776 -358.8748 L248.6593 -358.8748 Q238.6593 -358.8748 238.6593 -368.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient8)" d="M238.6593 -378.8748 Q238.6593 -388.8748 248.6593 -388.8748 L317.4776 -388.8748 Q327.4776 -388.8748 327.4776 -378.8748 L327.4776 -373.8748 L238.6593 -373.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M240.6593 -378.8748 Q240.6593 -386.8748 248.6593 -386.8748 L317.4776 -386.8748 Q325.4776 -386.8748 325.4776 -378.8748 L325.4776 -368.8748 Q325.4776 -360.8748 317.4776 -360.8748 L248.6593 -360.8748 Q240.6593 -360.8748 240.6593 -368.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
|
||||
<path fill="none" d="M240.6593 -378.8748 Q240.6593 -386.8748 248.6593 -386.8748 L317.4776 -386.8748 Q325.4776 -386.8748 325.4776 -378.8748 L325.4776 -368.8748 Q325.4776 -360.8748 317.4776 -360.8748 L248.6593 -360.8748 Q240.6593 -360.8748 240.6593 -368.8748 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="245.6593" xml:space="preserve" y="-369.3396" clip-path="url(#clipPath2)" stroke="none">spec merged</text>
|
||||
</g>
|
||||
<g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
|
||||
<path d="M130.2458 -299.8748 L320.9939 -299.8748 L320.9939 -293.8748 Q320.9939 -283.8748 310.9939 -283.8748 L140.2458 -283.8748 Q130.2458 -283.8748 130.2458 -293.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient9)" d="M130.2458 -303.8748 Q130.2458 -313.8748 140.2458 -313.8748 L310.9939 -313.8748 Q320.9939 -313.8748 320.9939 -303.8748 L320.9939 -298.8748 L130.2458 -298.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M132.2458 -303.8748 Q132.2458 -311.8748 140.2458 -311.8748 L310.9939 -311.8748 Q318.9939 -311.8748 318.9939 -303.8748 L318.9939 -293.8748 Q318.9939 -285.8748 310.9939 -285.8748 L140.2458 -285.8748 Q132.2458 -285.8748 132.2458 -293.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
|
||||
<path fill="none" d="M132.2458 -303.8748 Q132.2458 -311.8748 140.2458 -311.8748 L310.9939 -311.8748 Q318.9939 -311.8748 318.9939 -303.8748 L318.9939 -293.8748 Q318.9939 -285.8748 310.9939 -285.8748 L140.2458 -285.8748 Q132.2458 -285.8748 132.2458 -293.8748 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="137.2458" xml:space="preserve" y="-294.3396" clip-path="url(#clipPath2)" stroke="none">blueprint approved for release</text>
|
||||
</g>
|
||||
<g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,204,0)">
|
||||
<path d="M204.6518 -648.8748 L253.9389 -663.8748 L303.226 -648.8748 L253.9389 -633.8748 Z" fill-rule="evenodd" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="211.6518" xml:space="preserve" y="-644.3396" clip-path="url(#clipPath2)" stroke="none">spec required?</text>
|
||||
<path fill="none" d="M204.6518 -648.8748 L253.9389 -663.8748 L303.226 -648.8748 L253.9389 -633.8748 Z" clip-path="url(#clipPath2)" fill-rule="evenodd"/>
|
||||
</g>
|
||||
<g fill="rgb(153,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(153,204,0)">
|
||||
<path d="M125.0589 -574.8748 L333.5316 -574.8748 L333.5316 -568.8748 Q333.5316 -558.8748 323.5316 -558.8748 L135.0589 -558.8748 Q125.0589 -558.8748 125.0589 -568.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient10)" d="M125.0589 -578.8748 Q125.0589 -588.8748 135.0589 -588.8748 L323.5316 -588.8748 Q333.5316 -588.8748 333.5316 -578.8748 L333.5316 -573.8748 L125.0589 -573.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M127.0589 -578.8748 Q127.0589 -586.8748 135.0589 -586.8748 L323.5316 -586.8748 Q331.5316 -586.8748 331.5316 -578.8748 L331.5316 -568.8748 Q331.5316 -560.8748 323.5316 -560.8748 L135.0589 -560.8748 Q127.0589 -560.8748 127.0589 -568.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(240,247,217)"/>
|
||||
<path fill="none" d="M127.0589 -578.8748 Q127.0589 -586.8748 135.0589 -586.8748 L323.5316 -586.8748 Q331.5316 -586.8748 331.5316 -578.8748 L331.5316 -568.8748 Q331.5316 -560.8748 323.5316 -560.8748 L135.0589 -560.8748 Q127.0589 -560.8748 127.0589 -568.8748 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="132.0589" xml:space="preserve" y="-569.3396" clip-path="url(#clipPath2)" stroke="none">add link on masakari meeting agenda</text>
|
||||
</g>
|
||||
<g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
|
||||
<path d="M380.6786 -16 L569.6278 -16 L569.6278 -10 Q569.6278 0 559.6278 0 L390.6786 0 Q380.6786 0 380.6786 -10 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient11)" d="M380.6786 -20 Q380.6786 -30 390.6786 -30 L559.6278 -30 Q569.6278 -30 569.6278 -20 L569.6278 -15 L380.6786 -15 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M382.6786 -20 Q382.6786 -28 390.6786 -28 L559.6278 -28 Q567.6278 -28 567.6278 -20 L567.6278 -10 Q567.6278 -2 559.6278 -2 L390.6786 -2 Q382.6786 -2 382.6786 -10 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
|
||||
<path fill="none" d="M382.6786 -20 Q382.6786 -28 390.6786 -28 L559.6278 -28 Q567.6278 -28 567.6278 -20 L567.6278 -10 Q567.6278 -2 559.6278 -2 L390.6786 -2 Q382.6786 -2 382.6786 -10 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="387.6786" xml:space="preserve" y="-10.4648" clip-path="url(#clipPath2)" stroke="none">blueprint hit by feature freeze</text>
|
||||
</g>
|
||||
<g fill="rgb(153,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(153,204,0)">
|
||||
<path d="M438.3602 -649.8748 L606.4208 -649.8748 L606.4208 -643.8748 Q606.4208 -633.8748 596.4208 -633.8748 L448.3602 -633.8748 Q438.3602 -633.8748 438.3602 -643.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient12)" d="M438.3602 -653.8748 Q438.3602 -663.8748 448.3602 -663.8748 L596.4208 -663.8748 Q606.4208 -663.8748 606.4208 -653.8748 L606.4208 -648.8748 L438.3602 -648.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M440.3602 -653.8748 Q440.3602 -661.8748 448.3602 -661.8748 L596.4208 -661.8748 Q604.4208 -661.8748 604.4208 -653.8748 L604.4208 -643.8748 Q604.4208 -635.8748 596.4208 -635.8748 L448.3602 -635.8748 Q440.3602 -635.8748 440.3602 -643.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(240,247,217)"/>
|
||||
<path fill="none" d="M440.3602 -653.8748 Q440.3602 -661.8748 448.3602 -661.8748 L596.4208 -661.8748 Q604.4208 -661.8748 604.4208 -653.8748 L604.4208 -643.8748 Q604.4208 -635.8748 596.4208 -635.8748 L448.3602 -635.8748 Q440.3602 -635.8748 440.3602 -643.8748 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="446.3602" xml:space="preserve" y="-642.406" clip-path="url(#clipPath2)" stroke="none">re-submit for next release</text>
|
||||
</g>
|
||||
<g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
|
||||
<path d="M452.3026 -299.8748 L592.4784 -299.8748 L592.4784 -293.8748 Q592.4784 -283.8748 582.4784 -283.8748 L462.3026 -283.8748 Q452.3026 -283.8748 452.3026 -293.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient13)" d="M452.3026 -303.8748 Q452.3026 -313.8748 462.3026 -313.8748 L582.4784 -313.8748 Q592.4784 -313.8748 592.4784 -303.8748 L592.4784 -298.8748 L452.3026 -298.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M454.3026 -303.8748 Q454.3026 -311.8748 462.3026 -311.8748 L582.4784 -311.8748 Q590.4784 -311.8748 590.4784 -303.8748 L590.4784 -293.8748 Q590.4784 -285.8748 582.4784 -285.8748 L462.3026 -285.8748 Q454.3026 -285.8748 454.3026 -293.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
|
||||
<path fill="none" d="M454.3026 -303.8748 Q454.3026 -311.8748 462.3026 -311.8748 L582.4784 -311.8748 Q590.4784 -311.8748 590.4784 -303.8748 L590.4784 -293.8748 Q590.4784 -285.8748 582.4784 -285.8748 L462.3026 -285.8748 Q454.3026 -285.8748 454.3026 -293.8748 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="459.3026" xml:space="preserve" y="-294.3396" clip-path="url(#clipPath2)" stroke="none">blueprint unapproved</text>
|
||||
</g>
|
||||
<g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
|
||||
<path d="M457.2567 -249.8748 L587.5243 -249.8748 L587.5243 -243.8748 Q587.5243 -233.8748 577.5243 -233.8748 L467.2567 -233.8748 Q457.2567 -233.8748 457.2567 -243.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient14)" d="M457.2567 -253.8748 Q457.2567 -263.8748 467.2567 -263.8748 L577.5243 -263.8748 Q587.5243 -263.8748 587.5243 -253.8748 L587.5243 -248.8748 L457.2567 -248.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M459.2567 -253.8748 Q459.2567 -261.8748 467.2567 -261.8748 L577.5243 -261.8748 Q585.5243 -261.8748 585.5243 -253.8748 L585.5243 -243.8748 Q585.5243 -235.8748 577.5243 -235.8748 L467.2567 -235.8748 Q459.2567 -235.8748 459.2567 -243.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
|
||||
<path fill="none" d="M459.2567 -253.8748 Q459.2567 -261.8748 467.2567 -261.8748 L577.5243 -261.8748 Q585.5243 -261.8748 585.5243 -253.8748 L585.5243 -243.8748 Q585.5243 -235.8748 577.5243 -235.8748 L467.2567 -235.8748 Q459.2567 -235.8748 459.2567 -243.8748 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="464.2567" xml:space="preserve" y="-244.3396" clip-path="url(#clipPath2)" stroke="none">apply procedural -2</text>
|
||||
</g>
|
||||
<g fill="rgb(153,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(153,204,0)">
|
||||
<path d="M36.5255 -174.8748 L183.5919 -174.8748 L183.5919 -168.8748 Q183.5919 -158.8748 173.5919 -158.8748 L46.5255 -158.8748 Q36.5255 -158.8748 36.5255 -168.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient15)" d="M36.5255 -178.8748 Q36.5255 -188.8748 46.5255 -188.8748 L173.5919 -188.8748 Q183.5919 -188.8748 183.5919 -178.8748 L183.5919 -173.8748 L36.5255 -173.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M38.5255 -178.8748 Q38.5255 -186.8748 46.5255 -186.8748 L173.5919 -186.8748 Q181.5919 -186.8748 181.5919 -178.8748 L181.5919 -168.8748 Q181.5919 -160.8748 173.5919 -160.8748 L46.5255 -160.8748 Q38.5255 -160.8748 38.5255 -168.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(240,247,217)"/>
|
||||
<path fill="none" d="M38.5255 -178.8748 Q38.5255 -186.8748 46.5255 -186.8748 L173.5919 -186.8748 Q181.5919 -186.8748 181.5919 -178.8748 L181.5919 -168.8748 Q181.5919 -160.8748 173.5919 -160.8748 L46.5255 -160.8748 Q38.5255 -160.8748 38.5255 -168.8748 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="43.5255" xml:space="preserve" y="-169.3396" clip-path="url(#clipPath2)" stroke="none">upload code for review</text>
|
||||
</g>
|
||||
<g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
|
||||
<path d="M154.6882 -249.8748 L296.5515 -249.8748 L296.5515 -243.8748 Q296.5515 -233.8748 286.5515 -233.8748 L164.6882 -233.8748 Q154.6882 -233.8748 154.6882 -243.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient16)" d="M154.6882 -253.8748 Q154.6882 -263.8748 164.6882 -263.8748 L286.5515 -263.8748 Q296.5515 -263.8748 296.5515 -253.8748 L296.5515 -248.8748 L154.6882 -248.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M156.6882 -253.8748 Q156.6882 -261.8748 164.6882 -261.8748 L286.5515 -261.8748 Q294.5515 -261.8748 294.5515 -253.8748 L294.5515 -243.8748 Q294.5515 -235.8748 286.5515 -235.8748 L164.6882 -235.8748 Q156.6882 -235.8748 156.6882 -243.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
|
||||
<path fill="none" d="M156.6882 -253.8748 Q156.6882 -261.8748 164.6882 -261.8748 L286.5515 -261.8748 Q294.5515 -261.8748 294.5515 -253.8748 L294.5515 -243.8748 Q294.5515 -235.8748 286.5515 -235.8748 L164.6882 -235.8748 Q156.6882 -235.8748 156.6882 -243.8748 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="161.6882" xml:space="preserve" y="-244.3396" clip-path="url(#clipPath2)" stroke="none">remove procedural -2</text>
|
||||
</g>
|
||||
<g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
|
||||
<path d="M126.5706 -524.8748 L332.0198 -524.8748 L332.0198 -518.8748 Q332.0198 -508.8748 322.0198 -508.8748 L136.5706 -508.8748 Q126.5706 -508.8748 126.5706 -518.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
|
||||
<path fill="url(#linearGradient17)" d="M126.5706 -528.8748 Q126.5706 -538.8748 136.5706 -538.8748 L322.0198 -538.8748 Q332.0198 -538.8748 332.0198 -528.8748 L332.0198 -523.8748 L126.5706 -523.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M128.5706 -528.8748 Q128.5706 -536.8748 136.5706 -536.8748 L322.0198 -536.8748 Q330.0198 -536.8748 330.0198 -528.8748 L330.0198 -518.8748 Q330.0198 -510.8748 322.0198 -510.8748 L136.5706 -510.8748 Q128.5706 -510.8748 128.5706 -518.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
|
||||
<path fill="none" d="M128.5706 -528.8748 Q128.5706 -536.8748 136.5706 -536.8748 L322.0198 -536.8748 Q330.0198 -536.8748 330.0198 -528.8748 L330.0198 -518.8748 Q330.0198 -510.8748 322.0198 -510.8748 L136.5706 -510.8748 Q128.5706 -510.8748 128.5706 -518.8748 Z" clip-path="url(#clipPath2)"/>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<text x="133.5706" xml:space="preserve" y="-519.3396" clip-path="url(#clipPath2)" stroke="none">review blueprint in masakari meeting</text>
|
||||
</g>
|
||||
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
|
||||
<path fill="none" d="M193.5977 -945.6048 L193.5977 -928.1078 L173.5175 -893.1078 L173.5175 -853.1078 L110.0587 -810.5408 L110.0587 -766.9" clip-path="url(#clipPath2)"/>
|
||||
<path d="M110.0587 -758.9 L115.0587 -770.9 L110.0587 -767.9 L105.0587 -770.9 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M359.6091 -1073.6365 L359.6091 -1061.6365" clip-path="url(#clipPath2)"/>
|
||||
<path d="M359.6091 -1053.6365 L364.6091 -1065.6365 L359.6091 -1062.6365 L354.6091 -1065.6365 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" stroke-dasharray="6,2" d="M330.8582 -1031.1052 L330.8582 -1013.6365 L208.7433 -983.1078 L208.7433 -976.1078" clip-path="url(#clipPath2)"/>
|
||||
<path stroke-dasharray="6,2" d="M208.7433 -968.1078 L213.7433 -980.1078 L208.7433 -977.1078 L203.7433 -980.1078 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<text x="262.3915" xml:space="preserve" y="-980.4183" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">no</text>
|
||||
<path fill="none" d="M388.3601 -1031.1052 L388.3599 -766.908" clip-path="url(#clipPath2)"/>
|
||||
<path d="M388.3599 -758.908 L393.3599 -770.908 L388.3599 -767.908 L383.3599 -770.908 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<text x="392.36" xml:space="preserve" y="-886.7205" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">yes</text>
|
||||
<path fill="none" d="M388.3599 -728.8748 L388.3599 -523.8748 L378.0377 -478.8748 L378.0377 -471.9041" clip-path="url(#clipPath2)"/>
|
||||
<path d="M378.0377 -463.9041 L383.0377 -475.9041 L378.0377 -472.9041 L373.0377 -475.9041 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" stroke-dasharray="6,2" d="M365.8652 -433.8748 L365.8651 -148.8748 L200.9904 -81.666 L200.9904 -38.0252" clip-path="url(#clipPath2)"/>
|
||||
<path stroke-dasharray="6,2" d="M200.9904 -30.0252 L205.9904 -42.0252 L200.9904 -39.0252 L195.9904 -42.0252 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" stroke-dasharray="6,2" d="M223.8887 -945.6134 L223.8889 -901.1078" clip-path="url(#clipPath2)"/>
|
||||
<path stroke-dasharray="6,2" d="M223.8889 -893.1078 L228.8889 -905.1078 L223.8889 -902.1078 L218.8889 -905.1078 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M241.5744 -870.6118 L241.5746 -766.902" clip-path="url(#clipPath2)"/>
|
||||
<path d="M241.5746 -758.902 L246.5746 -770.902 L241.5746 -767.902 L236.5746 -770.902 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M292.83 -433.8748 L292.83 -423.8748 L283.0685 -403.8748 L283.0685 -396.9041" clip-path="url(#clipPath2)"/>
|
||||
<path d="M283.0685 -388.9041 L288.0685 -400.9041 L283.0685 -397.9041 L278.0685 -400.9041 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M283.0685 -358.8748 L283.0685 -348.8748 L273.3069 -328.8748 L273.3069 -321.9041" clip-path="url(#clipPath2)"/>
|
||||
<path d="M273.3069 -313.9041 L278.3069 -325.9041 L273.3069 -322.9041 L268.3069 -325.9041 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M241.5746 -728.8748 L241.5746 -698.8748 L253.9389 -678.8748 L253.9389 -671.8748" clip-path="url(#clipPath2)"/>
|
||||
<path d="M253.9389 -663.8748 L258.9389 -675.8748 L253.9389 -672.8748 L248.9389 -675.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M278.5825 -641.3718 L278.5825 -623.8748 L348.5317 -588.8748 L348.5317 -508.8748 L329.3476 -478.8748 L329.3476 -471.9041" clip-path="url(#clipPath2)"/>
|
||||
<path d="M329.3476 -463.9041 L334.3476 -475.9041 L329.3476 -472.9041 L324.3476 -475.9041 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" stroke-dasharray="6,2" d="M229.2953 -641.3804 L229.2953 -596.9004" clip-path="url(#clipPath2)"/>
|
||||
<path stroke-dasharray="6,2" d="M229.2952 -588.9004 L234.2953 -600.9004 L229.2953 -597.9004 L224.2953 -600.9004 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M438.3272 -648.8748 L311.226 -648.8748" clip-path="url(#clipPath2)"/>
|
||||
<path d="M303.226 -648.8748 L315.226 -643.8748 L312.226 -648.8748 L315.226 -653.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M522.3905 -313.9138 L522.3905 -625.8748" clip-path="url(#clipPath2)"/>
|
||||
<path d="M522.3905 -633.8748 L517.3905 -621.8748 L522.3905 -624.8748 L527.3905 -621.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M522.3905 -30.0498 L522.3905 -225.8748" clip-path="url(#clipPath2)"/>
|
||||
<path d="M522.3905 -233.8748 L517.3905 -221.8748 L522.3905 -224.8748 L527.3905 -221.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M522.3905 -263.9138 L522.3905 -275.8748" clip-path="url(#clipPath2)"/>
|
||||
<path d="M522.3905 -283.8748 L517.3905 -271.8748 L522.3905 -274.8748 L527.3905 -271.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M110.0587 -728.8748 L110.0587 -196.9077" clip-path="url(#clipPath2)"/>
|
||||
<path d="M110.0587 -188.9077 L115.0587 -200.9077 L110.0587 -197.9077 L105.0587 -200.9077 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" stroke-dasharray="6,2" d="M206.2033 -870.6048 L206.2033 -853.1078 L35.9353 -810.5408 L35.9353 -248.8748 L61.0366 -203.8748 L61.0366 -196.9041" clip-path="url(#clipPath2)"/>
|
||||
<path stroke-dasharray="6,2" d="M61.0366 -188.9041 L66.0366 -200.9041 L61.0366 -197.9041 L56.0366 -200.9041 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M61.0366 -158.8748 L61.0365 -38.0315" clip-path="url(#clipPath2)"/>
|
||||
<path d="M61.0365 -30.0315 L66.0365 -42.0315 L61.0365 -39.0315 L56.0365 -42.0315 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" stroke-dasharray="6,2" d="M110.0587 -158.8748 L110.0587 -148.8748 L157.712 -81.666 L157.712 -38.0252" clip-path="url(#clipPath2)"/>
|
||||
<path stroke-dasharray="6,2" d="M157.712 -30.0252 L162.712 -42.0252 L157.712 -39.0252 L152.712 -42.0252 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" stroke-dasharray="6,2" d="M159.0809 -158.8748 L159.0809 -148.8748 L427.9159 -81.666 L427.9159 -38.0252" clip-path="url(#clipPath2)"/>
|
||||
<path stroke-dasharray="6,2" d="M427.9159 -30.0252 L432.9159 -42.0252 L427.9159 -39.0252 L422.9159 -42.0252 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M225.6198 -283.8748 L225.6198 -271.9138" clip-path="url(#clipPath2)"/>
|
||||
<path d="M225.6198 -263.9138 L230.6198 -275.9138 L225.6198 -272.9138 L220.6198 -275.9138 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M225.6198 -233.8748 L225.6198 -223.8748 L159.0809 -203.8748 L159.0809 -196.9041" clip-path="url(#clipPath2)"/>
|
||||
<path d="M159.0809 -188.9041 L164.0809 -200.9041 L159.0809 -197.9041 L154.0809 -200.9041 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M229.2952 -558.8748 L229.2952 -546.9138" clip-path="url(#clipPath2)"/>
|
||||
<path d="M229.2952 -538.9138 L234.2952 -550.9138 L229.2952 -547.9138 L224.2952 -550.9138 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" d="M177.9329 -508.8748 L177.9328 -321.9224" clip-path="url(#clipPath2)"/>
|
||||
<path d="M177.9328 -313.9224 L182.9328 -325.9224 L177.9328 -322.9224 L172.9328 -325.9224 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
<path fill="none" stroke-dasharray="6,2" d="M280.6575 -508.8748 L280.6575 -471.9187" clip-path="url(#clipPath2)"/>
|
||||
<path stroke-dasharray="6,2" d="M280.6575 -463.9187 L285.6575 -475.9187 L280.6575 -472.9187 L275.6576 -475.9187 Z" clip-path="url(#clipPath2)" stroke="none"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 45 KiB |
BIN
doc/source/images/architecture.png
Normal file
BIN
doc/source/images/architecture.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 55 KiB |
@ -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`
|
||||
|
||||
|
@ -1,12 +0,0 @@
|
||||
============
|
||||
Installation
|
||||
============
|
||||
|
||||
At the command line::
|
||||
|
||||
$ pip install masakari
|
||||
|
||||
Or, if you have virtualenvwrapper installed::
|
||||
|
||||
$ mkvirtualenv masakari
|
||||
$ pip install masakari
|
197
doc/source/process.rst
Normal file
197
doc/source/process.rst
Normal file
@ -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? <why_plus1>`).
|
||||
|
||||
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.
|
@ -1 +0,0 @@
|
||||
.. include:: ../../README.rst
|
@ -1,7 +0,0 @@
|
||||
========
|
||||
Usage
|
||||
========
|
||||
|
||||
To use masakari in a project::
|
||||
|
||||
import masakari
|
Loading…
x
Reference in New Issue
Block a user