New layout (rev. 2)
by Jan Provazník
Sending updated version of layout patch, this revision enables layout only for
pools/instances/deployments.
12 years, 11 months
[PATCH conductor 1/2] Added new layout
by Jan Provazník
From: Jan Provaznik <jprovazn(a)redhat.com>
- fixed path to images in css
- styles/ moved to stylesheets/
- old images/* moved to images/obsolete/
---
src/app/controllers/application_controller.rb | 4 +-
src/app/stylesheets/layout.scss | 245 ++++++++++++++
src/app/views/layouts/application.haml | 94 +++---
src/app/views/layouts/old.haml | 52 +++
src/public/images/body-bg.png | Bin 0 -> 42057 bytes
src/public/images/button-icons.png | Bin 0 -> 3948 bytes
src/public/images/button-search-down.png | Bin 0 -> 673 bytes
src/public/images/button-search-over.png | Bin 0 -> 430 bytes
src/public/images/button-search.png | Bin 0 -> 424 bytes
src/public/images/button-userdrop.png | Bin 0 -> 697 bytes
src/public/images/footer-rhlogo.png | Bin 0 -> 2833 bytes
src/public/images/masthead-bg.png | Bin 0 -> 1843 bytes
src/public/images/masthead-nav-separator.gif | Bin 0 -> 51 bytes
src/public/images/tab-active-left.png | Bin 0 -> 731 bytes
src/public/images/tab-active-right.png | Bin 0 -> 1033 bytes
src/public/images/tab-inactive-left.png | Bin 0 -> 486 bytes
src/public/images/tab-inactive-right.png | Bin 0 -> 640 bytes
src/public/images/upstream-logo.png | Bin 0 -> 3972 bytes
src/public/stylesheets/960.css | 440 +++++++++++++++++++++++++
src/public/stylesheets/buttons.css | 394 ++++++++++++++++++++++
src/public/stylesheets/layout.css | 270 +++++++++++++++
src/public/stylesheets/reset.css | 171 ++++++++++
22 files changed, 1621 insertions(+), 49 deletions(-)
create mode 100644 src/app/stylesheets/layout.scss
create mode 100644 src/app/views/layouts/old.haml
create mode 100644 src/public/images/body-bg.png
create mode 100644 src/public/images/button-icons.png
create mode 100644 src/public/images/button-search-down.png
create mode 100644 src/public/images/button-search-over.png
create mode 100644 src/public/images/button-search.png
create mode 100644 src/public/images/button-userdrop.png
create mode 100644 src/public/images/footer-rhlogo.png
create mode 100644 src/public/images/masthead-bg.png
create mode 100644 src/public/images/masthead-nav-separator.gif
create mode 100644 src/public/images/tab-active-left.png
create mode 100644 src/public/images/tab-active-right.png
create mode 100644 src/public/images/tab-inactive-left.png
create mode 100644 src/public/images/tab-inactive-right.png
create mode 100644 src/public/images/upstream-logo.png
create mode 100755 src/public/stylesheets/960.css
create mode 100644 src/public/stylesheets/buttons.css
create mode 100644 src/public/stylesheets/layout.css
create mode 100644 src/public/stylesheets/layout_ie.css
create mode 100755 src/public/stylesheets/reset.css
diff --git a/src/app/controllers/application_controller.rb b/src/app/controllers/application_controller.rb
index 746811b..9ea7d85 100644
--- a/src/app/controllers/application_controller.rb
+++ b/src/app/controllers/application_controller.rb
@@ -27,7 +27,9 @@ class ApplicationController < ActionController::Base
filter_parameter_logging :password, :password_confirmation
helper_method :current_user_session, :current_user
- layout 'application'
+ def layout
+ %w(PoolsController DeploymentsController InstancesController).include?(controller_name) ? 'application' : 'old'
+ end
# General error handlers, must be in order from least specific
# to most specific
diff --git a/src/app/stylesheets/layout.scss b/src/app/stylesheets/layout.scss
new file mode 100644
index 0000000..05c5dc0
--- /dev/null
+++ b/src/app/stylesheets/layout.scss
@@ -0,0 +1,245 @@
+$width: 960px;
+$font-family-base: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+$font-family-em: "Lucida Sans", "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+$font-family-nav-primary: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
+$font-family-primary: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
+
+/* body */
+
+html, body{ height: 100%; }
+
+body{
+ background: url('../../images/body-bg.png');
+ font-family: $font-family-base;
+ font-size: 0.750em; /* 12px base */
+ color: #333;
+}
+
+strong, em, b, i{ font-family: $font-family-em; }
+
+#primary-container{
+ position: relative;
+ min-height: 100%;
+ margin-bottom: -60px;
+}
+
+/* typography */
+
+.label{
+ font-family: $font-family-base;
+}
+
+.label.strong{
+ font-weight: bold;
+ color: #333;
+}
+
+.label.small-caps{
+ text-transform: uppercase;
+ font-size: 0.917em;
+}
+
+/* Query Inputs */
+
+div.query-input{
+ display: inline-block;
+ background-image: -moz-linear-gradient(top, rgba(209,209,209,1), rgba(230,230,230, 0));
+ background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(209,209,209,1)), to(rgba(230,230,230, 0)));
+ -webkit-border-radius: 16px; -moz-border-radius: 16px; border-radius: 16px;
+ padding: 3px;
+}
+
+div.query-input input[type="text"]{
+ display: inline;
+ -webkit-border-radius: 16px; -moz-border-radius: 16px; border-radius: 16px;
+ border: 1px solid #ccc;
+ height: 23px;
+ width: 180px;
+ outline: none;
+ padding: 0px 26px 0px 10px;
+ margin:0px;
+ font-size: 12px;
+}
+
+div.query-input input[type="submit"]{
+ display:inline;
+ background: transparent url('../../images/button-search.png') no-repeat left center;
+ color: transparent;
+ border: 0px;
+ width: 25px; height: 25px;
+ margin-left: -25px;
+ outline: none;
+ cursor: pointer;
+ &:hover{ background: transparent url('../../images/button-search-over.png') no-repeat left center; }
+ &:active{ background: transparent url('../../images/button-search-down.png') no-repeat left center; }
+}
+
+/* Content */
+
+header#masthead{
+ height: 49px;
+ background-color: #E7E7E7;
+ background: url('../../images/masthead-bg.png') repeat-x;
+ position: relative;
+ margin-bottom: 22px;
+
+ img#logo{
+ position: absolute;
+ top: 8px;
+ }
+
+ div.container{
+ margin: 0 auto;
+ width: $width;
+ overflow: hidden;
+ position: relative;
+ }
+
+ a.user-dropdown{
+ border: 1px solid #ccc;
+ background: url('../../images/button-userdrop.png') no-repeat center center;
+ background: url('../../images/button-userdrop.png') no-repeat center center, -moz-linear-gradient(top, rgba(239,239,239,0), rgba(204,204,204,0));
+ background: url('../../images/button-userdrop.png') no-repeat center center, -webkit-gradient(linear,left top,left bottom,color-stop(0, rgb(239,239,239)),color-stop(1, rgb(204,204,204)));
+ width: 46px;
+ margin-left: 4px;
+ padding: 5px 2px 5px 2px;
+ color: transparent;
+ font-size: 12px; /* match the font-size of the query box, for proper valign */
+
+ &:active{
+ background: url('../../images/button-userdrop.png') no-repeat center center;
+ background: url('../../images/button-userdrop.png') no-repeat center center, -moz-linear-gradient(top, rgba(232,232,232,0), rgba(210,210,210,0));
+ background: url('../../images/button-userdrop.png') no-repeat center center, -webkit-gradient(linear,left top,left bottom,color-stop(0, rgb(232,232,232)),color-stop(1, rgb(210,210,210)));
+ }
+
+ }
+
+ nav#system{
+ float:right;
+ margin-top: 6px;
+ ul{
+ list-style: none;
+ li{ display: inline; }
+ li + li{ margin-left: 10px; }
+ li.separator{
+ background: url('../../images/masthead-nav-separator.gif') no-repeat left top;
+ padding: 8px 1px 8px 1px;
+ }
+ }
+ }
+
+}
+
+/* Primary Nav */
+
+nav#primary {
+ ul.container{
+ width: $width - 10;
+ margin: 0 auto;
+ list-style: none;
+ padding-left: 24px;
+ height: 34px;
+ li{
+ float: left;
+ position: relative;
+ display: inline-block;
+ background: url('../../images/tab-inactive-right.png') no-repeat right top;
+ height: 34px;
+ margin-right: 6px;
+ z-index: 1;
+ a{
+ display: block;
+ background:url('../../images/tab-inactive-left.png') no-repeat left top;
+ padding: 10px 16px 14px 16px;
+ margin-left: -11px;
+ font-family: $font-family-nav-primary;
+ font-size: 12px;
+ letter-spacing: 1px;
+ font-weight: normal;
+ text-transform: uppercase;
+ text-decoration: none;
+ font-weight: bold;
+ color: #fff;
+ }
+ }
+ li.active{
+ margin-top: -5px;
+ background: url('../../images/tab-active-right.png') no-repeat right top;
+ z-index: 1000;
+ height: 43px;
+ a{
+ background:url('../../images/tab-active-left.png') no-repeat left top;
+ padding: 12px 20px 12px 20px;
+ font-size: 16px;
+ color: #666;
+ }
+ }
+ li + li{
+ margin-right: 6px;
+ }
+ }
+}
+
+/* Content */
+
+$contentpadding: 7px;
+
+div#content{
+ width: $width - (2 * $contentpadding);
+ margin: 0 auto;
+ margin-bottom: 98px;
+ height: 200px;
+ -webkit-border-radius: 7px; -moz-border-radius: 7px; border-radius: 7px;
+ background-color: #FAFAFA;
+ padding: $contentpadding;
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.50);
+ -moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.50);
+ -webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.50);
+ border: 1px solid #999;
+
+ div.header{
+ background-color: #ccc;
+ height: 60px;
+ }
+
+}
+
+/* Footer */
+
+footer.standard{
+
+ background: rgba(0, 0, 0, 0.12);
+ position: relative;
+ height: 40px;
+ width: 100%;
+ clear:both;
+
+ div.container{
+ margin: 0 auto;
+ width: 946px;
+ background: rgba(0, 0, 0, 0.12);
+ height: 36px;
+ position: relative;
+ padding: 26px 8px 0px 8px;
+ top: -20px;
+ }
+
+ img.logo{
+ float: right;
+ }
+
+ span.copyright{
+ font-size: 10px;
+ display: inline-block;
+ color: #666;
+ }
+
+ nav.footer{
+ display: inline-block;
+ a{
+ color: #fff;
+ padding-right: 6px;
+ }
+ }
+
+}
diff --git a/src/app/views/layouts/application.haml b/src/app/views/layouts/application.haml
index 763e3e1..99fa36e 100644
--- a/src/app/views/layouts/application.haml
+++ b/src/app/views/layouts/application.haml
@@ -1,52 +1,50 @@
-!!!
-%html
+!!! 5
+%html{"xml:lang" => "en", :lang => "en"}
%head
- %meta(http-equiv="Content-Type" content="text/html; charset=UTF-8")
- %title
- Red Hat Cloud Engine
- = yield :title
- = stylesheet_link_tag 'facebox'
- = stylesheet_link_tag 'jquery.ui-1.8.1/jquery-ui-1.8.1.custom.css'
- = stylesheet_link_tag 'jquery.loadmask'
- = stylesheet_link_tag 'compiled/application'
-
- / [if lt IE 9]
- = javascript_include_tag "http://html5shiv.googlecode.com/svn/trunk/html5.js"
- = javascript_include_tag "jquery-1.4.2.min.js"
- = javascript_include_tag "application.js"
- = javascript_include_tag "jquery.ui-1.8.1/jquery-ui-1.8.1.custom.min.js"
- = javascript_include_tag "jquery.loadmask.min"
- = javascript_include_tag "modernizr-1.5"
- /= javascript_include_tag "jquery.html5form"
- = yield :scripts
+ %meta{:charset => 'utf-8'}/
+ %title Layout Example
+ %link{:rel => 'stylesheet', :type => 'text/css', :href => '/styles/reset.css'}
+ %link{:rel => 'stylesheet', :type => 'text/css', :href => '/styles/960.css'}
+ %link{:rel => 'stylesheet', :type => 'text/css', :href => '/styles/buttons.css'}
+ %link{:rel => 'stylesheet', :type => 'text/css', :href => '/layout.css'}/
+ /[if lt IE 9]
+ %script{:src => 'http://html5shiv.googlecode.com/svn/trunk/html5.js'}
+ %link{:rel => 'stylesheet', :type => 'text/css', :href => '/layout_ie.css'}/
%body
- %div#head
- %header.container_16
- = render :partial => '/layouts/header'
- - if @current_user.nil?
- #content.container_16
- = render :partial => '/layouts/notification'
- #formwindow
- = yield
- - else
- #subheader
- %nav.container_16
- = render_navigation({:expand_all => true, :level => 1})
- = render_navigation({:expand_all => true, :level => 2})
+ #primary-container
+
+ %header#masthead
+ .container
+ %img#logo{:src => '/images/upstream-logo.png'}
+ %nav#system
+ %ul
+ %li.account
+ %span.name.label.strong.small-caps Andy Smith
+ %a.button.pill.user-dropdown{:href => '#'}
+ %li.separator
+ %li
+ %div.query-input
+ -# Using verbatim HTML because CSS inline-block requires it.
+ != "<input type='text' placeholder='Search...' /><input type='submit' value='search' />"
+
+ %nav#primary
+ %ul.container
+ %li
+ %a{:href => '#'} Design & Deploy
+ %li.active
+ %a{:href => '#'} Monitor
+ %li
+ %a{:href => '#'} Administer
+
#content
- #saved-searches
- Saved searches
- - details = !(yield :details).blank?
- #list-view{ :class => details ? 'part' : 'full'}
- - form_tag({:action => 'index'}, :method => :get) do
- = text_field_tag :q, @search_term
- = submit_tag "Search"
- = render :partial => '/layouts/notification'
- = (yield :list or yield)
- #details-view.ui-tabs.ui-widget.ui-widget-content.ui-corner-all{ :class => ('hidden' unless details)}
- - if details
- = yield :details
- %footer
- = render :partial => "layouts/footer"
- #grid
+ -# works with any 960 container (.container_16 or .container_24)
+ Yield view here.
+ %footer.standard
+ .container
+ %img.logo{:src => '/images/footer-rhlogo.png'}
+ %nav.footer
+ %a{:href => '#'} Disclaimer
+ %a{:href => '#'} Terms of Use
+ %a{:href => '#'} Support
+ %span.copyright Copyright © 2011 Red Hat, Inc. All Rights Reserved.
diff --git a/src/app/views/layouts/old.haml b/src/app/views/layouts/old.haml
new file mode 100644
index 0000000..763e3e1
--- /dev/null
+++ b/src/app/views/layouts/old.haml
@@ -0,0 +1,52 @@
+!!!
+%html
+ %head
+ %meta(http-equiv="Content-Type" content="text/html; charset=UTF-8")
+ %title
+ Red Hat Cloud Engine
+ = yield :title
+ = stylesheet_link_tag 'facebox'
+ = stylesheet_link_tag 'jquery.ui-1.8.1/jquery-ui-1.8.1.custom.css'
+ = stylesheet_link_tag 'jquery.loadmask'
+ = stylesheet_link_tag 'compiled/application'
+
+ / [if lt IE 9]
+ = javascript_include_tag "http://html5shiv.googlecode.com/svn/trunk/html5.js"
+ = javascript_include_tag "jquery-1.4.2.min.js"
+ = javascript_include_tag "application.js"
+ = javascript_include_tag "jquery.ui-1.8.1/jquery-ui-1.8.1.custom.min.js"
+ = javascript_include_tag "jquery.loadmask.min"
+ = javascript_include_tag "modernizr-1.5"
+ /= javascript_include_tag "jquery.html5form"
+ = yield :scripts
+ %body
+ %div#head
+ %header.container_16
+ = render :partial => '/layouts/header'
+ - if @current_user.nil?
+ #content.container_16
+ = render :partial => '/layouts/notification'
+ #formwindow
+ = yield
+ - else
+ #subheader
+ %nav.container_16
+ = render_navigation({:expand_all => true, :level => 1})
+ = render_navigation({:expand_all => true, :level => 2})
+ #content
+ #saved-searches
+ Saved searches
+ - details = !(yield :details).blank?
+ #list-view{ :class => details ? 'part' : 'full'}
+ - form_tag({:action => 'index'}, :method => :get) do
+ = text_field_tag :q, @search_term
+ = submit_tag "Search"
+ = render :partial => '/layouts/notification'
+ = (yield :list or yield)
+ #details-view.ui-tabs.ui-widget.ui-widget-content.ui-corner-all{ :class => ('hidden' unless details)}
+ - if details
+ = yield :details
+ %footer
+ = render :partial => "layouts/footer"
+ #grid
+
diff --git a/src/public/images/body-bg.png b/src/public/images/body-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..139e81a155a9cce40fb30e86eb7fe3ec8cb7e108
GIT binary patch
literal 42057
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
literal 0
HcmV?d00001
diff --git a/src/public/images/button-icons.png b/src/public/images/button-icons.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c76039d948d1e884436b7c5f297cc3cafe99854
GIT binary patch
literal 3948
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
GLSTX(2v3Xv
literal 0
HcmV?d00001
diff --git a/src/public/images/button-search-down.png b/src/public/images/button-search-down.png
new file mode 100644
index 0000000000000000000000000000000000000000..32b8b45b810a702726ea56c4759c923609eaada0
GIT binary patch
literal 673
zcmV;S0$%-zP)<h;3K|Lk000e1NJLTq000jF000jN1^@s6JJyv-00004b3#c}2nYxW
zd<bNS00009a7bBm000XT000XT0n*)m`~Uy|9CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?o
zcW-iQb09-gHF34$HUIzs6?8>dbVG7wVRUJ4ZXi@?ZDjy8FEKGMF)^T*Lhk?o0s2Wq
zK~yM_jgmi$8bKI`f4hSc*VP>v@ehjGlRa5n6u}}X{Rnn)RlG(>cOT)}bf!D3Olh};
zMM}#nTv0&~1VIIfqOvO@Ib|_L^iY$7d#YjPeP({|%Wya%ilQ8iMjr)1$a5Sg0l?vK
zu(sQ+J{%4ocDtR4D>wk~`~5jZQS?Y8B2h{~2mt`twhhxXF&>Yt!C;UxO|yM2^P(uq
z$z)R3G)-cRjR+z4l}d#J;3I_GGsdiRIxT6M)^IwV^js#Ys+Lo!)F(p7sM&00>h=0F
z02qex+c1o_q9{LIF4rAnOtLKNWwly0USC!eB~J)}Wm%7{R_mX>YPDK>x7(EoA-KK0
zEndX-`Fzr`sCq4)Xf~S-00;yEA1~z7aIX6~XT4sZYA*J902Tm*!{Pi}GNm+kTy`$x
z{eG_lKq8SSQ%W=c5i_w^>;V9l%VqWaj7+D~hN`Mxy<V@x^ZcE|;rKuZfglKSC=@Ej
z<MAh1mL;C&F_}zeqtQq|$s7O_3Wba$Ne$b!rP*wT&1M4t5JeHeVDR<RESF34dc7b0
ze!mC+1OR%y-Y-h&6JzYf<MG@u#wcS99*?KP^ZYjeGXNPu5Fm<T=5RRNEEWr$duvG7
zluD&4fG?*6-EQ~$yXET(=JWaA*zd(K3_Y98`T%@(yWO2XzmBV7&ZQv(00000NkvXX
Hu0mjf>irj|
literal 0
HcmV?d00001
diff --git a/src/public/images/button-search-over.png b/src/public/images/button-search-over.png
new file mode 100644
index 0000000000000000000000000000000000000000..846b7e7d7b69d3db1b7c83b57a482e6960b72a08
GIT binary patch
literal 430
zcmeAS@N?(olHy`uVBq!ia0vp^{2<K11|+SoP4xm&EX7WqAsj$Z!;#Vf<Z~8yL>4nJ
za0`Jj<E6WGe}IBAC9V-A!TD(=<%vb942~)JNvR5MnMJAP`9;~q3eLf%g<Bt+0o93u
z)HxTWCYEI8=P86_=B6^3>KhsY(Sqqt?->{v**#qxLo_B%owTvAIe@3l-lOUf=Oe)#
zi#<<r+&fUF9F@+T&K$IeEB^q8&Vjj-2c>TaPdF6x=M&%kiTf*^s^-sYnUWwh(X@cY
z%pvWa^aV!t(7jAPm!EKSHZF}lHRC$3M(9_WLo4^bc))sNbr#c_hP{oF7rIYG&oJB?
zBzq=wD{H{j)i+ZoJP<f6y}AEhxJIZg^VZsTNfw*E-%hS$tg^nJEYYxIzN**G@67$5
zo`>ABJXVlirmIxxGxL0Xi1e{I-3Q$lyFJb>K7Q$u-GBR&wVp-H^K?B|1Yb6>*1vsx
zBip_m=Wm-b%|D>|A$RqvtorykCBe+b+y}qnc+RU<{N%UcaSj(b%JqZcnEd^@p)0n_
S9{L0fGX_srKbLh*2~7aCyQq!;
literal 0
HcmV?d00001
diff --git a/src/public/images/button-search.png b/src/public/images/button-search.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b18f793529a7e084aba9b2d73eec7f159649b7e
GIT binary patch
literal 424
zcmeAS@N?(olHy`uVBq!ia0vp^{2<K11|+SoP4xm&EX7WqAsj$Z!;#Vf<Z~8yL>4nJ
za0`Jj<E6WGe}IBAC9V-A!TD(=<%vb942~)JNvR5MnMJAP`9;~q3eLf%g<Bt+0o93u
z)HxTWCYEI8=P86_=B6^3>KhsY(Sqqt?->{v89iMbLo_D#PC8h6$bhG9|C6ut%9@Ov
z+&*yRIP7o<-^F-WL1yaYn+<|SOp=Yf2~A%bLSoD-_5UB;^u~Xhj_8b#Qf8S(-GG_D
z8DkonJMJ(p%PeX+bRc26*0Zk+O&u}8JGO|+?qRGJ)NJ5S$WLJ9S@mn4n~rWMd$wRF
zgHn;XwF)Dj<sQ@DFG`mRP1L?{bKA*>r}U1tRxz?g+ZRhT?3rh(Re6nh{g>w=IkLq+
zlFF8^D)pOr-d<~2dVbl1X2TU($5$Uqcz*A{{lQv~Eaqu#Dpz;r-adBuTUky+{=C0s
zy$8e#{AzaZd;j?T>Fgz|1aGLWyPQ>_=diQp>wcFdjDFi>>lrSb56Ruvp0pYmS`419
KelF{r5}E+>&ZJ8K
literal 0
HcmV?d00001
diff --git a/src/public/images/button-userdrop.png b/src/public/images/button-userdrop.png
new file mode 100644
index 0000000000000000000000000000000000000000..9485f20fcd5e40bd1588937fa6d6f0cce76dd8c7
GIT binary patch
literal 697
zcmV;q0!ICbP)<h;3K|Lk000e1NJLTq001BW000mO1^@s6cL04^00004b3#c}2nYxW
zd<bNS00009a7bBm000XT000XT0n*)m`~Uy|9CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?o
zcW-iQb09-gHF34$HUIzs6?8>dbVG7wVRUJ4ZXi@?ZDjy8FEKGMF)^T*Lhk?o0uo6?
zK~zYIy_CO?(qJ6MAAU4xEYj4{1ClP_f#H^m4s1udR443!Ihcgq$v;8<0VfwGaDqfG
zDVv5{7+IXoMCw6IngE8H;DI5uZ|Z=M(-h=5;*-2XpSR!l`Q&|*$A$HJ0^kLJy8x~L
zyaDju=||hPHypEB-ZlQAqA0HvMR`QiG&P&eOjT76R8_qM@MY&T2f3Y0Ns>-wSw5yH
ziXw!7q9{t1<zq>bPWKtU79f#GoG=VSTb708Vi<-_BoZh425@`=mSuU%vK;;Y0^oML
zXY={o(cd?K;}Z}<E=<$J--{4(v2Os!8{jzZY&xA5D2k$&o@tshj^oa58X(JZIU0@T
zJs!^=J|P6%ZnxqHU|H7rXf*m72m~H1z2D#GHw9=mn}uSrh<H4{f*^#T)9F-7rBcD=
zFv9~l%;j>GSS+>z&@}CHwOY+%(F4ZyflWo^axEh2^?F$p#XJD$x?ag-G6ev*4j=+Z
z@;v`E7z{p4rBe4<mSvWk<MDXfYPBwh!{JB6Fd6{b0Q7AE0H9W@l>s1|%@$VsSXAxv
zP$={`5{VqeVzC3B=l$yrGz{a1rfJ`Lz22w6VDJIJTidp;))M?fF2CRZI+;v96Gic!
z&*!_d?ciiG`Kjyr_jbGeZaf~p+!-L9PLIOj@XiI(@Ar*HqY>D3-YW=#W9w}zK@e`$
fj^5jZ??b-;!KKgc0OJX`00000NkvXXu0mjfhYT>O
literal 0
HcmV?d00001
diff --git a/src/public/images/footer-rhlogo.png b/src/public/images/footer-rhlogo.png
new file mode 100644
index 0000000000000000000000000000000000000000..5747817e5a192dd9a90c794da61f33cb346762a0
GIT binary patch
literal 2833
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
literal 0
HcmV?d00001
diff --git a/src/public/images/masthead-bg.png b/src/public/images/masthead-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..011db733f441011653813f88c0719a7691a2c739
GIT binary patch
literal 1843
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
literal 0
HcmV?d00001
diff --git a/src/public/images/masthead-nav-separator.gif b/src/public/images/masthead-nav-separator.gif
new file mode 100644
index 0000000000000000000000000000000000000000..eaf313bbef86ac115d2bd968477d0b488cc20922
GIT binary patch
literal 51
zcmZ?wbhEHbWMWWZXkcJCbLPzd|Nj+#vM{hS{AbW%00NK<0}~fd&+?P6dFS_RWMHrc
E0F!JFNdN!<
literal 0
HcmV?d00001
diff --git a/src/public/images/tab-active-left.png b/src/public/images/tab-active-left.png
new file mode 100644
index 0000000000000000000000000000000000000000..983bba570d92238ec490d57624eba8ec960d7b06
GIT binary patch
literal 731
zcmV<10wn#3P)<h;3K|Lk000e1NJLTq000XB001ip1^@s6t^jfn00004b3#c}2nYxW
zd<bNS00009a7bBm000XT000XT0n*)m`~Uy|9CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?o
zcW-iQb09-gHF34$HUIzs6?8>dbVG7wVRUJ4ZXi@?ZDjy8FEKGMF)^T*Lhk?o0yIfP
zK~y-6jnv(a(m)gk@Y6HXZ`x_?6zD?e7IZ;AgaR5uASOaW7JUUCL|?{d@Lk++>5ax4
zHSXT5A+GC%fmqrpd#-<({Qom2Bf$eE48z7^v3M(;g7f+O^=h?x?>Np?E^f72?agNM
zq2KTSiK6HN^YD7TepjhfJ~x}q3*YyF=HV!cE_=P+En^G}!w_TFbqkhdS)B7nnx+9E
z1cWi-I35y0J}Qa=lu|%MG46J|D^1gG2q7Rz|L#GEgCKap7$bxb0059ANt~H6_Ly_N
z+hYI_W5Y1cJkL{3#uyHV9Ynm6Wf@N5(P(t3s%oN~5Lc_!spB|_azgBR-heS?{a;R4
z&@|1nAPAykoI1JPZr2g<({Z^>JRXmis;Yh?ga9Ju<1h?orfJ?GVxnATX3lxcIlnv3
zo5F~Qg+ieg1c6Oyx_cr<tyU`%LcU~`OX2x^{zg^R?|YbwqbOP$hVlFO<uWt7uKU#Y
z{rjwP39KjzwQW1}eP5!KrcO=72*WU-l>XFp-OehPz;PVUWLf^YKQ$NE>-CqquKyC{
zO=R|cKQ5I@s^}&X*s`p1&bcPadx+tAo-NDrZC<$po=he)O6d<-mQ!n)!p&y$m1&yS
z`?VAe0ss_?#ewU(dS1ChLEE;UaL!3yUH|~<x~^pyhQ=5xp29d744xsPaEBAP)9EZt
z)4a}mxkHR{x%_-Oopv3^If<q1c6-xkG^~>n0Hob+cmEIwkn{6r&0j8;M}k`|FGm0X
N002ovPDHLkV1gB_LGl0q
literal 0
HcmV?d00001
diff --git a/src/public/images/tab-active-right.png b/src/public/images/tab-active-right.png
new file mode 100644
index 0000000000000000000000000000000000000000..f01f5483d012cdfbd53ef5fa950e2e645b7a22fa
GIT binary patch
literal 1033
zcmV+k1or!hP)<h;3K|Lk000e1NJLTq006xJ001ip1^@s6E$E4E00004b3#c}2nYxW
zd<bNS00009a7bBm000XT000XT0n*)m`~Uy|9CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?o
zcW-iQb09-gHF34$HUIzs6?8>dbVG7wVRUJ4ZXi@?ZDjy8FEKGMF)^T*Lhk?o17b-;
zK~#90?cB|38&?zu@N++AJRkCS#xo<$Sc%o(YGP1r$E{UxTAM6FN}nU^yh8jA1wTWc
zz~Ds}1uxu{S6PT+FcpYm5`t{eItba*jjkCKO}hyWy8iz_8{IQ7i$B9TcRtwO-rnWh
z+?>l8V+1f`@;s;EaQIKR+kJCzaPa#4{QR%~J4Wv8>|FZ3KQDwJ<Q`^8p67IZeNFv-
zzu)O}zHT%czaJhRzC1oY{`J3(lg(zcZki@ZDevlB0Y012Xhd-w*OMfvpPilk!5I6c
z*X#Y<?RNhxJBAGggIr2Uob$UpSAfsr=H`Y*qY+(QT~WW^r=z2z-%d_W-tO=3zbZRM
z8isM()}XzCS(4{Dan4CfNw#fMp69f_zTO-R1{o2RhMqIVNc{k2iOOv;_;DQ9J<kh*
zAgGib#}Rgzb;aP1=hM#S=H|C$^=RZl8;miMQj%p^m#eF*yJd9<J!nC7ESz)leP1L=
z@}#U5`;?#+Aq0hCSY2FPtd-Ru^q>vZ-b7K9xvqOvR)_Wmw80o7Aq0)@J9V1P=EG@q
z2t8;;1>ZEyzqhuwo=vMk=s_E5m=!{h>$=w~D=ROi)uE>c?Fb<#iXuOXqQz<J2t8;=
zN=a#&Zp_cmUrt*`djncgJ-uNVB!uXtX&O$}AoQRW^*oN0lBARu?RNX=WDP<OS}ER{
zbsXnomSxW;YY=+Sk`RJwwOUZC)!LJ57-T^^s=bNh_|d|`!Y6lTais_CsA1N&ZO<@_
zkG5@_#dU-pv{QV(UP}34dwcu);yOYP+7d#L<2V<sR_mwY{|G&3r?`U?1c99-$#=zd
z46>l5!Z7>5_x-rIhATa2Ne#1}=hYp@skp9dsWpTiv{ZZ?fpgw#wOWtW8bS|R6GD(>
zSr=<-YtPhw2t8=2ILvyUCzqF(Z@-R!K^C;7hS_ShS`C8W_St$|=|OAbuOnoYN@dA3
zO@j!b2aR#gi^J?$mStZNA@ra*wToj}*2Tug#*ah@J!ov=MRC?>G!S~YAI5$CLKueM
z5MlQQG^ciO(lmYIdEPrBT<Jk`#XGZ7%J)l4OA$g3T2n8IkH32MzTIyBfY5{1RC^PK
zA?@z&HnS{y&W6Kb{-sY0;I5pWo}MH0aPOeKfqUm)gW!~f=6tL?00000NkvXXu0mjf
DEo0*Z
literal 0
HcmV?d00001
diff --git a/src/public/images/tab-inactive-left.png b/src/public/images/tab-inactive-left.png
new file mode 100644
index 0000000000000000000000000000000000000000..6fd48eebc9f306b027c210e18278d3c4f12969e5
GIT binary patch
literal 486
zcmeAS@N?(olHy`uVBq!ia0vp^+(4|v!3HEd`IT<~DVAa<&kznEsNqQI0P;BtJR*yM
z>V!a;@zUM8KR`j564!{5;QX|b^2DN42FH~Aq*MjB%%art{G#k)1?OPX!mW?Zfa*j+
z>YR&G6H7Al^Atidb5j{i^$iVyXu))+_Y4e-_MR?|Ar`&8SN3`xaS&mBQ2hSR>{$0s
z-wi?`Vq$_}e;QLiwr}0~rBbJcefMt%yN0PZx{_XVHR*JSNpYS$lagoo)8m|^k+Vn7
zOj(8<YzFKBo=kB}J9N7q-K^f9lD3FLhH;1X=^{m?$5nHc_4jFZJzB`gs37+ERQ3K0
z{jv=+Eg9y`yngGvlVM-y3%f5n1?<EpevhenF^BtR!oki}b>AQDFN$8ZYo738rVnCg
z1P=T@^JiA~d6y@~;^#w3RoiawHY_`*TfK26FJn$e$N5gfq-Vz^avlpS{W@{fIP|aA
z!?c68p|Z~&y$#v<Um|TAmqX`@H%A%N&it9u<ZB~7@!ZVrhbxQqs@ksvH^+wZ%J(ze
z6PcJ|$&g^Yy5q%Cey061{X17|kLlG9vacy-IdCz-;KkYK$Fk33-ZZ^=&^2?h`$|ju
YtzkN{b3dg4BZq;()78&qol`;+0IwLs)&Kwi
literal 0
HcmV?d00001
diff --git a/src/public/images/tab-inactive-right.png b/src/public/images/tab-inactive-right.png
new file mode 100644
index 0000000000000000000000000000000000000000..9098d281ce6b407174684f09959ba8569722d86f
GIT binary patch
literal 640
zcmeAS@N?(olHy`uVBq!ia0vp^dx2PqgAGV>J-@LGNU;<<d4_NRK@CSr2awNM;1OBO
zz`!j8!i<;h*8Kqr%9OZ9lmzFem6RtIr7}3C<R_&nxMdclmgg5`7b`din-*?;Yz9;(
z3R34>l$uzQnV+W+l9`*zV5)Cu2t*5}JH2OMV7%$+;uumf=k1-nUBZD9$3Fi5>1A+a
z!$sF_R@TJeoP`U-w7QxqnC~?mz0*+sK=#JmdwSb9d{0bNjPBr&I-`^*qmpdAn`d*T
zG4peq{qOcX7s>x<FlXk6V@D*mcPx3x|AF&IfXLDBvFxvQ9n+b9de{AZF5i-O->tiy
zV-~+^)h_lu+Fg&fR4-eX{f1$0=bP58-!iP`?wfTsP4$D}v5NBNJLmltx@rCXZ<2}B
zUxs_{Z-u{5^_+b2iA2TjZ2yJRRU)(d8>9`7y_~w2@t5FBpl;(0JA&jFh);~Ocz&)i
z{q8O&{gXxK827xnCR*hg#_^EB;^no!40}7iD7AcGh$w$ub;<ix-EoQa+qt>+s+^VB
z%rtLHHjt&;vVrX$lvTi6acA92*RV;?=FDc^e#^8qZql>8@eK91O=I&_Dv!-rZ+OgF
zJR2yQzV<KYo_#U=H@ZFa=M?|Xs6BXbZrmhux&G&&p|SrQmR|7wG^e<|VRyvqD&>>e
zY+i1LZtPrpQw~WKv)M4U#u+`_YtJ6n;G{n@gUw5>DK14-Sh1yflg{&oe-C{=ZH!ub
z?SL=PM)m9m0Sl++NF>)WeiyAe>1G`8DF(<lVOI73`qgdIMV={l!d|FKpLOv3DSvU2
WPm_m5-X~xxVDNPHb6Mw<&;$U)`WW*7
literal 0
HcmV?d00001
diff --git a/src/public/images/upstream-logo.png b/src/public/images/upstream-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..59490125832d7454effb2475c4ee9cc20793cb66
GIT binary patch
literal 3972
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
literal 0
HcmV?d00001
diff --git a/src/public/stylesheets/960.css b/src/public/stylesheets/960.css
new file mode 100755
index 0000000..1272675
--- /dev/null
+++ b/src/public/stylesheets/960.css
@@ -0,0 +1,440 @@
+/*
+ 960 Grid System ~ Core CSS.
+ Learn more ~ http://960.gs/
+
+ Licensed under GPL and MIT.
+*/
+
+/*
+ Forces backgrounds to span full width,
+ even if there is horizontal scrolling.
+ Increase this if your layout is wider.
+
+ Note: IE6 works fine without this fix.
+*/
+
+body {
+ min-width: 960px;
+}
+
+/* Containers
+----------------------------------------------------------------------------------------------------*/
+.container_16 {
+ margin-left: auto;
+ margin-right: auto;
+ width: 960px;
+}
+
+/* Grid >> Global
+----------------------------------------------------------------------------------------------------*/
+
+.grid_1,
+.grid_2,
+.grid_3,
+.grid_4,
+.grid_5,
+.grid_6,
+.grid_7,
+.grid_8,
+.grid_9,
+.grid_10,
+.grid_11,
+.grid_12,
+.grid_13,
+.grid_14,
+.grid_15,
+.grid_16 {
+ display: inline;
+ float: left;
+ position: relative;
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+.push_1, .pull_1,
+.push_2, .pull_2,
+.push_3, .pull_3,
+.push_4, .pull_4,
+.push_5, .pull_5,
+.push_6, .pull_6,
+.push_7, .pull_7,
+.push_8, .pull_8,
+.push_9, .pull_9,
+.push_10, .pull_10,
+.push_11, .pull_11,
+.push_12, .pull_12,
+.push_13, .pull_13,
+.push_14, .pull_14,
+.push_15, .pull_15,
+.push_16, .pull_16 {
+ position: relative;
+}
+
+/* Grid >> Children (Alpha ~ First, Omega ~ Last)
+----------------------------------------------------------------------------------------------------*/
+
+.alpha {
+ margin-left: 0;
+}
+
+.omega {
+ margin-right: 0;
+}
+
+/* Grid >> 16 Columns
+----------------------------------------------------------------------------------------------------*/
+
+.container_16 .grid_1 {
+ width: 40px;
+}
+
+.container_16 .grid_2 {
+ width: 100px;
+}
+
+.container_16 .grid_3 {
+ width: 160px;
+}
+
+.container_16 .grid_4 {
+ width: 220px;
+}
+
+.container_16 .grid_5 {
+ width: 280px;
+}
+
+.container_16 .grid_6 {
+ width: 340px;
+}
+
+.container_16 .grid_7 {
+ width: 400px;
+}
+
+.container_16 .grid_8 {
+ width: 460px;
+}
+
+.container_16 .grid_9 {
+ width: 520px;
+}
+
+.container_16 .grid_10 {
+ width: 580px;
+}
+
+.container_16 .grid_11 {
+ width: 640px;
+}
+
+.container_16 .grid_12 {
+ width: 700px;
+}
+
+.container_16 .grid_13 {
+ width: 760px;
+}
+
+.container_16 .grid_14 {
+ width: 820px;
+}
+
+.container_16 .grid_15 {
+ width: 880px;
+}
+
+.container_16 .grid_16 {
+ width: 940px;
+}
+
+/* Prefix Extra Space >> 16 Columns
+----------------------------------------------------------------------------------------------------*/
+
+.container_16 .prefix_1 {
+ padding-left: 60px;
+}
+
+.container_16 .prefix_2 {
+ padding-left: 120px;
+}
+
+.container_16 .prefix_3 {
+ padding-left: 180px;
+}
+
+.container_16 .prefix_4 {
+ padding-left: 240px;
+}
+
+.container_16 .prefix_5 {
+ padding-left: 300px;
+}
+
+.container_16 .prefix_6 {
+ padding-left: 360px;
+}
+
+.container_16 .prefix_7 {
+ padding-left: 420px;
+}
+
+.container_16 .prefix_8 {
+ padding-left: 480px;
+}
+
+.container_16 .prefix_9 {
+ padding-left: 540px;
+}
+
+.container_16 .prefix_10 {
+ padding-left: 600px;
+}
+
+.container_16 .prefix_11 {
+ padding-left: 660px;
+}
+
+.container_16 .prefix_12 {
+ padding-left: 720px;
+}
+
+.container_16 .prefix_13 {
+ padding-left: 780px;
+}
+
+.container_16 .prefix_14 {
+ padding-left: 840px;
+}
+
+.container_16 .prefix_15 {
+ padding-left: 900px;
+}
+
+/* Suffix Extra Space >> 16 Columns
+----------------------------------------------------------------------------------------------------*/
+
+.container_16 .suffix_1 {
+ padding-right: 60px;
+}
+
+.container_16 .suffix_2 {
+ padding-right: 120px;
+}
+
+.container_16 .suffix_3 {
+ padding-right: 180px;
+}
+
+.container_16 .suffix_4 {
+ padding-right: 240px;
+}
+
+.container_16 .suffix_5 {
+ padding-right: 300px;
+}
+
+.container_16 .suffix_6 {
+ padding-right: 360px;
+}
+
+.container_16 .suffix_7 {
+ padding-right: 420px;
+}
+
+.container_16 .suffix_8 {
+ padding-right: 480px;
+}
+
+.container_16 .suffix_9 {
+ padding-right: 540px;
+}
+
+.container_16 .suffix_10 {
+ padding-right: 600px;
+}
+
+.container_16 .suffix_11 {
+ padding-right: 660px;
+}
+
+.container_16 .suffix_12 {
+ padding-right: 720px;
+}
+
+.container_16 .suffix_13 {
+ padding-right: 780px;
+}
+
+.container_16 .suffix_14 {
+ padding-right: 840px;
+}
+
+.container_16 .suffix_15 {
+ padding-right: 900px;
+}
+
+/* Push Space >> 16 Columns
+----------------------------------------------------------------------------------------------------*/
+
+.container_16 .push_1 {
+ left: 60px;
+}
+
+.container_16 .push_2 {
+ left: 120px;
+}
+
+.container_16 .push_3 {
+ left: 180px;
+}
+
+.container_16 .push_4 {
+ left: 240px;
+}
+
+.container_16 .push_5 {
+ left: 300px;
+}
+
+.container_16 .push_6 {
+ left: 360px;
+}
+
+.container_16 .push_7 {
+ left: 420px;
+}
+
+.container_16 .push_8 {
+ left: 480px;
+}
+
+.container_16 .push_9 {
+ left: 540px;
+}
+
+.container_16 .push_10 {
+ left: 600px;
+}
+
+.container_16 .push_11 {
+ left: 660px;
+}
+
+.container_16 .push_12 {
+ left: 720px;
+}
+
+.container_16 .push_13 {
+ left: 780px;
+}
+
+.container_16 .push_14 {
+ left: 840px;
+}
+
+.container_16 .push_15 {
+ left: 900px;
+}
+
+/* Pull Space >> 16 Columns
+----------------------------------------------------------------------------------------------------*/
+
+.container_16 .pull_1 {
+ left: -60px;
+}
+
+.container_16 .pull_2 {
+ left: -120px;
+}
+
+.container_16 .pull_3 {
+ left: -180px;
+}
+
+.container_16 .pull_4 {
+ left: -240px;
+}
+
+.container_16 .pull_5 {
+ left: -300px;
+}
+
+.container_16 .pull_6 {
+ left: -360px;
+}
+
+.container_16 .pull_7 {
+ left: -420px;
+}
+
+.container_16 .pull_8 {
+ left: -480px;
+}
+
+.container_16 .pull_9 {
+ left: -540px;
+}
+
+.container_16 .pull_10 {
+ left: -600px;
+}
+
+.container_16 .pull_11 {
+ left: -660px;
+}
+
+.container_16 .pull_12 {
+ left: -720px;
+}
+
+.container_16 .pull_13 {
+ left: -780px;
+}
+
+.container_16 .pull_14 {
+ left: -840px;
+}
+
+.container_16 .pull_15 {
+ left: -900px;
+}
+
+/* `Clear Floated Elements
+----------------------------------------------------------------------------------------------------*/
+
+/* http://sonspring.com/journal/clearing-floats */
+
+.clear {
+ clear: both;
+ display: block;
+ overflow: hidden;
+ visibility: hidden;
+ width: 0;
+ height: 0;
+}
+
+/* http://www.yuiblog.com/blog/2010/09/27/clearfix-reloaded-overflowhidden-d... */
+
+.clearfix:before,
+.clearfix:after {
+ content: '\0020';
+ display: block;
+ overflow: hidden;
+ visibility: hidden;
+ width: 0;
+ height: 0;
+}
+
+.clearfix:after {
+ clear: both;
+}
+
+/*
+ The following zoom: 1 rule is specifically for IE6 + IE7.
+ Move to separate stylesheet if invalid CSS is a problem.
+*/
+
+.clearfix {
+ zoom: 1;
+}
\ No newline at end of file
diff --git a/src/public/stylesheets/buttons.css b/src/public/stylesheets/buttons.css
new file mode 100644
index 0000000..10876b1
--- /dev/null
+++ b/src/public/stylesheets/buttons.css
@@ -0,0 +1,394 @@
+/* ------------------------------------------
+CSS3 GITHUB BUTTONS (Nicolas Gallagher)
+Licensed under Unlicense
+http://github.com/necolas/css3-github-buttons
+------------------------------------------ */
+
+
+/* ------------------------------------------------------------------------------------------------------------- BUTTON */
+
+.button {
+ position: relative;
+ overflow: visible;
+ display: inline-block;
+ padding: 0.5em 1em;
+ border: 1px solid #d4d4d4;
+ margin: 0;
+ text-decoration: none;
+ text-shadow: 1px 1px 0 #fff;
+ font:11px/normal sans-serif;
+ color: #333;
+ white-space: nowrap;
+ cursor: pointer;
+ outline: none;
+ background-color: #ececec;
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f4f4f4), to(#ececec));
+ background-image: -moz-linear-gradient(#f4f4f4, #ececec);
+ background-image: -o-linear-gradient(#f4f4f4, #ececec);
+ background-image: linear-gradient(#f4f4f4, #ececec);
+ -webkit-background-clip: padding;
+ -moz-background-clip: padding;
+ -o-background-clip: padding-box;
+ /*background-clip: padding-box;*/ /* commented out due to Opera 11.10 bug */
+ -webkit-border-radius: 0.2em;
+ -moz-border-radius: 0.2em;
+ border-radius: 0.2em;
+ /* IE hacks */
+ zoom: 1;
+ *display: inline;
+}
+
+.button:hover,
+.button:focus,
+.button:active,
+.button.active {
+ border-color: #3072b3;
+ border-bottom-color: #2a65a0;
+ text-decoration: none;
+ text-shadow: -1px -1px 0 rgba(0,0,0,0.3);
+ color: #fff;
+ background-color: #3C8DDE;
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#599bdc), to(#3072b3));
+ background-image: -moz-linear-gradient(#599bdc, #3072b3);
+ background-image: -o-linear-gradient(#599bdc, #3072b3);
+ background-image: linear-gradient(#599bdc, #3072b3);
+}
+
+.button:active,
+.button.active {
+ border-color: #2a65a0;
+ border-bottom-color: #3884CF;
+ background-color: #3072b3;
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#3072b3), to(#599bdc));
+ background-image: -moz-linear-gradient(#3072b3, #599bdc);
+ background-image: -o-linear-gradient(#3072b3, #599bdc);
+ background-image: linear-gradient(#3072b3, #599bdc);
+}
+
+/* overrides extra padding on button elements in Firefox */
+.button::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+}
+
+/* ............................................................................................................. Icons */
+
+.button.icon:before {
+ content: "";
+ position: relative;
+ top: 1px;
+ float:left;
+ width: 12px;
+ height: 12px;
+ margin: 0 0.75em 0 -0.25em;
+ background: url(images/button-icons.png) 0 99px no-repeat;
+}
+
+.button.arrowup.icon:before { background-position: 0 0; }
+.button.arrowup.icon:hover:before,
+.button.arrowup.icon:focus:before,
+.button.arrowup.icon:active:before { background-position: -12px 0; }
+
+.button.arrowdown.icon:before { background-position: 0 -12px; }
+.button.arrowdown.icon:hover:before,
+.button.arrowdown.icon:focus:before,
+.button.arrowdown.icon:active:before { background-position: -12px -12px; }
+
+.button.arrowleft.icon:before { background-position: 0 -24px; }
+.button.arrowleft.icon:hover:before,
+.button.arrowleft.icon:focus:before,
+.button.arrowleft.icon:active:before { background-position: -12px -24px; }
+
+.button.arrowright.icon:before { float:right; margin: 0 -0.25em 0 0.5em; background-position: 0 -36px; }
+.button.arrowright.icon:hover:before,
+.button.arrowright.icon:focus:before,
+.button.arrowright.icon:active:before { background-position: -12px -36px; }
+
+.button.approve.icon:before { background-position: 0 -48px; }
+.button.approve.icon:hover:before,
+.button.approve.icon:focus:before,
+.button.approve.icon:active:before { background-position: -12px -48px; }
+
+.button.add.icon:before { background-position: 0 -288px; }
+.button.add.icon:hover:before,
+.button.add.icon:focus:before,
+.button.add.icon:active:before { background-position: -12px -288px; }
+
+.button.remove.icon:before { background-position: 0 -60px; }
+.button.remove.icon:hover:before,
+.button.remove.icon:focus:before,
+.button.remove.icon:active:before { background-position: -12px -60px; }
+
+.button.log.icon:before { background-position: 0 -72px; }
+.button.log.icon:hover:before,
+.button.log.icon:focus:before,
+.button.log.icon:active:before { background-position: -12px -72px; }
+
+.button.calendar.icon:before { background-position: 0 -84px; }
+.button.calendar.icon:hover:before,
+.button.calendar.icon:focus:before,
+.button.calendar.icon:active:before { background-position: -12px -84px; }
+
+.button.chat.icon:before { background-position: 0 -96px; }
+.button.chat.icon:hover:before,
+.button.chat.icon:focus:before,
+.button.chat.icon:active:before { background-position: -12px -96px; }
+
+.button.clock.icon:before { background-position: 0 -108px; }
+.button.clock.icon:hover:before,
+.button.clock.icon:focus:before,
+.button.clock.icon:active:before { background-position: -12px -108px; }
+
+.button.settings.icon:before { background-position: 0 -120px; }
+.button.settings.icon:hover:before,
+.button.settings.icon:focus:before,
+.button.settings.icon:active:before { background-position: -12px -120px; }
+
+.button.comment.icon:before { background-position: 0 -132px; }
+.button.comment.icon:hover:before,
+.button.comment.icon:focus:before,
+.button.comment.icon:active:before { background-position: -12px -132px; }
+
+.button.fork.icon:before { background-position: 0 -144px; }
+.button.fork.icon:hover:before,
+.button.fork.icon:focus:before,
+.button.fork.icon:active:before { background-position: -12px -144px; }
+
+.button.like.icon:before { background-position: 0 -156px; }
+.button.like.icon:hover:before,
+.button.like.icon:focus:before,
+.button.like.icon:active:before { background-position: -12px -156px; }
+
+.button.favorite.icon:before { background-position: 0 -348px; }
+.button.favorite.icon:hover:before,
+.button.favorite.icon:focus:before,
+.button.favorite.icon:active:before { background-position: -12px -348px; }
+
+.button.home.icon:before { background-position: 0 -168px; }
+.button.home.icon:hover:before,
+.button.home.icon:focus:before,
+.button.home.icon:active:before { background-position: -12px -168px; }
+
+.button.key.icon:before { background-position: 0 -180px; }
+.button.key.icon:hover:before,
+.button.key.icon:focus:before,
+.button.key.icon:active:before { background-position: -12px -180px; }
+
+.button.lock.icon:before { background-position: 0 -192px; }
+.button.lock.icon:hover:before,
+.button.lock.icon:focus:before,
+.button.lock.icon:active:before { background-position: -12px -192px; }
+
+.button.unlock.icon:before { background-position: 0 -204px; }
+.button.unlock.icon:hover:before,
+.button.unlock.icon:focus:before,
+.button.unlock.icon:active:before { background-position: -12px -204px; }
+
+.button.loop.icon:before { background-position: 0 -216px; }
+.button.loop.icon:hover:before,
+.button.loop.icon:focus:before,
+.button.loop.icon:active:before { background-position: -12px -216px; }
+
+.button.search.icon:before { background-position: 0 -228px; }
+.button.search.icon:hover:before,
+.button.search.icon:focus:before,
+.button.search.icon:active:before { background-position: -12px -228px; }
+
+.button.mail.icon:before { background-position: 0 -240px; }
+.button.mail.icon:hover:before,
+.button.mail.icon:focus:before,
+.button.mail.icon:active:before { background-position: -12px -240px; }
+
+.button.move.icon:before { background-position: 0 -252px; }
+.button.move.icon:hover:before,
+.button.move.icon:focus:before,
+.button.move.icon:active:before { background-position: -12px -252px; }
+
+.button.edit.icon:before { background-position: 0 -264px; }
+.button.edit.icon:hover:before,
+.button.edit.icon:focus:before,
+.button.edit.icon:active:before { background-position: -12px -264px; }
+
+.button.pin.icon:before { background-position: 0 -276px; }
+.button.pin.icon:hover:before,
+.button.pin.icon:focus:before,
+.button.pin.icon:active:before { background-position: -12px -276px; }
+
+.button.reload.icon:before { background-position: 0 -300px; }
+.button.reload.icon:hover:before,
+.button.reload.icon:focus:before,
+.button.reload.icon:active:before { background-position: -12px -300px; }
+
+.button.rss.icon:before { background-position: 0 -312px; }
+.button.rss.icon:hover:before,
+.button.rss.icon:focus:before,
+.button.rss.icon:active:before { background-position: -12px -312px; }
+
+.button.tag.icon:before { background-position: 0 -324px; }
+.button.tag.icon:hover:before,
+.button.tag.icon:focus:before,
+.button.tag.icon:active:before { background-position: -12px -324px; }
+
+.button.trash.icon:before { background-position: 0 -336px; }
+.button.trash.icon:hover:before,
+.button.trash.icon:focus:before,
+.button.trash.icon:active:before { background-position: -12px -336px; }
+
+.button.user.icon:before { background-position: 0 -360px; }
+.button.user.icon:hover:before,
+.button.user.icon:focus:before,
+.button.user.icon:active:before { background-position: -12px -360px; }
+
+
+/* ------------------------------------------------------------------------------------------------------------- BUTTON EXTENSIONS */
+
+/* ............................................................................................................. Primary */
+
+.button.primary {
+ font-weight: bold;
+}
+
+/* ............................................................................................................. Danger */
+
+.button.danger {
+ color: #900;
+}
+
+.button.danger:hover,
+.button.danger:focus,
+.button.danger:active {
+ border-color: #b53f3a;
+ border-bottom-color: #a0302a;
+ color: #fff;
+ background-color: #dc5f59;
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#dc5f59), to(#b33630));
+ background-image: -moz-linear-gradient(#dc5f59, #b33630);
+ background-image: -o-linear-gradient(#dc5f59, #b33630);
+ background-image: linear-gradient(#dc5f59, #b33630);
+}
+
+.button.danger:active,
+.button.danger.active {
+ border-color: #a0302a;
+ border-bottom-color: #bf4843;
+ background-color: #b33630;
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b33630), to(#dc5f59));
+ background-image: -moz-linear-gradient(#b33630, #dc5f59);
+ background-image: -o-linear-gradient(#b33630, #dc5f59);
+ background-image: linear-gradient(#b33630, #dc5f59);
+}
+
+/* ............................................................................................................. Pill */
+
+.button.pill {
+ -webkit-border-radius: 50em;
+ -moz-border-radius: 50em;
+ border-radius: 50em;
+}
+
+/* ............................................................................................................. Disable */
+
+.button.disable {
+ opacity: 0.5;
+}
+
+/* ............................................................................................................. Big */
+
+.button.big {
+ font-size: 14px;
+}
+
+.button.big.icon:before { top: 0; }
+
+
+/* ------------------------------------------------------------------------------------------------------------- BUTTON GROUPS */
+
+/* ............................................................................................................. Standard */
+
+.button-group {
+ display: inline-block;
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ /* IE hacks */
+ zoom: 1;
+ *display: inline;
+}
+
+.button + .button,
+.button + .button-group,
+.button-group + .button,
+.button-group + .button-group {
+ margin-left: 15px;
+}
+
+.button-group li {
+ float: left;
+ padding: 0;
+ margin: 0;
+}
+
+.button-group .button {
+ float: left;
+ margin-left: -1px;
+}
+
+.button-group > .button:not(:first-child):not(:last-child),
+.button-group li:not(:first-child):not(:last-child) .button {
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+
+.button-group > .button:first-child,
+.button-group li:first-child .button {
+ margin-left: 0;
+ -webkit-border-top-right-radius: 0;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-topright: 0;
+ -moz-border-radius-bottomright: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.button-group > .button:last-child,
+.button-group li:last-child > .button {
+ -webkit-border-top-left-radius: 0;
+ -webkit-border-bottom-left-radius: 0;
+ -moz-border-radius-topleft: 0;
+ -moz-border-radius-bottomleft: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+/* ............................................................................................................. Minor */
+
+.button-group.minor-group .button {
+ border: 1px solid #d4d4d4;
+ text-shadow: none;
+ background-image: none;
+ background-color: #fff;
+}
+
+.button-group.minor-group .button:hover,
+.button-group.minor-group .button:focus,
+.button-group.minor-group .button:active {
+ background-color: #599bdc;
+}
+
+.button-group.minor-group .button:active,
+.button-group.minor-group .button.active {
+ background-color: #3072b3;
+}
+
+.button-group.minor-group .button.icon:before {
+ opacity: 0.8;
+}
+
+/* ------------------------------------------------------------------------------------------------------------- BUTTON CONTAINER */
+/* For mixing buttons and button groups, e.g., in a navigation bar */
+
+.button-container .button,
+.button-container .button-group {
+ vertical-align: top;
+}
diff --git a/src/public/stylesheets/layout.css b/src/public/stylesheets/layout.css
new file mode 100644
index 0000000..c530bc6
--- /dev/null
+++ b/src/public/stylesheets/layout.css
@@ -0,0 +1,270 @@
+/* body */
+/* line 9, ../../app/stylesheets/layout.scss */
+html, body {
+ height: 100%;
+}
+
+/* line 11, ../../app/stylesheets/layout.scss */
+body {
+ background: url("../images/body-bg.png");
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.750em;
+ /* 12px base */
+ color: #333;
+}
+
+/* line 18, ../../app/stylesheets/layout.scss */
+strong, em, b, i {
+ font-family: "Lucida Sans", "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+}
+
+/* line 20, ../../app/stylesheets/layout.scss */
+#primary-container {
+ position: relative;
+ min-height: 100%;
+ margin-bottom: -60px;
+}
+
+/* typography */
+/* line 28, ../../app/stylesheets/layout.scss */
+.label {
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+}
+
+/* line 32, ../../app/stylesheets/layout.scss */
+.label.strong {
+ font-weight: bold;
+ color: #333;
+}
+
+/* line 37, ../../app/stylesheets/layout.scss */
+.label.small-caps {
+ text-transform: uppercase;
+ font-size: 0.917em;
+}
+
+/* Query Inputs */
+/* line 44, ../../app/stylesheets/layout.scss */
+div.query-input {
+ display: inline-block;
+ background-image: -moz-linear-gradient(top, #d1d1d1, rgba(230, 230, 230, 0));
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#d1d1d1), to(rgba(230, 230, 230, 0)));
+ -webkit-border-radius: 16px;
+ -moz-border-radius: 16px;
+ border-radius: 16px;
+ padding: 3px;
+}
+
+/* line 52, ../../app/stylesheets/layout.scss */
+div.query-input input[type="text"] {
+ display: inline;
+ -webkit-border-radius: 16px;
+ -moz-border-radius: 16px;
+ border-radius: 16px;
+ border: 1px solid #ccc;
+ height: 23px;
+ width: 180px;
+ outline: none;
+ padding: 0px 26px 0px 10px;
+ margin: 0px;
+ font-size: 12px;
+}
+
+/* line 64, ../../app/stylesheets/layout.scss */
+div.query-input input[type="submit"] {
+ display: inline;
+ background: transparent url("../images/button-search.png") no-repeat left center;
+ color: transparent;
+ border: 0px;
+ width: 25px;
+ height: 25px;
+ margin-left: -25px;
+ outline: none;
+ cursor: pointer;
+}
+/* line 73, ../../app/stylesheets/layout.scss */
+div.query-input input[type="submit"]:hover {
+ background: transparent url("../images/button-search-over.png") no-repeat left center;
+}
+/* line 74, ../../app/stylesheets/layout.scss */
+div.query-input input[type="submit"]:active {
+ background: transparent url("../images/button-search-down.png") no-repeat left center;
+}
+
+/* Content */
+/* line 79, ../../app/stylesheets/layout.scss */
+header#masthead {
+ height: 49px;
+ background-color: #E7E7E7;
+ background: url("../images/masthead-bg.png") repeat-x;
+ position: relative;
+ margin-bottom: 22px;
+}
+/* line 86, ../../app/stylesheets/layout.scss */
+header#masthead img#logo {
+ position: absolute;
+ top: 8px;
+}
+/* line 91, ../../app/stylesheets/layout.scss */
+header#masthead div.container {
+ margin: 0 auto;
+ width: 960px;
+ overflow: hidden;
+ position: relative;
+}
+/* line 98, ../../app/stylesheets/layout.scss */
+header#masthead a.user-dropdown {
+ border: 1px solid #ccc;
+ background: url("../images/button-userdrop.png") no-repeat center center;
+ background: url("../images/button-userdrop.png") no-repeat center center, -moz-linear-gradient(top, rgba(239, 239, 239, 0), rgba(204, 204, 204, 0));
+ background: url("../images/button-userdrop.png") no-repeat center center, -webkit-gradient(linear, left top, left bottom, color-stop(0, #efefef), color-stop(1, #cccccc));
+ width: 46px;
+ margin-left: 4px;
+ padding: 5px 2px 5px 2px;
+ color: transparent;
+ font-size: 12px;
+ /* match the font-size of the query box, for proper valign */
+}
+/* line 109, ../../app/stylesheets/layout.scss */
+header#masthead a.user-dropdown:active {
+ background: url("../images/button-userdrop.png") no-repeat center center;
+ background: url("../images/button-userdrop.png") no-repeat center center, -moz-linear-gradient(top, rgba(232, 232, 232, 0), rgba(210, 210, 210, 0));
+ background: url("../images/button-userdrop.png") no-repeat center center, -webkit-gradient(linear, left top, left bottom, color-stop(0, #e8e8e8), color-stop(1, #d2d2d2));
+}
+/* line 117, ../../app/stylesheets/layout.scss */
+header#masthead nav#system {
+ float: right;
+ margin-top: 6px;
+}
+/* line 120, ../../app/stylesheets/layout.scss */
+header#masthead nav#system ul {
+ list-style: none;
+}
+/* line 122, ../../app/stylesheets/layout.scss */
+header#masthead nav#system ul li {
+ display: inline;
+}
+/* line 123, ../../app/stylesheets/layout.scss */
+header#masthead nav#system ul li + li {
+ margin-left: 10px;
+}
+/* line 124, ../../app/stylesheets/layout.scss */
+header#masthead nav#system ul li.separator {
+ background: url("../images/masthead-nav-separator.gif") no-repeat left top;
+ padding: 8px 1px 8px 1px;
+}
+
+/* Primary Nav */
+/* line 136, ../../app/stylesheets/layout.scss */
+nav#primary ul.container {
+ width: 950px;
+ margin: 0 auto;
+ list-style: none;
+ padding-left: 24px;
+ height: 34px;
+}
+/* line 142, ../../app/stylesheets/layout.scss */
+nav#primary ul.container li {
+ float: left;
+ position: relative;
+ display: inline-block;
+ background: url("../images/tab-inactive-right.png") no-repeat right top;
+ height: 34px;
+ margin-right: 6px;
+ z-index: 1;
+}
+/* line 150, ../../app/stylesheets/layout.scss */
+nav#primary ul.container li a {
+ display: block;
+ background: url("../images/tab-inactive-left.png") no-repeat left top;
+ padding: 10px 16px 14px 16px;
+ margin-left: -11px;
+ font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-size: 12px;
+ letter-spacing: 1px;
+ font-weight: normal;
+ text-transform: uppercase;
+ text-decoration: none;
+ font-weight: bold;
+ color: #fff;
+}
+/* line 165, ../../app/stylesheets/layout.scss */
+nav#primary ul.container li.active {
+ margin-top: -5px;
+ background: url("../images/tab-active-right.png") no-repeat right top;
+ z-index: 1000;
+ height: 43px;
+}
+/* line 170, ../../app/stylesheets/layout.scss */
+nav#primary ul.container li.active a {
+ background: url("../images/tab-active-left.png") no-repeat left top;
+ padding: 12px 20px 12px 20px;
+ font-size: 16px;
+ color: #666;
+}
+/* line 177, ../../app/stylesheets/layout.scss */
+nav#primary ul.container li + li {
+ margin-right: 6px;
+}
+
+/* Content */
+/* line 187, ../../app/stylesheets/layout.scss */
+div#content {
+ width: 946px;
+ margin: 0 auto;
+ margin-bottom: 98px;
+ height: 200px;
+ -webkit-border-radius: 7px;
+ -moz-border-radius: 7px;
+ border-radius: 7px;
+ background-color: #FAFAFA;
+ padding: 7px;
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.5);
+ -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.5);
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.5);
+ border: 1px solid #999;
+}
+/* line 200, ../../app/stylesheets/layout.scss */
+div#content div.header {
+ background-color: #ccc;
+ height: 60px;
+}
+
+/* Footer */
+/* line 209, ../../app/stylesheets/layout.scss */
+footer.standard {
+ background: rgba(0, 0, 0, 0.12);
+ position: relative;
+ height: 40px;
+ width: 100%;
+ clear: both;
+}
+/* line 217, ../../app/stylesheets/layout.scss */
+footer.standard div.container {
+ margin: 0 auto;
+ width: 946px;
+ background: rgba(0, 0, 0, 0.12);
+ height: 36px;
+ position: relative;
+ padding: 26px 8px 0px 8px;
+ top: -20px;
+}
+/* line 227, ../../app/stylesheets/layout.scss */
+footer.standard img.logo {
+ float: right;
+}
+/* line 231, ../../app/stylesheets/layout.scss */
+footer.standard span.copyright {
+ font-size: 10px;
+ display: inline-block;
+ color: #666;
+}
+/* line 237, ../../app/stylesheets/layout.scss */
+footer.standard nav.footer {
+ display: inline-block;
+}
+/* line 239, ../../app/stylesheets/layout.scss */
+footer.standard nav.footer a {
+ color: #fff;
+ padding-right: 6px;
+}
diff --git a/src/public/stylesheets/layout_ie.css b/src/public/stylesheets/layout_ie.css
new file mode 100644
index 0000000..e69de29
diff --git a/src/public/stylesheets/reset.css b/src/public/stylesheets/reset.css
new file mode 100755
index 0000000..885707c
--- /dev/null
+++ b/src/public/stylesheets/reset.css
@@ -0,0 +1,171 @@
+/* `XHTML, HTML4, HTML5 Reset
+----------------------------------------------------------------------------------------------------*/
+
+a,
+abbr,
+acronym,
+address,
+applet,
+article,
+aside,
+audio,
+b,
+big,
+blockquote,
+body,
+canvas,
+caption,
+center,
+cite,
+code,
+dd,
+del,
+details,
+dfn,
+dialog,
+div,
+dl,
+dt,
+em,
+embed,
+fieldset,
+figcaption,
+figure,
+font,
+footer,
+form,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+header,
+hgroup,
+hr,
+html,
+i,
+iframe,
+img,
+ins,
+kbd,
+label,
+legend,
+li,
+mark,
+menu,
+meter,
+nav,
+object,
+ol,
+output,
+p,
+pre,
+progress,
+q,
+rp,
+rt,
+ruby,
+s,
+samp,
+section,
+small,
+span,
+strike,
+strong,
+sub,
+summary,
+sup,
+table,
+tbody,
+td,
+tfoot,
+th,
+thead,
+time,
+tr,
+tt,
+u,
+ul,
+var,
+video,
+xmp {
+ border: 0;
+ margin: 0;
+ padding: 0;
+ font-size: 100%;
+}
+
+html,
+body {
+ height: 100%;
+}
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section {
+/*
+ Override the default (display: inline) for
+ browsers that do not recognize HTML5 tags.
+
+ IE8 (and lower) requires a shiv:
+ http://ejohn.org/blog/html5-shiv
+*/
+ display: block;
+}
+
+b,
+strong {
+/*
+ Makes browsers agree.
+ IE + Opera = font-weight: bold.
+ Gecko + WebKit = font-weight: bolder.
+*/
+ font-weight: bold;
+}
+
+img {
+ color: transparent;
+ font-size: 0;
+ vertical-align: middle;
+/*
+ For IE.
+ http://css-tricks.com/ie-fix-bicubic-scaling-for-images
+*/
+ -ms-interpolation-mode: bicubic;
+}
+
+li {
+/*
+ For IE6 + IE7.
+*/
+ display: list-item;
+}
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+th,
+td,
+caption {
+ font-weight: normal;
+ vertical-align: top;
+ text-align: left;
+}
+
+svg {
+/*
+ For IE9.
+*/
+ overflow: hidden;
+}
\ No newline at end of file
--
1.7.4
12 years, 11 months
New UI branch
by Jan Provazník
Hi,
I've created new branch for developing new UI: origin/newui where you
can currently find new layout. if you work on new UI tasks, push patches
into this repo please.
Jan
12 years, 11 months
Sample AR model for implementing services
by Scott Seago
In order to put something of a concrete model around the services
discussion, I've come up with an example of how we could implement this
in the context of our existing ActiveRecord model for Templates,
Assemblies, and Deployables.
What follows is entirely consistent with the description that Angus has
suggested -- so any deficiencies there are likely to be found here too,
and vice versa. In particular, note that in this model, there is no
explicit connection between Service and Template -- if the UI allows a
user to check off services that would be available to enable in
deployables which use the template, the result on the back end is simply
adding the service's associated package group to the package groups
listed for the template.
If we ultimately decide that the user will need to explicitly list the
service in the template to enable it (rather than relying on packages
listed in the template and simply warning the user and allowing
overrides), then we would simply need to add a service reference to the
template model, and then in the 'add a service to this deployable' UI
we'd filter the service list based on what's actually listed in the
templates.
Also note that, in this proposal, the services are tied to a particular
OS/version/architecture combination. This is necessary since the
associated package group will be arch/OS-specific as well. One downside
to this model is that if we want to enable the same service in multiple
places (i.e. RHEL6.1/x86_64 and Fedora15/i386), then we'll have to
create two separate unconnected Service objects with the puppet scripts
and config params copied over (the package group will be different, of
course, since it lives in a different repo). One alternate model for
this would be to make the service OS/arch-independent but supply a
separate package group for each OS/arch. If a common use case would be
to enable the same services across multiple architectures, this model
will allow us to do this without copying and pasting all the puppet
scripts and config params, as the only thing that differs will be the
package group. If we expect the config/puppet scripts to be different
(i.e. we need slightly different puppet recipes based on OS/arch), then
the currently-proposed simpler model would be better.
Anyway, here goes:
Here's an updated ActiveRecord model for adding in support for
Services. It's not complete, but it should reflect the specific object
types, attributes, and associations needed for Services.
A few inline notes are included as comments below.
# no changes here for services unless we add an explicit
# relationship to Service -- for now we only know this
# indirectly as the Service package group will be included
# in the template's package list
class Template < ActiveRecord::Base
has_many :images
has_many :instances
has_and_belongs_to_many :assemblies
end
# Updated Deployable association to indicate that the configured
# services are attached to the Deployable->Assembly relationship
class Assembly < ActiveRecord::Base
has_many :instances
has_and_belongs_to_many :templates
has_many :deployable_assemblies
has_many :deployables, :through => :deployable_assemblies
end
class Deployable < ActiveRecord::Base
has_many :deployments
has_and_belongs_to_many :deployables
has_many :deployable_assemblies
has_many :assemblies, :through => :deployable_assemblies
end
class DeployableAssembly < ActiveRecord::Base
belongs_to :assembly
belongs_to :deployable
has_many :configured_services, :dependent => :destroy
end
class CreateDeployableAssemblies < ActiveRecord::Migration
def self.up
create_table :deployable_assemblies do |t|
t.string :name # optional -- use assembly name if blank
t.integer :assembly_id
t.integer :deployable_id
end
end
end
# a Service is a collection of packages (in a package group),
# configuration scripts (puppet for now), and named configuration
# parameters used to describe a service. This is the service "in
# general", rather than connected to a specific
# deployable/template. For the moment, a service is only valid for a
# single Base OS, Version, and Architecture. If the same service needs
# to exist on more than one (say Fedora 14 x86_64 and RHEL6.1 i386),
# then two independent services must be created.
class Service < ActiveRecord::Base
has_many :service_config_scripts, :dependent => :destroy
has_many :service_params, :dependent => :destroy
has_many :configured_services, :dependent => :destroy
end
class CreateServices < ActiveRecord::Migration
def self.up
create_table :services do |t|
t.string :name
t.string :platform
t.string :platform_version
t.string :architecture
# FIXME: how are we actually referencing package group?
t.string :package_group
end
end
end
# A configuration script attached to a Service. For now we only
# support a script_type of 'puppet'.
class ServiceConfigScript < ActiveRecord::Base
belongs_to :service
validates_presence_of :name
validates_presence_of :script_type
validates_presence_of :script_content
end
class CreateServiceConfigScripts < ActiveRecord::Migration
def self.up
create_table :service_config_scripts do |t|
t.string :name
t.integer :service_id
t.string :script_type #'puppet', etc
t.text :script_content
end
end
end
# A parameter associated with a service. This doesn't hold the value
# for a particular instance, but it stores the name and type (and
# whether it's required).
class ServiceParam < ActiveRecord::Base
belongs_to :service
validates_presence_of :name
# value_type: fixed or compute-from-instance;
# for fixed 'value' in associated ServiceParamValue objects is
actual value
# for compute-from-instance value is key
end
class CreateServiceParams < ActiveRecord::Migration
def self.up
create_table :service_params do |t|
t.string :name
t.integer :service_id
t.string :value_type
t.boolean :is_required, :default => true
end
end
end
# A particular service attached to an assembly/template in the context
# of a deployable. This references a Service object and fills in the
# ServiceParams with actual values.
class ConfiguredService < ActiveRecord::Base
belongs_to :service
belongs_to :deployable_assembly
has_many :service_params
end
class CreateConfiguredServices < ActiveRecord::Migration
def self.up
create_table :configured_services do |t|
t.integer :service_id
t.integer :deployable_assembly_id
end
end
end
# Filled-in value for ServiceParam
class ServiceParamValue < ActiveRecord::Base
belongs_to :configured_service
belongs_to :service_param
validates_presence_of :value
# value_type: fixed or compute-from-instance;
# for fixed 'value' is actual value
# for compute-from-instance value is key
end
class CreateServiceParams < ActiveRecord::Migration
def self.up
create_table :service_params do |t|
t.integer :configured_service_id
t.integer :service_param_id
t.string :value
end
end
end
12 years, 11 months
Implementing Services
by Angus Thomas
Below is a sketch of how we can approach adding support for services,
with the goal of reaching a basic, functional implementation as soon as
possible, given that we have few development iterations left before
Cloud Engine ships.
Firstly, the services themselves: They will be implemented as:
* A packagegroup in pulp which includes the packages which the
implementation of the service requires
* A set of puppet scripts to be executed on the instance at launch
(The puppet scripts will be deployed from the configuration server that
all newly-launched instances will connect to)
To simplify what we're seeking to build, we can define services in the
context of a deployable only.
So, templates won't be built for specific services. Users can define
templates with one, or several, purposes in mind and will choose the
packages that they want to include on that basis. When the user is
deciding which packages to include in a template, they'll have the
option of including the packagegroups that defines the requirements for
particular services, to ensure that their template is capable of
supporting those services.
We don't need to add any functionality for services at the assembly level.
At the deployable level, users will select the number of instances of
various templates that they wish to launch, and then will associate
services with each instance of a template. If the user assigns a service
to a template that wasn't explicitly built to include the services'
packagegroup the UI will show a warning that the template *may not*
contain the packages to support the service, and the user will have the
option to amend the template to make sure.
If the user is confident that the template does include the dependencies
for the service, they'll carry on.
When preparing to launch the deployable, the user will prime the
configuration server with the specific parameters to pass to the
launched instances, along with the puppet scripts.
The instances will launch, receive the puppet scripts and parameters for
the configuration server, and enable the services.
To give a use case:
A user wants to host php web apps, which connect to a mysql DB server.
There are some one-off tasks before they can launch any deployables:
* Define a service which
-- Lists mysql as a package dependency
-- Contains a puppet script to enable mysqld and create an initial set
of users, tables, constraints etc.
* Define a service that
-- Lists httpd, mod_ssl & php as required packages
-- Contains a puppet script which enable the httpd service, configure
php's connection to a mysql instance and "git pull" the latest php files
from the release branch of the developer's repo
* Define a template that includes httpd, mod_ssl, php & mysql, either by
listing those packages explicity or by referring to the two services
above. The effect is the same in either case.
Having done those things, the following tasks are required to launch a
deployable:
* Pull two instances of the template into the deployable
* Set one instance to provide the mysqld service,
* Set one instance to provide the httpd/service
* Supply the parameters that each puppet script requires, which define
the URL of the git repo to check out the php pages, the IP & credentials
for the DB connection etc.
* Launch.
The same template and service definition scripts would support deploying
a range of web apps, or the same app to multiple hosts. With the
addition of another service definition script the same template could
support multiple DB instances for high availability etc..
12 years, 11 months
[PATCH conductor] Rename "rhevm" target to "rhev-m"
by Richard Su
Redmine #1525
Imagefactory expects target to be named "rhev-m"
---
.../migrate/20110513160000_rename_rhevm_target.rb | 15 +++++++++++++++
src/db/seeds.rb | 2 +-
2 files changed, 16 insertions(+), 1 deletions(-)
create mode 100644 src/db/migrate/20110513160000_rename_rhevm_target.rb
diff --git a/src/db/migrate/20110513160000_rename_rhevm_target.rb b/src/db/migrate/20110513160000_rename_rhevm_target.rb
new file mode 100644
index 0000000..8d4ba5b
--- /dev/null
+++ b/src/db/migrate/20110513160000_rename_rhevm_target.rb
@@ -0,0 +1,15 @@
+class RenameRhevmTarget < ActiveRecord::Migration
+
+ def self.up
+ type = ProviderType.find_by_codename("rhevm")
+ type.codename = "rhev-m"
+ type.save
+ end
+
+ def self.down
+ type = ProviderType.find_by_codename("rhev-m")
+ type.codename = "rhevm"
+ type.save
+ end
+
+end
diff --git a/src/db/seeds.rb b/src/db/seeds.rb
index 79551f0..3ab3131 100644
--- a/src/db/seeds.rb
+++ b/src/db/seeds.rb
@@ -118,7 +118,7 @@ if ProviderType.all.empty?
ProviderType.create!(:name => "Amazon EC2", :build_supported => true, :codename =>"ec2", :ssh_user => "root", :home_dir => "/root")
ProviderType.create!(:name => "GoGrid", :codename =>"gogrid")
ProviderType.create!(:name => "Rackspace", :codename =>"rackspace")
- ProviderType.create!(:name => "RHEV-M", :codename =>"rhevm")
+ ProviderType.create!(:name => "RHEV-M", :codename =>"rhev-m")
ProviderType.create!(:name => "OpenNebula", :codename =>"opennebula")
end
--
1.7.4.4
12 years, 11 months
#1521 - new layout (rev.1)
by Jan Provazník
Resending patch which adds new layout from UX team into conductor, and adds some
minor modifications:
- changed images paths in css (from /images to ../images)
- styles/ dir renamed to stylesheets/
- layout.scss moved app/stylesheets and is generated to
public/stylesheets/compiled
If ACKed, I'm not going to push this into next but into separate public branch
because no data are displayed yet in this new layout.
12 years, 11 months
ViewState on the controller side (rev. 2)
by Tomas Sedovic
This patchset includes:
* changes to the ViewState models (fix the session keys filtering, add UUIDs)
* suggestions from jprovazn's response to the previous patch
* viewstate API mostly working
What's missing:
* API access to the non-current saved viewstates via:
GET /controller/action/viewstate/UUID
and similar for PUT and DELETE
Right now, only this works:
GET|PUT|POST|DELETE /controller/action/viewstate
(this manipulates the session viewstate for the given controller & action).
However, this way of accessing the saved viewstates does work:
GET /controller/action?viewstate=UUID
This returns the /controller/action page. If the specified UUID differs from
the session viewstate, the session will be replaced with the saved viewstate
with the given UUID (if it exists in the database).
Please take a look at it and let me know if it makes sense.
Thanks,
Thomas
12 years, 11 months
#1521 - new layout
by Jan Provazník
Hi,
this patch adds new layout from UX team into conductor, and adds some
minor modifications:
- changed images paths in css (from /images to ../images)
- styles/ dir renamed to stylesheets/
- layout.scss moved app/stylesheets and is generated to
public/stylesheets/compiled
If ACKed, I'm not going to push this into next but into separate public
branch because no data are displayed yet in this new layout.
I'm sending patches in attachment because of long lines.
Jan
12 years, 11 months
[PATCH configure] cleanup aeolus-configure web requests
by Mo Morsi
Introduces a generic web puppet resource type to access various web
apis from puppet. Implements a provider of this type using curl to
issue the requests.
Then uses this provider to issue requests to the conductor api to
create providers and hardware profiles, analyzing the results for
errors
---
recipes/aeolus_recipe/aeolus_recipe.pp | 12 +--
.../aeolus_recipe/lib/puppet/provider/web/curl.rb | 114 ++++++++++++++++++++
recipes/aeolus_recipe/lib/puppet/type/web.rb | 49 +++++++++
recipes/aeolus_recipe/manifests/aeolus.pp | 4 +-
recipes/aeolus_recipe/manifests/conductor.pp | 98 +++++++----------
recipes/aeolus_recipe/manifests/defaults.pp | 13 +++
6 files changed, 219 insertions(+), 71 deletions(-)
create mode 100644 recipes/aeolus_recipe/lib/puppet/provider/web/curl.rb
create mode 100644 recipes/aeolus_recipe/lib/puppet/type/web.rb
diff --git a/recipes/aeolus_recipe/aeolus_recipe.pp b/recipes/aeolus_recipe/aeolus_recipe.pp
index 879b314..8574584 100644
--- a/recipes/aeolus_recipe/aeolus_recipe.pp
+++ b/recipes/aeolus_recipe/aeolus_recipe.pp
@@ -33,33 +33,27 @@ include aeolus::iwhd
aeolus::create_bucket{"aeolus":}
-aeolus::site_admin{"admin":
+aeolus::site_admin{"$admin_user":
email => 'dcuser(a)aeolusproject.org',
- password => 'password',
+ password => "$admin_password",
first_name => 'aeolus',
last_name => 'user'}
aeolus::provider{"mock":
type => 'mock',
port => 3002,
- login_user => 'admin',
- login_password => 'password',
require => Aeolus::Site_admin["admin"] }
aeolus::provider{"ec2-us-east-1":
type => 'ec2',
endpoint => 'us-east-1',
port => 3003,
- login_user => 'admin',
- login_password => 'password',
require => Aeolus::Site_admin["admin"] }
aeolus::provider{"ec2-us-west-1":
type => 'ec2',
endpoint => 'us-west-1',
port => 3004,
- login_user => 'admin',
- login_password => 'password',
require => Aeolus::Site_admin["admin"] }
aeolus::conductor::hwp{"hwp1":
@@ -67,7 +61,5 @@ aeolus::conductor::hwp{"hwp1":
cpu => "1",
storage => "1",
architecture => "x86_64",
- login_user => 'admin',
- login_password => 'password',
require => Aeolus::Site_admin["admin"] }
diff --git a/recipes/aeolus_recipe/lib/puppet/provider/web/curl.rb b/recipes/aeolus_recipe/lib/puppet/provider/web/curl.rb
new file mode 100644
index 0000000..b5f4468
--- /dev/null
+++ b/recipes/aeolus_recipe/lib/puppet/provider/web/curl.rb
@@ -0,0 +1,114 @@
+require 'curb'
+require 'uuid'
+require 'fileutils'
+
+# Helper to invoke the web request w/ curl
+def web_request(method, uri, request_params, params = {})
+ raise Puppet::Error, "Must specify http method and uri" if method.nil? || uri.nil?
+
+ curl = Curl::Easy.new
+
+ if params.has_key?(:cookie)
+ curl.enable_cookies = true
+ curl.cookiefile = params[:cookie]
+ curl.cookiejar = params[:cookie]
+ end
+
+ curl.follow_location = (params.has_key?(:follow) && params[:follow])
+
+ case(method)
+ when 'get'
+ url = uri
+ url += ";" + request_params.collect { |k,v| "#{k}=#{v}" }.join("&") unless request_params.nil?
+ curl.url = url
+ curl.http_get
+ return curl
+
+ when 'post'
+ cparams = []
+ request_params.each_pair { |k,v| cparams << Curl::PostField.content(k,v) } unless request_params.nil?
+ curl.url = uri
+ curl.http_post(cparams)
+ return curl
+
+ #when 'put'
+ #when 'delete'
+ end
+end
+
+# Helper to verify the response
+def verify_result(result, verify = {})
+ returns = (verify.has_key?(:returns) && !verify[:returns].nil?) ? verify[:returns] : "200"
+ returns = [returns] unless returns.is_a? Array
+ unless returns.include?(result.response_code.to_s)
+ raise Puppet::Error, "Invalid HTTP Return Code: #{result.response_code},
+ was expecting one of #{returns.join(", ")}"
+ end
+
+ if verify.has_key?(:body) && !verify[:body].nil? && !(result.body_str =~ Regexp.new(verify[:body]))
+ raise Puppet::Error, "Expecting #{verify[:body]} in the result"
+ end
+end
+
+# Puppet provider definition
+Puppet::Type.type(:web).provide :curl do
+ desc "Use curl to access web resources"
+
+ def http_method
+ @request_method
+ end
+
+ def http_method=(request_method)
+ begin
+ # Set request method and generate a unique session key
+ @request_method = request_method
+ session = "/tmp/#{UUID.new.generate}"
+
+ # Invoke a login request if necessary
+ if @resource[:login]
+ login_params = @resource[:login].reject { |k,v| ['http_method', 'uri'].include?(k) }
+ web_request(@resource[:login]['http_method'], @resource[:login]['uri'],
+ login_params, :cookie => session, :follow => @resource[:follow]).close
+ end
+
+ # Check to see if we should actually run the request
+ skip_request = !@resource[:unless].nil?
+ if @resource[:unless]
+ result = web_request(@resource[:unless]['http_method'], @resource[:unless]['uri'],
+ @resource[:unless]['parameters'],
+ :cookie => session, :follow => @resource[:follow])
+ begin
+ verify_result(result,
+ :returns => @resource[:unless]['returns'],
+ :body => @resource[:unless]['verify'])
+ rescue Puppet::Error => e
+ skip_request = false
+ end
+ result.close
+ end
+ return if skip_request
+
+ # Actually run the request and verify the result
+ uri = !@resource[:uri].nil? ? @resource[:uri] : @resource[:name]
+ result = web_request(request_method, uri, @resource[:parameters],
+ :cookie => session, :follow => @resource[:follow])
+ verify_result(result,
+ :returns => @resource[:returns],
+ :body => @resource[:verify])
+ result.close
+
+ # Invoke a logout request if necessary
+ if @resource[:logout]
+ logout_params = @resource[:login].reject { |k,v| ['http_method', 'uri'].include?(k) }
+ web_request(@resource[:logout]['http_method'], @resource[:logout]['uri'],
+ logout_params, :cookie => session, :follow => @resource[:follow]).close
+ end
+
+ rescue Exception => e
+ raise Puppet::Error, "An exception was raised when invoking web request: #{e}"
+
+ ensure
+ FileUtils.rm_f(session) if @resource[:logout]
+ end
+ end
+end
diff --git a/recipes/aeolus_recipe/lib/puppet/type/web.rb b/recipes/aeolus_recipe/lib/puppet/type/web.rb
new file mode 100644
index 0000000..a9bf765
--- /dev/null
+++ b/recipes/aeolus_recipe/lib/puppet/type/web.rb
@@ -0,0 +1,49 @@
+Puppet::Type.newtype(:web) do
+ @doc = "Issue a request via the world wide web"
+
+ newparam :name
+
+ newparam(:uri) do
+ desc "URI to the web resource"
+ end
+
+ newproperty(:http_method) do
+ desc "HTTP method through which to issue the web request"
+ validate do |value|
+ unless ['post', 'get', 'put', 'delete'].include?(value)
+ raise ArgumentError, "#{value} is not a valid HTTP request method"
+ end
+ end
+ end
+
+ newparam(:parameters) do
+ desc "Hash of parameters to include in the web request"
+ end
+
+ newparam(:returns) do
+ desc "Expected http return codes of the request"
+ defaultto "200"
+ # TODO validate value(s) is among possible valid http return codes
+ end
+
+ newparam(:follow) do
+ desc "Boolean indicating if redirects should be followed"
+ newvalues(:true, :false)
+ end
+
+ newparam(:verify) do
+ desc "String to verify as being part of the result"
+ end
+
+ newparam(:login) do
+ desc "Login parameters to be used if a login is required before making the request"
+ end
+
+ newparam(:logout) do
+ desc "Logout parameters to be used if a logout is requred after making the request"
+ end
+
+ newparam(:unless) do
+ desc "Do not run request if the request specified here succeeds"
+ end
+end
diff --git a/recipes/aeolus_recipe/manifests/aeolus.pp b/recipes/aeolus_recipe/manifests/aeolus.pp
index ca684bb..a399771 100644
--- a/recipes/aeolus_recipe/manifests/aeolus.pp
+++ b/recipes/aeolus_recipe/manifests/aeolus.pp
@@ -54,13 +54,11 @@ class aeolus {
}
# Create a new provider in aeolus
-define aeolus::provider($type, $port, $endpoint="", $login_user="", $login_password=""){
+define aeolus::provider($type, $port, $endpoint=""){
aeolus::deltacloud{$name: provider_type => $type, endpoint => $endpoint, port => $port}
aeolus::conductor::provider{$name:
type => $type,
url => "http://localhost:${port}/api",
- login_user => $login_user,
- login_password => $login_password,
require => Aeolus::Deltacloud[$name] }
}
diff --git a/recipes/aeolus_recipe/manifests/conductor.pp b/recipes/aeolus_recipe/manifests/conductor.pp
index fee834f..7312e3a 100644
--- a/recipes/aeolus_recipe/manifests/conductor.pp
+++ b/recipes/aeolus_recipe/manifests/conductor.pp
@@ -228,66 +228,48 @@ define aeolus::site_admin($email="", $password="", $first_name="", $last_name=""
require => Exec[create_site_admin_user]}
}
-define aeolus::conductor::login($user,$password){
- exec{"conductor-login-for-${name}":
- command => "/usr/bin/curl -X POST http://localhost/conductor/user_session \
- -d user_session[login]=${user} \
- -d user_session[password]=${password} \
- -d commit=submit \
- -c /tmp/aeolus-${user}.cookie \
- --location --post301 --post302 -k -f",
- onlyif => "/usr/bin/test ! -f /tmp/aeolus-${user}.cookie || \"\" == \"`curl -X GET http://localhost/conductor -b /tmp/aeolus-${user}.cookie -i --silent | grep 'HTTP/1.1 200'`\"",
- require => Service['aeolus-conductor', 'httpd']}
-}
-
-define aeolus::conductor::logout($user){
- exec{"conductor-logout-for-${name}":
- command => "/usr/bin/curl -X GET http://localhost/conductor/logout -b /tmp/aeolus-${user}.cookie --location -k -f",
- onlyif => "/usr/bin/test -f /tmp/aeolus-${user}.cookie" } # TODO add condition ensuring cookie / session is valid
- exec{"conductor-logout-cookie-for-${name}":
- command => "/bin/rm /tmp/aeolus-${user}.cookie",
- onlyif => "/usr/bin/test -f /tmp/aeolus-${user}.cookie",
- require => Exec["conductor-logout-for-${name}"]}
-}
-
-
# Create a new provider via the conductor
-define aeolus::conductor::provider($type="",$url="",$login_user="",$login_password=""){
- aeolus::conductor::login{"provider-${name}": user => $login_user, password => $login_password }
- exec{"add-conductor-provider-${name}":
- command => "/usr/bin/curl -X POST http://localhost/conductor/admin/providers \
- -b /tmp/aeolus-${login_user}.cookie \
- -d provider[name]=${name} \
- -d provider[url]=${url} \
- -d provider[provider_type_codename]=${type} \
- --location --post301 --post302 -k -f",
- logoutput => true,
- require => [Aeolus::Conductor::Login["provider-$name"]] }
- aeolus::conductor::logout{"provider-${name}":
- user => $login_user,
- require => Exec["add-conductor-provider-${name}"] }
+define aeolus::conductor::provider($type="",$url=""){
+ web{ "provider-$name":
+ uri => "https://localhost/conductor/admin/providers",
+ http_method => 'post',
+ parameters => { 'provider[name]' => $name, 'provider[url]' => $url,
+ 'provider[provider_type_codename]' => $type },
+ returns => '200',
+ verify => '.*Provider added.*',
+ follow => true,
+ unless => { 'http_method' => 'get',
+ 'uri' => 'https://localhost/conductor/admin/providers',
+ 'verify' => ".*$name.*" },
+ require => Service['aeolus-conductor']
+ }
}
-define aeolus::conductor::hwp($memory='', $cpu='', $storage='', $architecture='', $login_user="",$login_password=""){
- aeolus::conductor::login{"hwp-${name}": user => $login_user, password => $login_password }
- exec{"add-conductor-hwp-${name}":
- command => "/usr/bin/curl -X POST http://localhost/conductor/admin/hardware_profiles \
- -b /tmp/aeolus-${login_user}.cookie \
- -d hardware_profile[name]=${name} \
- -d hardware_profile[memory_attributes][value]=${memory} \
- -d hardware_profile[cpu_attributes][value]=${cpu} \
- -d hardware_profile[storage_attributes][value]=${storage} \
- -d hardware_profile[architecture_attributes][value]=${architecture} \
- -d hardware_profile[memory_attributes][name]=memory -d hardware_profile[memory_attributes][unit]=MB \
- -d hardware_profile[cpu_attributes][name]=cpu -d hardware_profile[cpu_attributes][unit]=count \
- -d hardware_profile[storage_attributes][name]=storage -d hardware_profile[storage_attributes][unit]=GB \
- -d hardware_profile[architecture_attributes][name]=architecture -d hardware_profile[architecture_attributes][unit]=label \
- -d commit=Save \
- --location --post301 --post302 -k -f",
- logoutput => true,
- require => [Aeolus::Conductor::Login["hwp-$name"]] }
- aeolus::conductor::logout{"hwp-${name}":
- user => $login_user,
- require => Exec["add-conductor-hwp-${name}"] }
+define aeolus::conductor::hwp($memory='', $cpu='', $storage='', $architecture=''){
+ web{ "hwp-$name":
+ uri => "https://localhost/conductor/admin/hardware_profiles",
+ http_method => 'post',
+ parameters => {'hardware_profile[name]' => $name,
+ 'hardware_profile[memory_attributes][value]' => $memory,
+ 'hardware_profile[cpu_attributes][value]' => $cpu,
+ 'hardware_profile[storage_attributes][value]' => $storage,
+ 'hardware_profile[architecture_attributes][value]' => $architecture,
+ 'hardware_profile[memory_attributes][name]' => 'memory',
+ 'hardware_profile[memory_attributes][unit]' => 'MB',
+ 'hardware_profile[cpu_attributes][name]' => 'cpu',
+ 'hardware_profile[cpu_attributes][unit]' => 'count',
+ 'hardware_profile[storage_attributes][name]' => 'storage',
+ 'hardware_profile[storage_attributes][unit]' => 'GB',
+ 'hardware_profile[architecture_attributes][name]' => 'architecture',
+ 'hardware_profile[architecture_attributes][unit]' => 'label',
+ 'commit' => 'Save'},
+ returns => '200',
+ #verify => '.*Hardware profile added.*',
+ follow => true,
+ unless => { 'http_method' => 'get',
+ 'uri' => 'https://localhost/conductor/admin/hardware_profiles',
+ 'verify' => ".*$name.*" },
+ require => Service['aeolus-conductor']
+ }
}
diff --git a/recipes/aeolus_recipe/manifests/defaults.pp b/recipes/aeolus_recipe/manifests/defaults.pp
index f5c74c3..57b79f6 100644
--- a/recipes/aeolus_recipe/manifests/defaults.pp
+++ b/recipes/aeolus_recipe/manifests/defaults.pp
@@ -8,3 +8,16 @@
Package {provider => 'rpm'}
+$admin_user='admin'
+$admin_password='password'
+
+# Setup the default login/logout targets for web requests
+Web{
+ login => { 'http_method' => 'post',
+ 'uri' => 'https://localhost/conductor/user_session',
+ 'user_session[login]' => "$admin_user",
+ 'user_session[password]' => "$admin_password",
+ 'commit' => 'submit' },
+ logout => { 'http_method' => 'post',
+ 'uri' => 'https://localhost/conductor/logout' }
+}
--
1.7.2.3
12 years, 11 months