Reorganize masakari documentation

Updated operator guide documentation for
1. segregated sections appropriately
2. referred masakariclient for CLI section
3. added detailed 'Install and configure for Ubuntu' section
4. added detailed 'Verify operation' section
5. used sphinx-build instead of the pbr sphinx extention for building docs
   as instructed by the PTI[1]
6. cleaned up build_sphinx related entries in setup.cfg

[1]: https://governance.openstack.org/tc/reference/project-testing-interface.html#documentation

Change-Id: Iec93bebdbc7ffe1ccd27bb11f474384ff06a559c
This commit is contained in:
Shilpa Devharakar 2019-08-28 20:19:06 +05:30 committed by tpatil
parent a61319ecea
commit 596b3d142e
35 changed files with 1288 additions and 2922 deletions

8
.gitignore vendored
View File

@ -60,6 +60,14 @@ releasenotes/build
# PyCharm IDE # PyCharm IDE
.idea/ .idea/
# configuration sample generation
etc/masakari/masakari.conf.sample
etc/masakari/masakari-custom-recovery-methods.conf.sample
# policy sample generation # policy sample generation
etc/masakari/policy.yaml.sample etc/masakari/policy.yaml.sample
# Files created by doc build
doc/source/_static/masakari.conf.sample
doc/source/_static/masakari-custom-recovery-methods.conf.sample
doc/source/_static/masakari.policy.yaml.sample

View File

@ -1,340 +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"> <?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--> <!--Generated by ySVG 2.5-->
<defs id="genericDefs"/> <defs id="genericDefs"/>
<g> <g>
<defs id="defs1"> <defs id="defs1">
<linearGradient x1="66.9357" gradientUnits="userSpaceOnUse" x2="66.9357" y1="-759.8748" y2="-727.3748" id="linearGradient1" spreadMethod="pad"> <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(230,242,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
</linearGradient> </linearGradient>
<linearGradient x1="183.182" gradientUnits="userSpaceOnUse" x2="183.182" y1="-759.8748" y2="-727.3748" id="linearGradient2" spreadMethod="pad"> <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(230,242,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
</linearGradient> </linearGradient>
<linearGradient x1="329.9673" gradientUnits="userSpaceOnUse" x2="329.9673" y1="-759.8748" y2="-727.3748" id="linearGradient3" spreadMethod="pad"> <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(230,242,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
</linearGradient> </linearGradient>
<linearGradient x1="136.0729" gradientUnits="userSpaceOnUse" x2="136.0729" y1="-31" y2="1.5" id="linearGradient4" spreadMethod="pad"> <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,230,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
</linearGradient> </linearGradient>
<linearGradient x1="16.0004" gradientUnits="userSpaceOnUse" x2="16.0004" y1="-31" y2="1.5" id="linearGradient5" spreadMethod="pad"> <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,230,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
</linearGradient> </linearGradient>
<linearGradient x1="340.4421" gradientUnits="userSpaceOnUse" x2="340.4421" y1="-1104.6365" y2="-1072.1365" id="linearGradient6" spreadMethod="pad"> <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(230,242,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
</linearGradient> </linearGradient>
<linearGradient x1="256.3125" gradientUnits="userSpaceOnUse" x2="256.3125" y1="-464.8748" y2="-432.3748" id="linearGradient7" spreadMethod="pad"> <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(230,242,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
</linearGradient> </linearGradient>
<linearGradient x1="238.6593" gradientUnits="userSpaceOnUse" x2="238.6593" y1="-389.8748" y2="-357.3748" id="linearGradient8" spreadMethod="pad"> <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,230,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
</linearGradient> </linearGradient>
<linearGradient x1="130.2458" gradientUnits="userSpaceOnUse" x2="130.2458" y1="-314.8748" y2="-282.3748" id="linearGradient9" spreadMethod="pad"> <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,230,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
</linearGradient> </linearGradient>
<linearGradient x1="125.0589" gradientUnits="userSpaceOnUse" x2="125.0589" y1="-589.8748" y2="-557.3748" id="linearGradient10" spreadMethod="pad"> <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(230,242,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
</linearGradient> </linearGradient>
<linearGradient x1="380.6786" gradientUnits="userSpaceOnUse" x2="380.6786" y1="-31" y2="1.5" id="linearGradient11" spreadMethod="pad"> <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,230,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
</linearGradient> </linearGradient>
<linearGradient x1="438.3602" gradientUnits="userSpaceOnUse" x2="438.3602" y1="-664.8748" y2="-632.3748" id="linearGradient12" spreadMethod="pad"> <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(230,242,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
</linearGradient> </linearGradient>
<linearGradient x1="452.3026" gradientUnits="userSpaceOnUse" x2="452.3026" y1="-314.8748" y2="-282.3748" id="linearGradient13" spreadMethod="pad"> <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,230,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
</linearGradient> </linearGradient>
<linearGradient x1="457.2567" gradientUnits="userSpaceOnUse" x2="457.2567" y1="-264.8748" y2="-232.3748" id="linearGradient14" spreadMethod="pad"> <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,230,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
</linearGradient> </linearGradient>
<linearGradient x1="36.5255" gradientUnits="userSpaceOnUse" x2="36.5255" y1="-189.8748" y2="-157.3748" id="linearGradient15" spreadMethod="pad"> <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(230,242,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
</linearGradient> </linearGradient>
<linearGradient x1="154.6882" gradientUnits="userSpaceOnUse" x2="154.6882" y1="-264.8748" y2="-232.3748" id="linearGradient16" spreadMethod="pad"> <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,230,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
</linearGradient> </linearGradient>
<linearGradient x1="126.5706" gradientUnits="userSpaceOnUse" x2="126.5706" y1="-539.8748" y2="-507.3748" id="linearGradient17" spreadMethod="pad"> <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,230,191)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/> <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
</linearGradient> </linearGradient>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath1"> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">
<path d="M0 0 L637 0 L637 1149 L0 1149 L0 0 Z"/> <path d="M0 0 L637 0 L637 1149 L0 1149 L0 0 Z"/>
</clipPath> </clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath2"> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">
<path d="M-15 -1119 L622 -1119 L622 30 L-15 30 L-15 -1119 Z"/> <path d="M-15 -1119 L622 -1119 L622 30 L-15 30 L-15 -1119 Z"/>
</clipPath> </clipPath>
</defs> </defs>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="translate(15,1119)" stroke="white"> <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"/> <rect x="-15" width="637" height="1149" y="-1119" clip-path="url(#clipPath2)" stroke="none"/>
</g> </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)"> <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)" 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"/> <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>
<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"> <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> <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"/> <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>
<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)"> <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 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="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" 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)"/> <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>
<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"> <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> <text x="73.9357" xml:space="preserve" y="-739.3396" clip-path="url(#clipPath2)" stroke="none">create a bug</text>
</g> </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)"> <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 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="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" 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)"/> <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>
<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"> <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> <text x="190.182" xml:space="preserve" y="-739.3396" clip-path="url(#clipPath2)" stroke="none">create a blueprint</text>
</g> </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)"> <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 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="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" 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)"/> <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>
<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"> <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> <text x="336.9673" xml:space="preserve" y="-739.3396" clip-path="url(#clipPath2)" stroke="none">create a blueprint</text>
</g> </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)"> <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)" 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"/> <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>
<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"> <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> <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"/> <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>
<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)"> <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 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="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" 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)"/> <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>
<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"> <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> <text x="143.0729" xml:space="preserve" y="-10.4648" clip-path="url(#clipPath2)" stroke="none">out of scope</text>
</g> </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)"> <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 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="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" 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)"/> <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>
<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"> <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> <text x="23.0004" xml:space="preserve" y="-10.4648" clip-path="url(#clipPath2)" stroke="none">code merged</text>
</g> </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)"> <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"/> <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>
<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"> <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> <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"/> <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>
<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)"> <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 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="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" 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)"/> <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>
<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"> <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> <text x="347.4421" xml:space="preserve" y="-1084.1013" clip-path="url(#clipPath2)" stroke="none">idea</text>
</g> </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)"> <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"/> <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>
<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"> <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> <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"/> <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>
<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)"> <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 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="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" 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)"/> <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>
<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"> <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> <text x="263.3125" xml:space="preserve" y="-444.3396" clip-path="url(#clipPath2)" stroke="none">submit spec for review</text>
</g> </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)"> <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"/> <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>
<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"> <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> <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"/> <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>
<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)"> <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 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="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" 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)"/> <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>
<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"> <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> <text x="245.6593" xml:space="preserve" y="-369.3396" clip-path="url(#clipPath2)" stroke="none">spec merged</text>
</g> </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)"> <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 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="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" 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)"/> <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>
<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"> <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> <text x="137.2458" xml:space="preserve" y="-294.3396" clip-path="url(#clipPath2)" stroke="none">blueprint approved for release</text>
</g> </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)"> <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"/> <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>
<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"> <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> <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"/> <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>
<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)"> <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 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="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" 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)"/> <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>
<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"> <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> <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>
<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)"> <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 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="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" 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)"/> <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>
<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"> <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> <text x="387.6786" xml:space="preserve" y="-10.4648" clip-path="url(#clipPath2)" stroke="none">blueprint hit by feature freeze</text>
</g> </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)"> <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 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="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" 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)"/> <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>
<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"> <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> <text x="446.3602" xml:space="preserve" y="-642.406" clip-path="url(#clipPath2)" stroke="none">re-submit for next release</text>
</g> </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)"> <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 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="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" 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)"/> <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>
<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"> <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> <text x="459.3026" xml:space="preserve" y="-294.3396" clip-path="url(#clipPath2)" stroke="none">blueprint unapproved</text>
</g> </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)"> <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 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="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" 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)"/> <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>
<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"> <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> <text x="464.2567" xml:space="preserve" y="-244.3396" clip-path="url(#clipPath2)" stroke="none">apply procedural -2</text>
</g> </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)"> <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 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="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" 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)"/> <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>
<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"> <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> <text x="43.5255" xml:space="preserve" y="-169.3396" clip-path="url(#clipPath2)" stroke="none">upload code for review</text>
</g> </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)"> <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 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="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" 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)"/> <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>
<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"> <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> <text x="161.6882" xml:space="preserve" y="-244.3396" clip-path="url(#clipPath2)" stroke="none">remove procedural -2</text>
</g> </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)"> <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 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="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" 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)"/> <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>
<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"> <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> <text x="133.5706" xml:space="preserve" y="-519.3396" clip-path="url(#clipPath2)" stroke="none">review blueprint in masakari meeting</text>
</g> </g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt"> <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 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 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 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 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 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"/> <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> <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 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"/> <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> <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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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"/> <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>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

View File

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

View File

@ -1,87 +0,0 @@
[DEFAULT]
[taskflow_driver_recovery_flows]
#
# From customized_recovery_flow_opts
#
#
# This option allows operator to customize tasks to be executed for host failure
# auto recovery workflow.
#
# Provide list of strings reflecting to the task classes that should be included
# to the host failure recovery workflow. The full classname path of all task
# classes should be defined in the 'masakari.task_flow.tasks' of setup.cfg and
# these classes may be implemented by OpenStack Masaskari project team, deployer
# or third party.
#
# By default below three tasks will be part of this config option:-
# 1. disable_compute_service_task
# 2. prepare_HA_enabled_instances_task
# 3. evacuate_instances_task
#
# The allowed values for this option is comma separated dictionary of object
# names in between ``{`` and ``}``. (dict value)
#host_auto_failure_recovery_tasks = main:['prepare_HA_enabled_instances_task'],
#post:['evacuate_instances_task'],pre:['disable_compute_service_task']
#
# This option allows operator to customize tasks to be executed for host failure
# reserved_host recovery workflow.
#
# Provide list of strings reflecting to the task classes that should be included
# to the host failure recovery workflow. The full classname path of all task
# classes should be defined in the 'masakari.task_flow.tasks' of setup.cfg and
# these classes may be implemented by OpenStack Masaskari project team, deployer
# or third party.
#
# By default below three tasks will be part of this config option:-
# 1. disable_compute_service_task
# 2. prepare_HA_enabled_instances_task
# 3. evacuate_instances_task
#
# The allowed values for this option is comma separated dictionary of object
# names in between ``{`` and ``}``. (dict value)
#host_rh_failure_recovery_tasks = main:['prepare_HA_enabled_instances_task',
#'evacuate_instances_task'],post:[],pre:['disable_compute_service_task']
#
# This option allows operator to customize tasks to be executed for instance
# failure recovery workflow.
#
# Provide list of strings reflecting to the task classes that should be included
# to the instance failure recovery workflow. The full classname path of all task
# classes should be defined in the 'masakari.task_flow.tasks' of setup.cfg and
# these classes may be implemented by OpenStack Masaskari project team, deployer
# or third party.
#
# By default below three tasks will be part of this config option:-
# 1. stop_instance_task
# 2. start_instance_task
# 3. confirm_instance_active_task
#
# The allowed values for this option is comma separated dictionary of object
# names in between ``{`` and ``}``. (dict value)
#instance_failure_recovery_tasks = main:['start_instance_task'],
#post:['confirm_instance_active_task'],pre:['stop_instance_task']
#
# This option allows operator to customize tasks to be executed for process
# failure recovery workflow.
#
# Provide list of strings reflecting to the task classes that should be included
# to the process failure recovery workflow. The full classname path of all task
# classes should be defined in the 'masakari.task_flow.tasks' of setup.cfg and
# these classes may be implemented by OpenStack Masaskari project team, deployer
# or third party.
#
# By default below two tasks will be part of this config option:-
# 1. disable_compute_node_task
# 2. confirm_compute_node_disabled_task
#
# The allowed values for this option is comma separated dictionary of object
# names in between ``{`` and ``}``. (dict value)
#process_failure_recovery_tasks = main:['confirm_compute_node_disabled_task'],
#post:[],pre:['disable_compute_node_task']

File diff suppressed because it is too large Load Diff

View File

@ -1,90 +0,0 @@
# Decides what is required for the 'is_admin:True' check to succeed.
#"context_is_admin": "role:admin"
# Default rule for most non-Admin APIs.
#"admin_or_owner": "is_admin:True or project_id:%(project_id)s"
# Default rule for most Admin APIs.
#"admin_api": "is_admin:True"
# List available extensions.
# GET /extensions
#"os_masakari_api:extensions:index": "rule:admin_api"
# Shows information for an extension.
# GET /extensions/{extensions_id}
#"os_masakari_api:extensions:detail": "rule:admin_api"
# Extension Info API extensions to change the API.
#"os_masakari_api:extensions:discoverable": "rule:admin_api"
# Lists IDs, names, type, reserved, on_maintenance for all hosts.
# GET /segments/{segment_id}/hosts
#"os_masakari_api:os-hosts:index": "rule:admin_api"
# Shows details for a host.
# GET /segments/{segment_id}/hosts/{host_id}
#"os_masakari_api:os-hosts:detail": "rule:admin_api"
# Creates a host under given segment.
# POST /segments/{segment_id}/hosts
#"os_masakari_api:os-hosts:create": "rule:admin_api"
# Updates the editable attributes of an existing host.
# PUT /segments/{segment_id}/hosts/{host_id}
#"os_masakari_api:os-hosts:update": "rule:admin_api"
# Deletes a host from given segment.
# DELETE /segments/{segment_id}/hosts/{host_id}
#"os_masakari_api:os-hosts:delete": "rule:admin_api"
# Host API extensions to change the API.
#"os_masakari_api:os-hosts:discoverable": "rule:admin_api"
# Lists IDs, notification types, host_name, generated_time, payload
# and status for all notifications.
# GET /notifications
#"os_masakari_api:notifications:index": "rule:admin_api"
# Shows details for a notification.
# GET /notifications/{notification_id}
#"os_masakari_api:notifications:detail": "rule:admin_api"
# Creates a notiification.
# POST /notifications
#"os_masakari_api:notifications:create": "rule:admin_api"
# Notification API extensions to change the API.
#"os_masakari_api:notifications:discoverable": "rule:admin_api"
# Lists IDs, names, description, recovery_method, service_type for all
# segments.
# GET /segments
#"os_masakari_api:segments:index": "rule:admin_api"
# Shows details for a segment.
# GET /segments/{segment_id}
#"os_masakari_api:segments:detail": "rule:admin_api"
# Creates a segment.
# POST /segments
#"os_masakari_api:segments:create": "rule:admin_api"
# Updates the editable attributes of an existing host.
# PUT /segments/{segment_id}
#"os_masakari_api:segments:update": "rule:admin_api"
# Deletes a segment.
# DELETE /segments/{segment_id}
#"os_masakari_api:segments:delete": "rule:admin_api"
# Segment API extensions to change the API.
#"os_masakari_api:segments:discoverable": "rule:admin_api"
# List all versions.
# GET /
#"os_masakari_api:versions:index": "@"
# Version API extensions to change the API.
#"os_masakari_api:versions:discoverable": "@"

View File

@ -9,3 +9,5 @@ interface.
:maxdepth: 1 :maxdepth: 1
masakari-status masakari-status
masakari-manage
openstack-masakari

View File

@ -0,0 +1,52 @@
===============
masakari-manage
===============
-------------------------------------
Control and manage masakari database
-------------------------------------
Synopsis
========
::
masakari-manage <category> <action> [<args>]
Description
===========
:program:`masakari-manage` controls DB by managing various admin-only aspects
of masakari.
Options
=======
The standard pattern for executing a masakari-manage command is::
masakari-manage <category> <command> [<args>]
Run without arguments to see a list of available command categories::
masakari-manage
You can also run with a category argument such as db to see a list of all
commands in that category::
masakari-manage db
These sections describe the available categories and arguments for masakari-manage.
Masakari Database
~~~~~~~~~~~~~~~~~
``masakari-manage db version``
Print the current main database version.
``masakari-manage db sync [--version <version>]``
Upgrade the main database schema up to the most recent version or
``--version`` if specified.
``masakari-manage db purge``
Deleting rows older than 30 day(s) from table hosts, failover_segments and
notifications.

View File

@ -0,0 +1,7 @@
==================
openstack masakari
==================
To control and manage masakari operations, the extended `command list
<https://docs.openstack.org/python-masakariclient/latest/cli/index.html>`_
available in openstack command.

View File

@ -24,9 +24,26 @@ sys.path.insert(0, os.path.abspath('../'))
extensions = [ extensions = [
'openstackdocstheme', 'openstackdocstheme',
'sphinx.ext.autodoc', 'sphinx.ext.autodoc',
'ext.versioned_notifications' 'ext.versioned_notifications',
'oslo_config.sphinxconfiggen',
'oslo_config.sphinxext',
'oslo_policy.sphinxpolicygen',
'oslo_policy.sphinxext',
] ]
config_generator_config_file = [
('../../etc/masakari/masakari-config-generator.conf',
'_static/masakari'),
('../../etc/masakari/masakari-customized-recovery-flow-config-generator.conf',
'_static/masakari-custom-recovery-methods'),
]
sample_config_basename = '_static/masakari'
policy_generator_config_file = [
('../../etc/masakari/masakari-policy-generator.conf', '_static/masakari'),
]
sample_policy_basename = '_static/masakari'
# autodoc generation is a bit aggressive and a nuisance when doing heavy # autodoc generation is a bit aggressive and a nuisance when doing heavy
# text edit cycles. # text edit cycles.
# execute "export SPHINX_DEBUG=1" in your terminal to disable # execute "export SPHINX_DEBUG=1" in your terminal to disable

View File

@ -0,0 +1,8 @@
=============
api-paste.ini
=============
The masakari service stores its API configuration settings in the
``api-paste.ini`` file.
.. literalinclude:: /../../etc/masakari/api-paste.ini

View File

@ -0,0 +1,9 @@
=====================
Configuration Options
=====================
The following is an overview of all available configuration options in
Masakari. For a sample configuration file, refer to :doc:`sample_config`.
.. show-options::
:config-file: etc/masakari/masakari-config-generator.conf

View File

@ -0,0 +1,42 @@
===================
Configuration Guide
===================
The configuration for masakari lies in below described files.
Configuration
-------------
Masakari has two main config files:
``masakari.conf`` and ``recovery_workflow_sample_config.conf``.
* :doc:`Config Reference <config>`: A complete reference of all
config points in masakari and what they impact.
* :doc:`Sample Config File <sample_config>`: A sample config
file with inline documentation.
* :doc:`Recovery Config Reference <recovery_config>`: A complete reference of all
config points in masakari and what they impact.
* :doc:`Sample recovery workflow File <recovery_workflow_sample_config>`: A
complete reference of defining the monitoring processes.
Policy
------
Masakari, like most OpenStack projects, uses a policy language to restrict
permissions on REST API actions.
* :doc:`Policy Reference <policy>`: A complete reference of all
policy points in masakari and what they impact.
* :doc:`Sample policy File <sample_policy>`: A sample policy
file with inline documentation.
API configuration settings
--------------------------
* :doc:`API configuration <api-paste.ini>`: A complete reference of API
configuration settings.

View File

@ -0,0 +1,9 @@
=================
Masakari Policies
=================
The following is an overview of all available policies in masakari.
For a sample configuration file, refer to :doc:`sample_policy`.
.. show-policy::
:config-file: etc/masakari/masakari-policy-generator.conf

View File

@ -0,0 +1,9 @@
=====================
Configuration Options
=====================
The following is an overview of all available configuration options in
Masakari. For a sample configuration file, refer to :doc:`recovery_workflow_sample_config`.
.. show-options::
:config-file: etc/masakari/masakari-customized-recovery-flow-config-generator.conf

View File

@ -0,0 +1,11 @@
===========================================================
Masakari Customized Recovery Workflow Configuration Options
===========================================================
masakari-custom-recovery-methods.conf.sample
The following is a sample Masakari recovery workflow configuration for
adaptation and use.
The sample configuration can also be downloaded from :download:`here
</_static/masakari-custom-recovery-methods.conf.sample>`.
.. literalinclude:: /_static/masakari-custom-recovery-methods.conf.sample

View File

@ -7,7 +7,10 @@ auto-generated from Masakari when this documentation is built, so
if you are having issues with an option, please compare your version of if you are having issues with an option, please compare your version of
Masakari with the version of this documentation. Masakari with the version of this documentation.
.. literalinclude:: _static/masakari.conf.sample The sample configuration can also be downloaded from :download:`here
</_static/masakari.conf.sample>`.
.. literalinclude:: /_static/masakari.conf.sample
Minimal Configuration Minimal Configuration
===================== =====================

View File

@ -0,0 +1,15 @@
===========================
Sample Masakari Policy File
===========================
The following is a sample masakari policy file for adaptation and use.
The sample policy can also be viewed in :download:`file form
</_static/masakari.policy.yaml.sample>`.
.. important::
The sample policy file is auto-generated from masakari when this
documentation is built.
.. literalinclude:: /_static/masakari.policy.yaml.sample

View File

@ -13,76 +13,84 @@
License for the specific language governing permissions and limitations License for the specific language governing permissions and limitations
under the License. under the License.
======================================================= ====================================
Welcome to Masakari's developer/operator documentation! Welcome to Masakari's documentation!
======================================================= ====================================
Masakari is an OpenStack project designed to assure high availability of Masakari is an OpenStack project designed to ensure high availability of
instances and compute processes running on hosts. instances and compute processes running on hosts.
The developer documentation provided here is continually kept up-to-date This documentation is intended to help explain the current scope of the
based on the latest code, and may not represent the state of the project at Masakari project and the architectural decisions made to support this scope.
any specific prior release. The documentation will include the future architectural roadmap and the
current development process and policies.
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 Masakari API References
======================= =======================
The Masakari API is quite large, we provide a concept guide which The `Masakari API <https://docs.openstack.org/api-ref/instance-ha/>`_ is
gives some of the high level details, as well as a more detailed API extensive. We provide a concept guide which gives some of the high level
reference. 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: 1
how_to_get_involved
architecture
development.environment
Operator Guide Operator Guide
============== ==============
This section will help you in configuring masakari mannualy. Architecture Overview
---------------------
* :doc:`Masakari architecture </user/architecture>`: An overview of how all
the components in masakari work together.
Installation
------------
A detailed install guide for masakari.
.. toctree:: .. toctree::
:maxdepth: 1 :maxdepth: 2
operators_guide install/index
cli/index
sample_config
sample_policy
recovery_workflow_sample_config
recovery_workflow_custom_task
Indices and tables Reference Material
================== ------------------
* :ref:`search` * :doc:`Configuration Guide <configuration/index>`: Information on configuration files.
* :doc:`Custom Recovery Workflow Configuration Guide <configuration/recovery_workflow_custom_task>`
* :doc:`CLI Commands for Masakari </cli/index>`: The complete command
reference for Masakari.
* :doc:`Versioned Notifications </user/notifications>`: This provides the list
of existing versioned notifications with sample payloads.
* :doc:`Masakari team process <user/process>`
* :doc:`Getting started with Masakari <user/how_to_get_involved>`:
This will help newcomers understand basics of Masakari
* `Nova Docs <https://docs.openstack.org/nova/latest/index.html>`_: A collection of guides for Nova.
Versioned Notifications
=======================
This provides the list of existing versioned notifications with sample payloads.
.. # NOTE(shilpasd): This is the section where we hide things that we don't
# actually want in the table of contents but sphinx build would fail if
# they aren't in the toctree somewhere.
.. toctree:: .. toctree::
:maxdepth: 1 :hidden:
notifications cli/index
configuration/api-paste.ini.rst
configuration/config.rst
configuration/index.rst
configuration/policy.rst
configuration/recovery_config.rst
configuration/recovery_workflow_custom_task.rst
configuration/recovery_workflow_sample_config.rst
configuration/sample_config.rst
configuration/sample_policy.rst
install/development.environment.rst
user/architecture.rst
user/how_to_get_involved.rst
user/notifications.rst
user/process.rst
Search
======
* :ref:`search`: Search the contents of this document.
* `OpenStack wide search <https://docs.openstack.org>`_: Search the wider
set of OpenStack documentation, including forums.

View File

@ -24,10 +24,9 @@ These instructions assume you're already familiar with git.
Following these instructions will allow you to build the documentation Following these instructions will allow you to build the documentation
and run the masakari unit tests. and run the masakari unit tests.
.. note:: For how to contribute to Masakari, see .. note:: For how to contribute to Masakari, refer: http://docs.openstack.org/infra/manual/developers.html
`How To Contribute <http://docs.openstack.org/infra/manual/developers.html>`_.
Masakari uses the Gerrit code review system, Masakari uses the Gerrit code review system, refer: http://docs.openstack.org/infra/manual/developers.html#development-workflow
See `Gerrit Workflow <http://docs.openstack.org/infra/manual/developers.html#development-workflow>`_.
Setup Setup
===== =====
@ -79,39 +78,13 @@ Explicit Install/Clone
---------------------- ----------------------
DevStack installs a complete OpenStack environment. Alternatively, DevStack installs a complete OpenStack environment. Alternatively,
you can explicitly install and clone just what you need for Masakari to clone and install Masakari explicitly refer: :doc:`install_and_configure_ubuntu`
development.
Getting the code
~~~~~~~~~~~~~~~~
Grab the code from git::
git clone https://opendev.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 Building the Documentation
========================== ==========================
Install the prerequisite packages: graphviz For a full documentation build, issue the following command from the masakari
directory
To do a full documentation build, issue the following command while
the masakari directory is current.
.. code-block:: bash .. code-block:: bash
@ -124,4 +97,4 @@ documentation in that environment.
Running unit tests Running unit tests
================== ==================
See `Running Python Unit Tests <https://docs.openstack.org/project-team-guide/project-setup/python.html#running-python-unit-tests>`_. See `Running Python Unit Tests <https://docs.openstack.org/project-team-guide/project-setup/python.html#running-python-unit-tests>`_

View File

@ -0,0 +1,9 @@
=================
Masakari services
=================
.. toctree::
overview
install_and_configure
verify

View File

@ -13,11 +13,20 @@
License for the specific language governing permissions and limitations License for the specific language governing permissions and limitations
under the License. under the License.
================ =====================
Masakari Service Install and configure
================ =====================
This section describes how to install and configure Masakari services
on the compute node.
This section assumes that you already have a :doc:`working OpenStack
environment <development.environment>` with the following components installed:
Nova, Glance, Cinder, Neutron and Identity.
The installation and configuration vary by distribution.
.. toctree:: .. toctree::
:maxdepth: 1 :maxdepth: 1
masakari_overview install_and_configure_ubuntu

View File

@ -0,0 +1,250 @@
.. _install-ubuntu:
Install and configure for Ubuntu
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This section describes how to install and configure Masakari for Ubuntu
18.04 (bionic).
Prerequisites
-------------
Before you install and configure the masakari service, you must create
databases, service credentials, and API endpoints.
#. To create the masakari database, follow these steps:
* Use the database access client to connect to the database server
as the ``root`` user:
.. code-block:: console
# mysql
* Create the ``masakari`` database:
.. code-block:: console
mysql> CREATE DATABASE masakari CHARACTER SET utf8;
* Grant access privileges to the databases:
.. code-block:: console
mysql> GRANT ALL PRIVILEGES ON masakari.* TO 'username'@'localhost' \
IDENTIFIED BY 'MASAKARI_DBPASS';
mysql> GRANT ALL PRIVILEGES ON masakari.* TO 'username'@'%' \
IDENTIFIED BY 'MASAKARI_DBPASS';
Replace ``MASAKARI_DBPASS`` with a suitable password.
* Exit the database access client.
#. Source the ``admin`` credentials to gain access to admin-only CLI commands:
.. code-block:: console
$ . admin-openrc
#. Create the Masakari service credentials:
* Create the ``masakari`` user with password as ``masakari``:
.. code-block:: console
$ openstack user create --password-prompt masakari
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| domain_id | default |
| enabled | True |
| id | 8a7dbf5279404537b1c7b86c033620fe |
| name | masakari |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
* Add the ``admin`` role to the ``masakari`` user:
.. code-block:: console
$ openstack role add --project service --user masakari admin
* Create the ``masakari`` service entity:
.. code-block:: console
$ openstack service create --name masakari \
--description "masakari high availability" instance-ha
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | masakari high availability |
| enabled | True |
| id | 060d59eac51b4594815603d75a00aba2 |
| name | masakari |
| type | instance-ha |
+-------------+----------------------------------+
#. Create the Masakari API service endpoints:
.. code-block:: console
$ openstack endpoint create --region RegionOne \
masakari public http:// <CONTROLLER_IP>/instance-ha/v1/$\(tenant_id\)s
+--------------+-------------------------------------------------------+
| Field | Value |
+--------------+-------------------------------------------------------+
| enabled | True |
| id | 38f7af91666a47cfb97b4dc790b94424 |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 060d59eac51b4594815603d75a00aba2 |
| service_name | masakari |
| service_type | instance-ha |
| url | http://<CONTROLLER_IP>/instance-ha/v1/$(tenant_id)s |
+--------------+-------------------------------------------------------+
$ openstack endpoint create --region RegionOne \
masakari internal http:// <CONTROLLER_IP>/instance-ha/v1/$\(tenant_id\)s
+--------------+-------------------------------------------------------+
| Field | Value |
+--------------+-------------------------------------------------------+
| enabled | True |
| id | 38f7af91666a47cfb97b4dc790b94424 |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 060d59eac51b4594815603d75a00aba2 |
| service_name | masakari |
| service_type | instance-ha |
| url | http://<CONTROLLER_IP>/instance-ha/v1/$(tenant_id)s |
+--------------+-------------------------------------------------------+
$ openstack endpoint create --region RegionOne \
masakari admin http://<CONTROLLER_IP>/instance-ha/v1/$\(tenant_id\)s
+--------------+-------------------------------------------------------+
| Field | Value |
+--------------+-------------------------------------------------------+
| enabled | True |
| id | 38f7af91666a47cfb97b4dc790b94424 |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 060d59eac51b4594815603d75a00aba2 |
| service_name | masakari |
| service_type | instance-ha |
| url | http://<CONTROLLER_IP>/instance-ha/v1/$(tenant_id)s |
+--------------+-------------------------------------------------------+
Install and configure Masakari
------------------------------
.. note::
* You must install Masakari on the Controller Nodes only.
#. Clone masakari using:
.. code-block:: console
# git clone https://opendev.org/openstack/masakari.git
#. Prepare the masakari configuration files:
#. Generate via tox:
Go to opt/stack/masakari and execute the command below, this will generate
``masakari.conf.sample``, sample configuration file at
``/opt/stack/masakari/etc/masakari/``
.. code-block:: console
# tox -egenconfig
#. Download from:
# :download:`masakari.conf.sample </_static/masakari.conf.sample>`
#. Rename ``masakari.conf.sample`` file to ``masakari.conf``,
and edit sections as shown below:
.. code-block:: none
[default]
transport_url = rabbit://stackrabbit:admin@<CONTROLLER_IP>:5672/
graceful_shutdown_timeout = 5
os_privileged_user_tenant = service
os_privileged_user_password = admin
os_privileged_user_auth_url = http://<CONTROLLER_IP>/identity
os_privileged_user_name = nova
logging_exception_prefix = %(color)s%(asctime)s.%(msecs)03d TRACE %(name)s [01;35m%(instance)s[00m
logging_debug_format_suffix = [00;33mfrom (pid=%(process)d) %(funcName)s %(pathname)s:%(lineno)d[00m
logging_default_format_string = %(asctime)s.%(msecs)03d %(color)s%(levelname)s %(name)s [[00;36m-%(color)s] [01;35m%(instance)s%(color)s%(message)s[00m
logging_context_format_string = %(asctime)s.%(msecs)03d %(color)s%(levelname)s %(name)s [[01;36m%(request_id)s [00;36m%(project_name)s %(user_name)s%(color)s] [01;35m%(instance)s%(color)s%(message)s[00m
use_syslog = False
debug = True
masakari_api_workers = 2
[database]
connection = mysql+pymysql://root:admin@1<CONTROLLER_IP>/masakari?charset=utf8
[keystone_authtoken]
memcached_servers = localhost:11211
cafile = /opt/stack/data/ca-bundle.pem
project_domain_name = Default
project_name = service
user_domain_name = Default
password = <MASAKARI_PASS>
username = masakari
auth_url = http://<CONTROLLER_IP>/identity
auth_type = password
[taskflow]
connection = mysql+pymysql://root:admin@<CONTROLLER_IP>/masakari?charset=utf8
.. note::
Replace ``CONTROLLER_IP`` with the IP address of controller node.
Replace ``MASAKARI_PASS`` with the password you chose for the
``masakari`` user in the Identity service.
#. Create ``masakari`` directory in /etc/:
Copy ``masakari.conf`` file to ``/etc/masakari/``
.. code-block:: console
# cp -p etc/masakari/masakari.conf.sample /etc/masakari/masakari.conf
#. To install masakari run setup.py from masakari:
.. code-block:: console
# cd masakari
# sudo python setup.py install
#. Run below db command to sync database:
.. code-block:: console
# masakari-manage db sync
Finalize installation
---------------------
* Start masakari services:
.. code-block:: console
# masakari-api
# masakari-engine

View File

@ -0,0 +1,27 @@
=========================
Masakari service overview
=========================
Masakari provides Virtual Machines High Availability(VMHA), and rescues
KVM-based Virtual Machines(VM) from a failure events described below:
* VM process down - restart vm (use nova stop API, and nova start API).
Libvirt events will be also emitted by other failures.
* Provisioning process down - restarts process, changes nova-compute service
status to maintenance mode
(use nova service-disable).
* nova-compute host failure - evacuate all the VMs from failure host to
reserved host (use nova evacuate API).
The below services enables deplores to integrate with the Masakari directly
or through custom plug-ins.
The Masakari service consists of the following components:
``masakari-api``
An OpenStack-native REST API that processes API requests by sending
them to the ``masakari-engine`` over `Remote Procedure Call (RPC)`.
``masakari-engine``
Processes the notifications received from ``masakari-api`` by executing the
recovery workflow in asynchronous way.

View File

@ -0,0 +1,76 @@
Verify operation
~~~~~~~~~~~~~~~~
Verify Masakari installation.
#. Source the ``admin`` credentials to gain access to admin-only CLI commands:
.. code-block:: console
$ . admin-openrc
#. List API endpoints in the Identity service to verify connectivity with the
Identity service:
.. note::
Below endpoints list may differ depending on the installation of
OpenStack components.
.. code-block:: console
$ openstack endpoint list
+-------------+----------------+--------------------------------------------------------+
| Name | Type | Endpoints |
+-------------+----------------+--------------------------------------------------------+
| nova_legacy | compute_legacy | RegionOne |
| | | public: http://controller/compute/v2/<tenant_id> |
| | | |
| nova | compute | RegionOne |
| | | public: http://controller/compute/v2.1 |
| | | |
| cinder | block-storage | RegionOne |
| | | public: http://controller/volume/v3/<tenant_id> |
| | | |
| glance | image | RegionOne |
| | | public: http://controller/image |
| | | |
| cinderv3 | volumev3 | RegionOne |
| | | public: http://controller/volume/v3/<tenant_id> |
| | | |
| masakari | instance-ha | RegionOne |
| | | internal: http://controller/instance-ha/v1/<tenant_id> |
| | | RegionOne |
| | | admin: http://controller/instance-ha/v1/<tenant_id> |
| | | RegionOne |
| | | public: http://controller/instance-ha/v1/<tenant_id> |
| | | |
| keystone | identity | RegionOne |
| | | public: http://controller/identity |
| | | RegionOne |
| | | admin: http://controller/identity |
| | | |
| cinderv2 | volumev2 | RegionOne |
| | | public: http://controller/volume/v2/<tenant_id> |
| | | |
| placement | placement | RegionOne |
| | | public: http://controller/placement |
| | | |
| neutron | network | RegionOne |
| | | public: http://controller:9696/ |
| | | |
+-------------+----------------+--------------------------------------------------------+
#. Run ``segment list`` command to verify masakari-api is running properly.
This will return empty segment list as you haven't yet configured
``Failover segments``.
.. code-block:: console
$ openstack segment list
.. note::
Since ``Failover segments`` are not configured, there is no way to
verify masakari-engine is running properly as the notification cannot
be sent from masakari-api to masakari-engine.

View File

@ -1,42 +0,0 @@
..
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 service overview
=========================
Masakari provides a Virtual Machines High Availability(VMHA), and rescues a
KVM-based Virtual Machines(VM) from a failure events of the following:
* VM process down - restart vm (use nova stop API, and nova start API).
Libvirt events will be also emitted by other failures.
* Provisioning process down - restarts process, changes nova-compute service
status to maintenance mode
(use nova service-disable).
* nova-compute host failure - evacuate all the VMs from failure host to
reserved host (use nova evacuate API).
The service enables deployers to integrate with the Masakari service
directly or through custom plug-ins.
The Masakari service consists of the following components:
``masakari-api``
An OpenStack-native REST API that processes API requests by sending
them to the ``masakari-engine`` over `Remote Procedure Call (RPC)`.
``masakari-engine``
Processes the notifications recevied from ``masakari-api`` by execcuting the
recovery workflow in asynchronus way.

View File

@ -1,22 +0,0 @@
===========================================================
Masakari Customized Recovery Workflow Configuration Options
===========================================================
The following is a sample Masakari recovery workflow configuration for
adaptation and use.
.. literalinclude:: _static/masakari-custom-recovery-methods.conf.sample
Minimal Configuration
=====================
#. To generate the sample custom-recovery-methods.conf file, run the following
command from the top level of the masakari directory::
$ tox -egenconfig
#. Copy sample file ``etc/masakari/masakari-custom-recovery-methods.conf.sample`` to
``/etc/masakari`` directory
#. Remove '.sample' from files ``masakari-custom-recovery-methods.conf.sample`` which
exist at ``etc/masakari``.

View File

@ -1,9 +0,0 @@
===============
Masakari Policy
===============
The following is a sample masakari policy file. Operator can configure policies
as per his requirement. It is recommended that all api's of masakari should
be allowed to admin user only.
.. literalinclude:: _static/masakari.policy.yaml.sample

View File

@ -16,7 +16,7 @@
Masakari System Architecture Masakari System Architecture
============================ ============================
Masakari is comprised of two services api and engine, each performing different Masakari comprises of two services api and engine, each performing different
functions. The user-facing interface is a REST API, while internally Masakari functions. The user-facing interface is a REST API, while internally Masakari
communicates via an RPC message passing mechanism. communicates via an RPC message passing mechanism.
@ -25,9 +25,9 @@ reads/writes, sending RPC messages to other Masakari engine,
and generating responses to the REST calls. and generating responses to the REST calls.
RPC messaging is done via the **oslo.messaging** library, RPC messaging is done via the **oslo.messaging** library,
an abstraction on top of message queues. an abstraction on top of message queues.
Masakari engine will run on same host where masakari api is running, and have The Masakari engine will run on the same host where the Masakari api is
a `manager` that is listening for `RPC` messages. running, and has a `manager` that is listening for `RPC` messages.
The manager also, optionally, has periodic tasks. The manager too has periodic tasks.
Components Components
---------- ----------
@ -35,10 +35,10 @@ Components
Below you will find a helpful explanation of the key components Below you will find a helpful explanation of the key components
of a typical Masakari deployment. of a typical Masakari deployment.
.. image:: ./images/architecture.png .. image:: /_static/architecture.png
:width: 100% :width: 100%
* DB: sql database for data storage. * DB: sql database for data storage.
* API: component that receives HTTP requests, converts commands and * API: component that receives HTTP requests, converts commands and
communicates with masakari engine via the **oslo.messaging** queue. communicates with masakari engine via the **oslo.messaging** queue.
* Engine: Executes recovery workflow and communicates with nova via HTTP. * Engine: Executes recovery workflow and communicates with nova via HTTP.

View File

@ -1,298 +1,298 @@
.. ..
Copyright 2017 NTT DATA Copyright 2017 NTT DATA
Licensed under the Apache License, Version 2.0 (the "License"); you may 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 not use this file except in compliance with the License. You may obtain
a copy of the License at a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations License for the specific language governing permissions and limitations
under the License. under the License.
.. _getting_involved: .. _getting_involved:
======================================== ========================================
How to get (more) involved with Masakari How to get (more) involved with Masakari
======================================== ========================================
So you want to get more involved with Masakari? Or you are new to Masakari and So you want to get more involved with Masakari? Or you are new to Masakari and
wondering where to start? wondering where to start?
We are working on building easy ways for you to get help and ideas on 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 to learn more about Masakari and how the Masakari community works.
How do I get started? How do I get started?
===================== =====================
There are quite a few global docs on this: There are quite a few global docs on this:
- http://www.openstack.org/assets/welcome-guide/OpenStackWelcomeGuide.pdf - http://www.openstack.org/assets/welcome-guide/OpenStackWelcomeGuide.pdf
- https://wiki.openstack.org/wiki/How_To_Contribute - https://wiki.openstack.org/wiki/How_To_Contribute
- http://www.openstack.org/community/ - http://www.openstack.org/community/
There is more general info, non Masakari specific info here: There is more general info, non Masakari specific info here:
- https://wiki.openstack.org/wiki/Mentors - https://wiki.openstack.org/wiki/Mentors
- https://wiki.openstack.org/wiki/OpenStack_Upstream_Training - https://wiki.openstack.org/wiki/OpenStack_Upstream_Training
What should I work on? What should I work on?
~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
So you are starting out your Masakari journey, where is a good place to So you are starting out your Masakari journey, where is a good place to
start? start?
If you'd like to learn how Masakari works before changing anything 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 (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 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 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. 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 Once you're ready to write code, take a look at some of the work already marked
as low-hanging fruit: as low-hanging fruit:
* https://bugs.launchpad.net/masakari/+bugs?field.tag=low-hanging-fruit * https://bugs.launchpad.net/masakari/+bugs?field.tag=low-hanging-fruit
How do I get my feature in? How do I get my feature in?
~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
The best way of getting your feature in is... well it depends. 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 First concentrate on solving your problem and/or use case, don't fixate
on getting the code you have working merged. Its likely things will need on getting the code you have working merged. Its likely things will need
significant re-work after you discuss how your needs match up with all 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 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 process should leave you with a feature that's more flexible and doesn't
lock you into your current way of thinking. lock you into your current way of thinking.
A key part of getting code merged, is helping with reviewing other 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 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 reviewer time to look at your own patches. In addition, you will
understand how the review is thinking when they review your code. understand how the review is thinking when they review your code.
Also, work out if any ongoing efforts are blocking your feature and Also, work out if any ongoing efforts are blocking your feature and
helping out speeding those up. The spec review process should help with helping out speeding those up. The spec review process should help with
this effort. this effort.
For more details on our process, please see: :ref:`process`. For more details on our process, please see: :ref:`process`.
What is expected of a good contributor? What is expected of a good contributor?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TODO - need more info on this TODO - need more info on this
Top Tips for working with the Masakari community Top Tips for working with the Masakari community
================================================ ================================================
Here are some top tips around engaging with the Masakari community: Here are some top tips around engaging with the Masakari community:
- IRC - IRC
- we talk a lot in #openstack-masakari - we talk a lot in #openstack-masakari
- do ask us questions in there, and we will try to help you - do ask us questions in there, and we will try to help you
- not sure about asking questions? feel free to listen in around - not sure about asking questions? feel free to listen in around
other people's questions other people's questions
- we recommend you setup an IRC bouncer: - we recommend you setup an IRC bouncer:
https://wiki.openstack.org/wiki/IRC https://wiki.openstack.org/wiki/IRC
- Email - Email
- Use the [masakari] tag in the mailing lists - Use the [masakari] tag in the mailing lists
- Filtering on [masakari] and [all] can help tame the list - Filtering on [masakari] and [all] can help tame the list
- Be Open - Be Open
- i.e. don't review your teams code in private, do it publicly in - i.e. don't review your teams code in private, do it publicly in
gerrit gerrit
- i.e. be ready to talk about openly about problems you are having, - i.e. be ready to talk about openly about problems you are having,
not "theoretical" issues not "theoretical" issues
- that way you can start to gain the trust of the wider community - that way you can start to gain the trust of the wider community
- Got a problem? Please ask! - Got a problem? Please ask!
- Please raise any problems and ask questions early - Please raise any problems and ask questions early
- we want to help you before you are frustrated or annoyed - we want to help you before you are frustrated or annoyed
- unsure who to ask? Just ask in IRC. - unsure who to ask? Just ask in IRC.
- Talk about problems first, then solutions - Talk about problems first, then solutions
- Don't think about "merging your patch", instead think about - Don't think about "merging your patch", instead think about
"solving your problem" "solving your problem"
- conversations are more productive that way - conversations are more productive that way
- It's not the decision that's important, it's the reason behind it that's - It's not the decision that's important, it's the reason behind it that's
important important
- Don't like the way the community is going? - Don't like the way the community is going?
- Please ask why we were going that way, and please engage with the - Please ask why we were going that way, and please engage with the
debate debate
- If you don't, we are unable to learn from what you have to offer - 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? - No one will decide, this is stuck, who can help me?
- it's rare, but it happens - it's rare, but it happens
- ...but if you don't ask, it's hard for them to help you - ...but if you don't ask, it's hard for them to help you
Process Process
======= =======
It can feel like you are faced with a wall of process. We are a big 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 community, to make sure the right communication happens, we do use a
minimal amount of process. minimal amount of process.
If you find something that doesn't make sense, please: If you find something that doesn't make sense, please:
- ask questions to find out \*why\* it happens - ask questions to find out \*why\* it happens
- if you know of a better way to do it, please speak up - 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 - 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`. To learn more about Masakari's process, please read :ref:`process`.
Why bother with any process? Why bother with any process?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Why is it worth creating a bug or blueprint to track your code review? 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 This may seem like silly process, but there is usually a good reason
behind it. behind it.
We have lots of code to review, and we have tools to try and get to 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 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 not picked up by our tools, it's possible you just get lost in the bottom
of a big queue. of a big queue.
If you have a bug fix, you have done loads of work to identify the 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 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 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 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 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 that might have affected you, if you had not given them the time go fix
it. it.
It's similar with blueprints. You have worked out how to scratch your 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 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 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 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. 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 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 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 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. we are open to trying them. Please help be part of the solution.
.. _why_plus1: .. _why_plus1:
Why do code reviews if I am not in masakari-core? Why do code reviews if I am not in masakari-core?
================================================= =================================================
Code reviews are the life blood of the developer community. Code reviews are the life blood of the developer community.
There is a good discussion on how you do good reviews, and how anyone There is a good discussion on how you do good reviews, and how anyone
can be a reviewer: can be a reviewer:
http://docs.openstack.org/infra/manual/developers.html#peer-review http://docs.openstack.org/infra/manual/developers.html#peer-review
In the draft process guide, I discuss how doing reviews can help get In the draft process guide, I discuss how doing reviews can help get
your code merged faster: :ref:`process`. your code merged faster: :ref:`process`.
Lets look at some of the top reasons why participating with code reviews Lets look at some of the top reasons why participating with code reviews
really helps you: really helps you:
- Doing more reviews, and seeing what other reviewers notice, will help - Doing more reviews, and seeing what other reviewers notice, will help
you better understand what is expected of code that gets merged into you better understand what is expected of code that gets merged into
master master
- Having more non-core people do great reviews, leaves less review work - 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 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 - 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 doing code reviews, you will better understand the comments you get
when people review your code. As you do more code reviews, and see 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 what others notice, you will get a better idea of what people are
looking for when then apply a +2 to your code. looking for when then apply a +2 to your code.
What are the most useful types of code review comments? Well here are a What are the most useful types of code review comments? Well here are a
few to the top ones: few to the top ones:
- Fundamental flaws are the biggest thing to spot. Does the patch break - Fundamental flaws are the biggest thing to spot. Does the patch break
a whole set of existing users, or an existing feature? a whole set of existing users, or an existing feature?
- Consistency of behavior is really important. Does this bit of code - Consistency of behavior is really important. Does this bit of code
do things differently to where similar things happen elsewhere in do things differently to where similar things happen elsewhere in
Masakari? Masakari?
- Is the code easy to maintain, well tested and easy to read? Code is - 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 read order of magnitude times more than it is written, so optimize
for the reader of the code, not the writer. for the reader of the code, not the writer.
Let's look at some problems people hit when starting out doing code Let's look at some problems people hit when starting out doing code
reviews: reviews:
- My +1 doesn't mean anything, why should I bother? - My +1 doesn't mean anything, why should I bother?
- So your +1 really does help. Some really useful -1 votes that lead - So your +1 really does help. Some really useful -1 votes that lead
to a +1 vote helps get code into a position to a +1 vote helps get code into a position
- When to use -1 vs 0 vs +1 - When to use -1 vs 0 vs +1
- Please see the guidelines here: - Please see the guidelines here:
http://docs.openstack.org/infra/manual/developers.html#peer-review http://docs.openstack.org/infra/manual/developers.html#peer-review
- I have already reviewed this code internally, no point in adding a +1 - I have already reviewed this code internally, no point in adding a +1
externally? externally?
- Please talk to your company about doing all code reviews in the - 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 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 has evolved upstream, is much better than trying to 'perfect'
code internally, before uploading for public review. You can use code internally, before uploading for public review. You can use
Draft mode, and mark things as WIP if you prefer, but please do Draft mode, and mark things as WIP if you prefer, but please do
the reviews upstream. the reviews upstream.
- Where do I start? What should I review? - Where do I start? What should I review?
- There are various tools, but a good place to start is: - There are various tools, but a good place to start is:
https://etherpad.openstack.org/p/masakari-pike-workitems https://etherpad.openstack.org/p/masakari-pike-workitems
- Depending on the time in the cycle, it's worth looking at - Depending on the time in the cycle, it's worth looking at
NeedsCodeReview blueprints: NeedsCodeReview blueprints:
https://blueprints.launchpad.net/masakari/ https://blueprints.launchpad.net/masakari/
- Maybe take a look at things you want to see merged, bug fixes and - Maybe take a look at things you want to see merged, bug fixes and
features, or little code fixes features, or little code fixes
- Look for things that have been waiting a long time for a review: - 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: - If you get through the above lists, try other tools, such as:
http://status.openstack.org/reviews http://status.openstack.org/reviews
How to do great code reviews? How to do great code reviews?
============================= =============================
http://docs.openstack.org/infra/manual/developers.html#peer-review 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?`_ For more tips, please see: `Why do code reviews if I am not in masakari-core?`_
How do I become masakari-core? How do I become masakari-core?
============================== ==============================
You don't have to be masakari-core to be a valued member of the Masakari 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 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 that helps someone get their patch closer to being ready to merge helps
everyone get their code merged faster. everyone get their code merged faster.
The first step to becoming masakari-core is learning how to be an active 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 member of the Masakari community, including learning how to do great code
reviews. reviews.
If you feel like you have the time to commit to all the masakari-core 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 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 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 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 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 your reviews, so they are able to vote for you, if you get nominated for
join masakari-core. join masakari-core.
We encourage all mentoring, where possible, to occur on #openstack-masakari We encourage all mentoring, where possible, to occur on #openstack-masakari
so everyone can learn and benefit from your discussions. so everyone can learn and benefit from your discussions.
The above mentoring is available to everyone who wants to learn how to 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 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 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 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 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 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 you have the sort of involvement and conversations that can lead to
becoming a member of masakari-core. becoming a member of masakari-core.

View File

@ -14,7 +14,7 @@
Notifications in Masakari Notifications in Masakari
========================== ==========================
Similarly to other OpenStack services Masakari emits notifications to the message Similar to other OpenStack services Masakari emits notifications to the message
bus with the Notifier class provided by `oslo.messaging-doc`_. From the notification bus with the Notifier class provided by `oslo.messaging-doc`_. From the notification
consumer point of view a notification consists of two parts: an envelope with a fixed consumer point of view a notification consists of two parts: an envelope with a fixed
structure defined by oslo.messaging and a payload defined by the service emitting the structure defined by oslo.messaging and a payload defined by the service emitting the
@ -94,7 +94,7 @@ changed. Masakari provides the following contract regarding the versioned
notification payload: notification payload:
* the payload version defined by the ``masakari_object.version`` field of the * the payload version defined by the ``masakari_object.version`` field of the
payload will be increased if and only if the syntax or the semantics of the payload will be increased only if the syntax or the semantics of the
``masakari_object.data`` field of the payload is changed. ``masakari_object.data`` field of the payload is changed.
* a minor version bump indicates a backward compatible change which means that * a minor version bump indicates a backward compatible change which means that
only new fields are added to the payload so a well written consumer can still only new fields are added to the payload so a well written consumer can still

View File

@ -19,10 +19,8 @@
Masakari team process Masakari team process
===================== =====================
Masakari is always evolving its processes, but it's important to explain why we Masakari is always evolving its processes to ensure productive communication
have them: so we can all work to ensure that the interactions we need to between all members of our community easily.
happen do happen. The process exists to make productive communication between
all members of our community easier.
OpenStack Wide Patterns OpenStack Wide Patterns
======================= =======================
@ -50,7 +48,7 @@ But let's put a Masakari specific twist on things...
Overview Overview
~~~~~~~~ ~~~~~~~~
.. image:: ./images/Masakari_spec_process.svg .. image:: /_static/Masakari_spec_process.svg
:alt: Flow chart showing the Masakari bug/feature process :alt: Flow chart showing the Masakari bug/feature process
Where do you track bugs? Where do you track bugs?
@ -68,7 +66,7 @@ has already fixed it for you (Launchpad helps you with that, at little,
when you create the bug report). when you create the bug report).
When do I need a blueprint vs. a spec? When do I need a blueprint vs. a spec?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
To understand this question, we need to understand why blueprints and To understand this question, we need to understand why blueprints and
specs are useful. specs are useful.

View File

@ -78,14 +78,6 @@ masakari.task_flow.tasks =
confirm_compute_node_disabled_task = masakari.engine.drivers.taskflow.process_failure:ConfirmComputeNodeDisabledTask confirm_compute_node_disabled_task = masakari.engine.drivers.taskflow.process_failure:ConfirmComputeNodeDisabledTask
no_op = masakari.engine.drivers.taskflow.no_op:Noop no_op = masakari.engine.drivers.taskflow.no_op:Noop
[build_sphinx]
source-dir = doc/source
build-dir = doc/build
all_files = 1
[upload_sphinx]
upload-dir = doc/build/html
[compile_catalog] [compile_catalog]
directory = masakari/locale directory = masakari/locale
domain = masakari domain = masakari
@ -99,8 +91,3 @@ input_file = masakari/locale/masakari.pot
keywords = _ gettext ngettext l_ lazy_gettext keywords = _ gettext ngettext l_ lazy_gettext
mapping_file = babel.cfg mapping_file = babel.cfg
output_file = masakari/locale/masakari.pot output_file = masakari/locale/masakari.pot
[build_releasenotes]
all_files = 1
build-dir = releasenotes/build
source-dir = releasenotes/source

View File

@ -76,7 +76,7 @@ commands =
deps = -r{toxinidir}/doc/requirements.txt deps = -r{toxinidir}/doc/requirements.txt
basepython = python3 basepython = python3
commands = commands =
python setup.py build_sphinx sphinx-build -W -b html doc/source doc/build/html
[testenv:releasenotes] [testenv:releasenotes]
deps = -r{toxinidir}/doc/requirements.txt deps = -r{toxinidir}/doc/requirements.txt