Cherry-pick following change-ids from release-0.2.

I15a1d146c9578972816d98fc28961fa94f34c904
Ifb57fb054d1c575404e1500e75fa417d3355bb7f
I4cca1440241b25787a7462bb46afc8ed83569d9a
Ib88a75629c8966e05baa25680d9e75e56d3378f8
I3ef7e32c4155e710278f2d12df03fe3cecc10a59
I9aa9b7323d0ab376ee5c509e9b03f2d889563631
Ie07aa62d26be5144cd61d45021c6e7f65244de26
I6c574c79a2950f852c0ad7db7f0c434878213a54
I5c8729c4c20ce9475ad1329ac13c1b08bda63bff
I7daeec2063f5b36c2e27b3f9e7db8c353f36e2c8
Id171e7d7dea916c8d3e506973d7294c38e0d1600

Change-Id: I92e77e604c39574dc10efe79a073c07daf53ee57
This commit is contained in:
Serg Melikyan 2013-08-21 14:41:26 +04:00 committed by Timur Sufiev
parent b1dd256774
commit d1d156ac4a
49 changed files with 1954 additions and 730 deletions

125
site/css/ddsmoothmenu.css Executable file
View File

@ -0,0 +1,125 @@
.ddsmoothmenu{
margin-top: 20px
}
.ddsmoothmenu ul{
z-index:100;
margin: 0;
padding: 0;
list-style-type: none;
}
/*Top level list items*/
.ddsmoothmenu ul li{
position: relative;
display: inline;
float: left;
}
/*Top level menu link items style*/
.ddsmoothmenu ul li a {
display: block;
height: 23px;
width: 74px;
margin-left: 5px;
line-height: 23px;
font-size: 13px;
font-family: Georgia, "Times New Roman", Times, serif;
color: #a9a2a2;
text-align: center;
text-decoration: none;
font-weight: 400;
outline: none;
}
* html .ddsmoothmenu ul li a{ /*IE6 hack to get sub menu links to behave correctly*/
display: inline-block;
}
.ddsmoothmenu ul li a.selected, .ddsmoothmenu ul li a:hover { /*CSS class that's dynamically added to the currently active menu items' LI A element*/
color: #f00;
background: url(../images/templatemo_menu_hover.png)
}
/*1st sub level menu*/
.ddsmoothmenu ul li ul {
position: absolute;
width: 160px;
margin: 10px 0 0 5px;
left: 0;
display: none; /*collapse all sub menus to begin with*/
visibility: hidden;
background: url(../images/templatemo_smm.png) repeat-y
}
.ddsmoothmenu ul li ul span.top { position: absolute; width: 160px; height: 5px; top: -5px; left: 0; background: url(../images/templatemo_smt.png) no-repeat; }
.ddsmoothmenu ul li ul span.bottom { position: absolute; width: 160px; height: 5px; bottom: -5px; left: 0; background: url(../images/templatemo_smb.png) no-repeat; }
/*Sub level menu list items (undo style from Top level List Items)*/
.ddsmoothmenu ul li ul li{
display: list-item;
float: none;
}
/*All subsequent sub menu levels vertical offset after 1st level sub menu */
.ddsmoothmenu ul li ul li ul{
top: 0;
}
/* Sub level menu links style */
.ddsmoothmenu ul li ul li a{
font-weight: 500;
width: 140px; /*width of sub menus*/
height: 28px;
line-height: 28px;
margin: 0 10px;
font-size: 12px;
text-align: left;
background: none;
color: #a9a2a2;
border-bottom: 1px solid #151515
}
.ddsmoothmenu ul li ul li .last {
border-bottom: none;
}
.ddsmoothmenu ul li ul li a.selected, .ddsmoothmenu ul li ul li a:hover {
color: #f00;
width: 129px;
margin-left: 11px;
background: none;
}
/* Holly Hack for IE \*/
* html .ddsmoothmenu{height: 1%;} /*Holly Hack for IE7 and below*/
/* ######### CSS classes applied to down and right arrow images ######### */
.downarrowclass{
position: absolute;
top: 12px;
right: 7px;
}
.rightarrowclass{
position: absolute;
top: 6px;
right: 5px;
}
/* ######### CSS for shadow added to sub menus ######### */
.ddshadow{
position: absolute;
left: 0;
top: 0;
width: 0;
height: 0;
}
.toplevelshadow{ /*shadow opacity. Doesn't work in IE*/
opacity: 0.5;
}
/* menu */

202
site/css/lightbox.css Normal file
View File

@ -0,0 +1,202 @@
/* line 7, ../sass/lightbox.sass */
body:after {
content: url(../images/close.png) url(../images/loading.gif) url(../images/prev.png) url(../images/next.png);
display: none;
}
/* line 11, ../sass/lightbox.sass */
.lightboxOverlay {
position: absolute;
top: 0;
left: 0;
z-index: 9999;
background-color: black;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);
opacity: 0.8;
display: none;
}
/* line 20, ../sass/lightbox.sass */
.lightbox {
position: absolute;
left: 0;
width: 100%;
z-index: 10000;
text-align: center;
line-height: 0;
font-weight: normal;
}
/* line 28, ../sass/lightbox.sass */
.lightbox .lb-image {
display: block;
height: auto;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
}
/* line 32, ../sass/lightbox.sass */
.lightbox a img {
border: none;
}
/* line 35, ../sass/lightbox.sass */
.lb-outerContainer {
position: relative;
background-color: white;
*zoom: 1;
width: 250px;
height: 250px;
margin: 0 auto;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
-ms-border-radius: 4px;
-o-border-radius: 4px;
border-radius: 4px;
}
/* line 38, ../../../../.rvm/gems/ruby-1.9.3-p392/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss */
.lb-outerContainer:after {
content: "";
display: table;
clear: both;
}
/* line 44, ../sass/lightbox.sass */
.lb-container {
padding: 4px;
}
/* line 47, ../sass/lightbox.sass */
.lb-loader {
position: absolute;
top: 43%;
left: 0%;
height: 25%;
width: 100%;
text-align: center;
line-height: 0;
}
/* line 56, ../sass/lightbox.sass */
.lb-cancel {
display: block;
width: 32px;
height: 32px;
margin: 0 auto;
background: url(../images/loading.gif) no-repeat;
}
/* line 63, ../sass/lightbox.sass */
.lb-nav {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
z-index: 10;
}
/* line 71, ../sass/lightbox.sass */
.lb-container > .nav {
left: 0;
}
/* line 74, ../sass/lightbox.sass */
.lb-nav a {
outline: none;
}
/* line 77, ../sass/lightbox.sass */
.lb-prev, .lb-next {
width: 49%;
height: 100%;
cursor: pointer;
/* Trick IE into showing hover */
display: block;
}
/* line 84, ../sass/lightbox.sass */
.lb-prev {
left: 0;
float: left;
}
/* line 87, ../sass/lightbox.sass */
.lb-prev:hover {
background: url(../images/prev.png) left 48% no-repeat;
}
/* line 90, ../sass/lightbox.sass */
.lb-next {
right: 0;
float: right;
}
/* line 93, ../sass/lightbox.sass */
.lb-next:hover {
background: url(../images/next.png) right 48% no-repeat;
}
/* line 96, ../sass/lightbox.sass */
.lb-dataContainer {
margin: 0 auto;
padding-top: 5px;
*zoom: 1;
width: 100%;
-moz-border-radius-bottomleft: 4px;
-webkit-border-bottom-left-radius: 4px;
border-bottom-left-radius: 4px;
-moz-border-radius-bottomright: 4px;
-webkit-border-bottom-right-radius: 4px;
border-bottom-right-radius: 4px;
}
/* line 38, ../../../../.rvm/gems/ruby-1.9.3-p392/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss */
.lb-dataContainer:after {
content: "";
display: table;
clear: both;
}
/* line 103, ../sass/lightbox.sass */
.lb-data {
padding: 0 4px;
color: #bbbbbb;
}
/* line 106, ../sass/lightbox.sass */
.lb-data .lb-details {
width: 85%;
float: left;
text-align: left;
line-height: 1.1em;
}
/* line 111, ../sass/lightbox.sass */
.lb-data .lb-caption {
font-size: 13px;
font-weight: bold;
line-height: 1em;
}
/* line 115, ../sass/lightbox.sass */
.lb-data .lb-number {
display: block;
clear: left;
padding-bottom: 1em;
font-size: 12px;
color: #999999;
}
/* line 121, ../sass/lightbox.sass */
.lb-data .lb-close {
display: block;
float: right;
width: 30px;
height: 30px;
background: url(../images/close.png) top right no-repeat;
text-align: right;
outline: none;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70);
opacity: 0.7;
}
/* line 130, ../sass/lightbox.sass */
.lb-data .lb-close:hover {
cursor: pointer;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
opacity: 1;
}

683
site/css/templatemo_style.css Executable file
View File

@ -0,0 +1,683 @@
/*
Credit: http://www.templatemo.com
*/
body {
margin: 0;
padding: 0;
color: #6e6e6e;
font-family: Tahoma, Geneva, sans-serif;
font-size: 13px;
line-height: 1.4em;
background-color: #3b3939;
background-repeat: repeat-x;
background-position: top;
}
#home {
background-image: url(../images/templatemo_bg_homepage.jpg);
}
#subpage {
background-image: url(../images/templatemo_bg_subpage.jpg);
}
a, a:link, a:visited {
color: #7f0d0d;
font-weight: normal;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
a.more {
display: inline-block;
padding-left: 12px;
background: url(../images/templatemo_list.png) no-repeat 0 4px;
}
p {
margin: 0 0 10px 0;
padding: 0;
}
img {
border: none;
}
blockquote {
font-style: italic;
margin: 0 0 0 10px;
}
cite {
font-weight: bold;
color:#000;
}
cite a, cite a:link, cite a:visited {
font-size: 12px;
text-decoration: none;
font-style: normal;
}
cite span {
font-weight: 400;
color: #7f0d0d;
}
h1, h2, h3, h4, h5, h6 { color: #2c2c2c; font-weight: normal; }
h1 { font-size: 48px; margin: 0 0 30px; padding: 5px 0 }
h2 { font-size: 30px; margin: 0 0 25px; padding: 5px 0 }
h3 { font-size: 24px; margin: 0 0 20px; padding: 0; }
h4 { font-size: 18px; margin: 0 0 15px; padding: 0; }
h5 { font-size: 16px; margin: 0 0 10px; padding: 0; }
h6 { font-size: 12px; margin: 0 0 5px; padding: 0; }
.cleaner { clear: both }
.h10 { height: 10px }
.h20 { height: 20px }
.h30 { height: 30px }
.h40 { height: 40px }
.h50 { height: 50px }
.divider { margin-bottom: 40px; padding-bottom: 20px; background: url(../images/templatemo_divider.png) repeat-x bottom; }
.image_fl { float: left; margin: 3px 20px 5px 0 }
.image_fr { float: right; margin: 3px 0 5px 20px }
.float_l { float: left }
.float_r { float: right }
.templatemo_list {
margin: 10px 0 10px 15px;
padding: 0;
list-style: none;
}
.templatemo_list li {
color:#52493a;
margin: 0 0 10px 0;
padding: 0 5px 0 15px;
background: url(../images/templatemo_list.png) no-repeat scroll 0 4px;
}
.templatemo_list li a {
color: #52493a;
font-weight: normal;
}
.templatemo_list li a:hover {
color: #52493a;
}
#templatemo_header_wrapper {
width: 960px;
margin: 0 auto;
padding: 40px 10px 20px;
background: url(../images/templatemo_header_dividier.png) repeat-x bottom
}
#templatemo_slider {
width: 960px;
margin: 0 auto;
padding: 0 10px 10px;
}
#templatemo_main {
width: 960px;
margin: 0 auto;
padding: 40px 10px 20px;
background: #f6f3f3;
border: 1px solid #fff;
margin-bottom: 40px;
}
#content {
float: left;
width: 600px;
padding-right: 20px;
}
#sidebar {
float: right;
width: 300px;
}
#templatemo_bottom_wrapper {
width: 100%;
background: #272525;
}
#templatemo_bottom {
width: 960px;
margin: 0 auto;
padding: 0 10px 20px;
}
#templatemo_footer_wrapper {
width: 100%;
background: #181818;
}
#templatemo_footer {
width: 960px;
margin: 0 auto;
padding: 10px;
text-align: center;
position: relative;
}
.footer_img_link{
position: absolute;
margin: 0 0 0 -50px;
cursor: default;
}
#templatemo_footer a {
color: #6e6e6e;
}
#site_title {
float: left;
padding-right: 50px;
}
#site_title h1 {
margin: 0;
padding: 0;
}
#site_title h1 a {
display: block;
font-size: 12px;
width: 150px;
height: 45px;
color: #acacac;
text-indent: -10000px;
background: url(../images/templatemo_logo.png) no-repeat center left;
}
#templatemo_menu { float: right }
#slider-left-but {
display: block;
width: 30px;
height: 30px;
border: none;
background: url(../images/templatemo_slider_left.png);
margin-right: 10px;
}
#slider-right-but {
display: block;
width: 30px;
height: 30px;
border: none;
background: url(../images/templatemo_slider_right.png);
}
.rp_pp {
margin-bottom: 10px;
padding-bottom: 10px;
border-bottom: 1px dotted #ced4dc;
}
.rp_pp img {
float: left;
margin-right: 15px;
border: 3px solid #fff;
}
.rp_pp p {
font-size: 10px;
}
.about_box {
clear: both;
margin-bottom: 40px;
}
.about_box img {
float: left;
margin-right: 40px;
}
.about_box h4 {
font-size: 14px;
font-weight: bold;
font-style: italic;
margin-bottom: 0px;
}
p.position {
color: #f3a706;
font-weight: bold;
font-size: 12px;
font-style: italic;
margin-bottom: 10px;
}
.recent_post {
margin: 0;
padding:0;
list-style: none;
}
.recent_post li {
margin: 0 0 15px;
padding: 0 0 15px;
font-size: 11px;
border-bottom: 1px solid #ccc;
}
.recent_post li a {
display: block;
font-weight: 700;
}
.post {
clear: both;
margin-bottom: 60px;
}
.post img {
margin-bottom: 10px;
}
.post h2.home {
color: #ba8c00;
font-size: 18px;
margin-bottom: 0;
}
.post h2 {
margin-bottom: 0;
line-height: 38px;
border-bottom: 1px solid #999;
margin-bottom: 20px;
}
.post .meta {
font-size: 10px;
margin-bottom: 20px;
border: 1px solid #ccc;
border-left: none;
border-right: none;
}
.post .meta span {
float: left;
display: block;
margin-right: 20px;
padding: 5px 0 5px 30px;
}
.post .meta span.admin {
background: url(../images/agent.png) no-repeat;
}
.post .meta span.date {
background: url(../images/calendar.png) no-repeat;
}
.post .meta span.tag {
background: url(../images/tag.png) no-repeat;
}
.post .meta span.comment {
background: url(../images/chat.png) no-repeat;
}
.post .meta span.more_but {
float: right;
}
.post .meta span.more_but a {
color: #7f0d0d;
}
.post .meta a, .post .meta strong {
color: #7b7b7b;
font-weight: 700;
}
#comment_section {
clear: both;
margin-bottom: 60px;
width: 538px;
}
.first_level {
margin: 0; padding: 0;
}
.comments {
list-style: none;
}
.comments li {
margin-bottom: 10px;
list-style:none;
}
.comments li .commentbox1 {
border: 1px solid #d7cfbe;
}
.comments li .commentbox2 {
border: 1px solid #ccc;
}
.comments li .comment_box {
clear: both;
width:100%;
padding: 10px 30px 20px 30px;
margin-bottom: 40px;
}
.comment_box .gravatar {
float: left;
width: 75px;
margin-right: 30px;
}
.comment_box .gravatar img {
width: 75px;
height: 75px;
}
.comment_box .comment_text { }
.comment_box .comment_text p {
margin: 0;
}
.comment_text .comment_author {
font-size: 14px;
font-weight: bold;
color: #7f0d0d;
margin-bottom: 10px;
}
.comment_text .date {
font-size: 12px;
font-weight: normal;
color: #7b7b7b;
padding-left: 10px;
}
.comment_text .time {
font-size: 12px;
font-weight: normal;
color: #7b7b7b;
padding-left: 10px;
}
.comment_text .reply a {
display: block;
clear: both;
float: right;
color: #444;
font-weight: 700;
}
#comment_form {
clear: both;
}
#comment_form h3 {
font-size: 20px;
border-bottom: 1px solid #1b1b1b;
margin-bottom: 15px;
padding-bottom: 10px;
}
#comment_form form {
}
#comment_form textarea {
color: #000;
background:#fff;
border: 1px solid #ccc;
height:150px;
padding:5px;
width: 360px;
font-family: Tahoma, Geneva, sans-serif;
font-size: 12px;
margin-top: 5px;
}
#comment_form .form_row {
width: 100%;
margin-bottom: 15px;
}
#comment_form form input {
color: #000;
padding: 5px;
width: 200px;
background:#fff;
border: 1px solid #ccc;
font-family: Tahoma, Geneva, sans-serif;
font-size: 12px;
margin-top: 5px;
}
#comment_form .submit_btn {
width: 80px;
height: 30px;
color: #000;
background:#fff;
border: 1px solid #ccc;
}
.gallery_box {
margin-bottom: 40px;
}
.gallery_box img {
margin-bottom: 10px;
}
.gallery_box h5 {
font-size: 12px;
font-weight: 700;
margin-bottom:0;
}
.gallery_box p {
font-size: 11px;
}
.testimonial {
padding: 0 0 20px 70px;
margin-bottom: 30px;
border-bottom: 1px dotted #ced4dc;
display: block;
background: url(../images/speech_bubble_grey.png) left top no-repeat;
}
#contact_form {
padding: 0;
width: 410px;
margin-bottom: 40px;
}
#contact_form form {
margin: 0px;
padding: 0px;
}
#contact_form form .input_field {
width: 270px;
padding: 5px;
color: #333;
background: #fff;
border: 1px solid #dedede;
font-family: Tahoma, Geneva, sans-serif;
font-size: 12px;
margin-top: 5px;
}
#contact_form form label {
display: block;
width: 100px;
margin-right: 12px;
font-size: 12px;
}
#contact_form form textarea {
width: 398px;
height: 200px;
padding: 5px;
color: #333;
background: #fff;
border: 1px solid #dedede;
font-family: Tahoma, Geneva, sans-serif;
font-size: 12px;
margin-top: 5px;
}
#contact_form form .submit_btn {
display: block;
width: 80px;
height: 25px;
background: url(../images/templatemo_button_02.png);
border: 1px solid #bb4d17;
color: #fff;
font-size:13px;
border: none;
margin: 10px 0px;
}
#templatemo_bottom h4 {
display: block;
position: relative;
height: 27px;
padding-top: 5px;
margin-left: 27px;
color: #fff;
background:url(../images/templatemo_footer_header_right.png) no-repeat right
}
#templatemo_bottom h4 span {
position: absolute;
top: 0;
left: -27px;
width: 27px;
height: 32px;
background: url(../images/templatemo_footer_header_left.png) no-repeat left;
}
#templatemo_bottom .bottom_box {
padding: 0 30px;
}
#templatemo_bottom a {
color: #aca6a6;
}
.footer_list {
margin: 0;
padding: 0;
list-style: none;
}
.footer_list li {
margin: 0 0 5px;
padding: 0 0 5px;
border-bottom: 1px dotted #313030;
}
.footer_list li a {
color: #aca6a6;
}
.twitter_post {
margin: 0;
padding: 0;
list-style: none;
}
.twitter_post li {
margin: 0 0 10px;
padding: 0 0 7px;
border-bottom: 1px dotted #313030;
}
.footer_social_button {
clear: both;
margin-bottom: 40px;
}
.footer_social_button a {
margin-right: 5px;
}
.col {
float: left;
margin: 0 20px 20px 0;
}
.half {
width: 450px;
}
#sidebar, .one_third {
width: 300px;
}
.two-third {
width: 620px;
}
.padding_right {
padding-right: 20px;
}
.one_fourth {
width: 220px;
}
.no_margin_right {
margin-right: 0;
}
.last_box {
margin-bottom: 0;
background: none;
}
.pagging {
margin: 0 0 20px;
padding: 0;
}
.pagging ul {
margin: 0;
padding: 0;
list-style: none;
}
.pagging ul li {
margin: 0;
padding: 0;
display: inline;
}
.pagging ul li a {
float: left;
display: block;
color: #333;
text-decoration: none;
margin-right: 5px;
padding: 5px 10px;
background: #fff;
border: 1px solid #ccc;
}
.pagging ul li a:hover {
background: #7f0d0d;
border: 1px solid #fff;
color: #fff;
}

BIN
site/images/close.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

BIN
site/images/loading.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

BIN
site/images/next.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
site/images/prev.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
site/images/slider/01.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
site/images/slider/02.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

BIN
site/images/slider/03.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

BIN
site/images/slider/04.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
site/images/slider/05.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

BIN
site/images/slider/06.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
site/images/slider/07.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

BIN
site/images/slider/08.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 B

BIN
site/images/templatemo_list.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

BIN
site/images/templatemo_logo.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

BIN
site/images/templatemo_smb.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 B

BIN
site/images/templatemo_smm.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 B

BIN
site/images/templatemo_smt.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B

View File

@ -1,335 +1,110 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Documentation | Murano</title>
<link rel="stylesheet" type="text/css" href="http://mirantis.com/wp-content/themes/carrington-jam-1.4/css/style.css" />
<link href='http://fonts.googleapis.com/css?family=PT+Sans:400,700,400italic' rel='stylesheet' type='text/css' />
<link href='http://fonts.googleapis.com/css?family=PT+Sans+Caption' rel='stylesheet' type='text/css' />
<link href='http://fonts.googleapis.com/css?family=PT+Sans+Narrow:400,700' rel='stylesheet' type='text/css' />
<meta name="description" content="Mirantis Inc. - OpenStack Experts On-Demand. Openstack outsourcing and consulting. Openstack engineers and development for openstack software."/>
<meta name="keywords" content="openstack development, software, consulting, engineers, outsourcing, open cloud, murano, windows, services"/>
<style type="text/css">
html, body {
height: 100%;
background:url(http://www.mirantis.com/wp-content/themes/carrington-jam-1.4/img/bginner.jpg) repeat-x;
font-family: 'PT Sans', arial, sans-serif;
font-size: 14px;
color:#41454d;
}
h1 {
font-family: 'PT Sans Caption', arial, sans-serif;
font-weight: normal;
font-style: normal;
font-size: 27px;
color: black;
line-height: 1.4em;
}
h1.logo-company-name { display: none; }
h2 {
color: #D3301A;
font-family: 'PT Sans', arial, sans-serif;
font-size: 19px;
font-style: italic;
font-weight: normal;
letter-spacing: 0;
word-spacing: 0;
line-height: 35px;
margin-top: 5px;
margin-bottom: 8px;
}
h3 {
font-family: 'PT Sans Narrow', 'Arial Narrow', arial, sans-serif;
font-size: 19px;
font-weight: normal;
margin-top: 15px;
margin-bottom: 14px;
color: black;
}
h4 {
font-family: 'PT Sans Narrow', 'Arial Narrow', arial, sans-serif;
font-size: 17px;
font-weight: normal;
margin-top: 15px;
margin-bottom: 14px;
color: #2366AB;
}
#topdynamicinner {
margin-bottom: -160px;
margin-top: 7px;
width: 960px;
height: 310px;
padding-right: 12px;
}
#topdynamicinner h3 {
font-family: 'PT Sans Narrow', 'Arial Narrow', arial, sans-serif;
font-weight: bold;
font-style: normal;
font-size: 35px;
color: #5E6771;
padding-top: 30px;
text-shadow: 1px 1px 0 #fff;
margin: 0px;
}
#topdynamicinner p {
padding-top: 0px;
font-family: 'PT Serif Caption', georgia, serif;
font-weight: normal;
font-style: italic;
font-size: 21px;
color: #647280;
line-height: 1.2em;
text-shadow: 1px 1px 0 #fff;
}
img {
border:0px;
}
a {
color:#D32F1A;
text-decoration:none;
}
a:hover {
color:#F00;
}
ul {
list-style-image: url("http://mirantis.com/wp-content/themes/carrington-jam-1.4/img/bullet.png");
margin-left:30px;
font-size:14px;
padding-right: 80px;
margin-bottom: 4px;
}
ul ul {
list-style-image: url("http://mirantis.com/wp-content/themes/carrington-jam-1.4/img/bull_l2.png");
margin-top: 8px;
}
ul.lv2 {
list-style-image: url("http://mirantis.com/wp-content/themes/carrington-jam-1.4/img/bull_l2.png");
margin-top: 8px;
}
li {
margin-bottom:8px;
}
p {
font-size: 15px;
color: #41454D;
font-style: regular;
margin:6px 0px 15px 0px;
}
.glink {margin: 0; border:0;}
.subglobalNav {margin-top: -5px !important; border:0;}
a:hover h1 {color: #D3301A;}
/* For the MAIN MENU */
#main-menu {
height:47px;
margin-top:30px;
text-align: right;
position:relative;
}
a.glink {
color: black;
font-family: 'PT Sans Narrow','Arial Narrow',arial,sans-serif;
font-size: 19px;
padding: 5px 5px 5px 12px;
white-space: nowrap;
text-decoration:none;
}
a.glink:hover {
color:#d3301a;
}
.subglobalNav {
color: black;
position:absolute;
font-family: 'PT Sans Narrow','Arial Narrow',arial,sans-serif;
font-size: 14px;
white-space: nowrap;
text-decoration:none;
right:0px;
padding-top: 10px;
}
.subglobalNav a{
color: black;
text-decoration:none;
padding: 2px 7px 2px 7px;
margin-left:12px;
}
.subglobalNav a:hover {
color: #fff;
background: #CB2E19;
-moz-border-radius: 2px;
border-radius: 2px;
margin-left:12px;
text-shadow: -1px -1px 0px #7F2114;
}
a.act {
color:#d3301a !important;
}
a.act:hover { color: #fff !important; background: #CB2E19; }
a.active { color:#d3301a; }
span.hs-footer-company-copyright { display: none; }
div.page-header.section-header { min-height: 80px; padding-top: 20px; }
div.body-container-wrapper {margin-bottom: 100px;}
</style>
<style type="text/css" media="screen">
html { margin-top: 28px !important; }
* html body { margin-top: 28px !important; }
</style>
<script type='text/javascript' src='http://www.mirantis.com/wp-content/themes/carrington-jam-1.4/js/menu.js'></script>
</head>
<body style="background:url(http://www.mirantis.com/wp-content/themes/carrington-jam-1.4/img/bginner.jpg) repeat-x; margin:0 !important;">
<div id="content" style="width:960px; margin:auto; min-height: 100%;">
<table width="100%" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td width="167px" height="107px">
<a href="http://www.mirantis.com/" title="Home" rel="home"><img src="http://www.mirantis.com/wp-content/themes/carrington-jam-1.4/img/logo.gif" alt="Mirantis" border="0" /></a>
</td>
<td>
<div id="top-menu" style="height: 30px;">
<div class="textwidget">
<table align="right">
<tbody>
<tr>
<td>
<div style="margin-top:5px; margin-right:10px;">
<a href="https://twitter.com/MirantisIT" class="twitter-follow-button" data-show-count="false" data-show-screen-name="false">Follow @MirantisIT</a>
<script>!function (d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], p = /^http:/.test(d.location) ? 'http' : 'https'; if (!d.getElementById(id)) { js = d.createElement(s); js.id = id; js.src = p + '://platform.twitter.com/widgets.js'; fjs.parentNode.insertBefore(js, fjs); } } (document, 'script', 'twitter-wjs');</script>
</div>
</td>
<td>
<div id="ttopmenu" style="float: right; height: 20px; overflow: hidden; margin-top: 10px;">
<a class="top" href="http://www.mirantis.com/blog/" style="font-size: 13px; font-style: italic; color:#A7B6C3;">Blog</a> &nbsp;
<a class="top" href="http://www.mirantis.com/careers/" style="font-size: 13px; font-style: italic; color:#A7B6C3;">Careers</a> &nbsp;
<a class="top" href="http://www.mirantis.com/contact/" style="font-size: 13px; font-style: italic; color:#A7B6C3;">Contact Us</a>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!--#top-menu-->
<div id="main-menu">
<div id="masthead">
<div id="globalNav">
<div id="globalLink">
<a href="http://www.mirantis.com/openstack-services/" id="gl1" class="glink" name="gl1">OpenStack Services</a>
<a href="http://www.mirantis.com/openstack-training/" id="gl2" class="glink" name="gl2">Training</a>
<a href="http://fuel.mirantis.com" id="gl3" class="glink" name="gl3">Fuel for OpenStack</a>
<a href="http://www.mirantis.com/openstack-use-cases/" id="gl4" class="glink" name="gl4">Use Cases </a>
<a href="http://www.mirantis.com/why-mirantis/" id="gl5" class="glink" name="gl5">Why Mirantis</a>
<a href="http://www.mirantis.com/company/" id="gl6" class="glink" name="gl6">Company</a>
</div>
</div>
</div>
<div class="clear"></div>
</div>
<!--#main-menu-->
</td>
</tr>
</tbody>
</table>
<div id="topdynamicinner" style="background:url(http://www.mirantis.com/wp-content/themes/carrington-jam-1.4/img/inner1.jpg) no-repeat top right;">
<h3>Murano Project</h3>
<p>Windows Services upon OpenStack</p>
</div>
<h1>Murano for OpenStack</h1>
<h2>Overview</h2>
<p>
Mirantis proposes to introduce a new service which will allow a non-experienced user to deploy
reliable Windows based environments in a “push-the-button” manner. The key goal is to provide a UI
and API enabling the deployment and operation of Windows Environments at the Windows Services
abstraction level. The service should be able to orchestrate complex circular dependent cases in
order to set up a complex Windows Environment with multiple dependant services.
</p>
<p>
The Key Features of the Service are the following:
</p>
<ul>
<li><p>Native to OpenStack</p></li>
<li><p>Introduces abstraction level for Windows Environments</p></li>
<li><p>Supports Availability Zones and Disaster Recovery scenarios</p></li>
<li><p>Uses native Windows features for HA solutions</p></li>
</ul>
<h2>Manuals</h2>
<ul>
<li><a href="docs/murano-manual/content/ch01.html">User Manual</a> (<a href="docs/murano-manual/murano-manual.pdf">download pdf</a>)</li>
<li><a href="docs/murano-deployment-guide/content/ch01.html">Deployment Guide</a> (<a href="docs/murano-deployment-guide/murano-deployment-guide.pdf">download pdf</a>)</li>
</ul>
<h2>Links</h2>
<ul>
<li><a href="http://launchpad.net/murano">Launchpad</a></li>
<li><a href="http://wiki.openstack.org/Murano">Wiki</a></li>
</ul>
<div id="dummy" style="height: 115px;margin-top: 20px;width: 100%;"></div>
</div>
<div id="footer" style="height:115px; margin-top:-120px; background:url(http://mirantis.com/wp-content/themes/carrington-jam-1.4/img/footer_tile.jpg) repeat-x; font-family: 'PT Sans Narrow', 'Arial Narrow', arial, sans-serif; font-size: 17px; line-height: 21px; text-shadow: 1px 1px 0px white;">
<div id="footer_content" style="width:960px; margin:4px auto auto auto; height:110px;">
<table width="100%" border="0" cellpadding="0" cellspacing="0" id="foottable">
<tr>
<td valign="top" style="padding-top: 20px;">
<span class="fgeneral" style="color: black;">Mirantis Inc.<br>
<span class="fslogan" style="font-family: 'PT Sans', arial, sans-serif; font-style: italic; color: #43678a; font-size: 13px;">OpenStack Clouds. Delivered.</span>
</span>
</td>
<td valign="top" style="padding-top: 20px;">
<span class="fgeneral" style="color: black;">&copy 2005&ndash;2013</span> <span class="fgeneralblue">All Rights Reserved</span></span>
</td>
<td valign="top" style="padding-top: 20px;">
<div id="fbox" style="padding-left: 10px; border-left: 1px solid #d5dbe1;">
<span class="fgeneral" style="color: black;">615 National Avenue, Suite 100<br>
Mountain View, CA 94043
</span>
</div>
</td>
<td valign="top" style="padding-top: 20px;">
<div id="fbox" style="padding-left: 10px; border-left: 1px solid #d5dbe1;">
<span class="fgeneralblue" style="color: #43678a;">Phone</span> <span class="fgeneral">650-963-9828</span><br>
<span class="fgeneralblue" style="color: #43678a;">Fax</span> <span class="fgeneral">650-968-2997</span>
</div>
</td>
</tr>
</table>
<div class="clear"></div>
</div>
</div>
</body>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Murano Documentation</title>
<link href="css/templatemo_style.css" rel="stylesheet" type="text/css" />
<link href="css/lightbox.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" type="text/css" href="css/ddsmoothmenu.css" />
<script type="text/javascript" src="js/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="js/jquery-migrate-1.2.1.min.js"></script>
<script type="text/javascript" src="js/lightbox-2.6.min.js"></script>
<script type="text/javascript" src="js/modernizr.custom.js"></script>
<!-- Load the CloudCarousel JavaScript file -->
<script type="text/JavaScript" src="js/cloud-carousel.1.0.5.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
// This initialises carousels on the container elements specified, in this case, carousel1.
$("#carousel1").CloudCarousel(
{
reflHeight: 40,
reflGap:2,
titleBox: $('#da-vinci-title'),
altBox: $('#da-vinci-alt'),
buttonLeft: $('#slider-left-but'),
buttonRight: $('#slider-right-but'),
yRadius:30,
xPos: 480,
yPos: 32,
speed:0.15,
}
);
});
</script>
</head>
<body id="home">
<div id="templatemo_header_wrapper">
<div id="site_title"><h1><a href="http://murano.github.io">Murano Documentation</a></h1></div>
<div id="templatemo_menu" class="ddsmoothmenu">
<ul>
<li><a href="index.html" class="selected">Docs</a></li>
<li><a href="https://wiki.openstack.org/wiki/Murano">Wiki</a>
<li><a href="http://launchpad.net/murano">Launchpad</a></li>
</ul>
<br style="clear: left" />
</div> <!-- end of templatemo_menu -->
<div class="cleaner"></div>
</div> <!-- END of templatemo_header_wrapper -->
<div id="templatemo_slider">
<!-- This is the container for the carousel. -->
<div id = "carousel1" style="width:960px; height:280px;background:none;overflow:scroll; margin-top: 20px">
<!-- All images with class of "cloudcarousel" will be turned into carousel items -->
<!-- You can place links around these images -->
<a href="images/slider/01.png" data-lightbox="image-01"><img class="cloudcarousel" src="images/slider/01_small.png" /></a>
<a href="images/slider/02.png" data-lightbox="image-02"><img class="cloudcarousel" src="images/slider/02_small.png" /></a>
<a href="images/slider/03.png" data-lightbox="image-03"><img class="cloudcarousel" src="images/slider/03_small.png" /></a>
<a href="images/slider/04.png" data-lightbox="image-04"><img class="cloudcarousel" src="images/slider/04_small.png" /></a>
<a href="images/slider/05.png" data-lightbox="image-05"><img class="cloudcarousel" src="images/slider/05_small.png" /></a>
<a href="images/slider/06.png" data-lightbox="image-06"><img class="cloudcarousel" src="images/slider/06_small.png" /></a>
<a href="images/slider/07.png" data-lightbox="image-07"><img class="cloudcarousel" src="images/slider/07_small.png" /></a>
<a href="images/slider/08.png" data-lightbox="image-08"><img class="cloudcarousel" src="images/slider/08_small.png" /></a>
</div>
<!-- Define left and right buttons. -->
<center>
<input id="slider-left-but" type="button" value="" />
<input id="slider-right-but" type="button" value="" />
</center>
</div>
<div id="templatemo_main">
<div class="col one_third fp_services">
<h2>Overview</h2>
<p>
Mirantis proposes to introduce a new service which will allow a non-experienced user to deploy
reliable Windows based environments in a “push-the-button” manner. The key goal is to provide a UI
and API enabling the deployment and operation of Windows Environments at the Windows Services
abstraction level. The service should be able to orchestrate complex circular dependent cases in
order to set up a complex Windows Environment with multiple dependant services.
</p>
</div>
<div class="col one_third fp_services">
<h2>Key Features</h2>
<ul>
<li><p>Native to OpenStack</p></li>
<li><p>Introduces abstraction level for Windows Environments</p></li>
<li><p>Supports Availability Zones and Disaster Recovery scenarios</p></li>
<li><p>Uses native Windows features for HA solutions</p></li>
</ul>
</div>
<div class="col one_third no_margin_right fp_services">
<h2>Manuals</h2>
<ul>
<li><a href="docs/murano-manual/content/ch01.html">User Manual</a> (<a href="docs/murano-manual/murano-manual.pdf">download pdf</a>)</li>
<li><a href="docs/murano-deployment-guide/content/ch01.html">Deployment Guide</a> (<a href="docs/murano-deployment-guide/murano-deployment-guide.pdf">download pdf</a>)</li>
</ul>
</div>
<div class="cleaner"></div>
</div> <!-- END of templatemo_main -->
</body>
</html>

10
site/js/cloud-carousel.1.0.5.min.js vendored Normal file

File diff suppressed because one or more lines are too long

6
site/js/jquery-1.10.2.min.js vendored Normal file

File diff suppressed because one or more lines are too long

2
site/js/jquery-migrate-1.2.1.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1
site/js/lightbox-2.6.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1002,8 +1002,9 @@
<chapter xml:id="_post_building_setup">
<title>Image registration</title>
<para>
Murano is one of the Openstack services which communicates with other Openstack components. Therefore just
created image should be registered in Openstack Glance - image operation service.
Services deployed by Murano require specially prepared images, that can be created manually or via
automated scripts. Please refer to corresponding chapters of this book to create image. After images are
created they should be registered in Openstack Glance - image operation service.
</para>
<orderedlist>
<listitem>
@ -1025,8 +1026,7 @@
</listitem>
<listitem>
<para>Replace IS_PUBLIC with true or false. Setting this value to true means that all users will
be able
to view and use the image.
be able to view and use the image.
</para>
</listitem>
<listitem>
@ -1049,9 +1049,11 @@
<listitem>
<para>
Replace IMAGE_METADATA with the following property:
<emphasis>murano_image_info="{'title': 'Windows 2012 Core edition', 'id': NAME }"</emphasis>,
<emphasis>murano_image_info='{"title": "Windows 2012 Core Edition", "type": "ws-2012-core"}'</emphasis>,
where <emphasis>title </emphasis>- full image description for user and
<emphasis>id</emphasis> is an image name.
<emphasis>type</emphasis> - one of the following: ws-2012-std (Windows Server 2012 Standart Edition),
ws-2012-core (Windows 2012 Core Edition), ws-2008r2-std (Windows Server 2008R2 Standart
Edition), ws-2008r2 (Windows Server 2012R2)
<warning>
<para>Setting <emphasis>murano_image_info</emphasis> property is
required to pick up image from Murano Dashboard.</para>
@ -1072,7 +1074,7 @@
<listitem>
<para>
Replace IMAGE_METADATA with murano_image_info property, e.g.<emphasis>
murano_image_info="{'title': 'Windows 2012 Core edition','id': 'win2k12core'}"</emphasis>,
murano_image_info='{"title": "Windows 2012 Core Edition","type": "ws-2012-core"}'</emphasis>,
</para>
</listitem>
</itemizedlist>

View File

@ -23,14 +23,14 @@
http://www.w3.org/1999/xlink http://www.w3.org/1999/xlink.xsd"
version="5.0">
<title>Installation Guide</title>
<para>This chapter is about installation and configuration Murano services.</para>
<para>This chapter describes installation and configuration of Murano services.</para>
<para>Note that all Murano modules can be downloaded from
<link xlink:href="https://launchpad.net/murano/">our page</link>
on launchpad.
</para>
<section>
<title>Common Pre-Requirements</title>
<para>Operation system:</para>
<title>Pre-Requisites</title>
<para>Murano supports the following operating systems:</para>
<orderedlist>
<listitem>
<para>Ubuntu</para>
@ -39,7 +39,7 @@
<para>RHEL/CentOS</para>
</listitem>
</orderedlist>
<para>Packages:</para>
<para>Ensure that these packages are installed before Murano installation using your OS package manager:</para>
<orderedlist>
<listitem>
<para>python-dev</para>
@ -59,14 +59,12 @@
<section>
<title>Murano API Service</title>
<para>Murano API provides access to the Murano orchestration engine via API.</para>
<para>This chapter describes Murano API for contributors of the project, and assumes that you are already
familiar with Murano API from an end-user perspective.
</para>
<para>This chapter describes the procedure of installation and condiguration of Murano API. </para>
<section>
<title>Install</title>
<itemizedlist>
<listitem>
<para>Need to work as root</para>
<para>We need to have superuser privileges in order to install and configure system packages. Let's switch to root account:</para>
<programlisting>
<![CDATA[
sudo su
@ -74,14 +72,12 @@ sudo su
</programlisting>
</listitem>
<listitem>
<para>Navigate to the temporary directory and clone Murano API Service from repository</para>
<para>Clone Murano API Service from repository</para>
<para>
<emphasis>Ubuntu Linux 12.04 / 12.10</emphasis>
</para>
<programlisting>
<![CDATA[
mkdir -p /tmp/murano
cd /tmp/murano
apt-get install -y git
git clone https://github.com/stackforge/murano-api
]]>
@ -91,13 +87,10 @@ git clone https://github.com/stackforge/murano-api
</para>
<programlisting>
<![CDATA[
mkdir -p /tmp/murano
cd /tmp/murano
yum install -y git
yum install -y git gcc python-paste-deploy python-routes
git clone https://github.com/stackforge/murano-api
]]>
</programlisting>
</listitem>
<listitem>
<para>Switch to just created directory and them perform installation</para>
@ -107,8 +100,7 @@ git clone https://github.com/stackforge/murano-api
<programlisting>
<![CDATA[
cd murano-api
chmod +x setup.sh
./setup.sh install
sh setup.sh install
]]>
</programlisting>
<para>
@ -117,13 +109,22 @@ chmod +x setup.sh
<programlisting>
<![CDATA[
cd murano-api
chmod +x setup.sh
yum install -y
http://mirror.yandex.ru/epel/6/x86_64/epel-release-6-8.noarch.rpm
./setup-centos.sh install
yum install -y http://mirror.yandex.ru/epel/6/x86_64/epel-release-6-8.noarch.rpm
sh setup-centos.sh install
]]>
</programlisting>
</listitem>
<listitem>
<para>Successful installation ends with message like this:</para>
<programlisting>
<![CDATA[
Successfully installed muranoapi
Cleaning up...
LOG:> Making sample configuration files at "/etc/murano-api"
LOG:> Reloading initctl
LOG:> Please, make proper configugation,located at "/etc/murano-api", before starting the "murano-api" daemon!
]]>
</programlisting>
</listitem>
</itemizedlist>
</section>
@ -134,10 +135,10 @@ http://mirror.yandex.ru/epel/6/x86_64/epel-release-6-8.noarch.rpm
<para>First configure rabbitMQ by adding vhost and user with administrator rights:</para>
<programlisting>
<![CDATA[
rabbitmqctl add_user murano murano
rabbitmqctl set_user_tags murano administrator
rabbitmqctl add_vhost murano
rabbitmqctl set_permissions -p murano murano ".*" ".*" ".*"
rabbitmqctl add_user muranouser murano
rabbitmqctl set_user_tags muranouser administrator
rabbitmqctl add_vhost muranovhost
rabbitmqctl set_permissions -p muranovhost muranouser ".*" ".*" ".*"
]]>
</programlisting>
</listitem>
@ -148,6 +149,7 @@ rabbitmqctl set_permissions -p murano murano ".*" ".*" ".*"
cd /etc/murano-api
cp murano-api.conf.sample murano-api.conf
cp murano-api-paste.ini.sample murano-api-paste.ini
vi murano-api.conf
]]>
</programlisting>
@ -156,69 +158,28 @@ vi murano-api.conf
<para>Configure it according to your environment:
<itemizedlist>
<listitem>
<para><emphasis>[DEFAULT]</emphasis>section sets up logging.
<para><emphasis>[DEFAULT]</emphasis> section sets up logging.
</para>
</listitem>
<listitem>
<para>
<emphasis>[reports]</emphasis>
section you can set names for new rabbitMQ queues.
section allows you to set up names for new rabbitMQ queues.
</para>
</listitem>
<listitem>
<para>In
<emphasis>[rabbitmq]</emphasis>
section sets up host configuration where rabbitMQ
section you can set up host configuration where rabbitMQ
with just created user and vhost is running.
</para>
</listitem>
</itemizedlist>
</para>
<programlisting>
<![CDATA[
[DEFAULT]
# Show more verbose log output (sets INFO log level output)
verbose = True
# Show debugging output in logs (sets DEBUG log level output)
debug = True
# Address to bind the server to
bind_host = 0.0.0.0
# Port the bind the server to
bind_port = 8082
# Log to this file. Make sure the user running skeleton-api has
# permissions to write to this file!
log_file = /tmp/murano-api.log
#A valid SQLAlchemy connection string for the metadata database
sql_connection = sqlite:///murano.sqlite
[reports]
results_exchange = task-results
results_queue = task-results
reports_exchange = task-reports
reports_queue = task-reports
[rabbitmq]
host = localhost
port = 5672
virtual_host = murano
login = murano
password = murano
ssl = False
ca_certs =
[ssl]
cert_file = /path/to/certfile
key_file = /path/to/keyfile
ca_file = /path/to/cafile
]]>
</programlisting>
<para> For more information how to configure SSL take a look at <link linkend="ssl"> SSL configuration chapter </link></para>
</listitem>
<listitem>
<para>Configure keystone auth_token in
<emphasis>[keystone_authtoken]</emphasis>
section.
<para>Configure keystone auth_token in murano-api-paste.ini file.
For more information see
<link xlink:href="http://docs.openstack.org/developer/keystone/configuringservices.html">
Auth-Token Middleware with Username and Password
@ -226,27 +187,47 @@ ca_file = /path/to/cafile
</para>
<programlisting>
<![CDATA[
[keystone_authtoken]
vim murano-api-paste.ini
[pipeline:muranoapi]
pipeline = authtoken context apiv1app
[app:apiv1app]
paste.app_factory = muranoapi.api.v1.router:API.factory
[filter:context]
paste.filter_factory = muranoapi.api.middleware.context:ContextMiddleware.facto$
#For more information see Auth-Token Middleware with Username and Password
#http://docs.openstack.org/developer/keystone/configuringservices.html
[filter:authtoken]
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory
auth_host = localhost
auth_port = 35357
auth_protocol = http
admin_tenant_name = admin
admin_user = admin
admin_password = password
signing_dir = /tmp/keystone-signing-muranoapi
]]>
</programlisting>
</listitem>
<listitem>
<para>Register murano-api service in Openstack
(note: you need to be authorized in Openstack to run this commands)
</para>
<para>Register murano-api service in Openstack. </para>
<para>Note: you need to be authorized in Openstack to run this commands. To do this, you can run something like (having changed variables to appropriate values)</para>
<programlisting>
<![CDATA[
source $(YOUR_OPENSTACK_DIR)/openrc $(LOGIN) $(PASSWORD)
]]>
</programlisting>
<anchor xml:id="murano_api_endpoint"></anchor>
<programlisting>
<![CDATA[
user@work:~/$ keystone service-create --name muranoapi --type murano --description "Murano-Api Service"
keystone service-create --name muranoapi --type murano --description "Murano-Api Service"
user@work:~/$ keystone endpoint-create
keystone endpoint-create
--region RegionOne
--service-id The ID field returned by the keystone service-create
@ -260,12 +241,27 @@ user@work:~/$ keystone endpoint-create
</section>
<section>
<title>Run</title>
<para>Run Murano API and supply valid configuration file:</para>
<programlisting>
<![CDATA[
<itemizedlist>
<listitem>
<para>Run Murano API service:</para>
<para>
<emphasis>Ubuntu Linux 12.04 / 12.10</emphasis>
</para>
<programlisting>
<![CDATA[
service murano-api start
]]>
</programlisting>
]]>
</programlisting>
<para>
<emphasis>CentOS 6.x</emphasis>
</para>
<programlisting>
<![CDATA[
initctl start murano-api
]]>
</programlisting>
</listitem>
</itemizedlist>
</section>
</section>
<section>
@ -297,33 +293,60 @@ service murano-api start
</para>
</listitem>
<listitem>
<para>Project source code can be checked out from git repository (see below) or downloaded from
<link xlink:href="http://tarballs.openstack.org/murano-conductor/">here.</link>
<programlisting>
<![CDATA[
user@work:~/$ git clone https://github.com/stackforge/murano-conductor.git
]]>
</programlisting>
</para>
</listitem>
<listitem>
<para>Switch to just created directory</para>
<para>Need to work as root</para>
<programlisting>
<![CDATA[
user@work:~/cd murano-conductor
sudo su
]]>
</programlisting>
</listitem>
<listitem>
<para>And install Conductor Service to the system:</para>
<para>Navigate to the temporary directory and clone Murano Conductor Service from repository</para>
<para>
<emphasis>Ubuntu Linux 12.04 / 12.10</emphasis>
</para>
<programlisting>
<![CDATA[
user@work:~/murano-conductor$ chmod +x setup.sh ; sudo ./setup.sh install
mkdir -p /tmp/murano
cd /tmp/murano
apt-get install -y git
git clone https://github.com/stackforge/murano-conductor
]]>
</programlisting>
<para>
<emphasis>CentOS 6.x</emphasis>
</para>
<programlisting>
<![CDATA[
mkdir -p /tmp/murano
cd /tmp/murano
yum install -y git
git clone https://github.com/stackforge/murano-conductor
]]>
</programlisting>
</listitem>
<listitem>
<para>Switch to just created directory and then perform installation</para>
<para>
<emphasis>Ubuntu Linux 12.04 / 12.10</emphasis>
</para>
<programlisting>
<![CDATA[
cd murano-conductor
sh setup.sh install
]]>
</programlisting>
<para>
<emphasis>CentOS 6.x</emphasis>
</para>
<programlisting>
<![CDATA[
cd murano-conductor
yum install -y
http://mirror.yandex.ru/epel/6/x86_64/epel-release-6-8.noarch.rpm
sh setup-centos.sh install
]]>
</programlisting>
</listitem>
</itemizedlist>
</section>
@ -331,16 +354,21 @@ service murano-api start
<title>Configure</title>
<itemizedlist>
<listitem>
<para>Edit configuration file:</para>
<para>Edit configuration file where each parameter has a comment:</para>
<programlisting>
<![CDATA[
user@work:~/murano-conductor$ nano /etc/murano-conductor/conductor.conf
cd /etc/murano-conductor
cp conductor.conf.sample conductor.conf
]]>
</programlisting>
</listitem>
<listitem>
<para>
Change it according to your environment.
<para>Change configuration file according to your environment.
<programlisting>
<![CDATA[
vi conductor.conf
]]>
</programlisting>
<itemizedlist>
<listitem>
<para><emphasis>[DEFAULT]</emphasis>section is responsible for logging.
@ -350,7 +378,6 @@ service murano-api start
<para><emphasis>[heat]</emphasis>points where heat is running.
</para>
</listitem>
<listitem>
<para><emphasis>[rabbitmq]</emphasis>section points where your rabbitMQ installed and
configured.
@ -360,20 +387,55 @@ service murano-api start
</para>
<programlisting>
<![CDATA[
[DEFAULT]
log_file = logs/conductor.log
debug=True
verbose=True
[DEFAULT]
[heat]
auth_url = http://localhost:5000/v2.0
# Path where log will be written
log_file = /var/log/murano-conductor.log
# Log verbosity
debug=True
verbose=True
data_dir = /etc/murano-conductor
# Maximum number of environments that can be processed simultaneously
max_environments = 20
[rabbitmq]
host = localhost
port = 5672
virtual_host = murano
login = murano
password = murano
[keystone]
auth_url = http://localhost:5000/v2.0
ca_file =
cert_file =
key_file =
insecure = False
[heat]
# Heat SSL parameters
# Optional CA cert file to use in SSL connections
ca_file =
# Optional PEM-formatted certificate chain file
cert_file =
# Optional PEM-formatted file that contains the private key
key_file =
# If set then the server's certificate will not be verified
insecure = False
# Valid endpoint types: publicURL (default), internalURL, adminURL
endpoint_type = publicURL
[rabbitmq]
# Connection parameters to RabbitMQ service
# Hostname or IP address where RabbitMQ is located.
# !!! Change localhost to your real IP or hostname as this address must be reachable from VMs !!!
host = localhost
# RabbitMQ port (5672 is a default)
port = 5672
# Use SSL for RabbitMQ connections (True or False)
ssl = False
# Path to SSL CA certificate or empty to allow self signed server certificate
ca_certs =
# RabbitMQ credentials. Fresh RabbitMQ installation has "guest" account with "guest" password.
# It is recommended to create dedicated user account for Murano using RabbitMQ web console or command line utility
login = muranouser
password = murano
# RabbitMQ virtual host (vhost). Fresh RabbitMQ installation has "/" vhost preconfigured.
# It is recommended to create dedicated vhost for Murano using RabbitMQ web console or command line utility
virtual_host = muranovhost
]]>
</programlisting>
</listitem>
@ -381,153 +443,91 @@ service murano-api start
</section>
<section>
<title>Run</title>
<para>Run Conductor and supply valid configuration file:</para>
<programlisting>
<![CDATA[
user@work:~/murano-conductor$ sudo service murano-conductor start
]]>
</programlisting>
</section>
</section>
<itemizedlist>
<listitem>
<para>Run Murano Conductor service:</para>
<para>
<emphasis>Ubuntu Linux 12.04 / 12.10</emphasis>
</para>
<programlisting>
<![CDATA[
service murano-conductor start
]]>
</programlisting>
<para>
<emphasis>CentOS 6.x</emphasis>
</para>
<programlisting>
<![CDATA[
initctl start murano-conductor
]]>
</programlisting>
</listitem>
</itemizedlist>
</section>
</section>
<section>
<title>Murano Dashboard</title>
<para>Murano Dashboard provides Web UI for Murano Project.</para>
<section>
<title>Pre-Requirements</title>
<itemizedlist>
<listitem>
<para>To setup Murano Dashboard on a host with Openstack Dashbord already installed you just need to
install<emphasis>
the python-muranoclient</emphasis>. You can download it from
<link xlink:href="http://tarballs.openstack.org/python-muranoclient/">here.</link>
</para>
<para>And then perform installation with pip:
<programlisting>
<![CDATA[
user@work:~/$ sudo pip install
]]>
<emphasis>just_downloaded</emphasis>.tar.gz
</programlisting>
</para>
</listitem>
<listitem>
<para>If there is no OpenStack Dashboard (horizon) you"ll need to install it. See
<link xlink:href="http://docs.openstack.org/trunk/openstack-compute/install/yum/content/ch_install-dashboard.html">
here
</link>
how to do that.
</para>
</listitem>
</itemizedlist>
</section>
<section>
<title>Install</title>
<itemizedlist>
<listitem>
<para>Project source code can be checked out from git repository (see below) or downloaded from
<link xlink:href="http://tarballs.openstack.org/murano-dashboard/">here.</link>
<para>Need to work as root</para>
<programlisting>
<![CDATA[
sudo su
]]>
</programlisting>
</listitem>
<listitem>
<para>Navigate to the temporary directory and clone Murano Dashboard Service from repository</para>
<para>
<emphasis>Ubuntu Linux 12.04 / 12.10</emphasis>
</para>
<programlisting>
<![CDATA[
user@work:~/$ git clone https://github.com/stackforge/murano-dashboard.git
mkdir -p /tmp/murano
cd /tmp/murano
apt-get install -y git
git clone https://github.com/stackforge/murano-dashboard
]]>
</programlisting>
<para>
<emphasis>CentOS 6.x</emphasis>
</para>
<programlisting>
<![CDATA[
mkdir -p /tmp/murano
cd /tmp/murano
yum install -y git
git clone https://github.com/stackforge/murano-dashboard
]]>
</programlisting>
</listitem>
<listitem>
<para>Switch to just created directory</para>
<para>Switch to just created directory and run installation script</para>
<para>
<emphasis>Ubuntu Linux 12.04 / 12.10</emphasis>
</para>
<programlisting>
<![CDATA[
user@work:~/$ cd murano-dashboard
cd /tmp/murano/murano-dashboard
sh setup.sh install
]]>
</programlisting>
</listitem>
<listitem>
<para>And perform installation</para>
<para>
<emphasis>CentOS 6.x</emphasis>
</para>
<programlisting>
<![CDATA[
user@work:~/murano-dashboard$ sudo python setup.py install
]]>
cd /tmp/murano/murano-dashboard
sh setup-centos.sh install
]]>
</programlisting>
</listitem>
</itemizedlist>
</section>
<section>
<title>Configure</title>
<itemizedlist>
<listitem>
<para>Open Django configuration file:</para>
<programlisting>
<![CDATA[
user@work:~/$ cd <Horizon Installation Dir> && nano settings.py
]]>
</programlisting>
<para>Please, make sure that no local/local_settings.py file exists.</para>
</listitem>
<listitem>
<para>Add to import section</para>
<programlisting>
<![CDATA[
from muranoclient.common import exceptions as muranoclient
]]>
</programlisting>
</listitem>
<listitem>
<para>And this so muranoclient exceptions can be safely handle by horizon:</para>
<programlisting>
<![CDATA[
RECOVERABLE_EXC = (muranoclient.HTTPException,
muranoclient.CommunicationError,
muranoclient.Forbidden)
EXTENDED_RECOVERABLE_EXCEPTIONS = tuple(
exceptions.RECOVERABLE + RECOVERABLE_EXC)
NOT_FOUND_EXC = (muranoclient.HTTPNotFound, muranoclient.EndpointNotFound)
EXTENDED_NOT_FOUND_EXCEPTIONS = tuple(exceptions.NOT_FOUND + NOT_FOUND_EXC)
UNAUTHORIZED_EXC = (muranoclient.HTTPUnauthorized, )
EXTENDED_UNAUTHORIZED_EXCEPTIONS = tuple(
exceptions.UNAUTHORIZED + UNAUTHORIZED_EXC)
]]>
</programlisting>
</listitem>
<listitem>
<para>And finally edit HORIZON_CONFIG and INSTALLED_APPS sections</para>
<programlisting>
<![CDATA[
HORIZON_CONFIG = {
...
'exceptions': {'recoverable': EXTENDED_RECOVERABLE_EXCEPTIONS,
'not_found': EXTENDED_NOT_FOUND_EXCEPTIONS,
'unauthorized': EXTENDED_UNAUTHORIZED_EXCEPTIONS},
'customization_module': 'muranodashboard.panel.overrides'.
...
}
...
INSTALLED_APPS = (
...
'muranodashboard',
'djblets',
'djblets.datagrid',
'djblets.util',
'floppyforms',
...
)
]]>
</programlisting>
</listitem>
</itemizedlist>
</section>
<section>
<title>Run</title>
<para>Run Horizon:</para>
<programlisting>
<![CDATA[
user@work:~/$ sudo service apache2 restart
]]>
</programlisting>
</section>
</section>
<section xml:id="ssl">
<title>SSL configuration</title>
@ -667,4 +667,4 @@ service murano-api start
</section>
</section>
</section>
</chapter>
</chapter>

View File

@ -1,143 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2013 Mirantis, Inc.
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.
-->
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xlink="http://www.w3.org/1999/xlink"
xsi:schemaLocation="http://docbook.org/ns/docbook http://www.docbook.org/xml/5.0/xsd/docbook.xsd
http://www.w3.org/1999/xlink http://www.w3.org/1999/xlink.xsd"
version="5.0">
<title>Roadmap</title>
<para>
<itemizedlist spacing="compact">
<title>
<emphasis>Phase 1. Initial Version</emphasis>
</title>
<para>(Release date: May 30th)</para>
<listitem>
<para>Core Services: REST API, Orchestration Engine</para>
</listitem>
<listitem>
<para>Horizon dashboard extension as plugin</para>
</listitem>
<listitem>
<para>Integration with Heat</para>
</listitem>
<listitem>
<para>Support single Data Center (no Disaster Recovery)</para>
</listitem>
<listitem>
<para>Support the following Windows Services:
<itemizedlist spacing="compact">
<listitem>
<para>Active Directory - Single Domain with multiple domain controllers</para>
</listitem>
<listitem>
<para>IIS Server - single instance of IIS Server</para>
</listitem>
<listitem>
<para>IIS Cluster - multiple IIS instances with Load Balancing</para>
</listitem>
<listitem>
<para>ASP.NET Application Service - ASP.NET application installed on top of IIS</para>
</listitem>
</itemizedlist>
</para>
</listitem>
</itemizedlist>
</para>
<para>
<itemizedlist spacing="compact">
<title>
<emphasis>Phase 2. Stable Release</emphasis>
</title>
<para>(3 month)</para>
<listitem>
<para>Stabilize Core Services (bug fixing)</para>
</listitem>
<listitem>
<para>Support API, UI extensibility</para>
</listitem>
<listitem>
<para>UI design</para>
</listitem>
<listitem>
<para>Workflow and recipes repository</para>
</listitem>
<listitem>
<para>Data transfer between service instances</para>
</listitem>
<listitem>
<para>Basic Service monitoring</para>
</listitem>
<listitem>
<para>Additional Services:
<itemizedlist spacing="compact">
<listitem>
<para>MS SQL - single instance of Microsoft SQL Server or Pair of SQL Servers with DB
mirroring
</para>
</listitem>
</itemizedlist>
</para>
</listitem>
</itemizedlist>
</para>
<para>
<itemizedlist spacing="compact">
<title>
<emphasis>Phase 3</emphasis>
</title>
<listitem>
<para>Add more services</para>
</listitem>
<listitem>
<para>Services Dependencies support</para>
</listitem>
<listitem>
<para>Extended health monitoring</para>
</listitem>
<listitem>
<para>Agent extensibility (allow 3rd party configuration tools)</para>
</listitem>
<listitem>
<para>Basic Self-healing (actions on monitoring events)</para>
</listitem>
<listitem>
<para>Additional Services</para>
</listitem>
</itemizedlist>
</para>
<para>
<itemizedlist spacing="compact">
<title>
<emphasis>Phase 4</emphasis>
</title>
<listitem>
<para>Availability Zones support</para>
</listitem>
<listitem>
<para>Auto-scaling for Windows services</para>
</listitem>
<listitem>
<para>Security improvements</para>
</listitem>
</itemizedlist>
</para>
</chapter>

View File

@ -0,0 +1,557 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2013 Mirantis, Inc.
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.
-->
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xlink="http://www.w3.org/1999/xlink"
xsi:schemaLocation="http://docbook.org/ns/docbook http://www.docbook.org/xml/5.0/xsd/docbook.xsd
http://www.w3.org/1999/xlink http://www.w3.org/1999/xlink.xsd"
version="5.0">
<title>Workflows XML DSL</title>
<section>
<title>XML DSL</title>
<para>
Workflows are written using XML markup language. This XML has no fixed structure but instead XML tags are translated into Python function calls. Thus such XML can be considered as a simplified programming language.
</para>
<para>
Consider the following XML fragment:
<programlisting><![CDATA[ <func arg1="value1" arg2="value2" /> ]]></programlisting>
This is an equivalent to <code>func(arg1='value1', arg2='value2')</code> in Python. Tag name is mapped to a function name, one that Murano Conductor knows. Each attribute corresponds to function argument.
</para>
<para>
XML functions may also have a body. It is evaluated to "body" argument. Thus
<programlisting><![CDATA[
<func arg1="value1" arg2="value2">some text</func>
]]></programlisting>is translated to <code>func(arg1='value1', arg2='value2', body='some text')</code>
</para>
<para>
In example above all function arguments were constant values. But they also can be evaluated:
<programlisting><![CDATA[
<foo arg="value">
<bar/>
</foo>
]]> </programlisting>turns to
<programlisting>
body_value = bar()
foo(arg='value', body=body_value)
</programlisting>
</para>
<para>
Tag body may consist of several function invocations. In such case all values would be concatenated.
For example if
<programlisting>
def foo(**kwargs):
return "foo"
def bar(**kwargs):
return "bar"
</programlisting>then <code><![CDATA[ <func><foo/> - <bar/></func> ]]></code> will result in <code>func(body = 'foo - bar')</code>
</para>
<para>
Function parameters can also be function calls using <![CDATA[<parameter>]]> tag
<programlisting><![CDATA[
<foo arg="value"/>
]]></programlisting>
can be rewritten as
<programlisting><![CDATA[
<foo>
<parameter name="arg">value</parameter>
</foo>
]]></programlisting>
while that later form is more verbose it allows having dynamically evaluated values as function arguments:
<programlisting><![CDATA[
<foo>
<parameter name="arg"><bar/></parameter>
</foo>
]]></programlisting>
</para>
<para>
Functions may also have other custom tags in their body that interpreted in a way different from plain function invocation.
</para>
</section>
<section>
<title>DSL functions</title>
<para>
There are a number of functions in Murano Conductor that can be used in XML DSL:
<itemizedlist>
<listitem>
<code><![CDATA[ <true/> ]]></code> - returns True
</listitem>
<listitem>
<code><![CDATA[ <false/> ]]></code> - False
</listitem>
<listitem>
<code><![CDATA[ <null/> ]]></code> - None
</listitem>
<listitem>
<code><![CDATA[ <text><foo/></text> ]]></code> - converts body to string <code>(str(foo()))</code>
</listitem>
<listitem>
list - form list (array) object -
<programlisting><![CDATA[<list>
<item>item1</item>
<item>item2</item>
<item><true/></item>
</list>
]]></programlisting> equals to <code>["item1", "item2", True]</code>
</listitem>
<listitem>
map - form dictionary (map) object
<programlisting><![CDATA[
<map>
<item name="key1">value1</item>
<item name="key2">value2</item>
</map>
]]></programlisting> equals to <code>{ "key1": "value1", "key2": "value2" }</code>
For both list and map functions names of item nodes ("item" in examples above) is irrelevant and can be changed to better match structure usage. For example
<programlisting><![CDATA[
<map>
<set name="key"><null/></set>
</map>
]]></programlisting>
</listitem>
</itemizedlist>
</para>
<para>
Structures can be nested:
<programlisting><![CDATA[
<list>
<item>
<map>
<item name="name 1">value 1</item>
<item name="name 2">value 2</item>
</map>
</item>
<item>
<map>
<item name="name 1">value 3</item>
<item name="name 2">value 4</item>
</map>
</item>
</list>
]]></programlisting> equals to
<programlisting>
[
{ 'name 1': 'value 1', 'name 2': 'value 2' },
{ 'name 1': 'value 3', 'name 2': 'value 4' }
]
</programlisting>
</para>
</section>
<section>
<title>Workflows</title>
<section>
<title>About workflows</title>
<para>
Workflows are XML DSL scripts that describe the steps that conductor need to perform in order to deploy specified environment. All workflow constructs are just ordinary DSL functions similar to those described above.
</para>
<para>
Usually workflows extract some data from input environment definition (Object Model) and then invoke one of the actions with these data as a input arguments.
</para>
<para>
Actions are:
<itemizedlist>
<listitem>
Heat commands that update or delete Heat Stack: <![CDATA[ <update-cf-stack>, <delete-cf-stack> ]]>
</listitem>
<listitem>
Send command to Murano Agent: <![CDATA[ <send-command> ]]>
</listitem>
<listitem>
Report state to API: <![CDATA[ <report> ]]>
</listitem>
</itemizedlist>
</para>
<para>
Workflow logic can be described in 6 steps:
<orderedlist>
<listitem>
Choose a node (set of nodes) to update. If none of the nodes can be updated we are done.
</listitem>
<listitem>
According to the current state of node (that is a part of input Object Model) choose appropriate command to execute (update Heat stack or issue PowerShell command)
</listitem>
<listitem>
Select appropriate information from Object Model and substitute it into chosen template
</listitem>
<listitem>
Execute command
</listitem>
<listitem>
Update Object Model according to command execution result
</listitem>
<listitem>
Go to step 1
</listitem>
</orderedlist>
</para>
</section>
<section>
<title>Accessing Object Model</title>
<para>Object Model is a definition of environment that Murano Conductor was asked to deploy.</para>
<para>Lets take the following Object Model that describes Active Directory service with single controller for our further examples:
<programlisting><![CDATA[
{
"name": "MyDataCenter",
"id": "adc6d143f9584d10808c7ef4d07e4802",
"services": [ {
"name": "TestAD",
"type": "activeDirectory",
"osImage": {"name": "ws-2012-std", "type": "ws-2012-std"},
"availabilityZone": "nova",
"flavor": "m1.medium",
"id": "9571747991184642B95F430A014616F9",
"domain": "acme.loc",
"adminPassword": "SuperP@ssw0rd",
"units": [ {
"id": "273c9183b6e74c9c9db7fdd532c5eb25",
"name": "dc01",
"isMaster": true,
"recoveryPassword": "SuperP@ssw0rd!2"
} ]
} ]
}
]]></programlisting>
</para>
<para>
There are several functions to select values from Object Model and function to modify it so that the Workflow can persist the changes made during deployment.
</para>
<para>
All reads and writes to Object Model are relative to some cursor position which is managed by workflow rule. Lets call it current cursor position.
</para>
<para>
The simplest method of accessing Object Model is a select function.
Suppose current cursor position points to a single unit of our single service. Then <code><![CDATA[ <select path="name"/> ]]></code> is "dc01" and <code><![CDATA[ <select path="isMaster"/> ]]></code> is True.
</para>
<para>
Path parameter may start with colon to indicate navigation to one level up or slash to go to Model root:
<programlisting><![CDATA[ <select path=":"/> ]]></programlisting>is<programlisting><![CDATA[
[
{
"id": "273c9183b6e74c9c9db7fdd532c5eb25",
"name": "dc01",
"isMaster": true,
"recoveryPassword": "SuperP@ssw0rd!2"
}
]
]]></programlisting>
<code><![CDATA[ <select path="::domain"> ]]></code> is "acme.loc" and <code><![CDATA[ <select path="/name" /> ]]></code> is "MyDataCenter"
</para>
<para>
The path also supports drill-down notation:
<code><![CDATA[ <select path="::osImage.name"> ]]></code> is "ws-2012-std"
<code><![CDATA[ <select path="::units.0.name"> ]]></code> equals to <code><![CDATA[ <select path="/services.0.units.0.name"> ]]></code> that is "dc01"
</para>
<para>
If the path does not exist then result of a select would be None:
<code><![CDATA[ <select path="::noSuchProperty"/> ]]></code> = None
</para>
<para>
<code><![CDATA[ <select/> ]]></code> without path results in object pointed by current cursor position.
</para>
<para>
It also possible to select multiple values using JSONPath selection language (<ulink url="http://goessner.net/articles/JsonPath/"/>):
<programlisting><![CDATA[ <select-all path="/$.services[?(@.type == 'activeDirectory')].units[*]"/> ]]></programlisting> - returns array of all units of all services of type 'activeDirectory'
</para>
<para>
JSONPath expressions by default select data relative to current cursor position and has no way for navigating up the Model tree. But Conductor has several improvements to JSONPath language:
<itemizedlist>
<listitem>
JSONPath expression may start with one or more colon characters to perform query relative to current cursor parent (grandparent etc.)
</listitem>
<listitem>
JSONPath expression may also start with slash as in example above to query the whole Model from the tree root
</listitem>
<listitem>
Expressions may reference nonexistent Model attributes in the same way as <code><![CDATA[ <select/> ]]></code>function does. Such attributes considered to have None values
</listitem>
</itemizedlist>
</para>
<para>
<code><![CDATA[ <select-single path="JSONPath expression"/> ]]></code> is similar to <code><![CDATA[ <select-all/> ]]></code>, but returns only the first value matched by a JSONPath query or None.
</para>
<para>
Object Model can also be modified using <code><![CDATA[ <set/> ]]></code>function. <code><![CDATA[ <set/> ]]></code>is very similar to <code><![CDATA[ <select/> ]]></code>with the only difference in that <code><![CDATA[ <select/> ]]></code> writes values while <code><![CDATA[ <select/> ]]></code>reads them:
<code><![CDATA[ <set path="name">dc02</set> ]]></code> changes unit name (eg. the object pointed by current cursor position) to "dc02".
<code><![CDATA[ <set> ]]></code> can also introduce new attributes, event nested ones:
<code><![CDATA[ <set path="newProperty">value</set> ]]></code> creates new attribute "newProperty" with given value,
<code><![CDATA[ <set path="state.property">value</set> ]]></code> makes current unit have property <code>"state": { "property": "value" }</code>
</para>
<para>
In this case "state" is just a convention - a reserved property that would never be used for service our units input properties. There is a also a special property called "temp". The contents of this property (on all services and units and environment itself) if wiped after each deployment.
</para>
</section>
<section>
<title>Function context</title>
<para>Function context is an equivalent to Python stack frame. This allows functions to have local variables that are visible only to the function XML body. </para>
<para>Function context may be considered as a key-value storage. If a key does not exist in current context then parent context is searched for the key.</para>
<para>
Data may be published to function context using ordinary <code><![CDATA[ <set/> ]]></code>function by using path in a form of "#key":
<code><![CDATA[ <set path="#myKey">value</set> ]]></code>sets "myKey" function context value to "value".
This value may be later accessed in inner block using select:
<code><![CDATA[ <select path="#myKey"/> ]]></code>
</para>
<para>
Values is function context may be not just scalars but a whole objects:
<code><![CDATA[ <set path="#myKey"><select/><set/> ]]></code>sets myKey local variable to an object pointed by current cursor position. Because this is a reference to a model part rather than its copy if ones edits its content the changes will be also present in original Model.
To edit content of local variable (eg. value in function context) "target" argument of <code><![CDATA[ <set/> ]]></code>function is used: <code><![CDATA[ <set path="property" target="myKey">value</set> ]]></code>. Because target always denotes a key in function context there is no need for # sign.
</para>
<para>
Function context values may also be the source for the <code><![CDATA[ <select/> ]]></code>and other selection functions:
<code><![CDATA[ <select path="property" source="myKey"/> ]]></code>
</para>
</section>
<section>
<title>Workflow rules</title>
<para>
Workflow consists of rules. Rule is a function with the following parameters:
<itemizedlist>
<listitem>
<emphasis role="bold">match</emphasis> - JSONPath expression to be executed relative to current cursor position
</listitem>
<listitem>
<emphasis role="bold">desc</emphasis> - optional human-readable free-form rule description
</listitem>
<listitem>
<emphasis role="bold">id</emphasis> - optional rule ID (auto-generated if not provided)
</listitem>
</itemizedlist>
for example
<programlisting><![CDATA[
<rule match="$.services[?(@.type == 'msSqlClusterServer' and @.domain)].units[*]" desc="Units of SQL Server Cluster services which are part of the domain">
<set path="domain">
<select path="::domain"/>
</set>
</rule>
]]></programlisting>
</para>
<para>
The logic of rule is simple:
<orderedlist>
<listitem>Execute given JSONPath expression</listitem>
<listitem>For each of matched objects make current cursor position point to it and then execute function XML body</listitem>
<listitem>If JSONPath hasn't matched any object execute <code><![CDATA[ <empty>...</empty> ]]></code> block if present</listitem>
</orderedlist>
</para>
<para>
Rules can be nested. In this case nested rule's JSONPath expression would be executed relative to parent's rule current cursor position. For outermost rules current cursor position is the Object Model itself.
</para>
<para>
Rules are grouped into workflows:
<programlisting><![CDATA[
<workflow>
<rule id="rule1" match="...">
</rule>
<rule id="rule2" match="...">
</rule>
</workflow>
]]></programlisting>
</para>
<para>
Workflow which is happen to be a XML DSL function and also a root element of workflow XML files. Workflow function executes rules one by one. If one of the rules has modified some part of Object Model then all rules executed once again. This repeats until there are no more actions that can be performed by workflow. At this point all pending actions (e.g. all the invocations of update-cf-stack, send-command etc.) got executed and the workflow loop is repeated.
When there no more actions that can be performed by workflow and also no pending commands then we are done and Object Model with all modifications made by workflows (except for "temp" attributes) returned back to Murano API service.
</para>
</section>
<section>
<title>Workflow actions</title>
<para>
There are several actions (functions) that can be invoked by rules to do the actual deployment. When action is invoked it is not executed immediately but enqueued and executed later when there are no more actions that can be performed by workflow.
</para>
<para>
The following actions are available for workflow rules:
<itemizedlist>
<listitem>
<emphasis role="bold">update-cf-stack</emphasis> - updates Heat stack by substituting values into Heat template and merging it into Heat stack definition. It has the following parameters:
<itemizedlist>
<listitem>
<emphasis role="bold">template</emphasis> - Heat template filename without extension
</listitem>
<listitem>
<emphasis role="bold">error</emphasis> - function context variable to be populated with command error info in case of command failure
</listitem>
<listitem>
<emphasis role="bold">mappings</emphasis> - dictionary to be used for values substitution into template. All values in JSON template file in the form of "$myKey" are replaced with a value under key "myKey" in this parameter
</listitem>
<listitem>
<emphasis role="bold">arguments</emphasis> - optional dictionary of Heat template arguments ("Parameters" section of Heat templates)
</listitem>
</itemizedlist>
<para>
update-cf-stack function also searches for 2 predefined tags in its body:
<itemizedlist>
<listitem>
<emphasis role="bold">&lt;success&gt;</emphasis> - a block to be executed after successfull stack update
</listitem>
<listitem>
<emphasis role="bold">&lt;failure&gt;</emphasis> - block that would be executed in case of function failure
</listitem>
</itemizedlist>
</para>
<para>Templates are located in data/cf directory</para>
</listitem>
<listitem>
<emphasis role="bold">send-command</emphasis> - sends an execution plan to Murano Agent on specific VM. It has the following parameters:
<itemizedlist>
<listitem>
<emphasis role="bold">template</emphasis> - execution plan template filename without extension
</listitem>
<listitem>
<emphasis role="bold">error</emphasis> - function context variable to be populated with command error info in case of command failure
</listitem>
<listitem>
<emphasis role="bold">service</emphasis> - ID of a service that target units belongs to
</listitem>
<listitem>
<emphasis role="bold">unit</emphasis> - ID of target unit (VM)
</listitem>
<listitem>
<emphasis role="bold">mappings</emphasis> - dictionary to be used for values substitution into template. All values in JSON template file in the form of "$myKey" are replaced with a value under key "myKey" in this parameter
</listitem>
</itemizedlist>
<para>
send-command function also searches for 2 predefined tags in its body:
<itemizedlist>
<listitem>
<emphasis role="bold">&lt;success&gt;</emphasis> - a block to be executed after successfull stack update
</listitem>
<listitem>
<emphasis role="bold">&lt;failure&gt;</emphasis> - block that would be executed in case of function failure
</listitem>
</itemizedlist>
</para>
<para>Templates are located in data/agent directory</para>
</listitem>
<listitem>
<emphasis role="bold">report</emphasis> - sends status report back to REST API service. It has the following parameters:
<itemizedlist>
<listitem>
<emphasis role="bold">entity</emphasis> - entity type ("unit", "service", "environment")
</listitem>
<listitem>
<emphasis role="bold">level</emphasis> - log level
</listitem>
<listitem>
<emphasis role="bold">id</emphasis> - ID of unit/service/environment
</listitem>
<listitem>
<emphasis role="bold">text</emphasis> - reported status text
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
</para>
</section>
<section>
<title>Workflow control</title>
<para>
There are several functions that affect workflow execution.
<code><![CDATA[ <stop/> ]]></code>stops execution of workflows causing Conductor returning current result back to REST API service and stop deployment activities.
</para>
<para>
<code><![CDATA[ <mute/> ]]></code>excludes current object from being processed by the current rule during next workflow rounds. Mutes table tracks items using pairs or rule id (that is rule function argument, auto-generated if not provided) and object ID ("id" attribute of current object. If object has no such attribute it cannot be muted). It is possible to explicitly specify rule id via "rule" argument and object id via "id" argument. Missing parameters are auto-guest from current context - current cule ID and current object ID.
</para>
<para>
Note that objects are automatically muted for every object that matched by the rule but the mutes get reseted after each workflow loop round. <code><![CDATA[ <mute/> ]]></code> places a permanent mute on the object
</para>
<para>
Mutes can be removed by <code><![CDATA[ <unmute/> ]]></code> function which has exactly the same arguments as <code><![CDATA[ <mute/> ]]></code> command but is only usable with explicit specification of rule and id because otherwise if the current object is already muted the rule body would not be executed for the object and thus <code><![CDATA[ <unmute/> ]]></code> would not be executed either.
</para>
<para>
When referencing id of a nested rule IDs of all rule chain must be joined by dot. E.g.
<programlisting><![CDATA[
<rule id="id1">
<rule id="id2">
<mute rule="id1.id2"/>
</rule>
</rule>
]]></programlisting>
</para>
</section>
<section>
<title>Execution Plans</title>
<para>
Execution plans are a description of what should be executed on Murano Agent at VM to perform some deployment step.
</para>
<para>
Execution plans is a JSON document that has 3 keys:
<itemizedlist>
<listitem>
<emphasis role="bold">Commands</emphasis> array - list of functions to be executed. Each function has a "Name" property and "Arguments" dictionary which maps function argument names to parameter values.
</listitem>
<listitem>
<emphasis role="bold">Scripts</emphasis> - list of PowerShell script file names to be included into execution plans. The scripts contain function implementations that can be referenced in Command array.Script files need to be located in data/templates/agent/scripts directory.
</listitem>
<listitem>
<emphasis role="bold">RebootOnCompletion</emphasis> - 0 = do not reboot, 1 = reboot only upon successful plan execution, 2 = reboot always. Murano Agent send execution result after system reboot.
</listitem>
</itemizedlist>
</para>
<para>
As for other Murano JSON templates keys and values starting with $ sign will be replaced with a values provided in Workflow.
</para>
<para>
Example of execution plan:
<programlisting><![CDATA[
{
"Scripts":
[
"ImportCoreFunctions.ps1",
"DeployWebApp.ps1"
],
"Commands":
[
{
"Name": "Deploy-WebAppFromGit",
"Arguments":
{
"URL": "$repository"
}
}
],
"RebootOnCompletion": 0
}
]]></programlisting>
</para>
<para>
Result of execution plan has the following format:
<programlisting><![CDATA[
{
"IsException": false,
"Result":
[
{
"IsException": false,
"Result": [ "result value" ]
}
]
}
]]></programlisting>
</para>
<para>
There are result entry for each source command. Each result can have many values - all the outputs of PowerShell function. If IsException is set to true then Result is an array in form of <code>["Exception type", "Error message"]</code>. IsException at command level means exception during function invocation while root IsException means that execution plan cannot be even started (corrupted data, PowerShell engine failure etc.)
</para>
</section>
</section>
</chapter>

View File

@ -22,7 +22,7 @@
xsi:schemaLocation="http://docbook.org/ns/docbook http://www.docbook.org/xml/5.0/xsd/docbook.xsd
http://www.w3.org/1999/xlink http://www.w3.org/1999/xlink.xsd"
version="5.0">
<title>Murano Project Documentation</title>
<title>Murano User Guide</title>
<info>
<author>
<personname>
@ -62,10 +62,10 @@
</cover>
</info>
<xi:include href="./content/overview.xml" xlink:title="Overview" />
<xi:include href="./content/blueprint.xml" xlink:title="Blueprint" />
<xi:include href="./content/roadmap.xml" xlink:title="Roadmap" />
<xi:include href="./content/specification.xml" xlink:title="API Specification" />
<xi:include href="./content/installation-guide.xml" xlink:title="Installation Guide" />
<xi:include href="./content/blueprint.xml" xlink:title="Blueprint" />
<xi:include href="./content/specification.xml" xlink:title="API Specification" />
<xi:include href="./content/workflows.xml" xlink:title="Workflows XML DSL" />
<xi:include href="./content/screenshots.xml" xlink:title="Screenshots" />
<xi:include href="./content/knownissues.xml" xlink:title="Known Issues" />
<chapter>
@ -83,7 +83,7 @@
</para>
<para>If you want to contribute either to docs or to code, simply send us change request via
<link xlink:href="http://review.openstack.org">review.openstack.org</link>
(gerrit). You can file bugs and register blueprints at Murano<link
(gerrit). You can file bugs and register blueprints at Murano <link
xlink:href="https://launchpad.net/murano">launchpad page</link>.
</para>
</chapter>