#TASK-1553 integrate new scorecard design
by Tomas Hrcka
- implemented new scorecard for pools#index
- renamed _header/_scorecard with postfix _action ie. _scoreboard_index
- implements method to get statistics for overview/index
12 years
[PATCH conductor] Partial view for pools filter view
by jzigmund@redhat.com
From: Jozef Zigmund <jzigmund(a)redhat.com>
Added basic filtred view for pools, deployments and instances on monitor page
---
src/app/controllers/pools_controller.rb | 27 +++++++++++++---
src/app/helpers/application_helper.rb | 11 ++++++
src/app/helpers/instances_helper.rb | 10 ------
src/app/models/deployment.rb | 11 ++++++
src/app/models/instance.rb | 10 ++++++
src/app/models/pool.rb | 10 ++++++
src/app/views/deployments/_list.haml | 52 +++++++++++++++++++-----------
src/app/views/layouts/_tabpanel.haml | 11 +++---
src/app/views/pools/_list.haml | 49 ++++++++++++++++++++++-------
src/app/views/pools/_overview.haml | 4 +-
src/app/views/pools/index.haml | 28 ++++++++++++++++-
src/features/pool.feature | 19 +++++++++++
12 files changed, 187 insertions(+), 55 deletions(-)
diff --git a/src/app/controllers/pools_controller.rb b/src/app/controllers/pools_controller.rb
index 33de831..aee9a08 100644
--- a/src/app/controllers/pools_controller.rb
+++ b/src/app/controllers/pools_controller.rb
@@ -16,14 +16,31 @@ class PoolsController < ApplicationController
def index
save_breadcrumb(pools_path(:viewstate => @viewstate ? @viewstate.id : nil))
- @search_term = params[:q]
- if @search_term.blank?
- load_pools
+ @user_pools = Pool.list_for_user(current_user, Privilege::VIEW)
+ if filter_view?
+ @tabs = [{:name => 'Pools', :view => 'list', :id => 'pools'},
+ {:name => 'Deployments', :view => 'deployments/list', :id => 'deployments'},
+ {:name => 'Instances', :view => 'instances/list', :id => 'instances'},
+ ]
+ details_tab_name = params[:details_tab].blank? ? 'pools' : params[:details_tab]
+ @details_tab = @tabs.find {|t| t[:id] == details_tab_name} || @tabs.first[:name].downcase
+ case @details_tab[:id]
+ when 'pools'
+ @pools = Pool.list_or_search(params[:q], params[:order_field],params[:order_dir])
+ when 'instances'
+ @instances = Instance.list_or_search(params[:q], params[:order_field],params[:order_dir])
+ when 'deployments'
+ @deployments = Deployment.list_or_search(params[:q], params[:order_field],params[:order_dir])
+ end
else
- @pools = Pool.search() { keywords(params[:q]) }.results
+ @pools = Pool.list_or_search(params[:q], params[:order_field],params[:order_dir])
end
respond_to do |format|
- format.js { render :partial => 'list' }
+ format.js { if filter_view?
+ render :partial => params[:only_tab] == "true" ? @details_tab[:view] : 'layouts/tabpanel'
+ else
+ render :partial => 'pretty_list'
+ end }
format.html
format.json { render :json => @pools }
end
diff --git a/src/app/helpers/application_helper.rb b/src/app/helpers/application_helper.rb
index 3049c7b..a73f293 100644
--- a/src/app/helpers/application_helper.rb
+++ b/src/app/helpers/application_helper.rb
@@ -210,4 +210,15 @@ module ApplicationHelper
result_string<<"#{"%02d"%hours.to_i}:#{"%02d"%minutes.to_i}:#{"%02d"%seconds.to_i}"
result_string.join(", ")
end
+
+ def owner_name(obj)
+ return '' unless obj.owner
+ # if last_name is set, use full name,
+ # else use login
+ if obj.owner.last_name.blank?
+ obj.owner.login
+ else
+ "#{obj.owner.first_name} #{obj.owner.last_name}"
+ end
+ end
end
diff --git a/src/app/helpers/instances_helper.rb b/src/app/helpers/instances_helper.rb
index 740b01f..b06286a 100644
--- a/src/app/helpers/instances_helper.rb
+++ b/src/app/helpers/instances_helper.rb
@@ -20,14 +20,4 @@
# Likewise, all the methods added will be available for all controllers.
module InstancesHelper
- def owner_name(inst)
- return '' unless inst.owner
- # if last_name is set, use full name,
- # else use login
- if inst.owner.last_name.blank?
- inst.owner.login
- else
- "#{inst.owner.first_name} #{inst.owner.last_name}"
- end
- end
end
diff --git a/src/app/models/deployment.rb b/src/app/models/deployment.rb
index 11e2b97..a9615ea 100644
--- a/src/app/models/deployment.rb
+++ b/src/app/models/deployment.rb
@@ -141,4 +141,15 @@ class Deployment < ActiveRecord::Base
end
errors
end
+
+ def self.list_or_search(query,order_field,order_dir)
+ if query.blank?
+ deployments = Deployment.all(:include => :owner,
+ :order => (order_field || 'name') +' '+ (order_dir || 'asc'))
+ else
+ deployments = search() { keywords(query) }.results
+ end
+ deployments
+ end
+
end
diff --git a/src/app/models/instance.rb b/src/app/models/instance.rb
index 4d1c5c6..c4820fa 100644
--- a/src/app/models/instance.rb
+++ b/src/app/models/instance.rb
@@ -292,6 +292,16 @@ class Instance < ActiveRecord::Base
(state == STATE_CREATE_FAILED) or (state == STATE_STOPPED and not restartable?)
end
+ def self.list_or_search(query,order_field,order_dir)
+ if query.blank?
+ instances = Instance.all(:include => [ :template, :owner ],
+ :order => (order_field || 'name') +' '+ (order_dir || 'asc'))
+ else
+ instances = search() { keywords(query) }.results
+ end
+ instances
+ end
+
named_scope :with_hardware_profile, lambda {
{:include => :hardware_profile}
}
diff --git a/src/app/models/pool.rb b/src/app/models/pool.rb
index 866ecce..081c171 100644
--- a/src/app/models/pool.rb
+++ b/src/app/models/pool.rb
@@ -91,4 +91,14 @@ class Pool < ActiveRecord::Base
#end
end
+ def self.list_or_search(query,order_field,order_dir)
+ if query.blank?
+ pools = Pool.all(:include => [ :quota, :pool_family ],
+ :order => (order_field || 'name') +' '+ (order_dir || 'asc'))
+ else
+ pools = search() { keywords(query) }.results
+ end
+ pools
+ end
+
end
diff --git a/src/app/views/deployments/_list.haml b/src/app/views/deployments/_list.haml
index 3f8064e..9d3e5d0 100644
--- a/src/app/views/deployments/_list.haml
+++ b/src/app/views/deployments/_list.haml
@@ -1,38 +1,52 @@
-= if request.xhr?
+- if request.xhr?
= render :partial => '/layouts/notification'
- form_tag do
- #object-actions
- = restful_submit_tag "Start", "start", deployments_path, "PUT"
- = restful_submit_tag "Stop", "stop", multi_stop_deployments_path, "GET"
- = restful_submit_tag "Launch new", "launch_new", launch_new_deployments_path, "GET"
- = restful_submit_tag "Delete", "delete", deployments_path, "DELETE"
+ = link_to "New Deployment", new_deployment_path, { :class => 'button' }
+ = label_tag "More actions"
+ = select_tag("more_actions",nil, :disabled => true)
- #search-actions
- = restful_submit_tag "Save Search", "save_search", deployments_path, "PUT"
- = restful_submit_tag "Save Selection", "save_selection", deployments_path, "PUT"
- = restful_submit_tag "Export to File", "export", deployments_path, "PUT"
%p
- Select:
- = link_to "All", @url_params.merge(:select => 'all')
- %span> ,
- = link_to "None", @url_params.merge(:select => 'none')
+ Viewing
+ = select_tag("deployments_running", "<option>Deployments running</option>",:disabled => true)
+ = @deployments.count.to_s + " results"
+ = text_field_tag :q, @search_term || "Search result for...", :disabled => true
%table#deployments_table
- = sortable_table_header @header
+ %tr
+ %th
+ = check_box_tag "all"
+ %th
+ -#there will be icons (belongs to mockups)
+ %th
+ Deployment name
+ %th
+ Deployed on
+ %th
+ Instances
+ %th
+ Pool
+ %th
+ Pool Family
+ %th
+ Owner
- @deployments.each do |deployment|
%tr
%td
- selected = @url_params[:select] == 'all'
%input{:name => "deployments_selected[]", :type => "checkbox", :value => deployment.id, :id => "deployment_checkbox_#{deployment.id}", :checked => selected }
%td
- = link_to deployment.name, deployment_path(deployment)
- %td
- = link_to deployment.deployable.name, deployable_path(deployment.deployable)
+ -#there will be icons (belongs to mockups)
%td
- = deployment.owner.login
+ = link_to deployment.name, deployment_path(deployment)
%td
= deployment.created_at
%td
+ = deployment.instances.count
+ %td
= link_to deployment.pool.name, pool_path(deployment.pool)
+ %td
+ = deployment.pool.pool_family.name
+ %td
+ = deployment.owner
diff --git a/src/app/views/layouts/_tabpanel.haml b/src/app/views/layouts/_tabpanel.haml
index c71cbac..2ccd801 100644
--- a/src/app/views/layouts/_tabpanel.haml
+++ b/src/app/views/layouts/_tabpanel.haml
@@ -1,9 +1,8 @@
#details-view.ui-tabs.ui-widget.ui-widget-content.ui-corner-all
%ul.ui-tabs-nav.ui-helper-reset.ui-helper-clearfix.ui-widget-header.ui-corner-all
- - @tab_captions.each do |tab|
- %li.ui-state-default.ui-corner-top{ :class => "#{'ui-tabs-selected ui-state-active' if @details_tab == slug(tab)}"}
- %a{ :href => url_for(@url_params.merge(:details_tab => slug(tab))), :id => "details_#{tab}"}
- %span
- = tab
+ - @tabs.each do |tab|
+ %li.ui-state-default.ui-corner-top{ :class => "#{'ui-tabs-selected ui-state-active' if @details_tab[:id] == tab[:id]}"}
+ %a{ :href => url_for(:details_tab => tab[:id], :view => "filter", :only_tab => true), :id => "details_#{tab[:id]}" }
+ = tab[:name]
#details-selected
- = render :partial => @details_tab
+ = render :partial => @details_tab[:view]
diff --git a/src/app/views/pools/_list.haml b/src/app/views/pools/_list.haml
index ff02c26..031aa94 100644
--- a/src/app/views/pools/_list.haml
+++ b/src/app/views/pools/_list.haml
@@ -1,28 +1,53 @@
- form_tag do
= link_to "New Pool", new_pool_path, { :class => 'button' }
- = restful_submit_tag "Destroy", 'destroy', multi_destroy_pools_path, 'DELETE', :id => 'delete_button'
+ = label_tag "More actions"
+ = select_tag("more_actions",nil, :disabled => true)
%p
- Select:
- = link_to "All", @url_params.merge(:select => 'all')
- %span> ,
- = link_to "None", @url_params.merge(:select => 'none')
+ Viewing
+ = select_tag("select_pools", "<option>All pools</option>",:disabled => true)
+ = @pools.count.to_s + " results"
+ = text_field_tag :q, @search_term || "Search result for...", :disabled => true
%table#pools_table
- = sortable_table_header @header
+ %tr
+ %th
+ = check_box_tag "all"
+ %th
+ -#there will be icons (belongs to mockups)
+ %th
+ Pool name
+ %th
+ Deployments
+ %th
+ Instances
+ %th
+ Pending
+ %th
+ Failed
+ %th
+ Quota used
+ %th
+ Pool Family
- @pools.each do |pool|
%tr
%td
- - selected = @url_params[:select] == 'all'
- %input{:name => "pools_selected[]", :type => "checkbox", :value => pool.id, :id => "pool_checkbox_#{pool.id}", :checked => selected }
- = link_to pool.name, pool_path(pool)
+ %input{:name => "pools_selected[]", :type => "checkbox", :value => pool.id, :id => "pool_checkbox_#{pool.id}" }
%td
- = pool.quota.maximum_running_instances or 'unlimited'
+ -#there will be icons (belongs to mockups)
+ %td
+ = pool.name
+ %td
+ = pool.deployments.count
+ %td
+ = 0 #pool.deployments.instances.count
+ %td
+ = 0 #there will be count of pending instances/deployments
+ %td
+ = 0 #there will be count of failed instances/deployments
%td
= pool.quota.percentage_used
='%'
%td
= pool.pool_family.name
- %td
- = pool.enabled
:javascript
$(document).ready(function () {
diff --git a/src/app/views/pools/_overview.haml b/src/app/views/pools/_overview.haml
index 4bd54f4..50c5b25 100644
--- a/src/app/views/pools/_overview.haml
+++ b/src/app/views/pools/_overview.haml
@@ -7,7 +7,7 @@
%li.stat
%h3=t("stats_bar_pools")
%span.your_pools
- =(a)pools.count
+ =(a)user_pools.count
%span.in_use
4
%li.stat
@@ -28,4 +28,4 @@
(TODO)15
%li.stat
%h3=t("stats_bar_quota_used")
- (TODO) 86%
\ No newline at end of file
+ (TODO) 86%
diff --git a/src/app/views/pools/index.haml b/src/app/views/pools/index.haml
index 7784a31..ff007ed 100644
--- a/src/app/views/pools/index.haml
+++ b/src/app/views/pools/index.haml
@@ -1,2 +1,28 @@
= render :partial => 'overview'
-= render :partial => 'pretty_list'
+= link_to "Pretty View", pools_path(:view => 'pretty'), :id =>'pretty_view'
+= link_to "Filtred View", pools_path(:view => 'filter'), :id => 'filtred_view'
+%div#view
+ - if params[:view] == 'filter'
+ = render :partial => 'layouts/tabpanel'
+ - else
+ = render :partial => 'pretty_list'
+
+:javascript
+ $(document).ready(function (){
+ $("#pretty_view").click(function(){
+ $.get($(this).attr("href"), $(this).serialize(),
+ function(result) {
+ $("#view").html(result);
+ }, "script");
+ return false;
+ });
+ $("#filtred_view").click(function(){
+ $.get($(this).attr("href"), $(this).serialize(),
+ function(result) {
+ $("#view").html(result);
+ $('#details-selected').hide();
+ $('#details-view').tabs('destroy').tabs();
+ }, "script");
+ return false;
+ });
+ });
diff --git a/src/features/pool.feature b/src/features/pool.feature
index 657e6b7..6c88c69 100644
--- a/src/features/pool.feature
+++ b/src/features/pool.feature
@@ -153,3 +153,22 @@ Feature: Manage Pools
And I accept JSON
When I delete "mockpool" pool
Then I should get back JSON object with success and errors
+
+ Scenario: Switch pretty view to filtred
+ Given I am on the pools page
+ And I see "Overview"
+ And I should see "expand all"
+ When I follow "Filtred View"
+ Then I should see "Pools" within "#details-view"
+ And I should see "Instances" within "#details-view"
+ And I should see "Deployments" within "#details-view"
+ And I should not see "expand all"
+ When I follow "Pretty View"
+
+ Scenario: Switch from filtred view to pretty
+ Given I am on the pools page
+ And I follow "Filtred View"
+ And I should see "Pools" within "#view"
+ When I follow "Pretty View"
+ Then I should not see "Pools" within "#view"
+ And I should see "expand all"
--
1.7.4.4
12 years
[PATCH configure] updates to puppet web resource type/provider for upstream compliance
by Mo Morsi
- renamed web_request back to web to better represent
a web resource
- encapsulate all methods previously defined at the global level
- added more validates to the type/provider
- bring things more inline w/ ood and the puppet way of doing things
---
recipes/aeolus/lib/puppet/provider/web/curl.rb | 178 ++++++++++++++++++++
.../aeolus/lib/puppet/provider/web_request/curl.rb | 128 --------------
recipes/aeolus/lib/puppet/type/web.rb | 95 +++++++++++
recipes/aeolus/lib/puppet/type/web_request.rb | 49 ------
recipes/aeolus/manifests/conductor.pp | 4 +-
recipes/aeolus/manifests/defaults.pp | 2 +-
6 files changed, 276 insertions(+), 180 deletions(-)
create mode 100644 recipes/aeolus/lib/puppet/provider/web/curl.rb
delete mode 100644 recipes/aeolus/lib/puppet/provider/web_request/curl.rb
create mode 100644 recipes/aeolus/lib/puppet/type/web.rb
delete mode 100644 recipes/aeolus/lib/puppet/type/web_request.rb
diff --git a/recipes/aeolus/lib/puppet/provider/web/curl.rb b/recipes/aeolus/lib/puppet/provider/web/curl.rb
new file mode 100644
index 0000000..86c5e0d
--- /dev/null
+++ b/recipes/aeolus/lib/puppet/provider/web/curl.rb
@@ -0,0 +1,178 @@
+require 'curb'
+require 'uuid'
+require 'fileutils'
+
+# Provides an interface to curl using the curb gem for puppet
+# TODO move this out into the puppet 'external' directory
+class Curl::Easy
+
+ def self.web_request(method, uri, request_params, params = {})
+ raise Puppet::Error, "Must specify http method (#{method}) and uri (#{uri})" if method.nil? || uri.nil?
+
+ curl = self.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
+
+ def valid_status_code?(valid_values=[])
+ valid_values.include?(response_code.to_s)
+ end
+
+ def valid_response_body?(test=/.*/)
+ body_str =~ Regexp.new(test)
+ end
+
+end
+
+# Puppet provider definition
+Puppet::Type.type(:web).provide :curl do
+ desc "Use curl to access web resources"
+
+ def get
+ @uri
+ end
+
+ def post
+ @uri
+ end
+
+ def delete
+ @uri
+ end
+
+ def put
+ @uri
+ end
+
+ def get=(uri)
+ @uri = uri
+ process_params('get', @resource, uri)
+ end
+
+ def post=(uri)
+ @uri = uri
+ process_params('post', @resource, uri)
+ end
+
+ def delete=(uri)
+ @uri = uri
+ process_params('delete', @resource, uri)
+ end
+
+ def put=(uri)
+ @uri = uri
+ process_params('put', @resource, uri)
+ end
+
+ private
+
+ # Helper to process/parse web parameters
+ def process_params(request_method, params, uri)
+ begin
+ # Set request method and generate a unique session key
+ session = "/tmp/#{UUID.new.generate}"
+
+ # Invoke a login request if necessary
+ session_request(params[:login]['http_method'], params[:login]['uri'], session,
+ params[:login].reject{ |k,v| k == 'http_method' || k == 'uri' },
+ params ) if params[:login]
+
+
+ # Check to see if we should actually run the request
+ return if params[:if] &&
+ skip_request?(params[:if]['http_method'], params[:if]['uri'], session,
+ params[:if]['parameters'], params[:if])
+
+ return if params[:unless] &&
+ !skip_request?(params[:unless]['http_method'], params[:unless]['uri'], session,
+ params[:unless]['parameters'], params[:unless])
+
+ # Actually run the request and verify the result
+ result = Curl::Easy::web_request(request_method, uri, params[:parameters],
+ :cookie => session, :follow => params[:follow])
+ verify_result(result,
+ :returns => params[:returns],
+ :body => params[:verify])
+ result.close
+
+ # Invoke a logout request if necessary
+ session_request(params[:logout]['http_method'], params[:logout]['uri'], session,
+ params[:logout].reject{ |k,v| k == 'http_method' || k == 'uri' },
+ params ) if params[:logout]
+
+ rescue Exception => e
+ raise Puppet::Error, "An exception was raised when invoking web request: #{e}"
+
+ ensure
+ FileUtils.rm_f(session) if params[:logout]
+ end
+ end
+
+ # Helper to issue login/logout requests
+ def session_request(http_method, uri, session, request_params, params = {})
+ Curl::Easy::web_request(http_method, uri, request_params,
+ :cookie => session, :follow => params[:follow]).close
+
+ end
+
+ # Helper to issue request to query if we should skip main request or not
+ def skip_request?(http_method, uri, session, request_params, params = {})
+ result = Curl::Easy::web_request(http_method, uri, request_params,
+ :cookie => session, :follow => params[:follow])
+
+ begin
+ verify_result(result,
+ :returns => params['returns'],
+ :body => params['verify'])
+
+ rescue Puppet::Error => e
+ return true
+
+ ensure
+ result.close
+ end
+
+ return false
+ end
+
+ # Helper to verify the response
+ def verify_result(result, verify = {})
+ if verify.has_key?(:returns) && !verify[:returns].nil? &&
+ !result.valid_status_code?(verify[:returns])
+ raise Puppet::Error, "Invalid HTTP Return Code: #{result.response_code},
+ was expecting one of #{verify[:returns].join(", ")}"
+ end
+
+ if verify.has_key?(:body) && !verify[:body].nil? &&
+ !result.valid_response_body?(verify[:body])
+ raise Puppet::Error, "Expecting #{verify[:body]} in the result"
+ end
+ end
+
+
+end
diff --git a/recipes/aeolus/lib/puppet/provider/web_request/curl.rb b/recipes/aeolus/lib/puppet/provider/web_request/curl.rb
deleted file mode 100644
index 925b865..0000000
--- a/recipes/aeolus/lib/puppet/provider/web_request/curl.rb
+++ /dev/null
@@ -1,128 +0,0 @@
-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
-
-# Helper to process/parse web parameters
-def process_params(request_method, params, uri)
- begin
- # Set request method and generate a unique session key
- session = "/tmp/#{UUID.new.generate}"
-
- # Invoke a login request if necessary
- if params[:login]
- login_params = params[:login].reject { |k,v| ['http_method', 'uri'].include?(k) }
- web_request(params[:login]['http_method'], params[:login]['uri'],
- login_params, :cookie => session, :follow => params[:follow]).close
- end
-
- # Check to see if we should actually run the request
- skip_request = !params[:unless].nil?
- if params[:unless]
- result = web_request(params[:unless]['http_method'], params[:unless]['uri'],
- params[:unless]['parameters'],
- :cookie => session, :follow => params[:follow])
- begin
- verify_result(result,
- :returns => params[:unless]['returns'],
- :body => params[: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 = params[:name] if uri.nil?
- result = web_request(request_method, uri, params[:parameters],
- :cookie => session, :follow => params[:follow])
- verify_result(result,
- :returns => params[:returns],
- :body => params[:verify])
- result.close
-
- # Invoke a logout request if necessary
- if params[:logout]
- logout_params = params[:login].reject { |k,v| ['http_method', 'uri'].include?(k) }
- web_request(params[:logout]['http_method'], params[:logout]['uri'],
- logout_params, :cookie => session, :follow => params[:follow]).close
- end
-
- rescue Exception => e
- raise Puppet::Error, "An exception was raised when invoking web request: #{e}"
-
- ensure
- FileUtils.rm_f(session) if params[:logout]
- end
-end
-
-# Puppet provider definition
-Puppet::Type.type(:web_request).provide :curl do
- desc "Use curl to access web resources"
-
- def get
- @uri
- end
-
- def post
- @uri
- end
-
- def get=(uri)
- @uri = uri
- process_params('get', @resource, uri)
- end
-
- def post=(uri)
- @uri = uri
- process_params('post', @resource, uri)
- end
-end
diff --git a/recipes/aeolus/lib/puppet/type/web.rb b/recipes/aeolus/lib/puppet/type/web.rb
new file mode 100644
index 0000000..bff2158
--- /dev/null
+++ b/recipes/aeolus/lib/puppet/type/web.rb
@@ -0,0 +1,95 @@
+require 'uri'
+
+Puppet::Type.newtype(:web) do
+ @doc = "Issue a request to a resource on the world wide web"
+
+ private
+
+ def self.validate_uri(url)
+ begin
+ uri = URI.parse(url)
+ raise ArgumentError, "Specified uri #{url} is not valid" if ![URI::HTTP, URI::HTTPS].include?(uri.class)
+ rescue URI::InvalidURIError
+ raise ArgumentError, "Specified uri #{url} is not valid"
+ end
+ end
+
+ def self.validate_http_status(status)
+ status = [status] unless status.is_a?(Array)
+ status.each { |stat|
+ stat = stat.to_s
+ unless ['100', '101', '102', '122',
+ '200', '201', '202', '203', '204', '205', '206', '207', '226',
+ '300', '301', '302', '303', '304', '305', '306', '307',
+ '400', '401', '402', '403', '404', '405', '406', '407', '408', '409',
+ '410', '411', '412', '413', '414', '415', '416', '417', '418',
+ '422', '423', '424', '425', '426', '444', '449', '450', '499',
+ '500', '501', '502', '503', '504', '505', '506', '507', '508', ' 509', '510'
+ ].include?(stat)
+ raise ArgumentError, "Invalid http status code #{stat} specified"
+ end
+ }
+ end
+
+ newparam :name
+
+ newproperty(:get) do
+ desc "Issue get request to the specified uri"
+ validate do |value| Puppet::Type::Web.validate_uri(value) end
+ end
+
+ newproperty(:post) do
+ desc "Issue post request to the specified uri"
+ validate do |value| Puppet::Type::Web.validate_uri(value) end
+ end
+
+ newproperty(:delete) do
+ desc "Issue delete request to the specified uri"
+ validate do |value| Puppet::Type::Web.validate_uri(value) end
+ end
+
+ newproperty(:put) do
+ desc "Issue put request to the specified uri"
+ validate do |value| Puppet::Type::Web.validate_uri(value) 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"]
+ validate do |value| Puppet::Type::Web.validate_http_status(value) end
+ munge do |value|
+ value = [value] unless value.is_a?(Array)
+ value = value.collect { |val| val.to_s }
+ value
+ end
+ 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
+
+ newparam(:if) do
+ desc "Only run request if the request specified here succeeds"
+ end
+end
diff --git a/recipes/aeolus/lib/puppet/type/web_request.rb b/recipes/aeolus/lib/puppet/type/web_request.rb
deleted file mode 100644
index 5225633..0000000
--- a/recipes/aeolus/lib/puppet/type/web_request.rb
+++ /dev/null
@@ -1,49 +0,0 @@
-Puppet::Type.newtype(:web_request) do
- @doc = "Issue a request via the world wide web"
-
- newparam :name
-
- newproperty(:get) do
- desc "Issue get request to the specified uri"
- # TODO valid value to be a uri
- end
-
- newproperty(:post) do
- desc "Issue get request to the specified uri"
- # TODO valid value to be a uri
- end
-
- #newproperty(:delete)
- #newproperty(:put)
-
- 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/manifests/conductor.pp b/recipes/aeolus/manifests/conductor.pp
index b3dc3aa..6695159 100644
--- a/recipes/aeolus/manifests/conductor.pp
+++ b/recipes/aeolus/manifests/conductor.pp
@@ -265,7 +265,7 @@ define aeolus::site_admin($email="", $password="", $first_name="", $last_name=""
# Create a new provider via the conductor
define aeolus::conductor::provider($type="",$url=""){
- web_request{ "provider-$name":
+ web{ "provider-$name":
post => "https://localhost/conductor/providers",
parameters => { 'provider[name]' => $name, 'provider[url]' => $url,
'provider[provider_type_codename]' => $type },
@@ -280,7 +280,7 @@ define aeolus::conductor::provider($type="",$url=""){
}
define aeolus::conductor::hwp($memory='', $cpu='', $storage='', $architecture=''){
- web_request{ "hwp-$name":
+ web{ "hwp-$name":
post => "https://localhost/conductor/hardware_profiles",
parameters => {'hardware_profile[name]' => $name,
'hardware_profile[memory_attributes][value]' => $memory,
diff --git a/recipes/aeolus/manifests/defaults.pp b/recipes/aeolus/manifests/defaults.pp
index f2fc891..57b79f6 100644
--- a/recipes/aeolus/manifests/defaults.pp
+++ b/recipes/aeolus/manifests/defaults.pp
@@ -12,7 +12,7 @@ $admin_user='admin'
$admin_password='password'
# Setup the default login/logout targets for web requests
-Web_request{
+Web{
login => { 'http_method' => 'post',
'uri' => 'https://localhost/conductor/user_session',
'user_session[login]' => "$admin_user",
--
1.7.2.3
12 years
Code sharing between Factory and Warehouse
by Pete Zaitcev
Hi, guys:
I transcoded Ian's code for uploading into vSpere yesterday, because
Warehouse is in C and he wrote it in Python... This got me thinking about
a sharing possibility. Currently, every registration in IW is a fork/exec
for a nicely self-contained program, with vSphere being by far the
most volumnous. Would it make sense to provide some kind of child
package, like iwhd-backends, which packaged them for outside use?
I suspect that Jeff himself had something like that in mind, because
these programs are traditionally called dc-something-register, which
I presume meant to make them a part of DeltaCloud, rather than internal
implementation details of iwhd.
The main objective is to fix any future bugs in one place. But I don't want
to do the work if nobody is going to use the result.
-- P
12 years
[PATCH conductor] extended dbomatic logging
by Mo Morsi
---
src/dbomatic/dbomatic | 60 ++++++++++++++++++++++++++++++++++++++----------
1 files changed, 47 insertions(+), 13 deletions(-)
diff --git a/src/dbomatic/dbomatic b/src/dbomatic/dbomatic
index e7f29b0..925d8d5 100755
--- a/src/dbomatic/dbomatic
+++ b/src/dbomatic/dbomatic
@@ -130,6 +130,8 @@ class CondorEventLog < Nokogiri::XML::SAX::Document
end
def update_instance_state_event(inst)
+ logger.info "update_instance_state_event for #{inst}"
+
if @trigger_type == "ULOG_GRID_SUBMIT"
inst.state = Instance::STATE_PENDING
elsif @trigger_type == "ULOG_JOB_ABORTED" or @trigger_type == "ULOG_JOB_TERMINATED"
@@ -177,6 +179,8 @@ class CondorEventLog < Nokogiri::XML::SAX::Document
end
def update_instance_cloud_id(inst)
+ logger.info "update_instance_cloud_id for #{inst}"
+
# The GridResource/ExecuteHost string looks like this:
# dcloud http://localhost:3001/api
@@ -219,6 +223,8 @@ class CondorEventLog < Nokogiri::XML::SAX::Document
end
def update_instance_addresses(inst)
+ logger.info "update_instance_addresses for #{inst}"
+
inst.public_addresses = @public_addresses
inst.private_addresses = @private_addresses
inst.save!
@@ -233,9 +239,11 @@ class CondorEventLog < Nokogiri::XML::SAX::Document
if inst.nil?
@logger.info "Unexpected nil instance, skipping..."
else
+ logger.info "Instance #{inst} found, running update events"
update_instance_state_event(inst)
update_instance_cloud_id(inst)
update_instance_addresses(inst)
+ logger.info "Instance #{inst} update events completed"
end
@tag = @event_type = @event_cmd = @event_time = @trigger_type = @grid_resource = @execute_host = @hold_reason = @public_addresses = @private_addresses = nil
end
@@ -248,6 +256,24 @@ class CondorEventLog < Nokogiri::XML::SAX::Document
end
end
+# Retrieve the current parsing position
+# of the log file as stored in the log
+# file postion tracker
+def get_log_file_pos
+ pos = 0
+ if File.exists?(EVENT_LOG_POS_FILE)
+ File.open(EVENT_LOG_POS_FILE, 'r') { |f| pos = f.read.to_i }
+ end
+ pos
+end
+
+# Set the current parsing position
+# of the log file in the log file
+# position tracker
+def set_log_file_pos(pos)
+ File.open(EVENT_LOG_POS_FILE, 'w') { |f| f.write pos.to_s }
+end
+
# FIXME we should make sure everything here is done atomically
def parse_log_file(parser)
# since the actual log file may be rotated out
@@ -256,9 +282,7 @@ def parse_log_file(parser)
# persistantly store log position in filesystem
# incase of dbomatic restarts
- if File.exists?(EVENT_LOG_POS_FILE)
- File.open(EVENT_LOG_POS_FILE, 'r') { |f| log_file.pos = f.read.to_i }
- end
+ log_file.pos = get_log_file_pos
# if the log has been rotated out
if log_file.pos > File.size(CONDOR_EVENT_LOG_FILE)
@@ -279,7 +303,7 @@ def parse_log_file(parser)
parser << s
end
- File.open(EVENT_LOG_POS_FILE, 'w') { |f| f.write log_file.pos.to_s }
+ set_log_file_pos(log_file.pos)
end
begin
@@ -295,20 +319,28 @@ begin
# Create one for parsing purposes.
parser << "<events>"
- notifier = INotify::Notifier.new
-
parse_log_file(parser) if File.exists? CONDOR_EVENT_LOG_FILE
+ logger.info "Parsed existing event log file - current postition: #{get_log_file_pos}"
- # Setup inotify watch for condor event log changes
- notifier.watch(condor_event_log_dir, :all_events){ |event|
- if event.name == "EventLog" && event.flags.include?(:modify)
- parse_log_file parser
- end
- }
-
+ logger.info "Beginning main event loop"
while true
begin
+ logger.info "Creating new notifier"
+ notifier = INotify::Notifier.new
+
+ # Setup inotify watch for condor event log changes
+ logger.info "Setting up notifier watch on #{condor_event_log_dir} directory"
+ notifier.watch(condor_event_log_dir, :all_events){ |event|
+ if event.name == "EventLog" && event.flags.include?(:modify)
+ logger.info "EventLog modification event triggered, parsing log"
+ parse_log_file parser
+ logger.info "EventLog modification event trigger completed, parsing finished - current position #{get_log_file_pos}"
+ end
+ }
+
+ logger.info "Running notifier"
notifier.run
+ logger.info "Notifier run completed"
rescue => e
logger.error "#{e.backtrace.shift}: #{e.message}"
e.backtrace.each do |step|
@@ -316,9 +348,11 @@ begin
end
end
end
+ logger.info "Main event loop completed"
parser << "</events>"
parser.finish
+ logger.info "Finished parsing, now exiting"
rescue => e
logger.error "#{e.backtrace.shift}: #{e.message}"
e.backtrace.each do |step|
--
1.7.2.3
12 years
newui - Masthead into partial; remove hardcoded username
by Matt Wagner
I just realized that we probably don't want to do a release with Andy Smith's name as a hardcoded username in the masthead. This is just a quick search to replace it with the user's first and last name; in doing so, I moved the masthead section into a partial.
-- Matt
12 years
[PATCH aeolus] Updated seed data to match core RHEVM
by Martyn Taylor
From: Martyn Taylor <mtaylor(a)redhat.com>
---
src/db/seeds.rb | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/db/seeds.rb b/src/db/seeds.rb
index 3ab3131..8c812ce 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 =>"rhev-m")
+ ProviderType.create!(:name => "RHEVM", :codename =>"rhevm")
ProviderType.create!(:name => "OpenNebula", :codename =>"opennebula")
end
--
1.7.4
12 years
[PATCH 1/2] Updated css and images from new layout
by Jan Provazník
From: Jan Provaznik <jprovazn(a)redhat.com>
---
src/app/stylesheets/layout.scss | 1383 ++++++++++++++++++------
src/public/images/sb_icon_alert.png | Bin 0 -> 508 bytes
src/public/images/sb_icon_deployment.png | Bin 0 -> 433 bytes
src/public/images/sb_icon_instance.png | Bin 0 -> 327 bytes
src/public/images/sb_icon_instance_failure.png | Bin 0 -> 325 bytes
src/public/images/sb_icon_instance_pending.png | Bin 0 -> 414 bytes
src/public/images/sb_icon_pool.png | Bin 0 -> 344 bytes
src/public/images/sb_icon_poolsemi.png | Bin 0 -> 354 bytes
src/public/images/sb_icon_provider.png | Bin 0 -> 422 bytes
src/public/images/sb_icon_quota.png | Bin 0 -> 443 bytes
src/public/images/sb_icon_update.png | Bin 0 -> 314 bytes
src/public/images/sb_separator.png | Bin 0 -> 188 bytes
12 files changed, 1078 insertions(+), 305 deletions(-)
create mode 100644 src/public/images/sb_icon_alert.png
create mode 100644 src/public/images/sb_icon_deployment.png
create mode 100644 src/public/images/sb_icon_instance.png
create mode 100644 src/public/images/sb_icon_instance_failure.png
create mode 100644 src/public/images/sb_icon_instance_pending.png
create mode 100644 src/public/images/sb_icon_pool.png
create mode 100644 src/public/images/sb_icon_poolsemi.png
create mode 100644 src/public/images/sb_icon_provider.png
create mode 100644 src/public/images/sb_icon_quota.png
create mode 100644 src/public/images/sb_icon_update.png
create mode 100644 src/public/images/sb_separator.png
diff --git a/src/app/stylesheets/layout.scss b/src/app/stylesheets/layout.scss
index 8452ec4..a50d82f 100644
--- a/src/app/stylesheets/layout.scss
+++ b/src/app/stylesheets/layout.scss
@@ -1,3 +1,633 @@
+/* ###########################################################################
+Generated SCSS for Aeolus UI [aeolus_ui]
+Compiled on Fri May 20 10:40:30 +0200 2011
+########################################################################### */
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Page Layout -- v.0.0.2 [layout] (reset.css)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+/* `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;
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Page Layout -- v.0.0.2 [layout] (960.css)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+/*
+ 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;
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Page Layout -- v.0.0.2 [layout] (layout.scss)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
$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;
@@ -10,7 +640,7 @@ html, body{ height: 100%; }
body{
background: url('../../images/body-bg.png');
font-family: $font-family-base;
- font-size: 0.750em; /* 12px base */
+ font-size: 12px; /* 12px base */
color: #333;
}
@@ -19,13 +649,14 @@ strong, em, b, i{ font-family: $font-family-em; }
#primary-container{
position: relative;
min-height: 100%;
- margin-bottom: -60px;
+ margin-bottom: -40px;
}
/* typography */
.label{
font-family: $font-family-base;
+ font-size: 12px;
}
.label.micro{ font-size: 9px; }
@@ -41,12 +672,10 @@ strong, em, b, i{ font-family: $font-family-em; }
color: #333;
}
-.label.small-caps{
+.label.caps{
text-transform: uppercase;
- font-size: 0.917em;
}
-
/* Content */
$contentpadding: 7px;
@@ -65,285 +694,29 @@ div#content{
border: 1px solid #999;
position: relative;
z-index: 100;
-
+
div.header{
background-color: #ccc;
height: 60px;
}
-
+
}
-/* Masthead */
-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: 960px;
- overflow: hidden;
- position: relative;
- }
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Page Layout -- v.0.0.2 [layout] (layout_ie.css)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
- 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 */
-$font-family-nav-primary: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
-
-
-nav#primary {
- ul.container{
- width: 950px;
- 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;
- }
- }
-}
-
-/* Nav History */
-nav#nav_history{
-
- display: block;
- margin: 6px 0px 12px 0px;
-
- ol.nav_hist_bar{
-
- list-style: none;
- display: inline;
-
- li{
- font-size: 11px;
- display: inline;
- }
-
- li + li:before{
- content: "|";
- }
-
- a{
- color: #666;
- &:hover{
- color: #333;
- }
- }
-
- }
-
-}
-
-/* Header */
-$font-family-primary: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
-
-div#content .page-header{
-
- display: block;
- background: #ccc;
- height: 56px;
- width: 952px;
- padding: 6px;
- position: relative;
- z-index: 900;
- background: transparent url('../../images/header_bg.png') repeat-x top center;
-
- box-shadow: 0 1px 1px rgba(0, 0, 0, 0.40);
- -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.40);
- -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.40);
-
- h1{
- font-family: $font-family-primary;
- font-weight: 200;
- font-size: 25px;
- margin-top: 6px;
- color: #333;
- text-shadow: 1px 1px 0 #fff;
- display: inline-block;
- }
-
- h1.pools{
- background: transparent url('../../images/header_icon_pools.png') no-repeat 8px center;
- padding: 6px 7px 7px 54px;
- }
-
- #obj_actions{
- position: absolute;
- right: 0px;
- top: 22px;
- display: inline-block;
- margin-right: 24px;
- }
-
- .corner{
- background: transparent url('../../images/header_corner.png') no-repeat top center;
- width: 10px;
- height: 10px;
- position: absolute;
- right: 0px;
- bottom: -10px;
- z-index: 1;
- }
-
- .button{
- border-color: #fff;
- }
-
-}
-
-/* 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;
- }
- }
-
-}
-
-/* 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; }
-}
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Application Button Set -- v.0.0.1 [button] (button.scss)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* ------------------------------------------
CSS3 GITHUB BUTTONS (Nicolas Gallagher)
-Licensed under Unlicense
+Licensed under Unlicense
http://github.com/necolas/css3-github-buttons
------------------------------------------ */
@@ -418,12 +791,12 @@ http://github.com/necolas/css3-github-buttons
.button.icon:before {
content: "";
- position: relative;
- top: 1px;
+ position: relative;
+ top: 1px;
float:left;
- width: 12px;
- height: 12px;
- margin: 0 0.75em 0 -0.25em;
+ width: 12px;
+ height: 12px;
+ margin: 0 0.75em 0 -0.25em;
background: url(../../images/button-icons.png) 0 99px no-repeat;
}
@@ -599,10 +972,10 @@ http://github.com/necolas/css3-github-buttons
.button.danger:hover,
.button.danger:focus,
-.button.danger:active {
+.button.danger:active {
border-color: #b53f3a;
border-bottom-color: #a0302a;
- color: #fff;
+ 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);
@@ -611,7 +984,7 @@ http://github.com/necolas/css3-github-buttons
}
.button.danger:active,
-.button.danger.active {
+.button.danger.active {
border-color: #a0302a;
border-bottom-color: #bf4843;
background-color: #b33630;
@@ -624,9 +997,9 @@ http://github.com/necolas/css3-github-buttons
/* ............................................................................................................. Pill */
.button.pill {
- -webkit-border-radius: 50em;
- -moz-border-radius: 50em;
- border-radius: 50em;
+ -webkit-border-radius: 50em;
+ -moz-border-radius: 50em;
+ border-radius: 50em;
}
/* ............................................................................................................. Disable */
@@ -638,7 +1011,7 @@ http://github.com/necolas/css3-github-buttons
/* ............................................................................................................. Big */
.button.big {
- font-size: 14px;
+ font-size: 14px;
}
.button.big.icon:before { top: 0; }
@@ -654,8 +1027,8 @@ http://github.com/necolas/css3-github-buttons
padding: 0;
margin: 0;
/* IE hacks */
- zoom: 1;
- *display: inline;
+ zoom: 1;
+ *display: inline;
}
.button + .button,
@@ -673,41 +1046,41 @@ http://github.com/necolas/css3-github-buttons
.button-group .button {
float: left;
- margin-left: -1px;
+ 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 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 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;
+.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;
+ border: 1px solid #d4d4d4;
text-shadow: none;
background-image: none;
background-color: #fff;
@@ -735,3 +1108,403 @@ http://github.com/necolas/css3-github-buttons
.button-container .button-group {
vertical-align: top;
}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Application Input Controls -- v.0.0.1 [input] (input.scss)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+/* 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; }
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+App Masthead -- v.0.0.2 [masthead] (masthead.scss)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+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: 960px;
+ 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 Tab Navigation -- v.0.0.2 [nav_primary] (nav_primary.scss)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+/* Primary Nav */
+$font-family-nav-primary: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
+
+
+nav#primary {
+ ul.container{
+ width: 950px;
+ 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;
+ }
+ }
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Breadcrumb Navigation -- v.0.0.2 [nav_hist_bar] (nav_hist_bar.scss)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+nav#nav_history{
+
+ display: block;
+ margin: 6px 0px 12px 0px;
+
+ ol.nav_hist_bar{
+
+ list-style: none;
+ display: inline;
+
+ li{
+ font-size: 11px;
+ display: inline;
+ }
+
+ li + li:before{
+ content: "|";
+ }
+
+ a{
+ color: #666;
+ &:hover{
+ color: #333;
+ }
+ }
+
+ }
+
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Page Header -- v.0.0.1 [header] (header.scss)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+$font-family-primary: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
+
+div#content .page-header{
+
+ display: block;
+ background: #ccc;
+ height: 56px;
+ width: 952px;
+ padding: 6px;
+ position: relative;
+ z-index: 900;
+ background: transparent url('../../images/header_bg.png') repeat-x top center;
+
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.40);
+ -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.40);
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.40);
+
+ h1{
+ font-family: $font-family-primary;
+ font-weight: 200;
+ font-size: 25px;
+ margin-top: 6px;
+ color: #333;
+ text-shadow: 1px 1px 0 #fff;
+ display: inline-block;
+ }
+
+ h1.pools{
+ background: transparent url('../../images/header_icon_pools.png') no-repeat 8px center;
+ padding: 6px 7px 7px 54px;
+ }
+
+ #obj_actions{
+ position: absolute;
+ right: 0px;
+ top: 22px;
+ display: inline-block;
+ margin-right: 24px;
+ }
+
+ .corner{
+ background: transparent url('../../images/header_corner.png') no-repeat top center;
+ width: 10px;
+ height: 10px;
+ position: absolute;
+ right: 0px;
+ bottom: -10px;
+ z-index: 1;
+ }
+
+ .button{
+ border-color: #fff;
+ }
+
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Statistics Scoreboard -- v.0.0.1 [scoreboard] (scoreboard.scss)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+$font-family-primary: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
+$dd_padding: 10px;
+$dd_icon_padding_right: 4px;
+
+#scoreboard{
+
+ background-color: #efefef;
+ display: inline-block;
+ padding: 8px $dd_padding 10px $dd_padding;
+ height: 40px;
+
+ /* statistic group list */
+ ul.groups{ list-style: none; }
+ ul.groups > li{
+ display: inline-block;
+ text-align: center;
+ margin: 0px;
+ }
+ ul.groups > li + li{
+ background: transparent url('../../images/sb_separator.png') repeat-y 0px 0px;
+ padding-left: 2px;
+ margin-left: -6px;
+ }
+
+ /* statistic sub-group list */
+ ul.subgroup{ list-style: none; }
+ ul.subgroup > li{ display: inline-block; text-align: center; }
+ ul.subgroup > li + li{ margin-left: -$dd_padding; }
+
+ dt{
+ text-align: center;
+ font-size: 11px;
+ font-weight: normal;
+ color: #999;
+ margin-bottom: 6px;
+ text-transform: uppercase;
+ padding: 0px $dd_padding 0px $dd_padding;
+ }
+
+ dd{
+ display: inline;
+ padding: 0px $dd_padding 0px $dd_padding;
+ font-size: 20px;
+ color: #999;
+ font-family: $font-family-primary;
+ }
+
+ dd + dd{
+ margin-left: -$dd_padding; /* compensate for padding-right */
+ }
+
+ /* icons */
+
+ dd.pool{
+ background: transparent url('../../images/sb_icon_pool.png') no-repeat $dd_padding 4px;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 15px;
+ }
+
+ dd.pool.partial{
+ background: transparent url('../../images/sb_icon_poolsemi.png') no-repeat $dd_padding 4px;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 15px;
+ }
+
+ dd.provider{
+ background: transparent url('../../images/sb_icon_provider.png') no-repeat $dd_padding 4px;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 22px;
+ }
+
+ dd.deployment{
+ background: transparent url('../../images/sb_icon_deployment.png') no-repeat $dd_padding 4px;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 23px;
+ }
+
+ dd.instance{
+ background: transparent url('../../images/sb_icon_instance.png') no-repeat $dd_padding 4px;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 14px;
+ }
+
+ dd.instance.pending{
+ background: transparent url('../../images/sb_icon_instance_pending.png') no-repeat $dd_padding 4px;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 15px;
+ }
+
+ dd.instance.failure{
+ background: transparent url('../../images/sb_icon_instance_failure.png') no-repeat $dd_padding 4px;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 16px;
+ }
+
+ dd.alert{
+ background: transparent url('../../images/sb_icon_alert.png') no-repeat $dd_padding 4px;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 29px;
+ }
+
+ dd.update{
+ background: transparent url('../../images/sb_icon_update.png') no-repeat $dd_padding 4px;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 14px;
+ }
+
+ dd.quota{
+ background: transparent url('../../images/sb_icon_quota.png') no-repeat $dd_padding 4px;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 16px;
+ }
+
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Page Footer -- v.0.0.1 [footer] (footer.scss)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+/* Footer */
+
+footer.standard{
+
+ background: rgba(0, 0, 0, 0.20);
+ position: relative;
+ height: 40px;
+ width: 100%;
+ font-size: 11px;
+ clear:both;
+
+ div.container{
+ margin: 0 auto;
+ width: 946px;
+ background: rgba(0, 0, 0, 0.12);
+ padding: 0px 10px 0px 10px;
+ height: 40px;
+ }
+
+ img.logo{
+ margin-right: 14px;
+ }
+
+ span.copyright{
+ display: inline-block;
+ color: #666;
+ }
+
+ nav.footer{
+ display: inline-block;
+ padding: 14px;
+ a{
+ color: #fff;
+ padding-right: 6px;
+ }
+ }
+
+}
+
diff --git a/src/public/images/sb_icon_alert.png b/src/public/images/sb_icon_alert.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff4ffac1709efe8ef9ad0c06b5c6e0fc49daab8a
GIT binary patch
literal 508
zcmeAS@N?(olHy`uVBq!ia0vp^vOp}r!3HE>@s?Z!QY^(zo*^7SP{WbZ0pxQQctjR6
zFmMZjFyp1Wb$@_@G9|7NCBgY=CFO}lsSJ)O`AMk?Zka`?<@rU~#R|^BriEJ{n*r5{
zg48(|r6!hS=I1GdWag$anCcr^=o=c|ozI)fz`z*l>Eak-(Ytl(#lS-j0&V+KD%`ad
z!UWbh%+);*(FlU>tWNBjjNCum*Ep<kc)?)xp^;bkd`qL@KmGFR?X&fNZl12PL#4N&
zXa1~NH`~NKt(cht7@BWgTYi0-Z)vA^`hoB*+l@ANGapdg!0;>A@_==~5%YP!EV49a
z$S|b2Gcc}esN8cSyD{%kil=G;|Cxq|f(L9PF0IHbef7RbKvnHP%%vNRt;~#ae>wdw
z?vVSEv27dw6NiUqgUp`HS+qxPNm?229Ol~^AJ0iIcv7Jqt*ZHEp`F;p*7US(1=0Ec
zxk_xkqpmG1JwH7y?5OsGw%FI@3uA&jq|Ut%-ca(x?ULz-Yl0#Px0PS%JUH4oUC!T{
zh3QLhnHZbAw(Ws`PoI~pSu)EbYJ+vXurc?)nZI91ajdzVk(iox@cC1F2F6noQ8#CO
u{M~=KHSVmAO78Bw`~|a%cd?y1bu>S0Mp@2p|K*_gW$<+Mb6Mw<&;$UwwaeQ8
literal 0
HcmV?d00001
diff --git a/src/public/images/sb_icon_deployment.png b/src/public/images/sb_icon_deployment.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c069e924dfe504fb5be1695bb786aafeb182254
GIT binary patch
literal 433
zcmeAS@N?(olHy`uVBq!ia0vp^;y^6G!3HG%>OYYHQY^(zo*^7SP{WbZ0pxQQctjR6
zFmMZjFyp1Wb$@_@G9|7NCBgY=CFO}lsSJ)O`AMk?Zka`?<@rU~#R|^BriEJ{n*r5{
zg48(|r6!hS=I1GdWag$anCcr^=o=c|ozI)fz`)4m>Eak-(Ytoa#lk}dJPz?Sf2Q+F
zH0Dj1x7ESQaWbzFQ_ck5SG*sXK27CKXz^o^ULtRJWoc%C{vLT%tEV@o`D>nV37zi1
z9df{G+4lxv!Sa=_fB*aCJ5jTa&1S=|#ZNf)beyo9I{S=ly-!D?MdyBBJvSHG4{SA`
z?zSzjp3UGDx|Y#gtAF+MkCm)%jFxETYVFVUK5299<>^qlev{b(PG6nZt>UYwZ;`pt
zDj?&qaFyu)_qlxQ+a3xPSup$dSZ-<i<9+9t=bf}`)63g69=R@I?)Z59Ku@B?KmOpD
zTN5W;p0_t~#tF@72RuW~84Two)pecg=un@ziv8i5t@ju@JeaQ>NL==X;mWmJY!A45
XUj=fn=GssI3^oQ&S3j3^P6<r_z7VJ;
literal 0
HcmV?d00001
diff --git a/src/public/images/sb_icon_instance.png b/src/public/images/sb_icon_instance.png
new file mode 100644
index 0000000000000000000000000000000000000000..e23dd4ae227a0fe8d01c67b1b62d57d0fbc73d79
GIT binary patch
literal 327
zcmeAS@N?(olHy`uVBq!ia0vp^d_XL~!3HGNrubO_DVAa<&kznEsNqQI0P;BtJR*x3
z7`TN%nDNrxx<5ccnG)BClHmNblJdl&R0hYC{G?O`x6Go{^8BLgVg=`5)55Kf&4B7e
zLF$}~QWHxu^Yau!GILWIO!W;d^bHN~&gV@9Dp=s@;uxYaaqgsxyoU^UT;?zSci88h
zQVEM$B6Gx%cU-cpY8>&c6Rf;W*QzeB-c+*f$sERl@7x8<ep^gezG7AoP2*?UvA%zy
zLHG+U9Y&Ms^A$OCN<Bi4-mP~MJYmrn^zXWy*V5kLlV`SFkqZb_{j_^Qhr*`R-3i{i
z9gMB7$6a}qlh&^0XWdqBl$iV>);W85{dDEDZ%gX$Y>ngO&|kdx4_nq;t=C;wIQxKZ
OW$<+Mb6Mw<&;$TWQE_Vk
literal 0
HcmV?d00001
diff --git a/src/public/images/sb_icon_instance_failure.png b/src/public/images/sb_icon_instance_failure.png
new file mode 100644
index 0000000000000000000000000000000000000000..1605819ea7a0dd2751b66e4d412d6e5c589a8e35
GIT binary patch
literal 325
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf<Z~8yL>4nJ
za0`Jj<E6WGe}IBAC9V-A!TD(=<%vb942~)JNvR5MnMJAP`9;~q3eLf%g<Bt+0o93u
z)HxTWCYEI8=P86_=B6^3>Kj_<8yeo7&zlNVFwfJ)F~p*G>Evi$Cqn@je`%HnEZnNf
zODq^w9xS-d$Yyr%P-zp39mf*$DR!5B-g!IouIH{kpR{f4at9hWiFq#H^MLKaqE6|S
zdY>BReT>(gY-dF>eds+|?m69lZ${e5@CS0P_KeK$If8GQ{yKQ(P|v}gTOG9z1x{LR
z`{BT)SwR<n{p{rISZpBhDO$oXvQgpX&Xd<OKea0EKIS)>m*)dh(G5!{jSE+H16|7C
M>FVdQ&MBb@06@5PQ~&?~
literal 0
HcmV?d00001
diff --git a/src/public/images/sb_icon_instance_pending.png b/src/public/images/sb_icon_instance_pending.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c7f909883fd26abede7a98a43363de0fc3d3997
GIT binary patch
literal 414
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>Kj_<8yeo7&zlNV@ZHnJF+^kH(n%Ks4?FO<%+LS9FMCAR
zf%9Z6^ScIZMO6#g9WB}ic{2()FEGAqD4D<?_VH-5q{O%PVY?^!1v#@CSF`vzuzd^7
zVB<14B4Ix_N9!@8M5FBO9SpHOg}Y{^)~sc5?Ub3j>*JB*5|6K}xXRCZuW?RLRrGX|
z&FQMOL5*fF`mF`+C96aCd(?9&F?30v&6#qrSNVc=+>-N+sjI%qS0|Wk*4ek(s_3rW
znrM~@8<^w5j#=B(xQB7}MHe<4xX!r1Yk%YGXAY(e@|VO!&R0!i;L&-kAI-VS_IFhK
z|JaDBKM%;~|K7H0$|aU92WF;r^hMUZc5BeKYs+Gplz;XGFbEhtUHx3vIVCg!0N>Y`
A9RL6T
literal 0
HcmV?d00001
diff --git a/src/public/images/sb_icon_pool.png b/src/public/images/sb_icon_pool.png
new file mode 100644
index 0000000000000000000000000000000000000000..281704b1ab02321299fb8b78ffa1bfc67a9e5fd6
GIT binary patch
literal 344
zcmeAS@N?(olHy`uVBq!ia0vp^{6H+g!3HExhN-duDVAa<&kznEsNqQI0P;BtJR*x3
z7`TN%nDNrxx<5ccnG)BClHmNblJdl&R0hYC{G?O`x6Go{^8BLgVg=`5)55Kf&4B7e
zLF$}~QWHxu^Yau!GILWIO!W;d^$iVEm9v2I3>!UN978lF9-Uywb;v=)CBA9t+}_q!
z*RCn|9B#@u^e=Ef!CNF;%(6E11IIIlrfHhr*`iWfLyx@SdSp`n<HL-f_7h8((hls?
z=n}P^w1s(^!(^tVx1&9$E?L!{e@BP?-X*5v`%>cVY#6UOXlH(GoN4DHHTlb`@(&gw
z-?I4|Cw{&jv4d4_;mQv&){Coegl|26KvC^xyK%z1n!lf){J)no_k3eC!{ptW!VI3#
gyG|`!)oVE0TC7{+_vDYq?tonH>FVdQ&MBb@0CA;&$N&HU
literal 0
HcmV?d00001
diff --git a/src/public/images/sb_icon_poolsemi.png b/src/public/images/sb_icon_poolsemi.png
new file mode 100644
index 0000000000000000000000000000000000000000..7e8828d506f2becd9d5b88cbbb4694e9bc52046c
GIT binary patch
literal 354
zcmeAS@N?(olHy`uVBq!ia0vp^{6H+g!3HExhN-duDVAa<&kznEsNqQI0P;BtJR*x3
z7`TN%nDNrxx<5ccnG)BClHmNblJdl&R0hYC{G?O`x6Go{^8BLgVg=`5)55Kf&4B7e
zLF$}~QWHxu^Yau!GILWIO!W;d^$iVEm9v2I47)vD978lFE}gWI_mF{rYy6@MmmLm@
z++@%+XYkNrP+qc_XYv6Kg9G7i3L*i)7cZnRYdkvCB~Um?KQev(moIN7D|?13u<E64
zTc$ke+ySl?NebnEqk<GyzIdP={`pAuHHVw2--NfH6D*MCsy{aCvf>Akh+U#0^$GsQ
z)-6rB#ab(;h}7iXkC_>H@%Wp=(w^1Z>;EUp?SCMC_CnL+{gsSo8ay>@PR+USCv(nM
qxdUfn*D5o3x+mOrt~#|T=R51JIz6E`qB;ve{_u45b6Mw<&;$Tjy?|8!
literal 0
HcmV?d00001
diff --git a/src/public/images/sb_icon_provider.png b/src/public/images/sb_icon_provider.png
new file mode 100644
index 0000000000000000000000000000000000000000..e3faf7e9f92e1a69475b6750428c7b6206c70557
GIT binary patch
literal 422
zcmeAS@N?(olHy`uVBq!ia0vp^Vn8gw!3HFS-u9~jDVAa<&kznEsNqQI0P;BtJR*x3
z7`TN%nDNrxx<5ccnG)BClHmNblJdl&R0hYC{G?O`x6Go{^8BLgVg=`5)55Kf&4B7e
zLF$}~QWHxu^Yau!GILWIO!W;d^bHN~&gV@9D){f|;uvDlyY|w>!X^iSV;}8(?qwe2
zb7D`t!S=>sje|8unS+*qwFlP^k2MO@CWSb}O*>PWEVJ{+-i>$u=0)l~_EOPp5Q|`P
z{qTzS#hEwC_l*0L8E%ShVcf;h^EoN)_UuGY)en`dJe!R-o3(wm7yE9$h~d25rp-1j
z{QrLPez0IZ_I*pD;=2k)o3k#At9DGNo*ukU=tB3&#=T4U4xF)iFyX<JNmibr9LzZ?
zU;E5CD;RScz9&k=F&cR$Z+P&)pzcCe-s^d>e?EsDjF7r?jA_H(l79aW)n9|G^^z)b
z)Ala@?IL2a|9H7`<6{>87oYfEnA<(xI`eCs&i_ui##QTHU*<nimEgnf7$F4=3I<PC
KKbLh*2~7YyP^6*&
literal 0
HcmV?d00001
diff --git a/src/public/images/sb_icon_quota.png b/src/public/images/sb_icon_quota.png
new file mode 100644
index 0000000000000000000000000000000000000000..70abe9deb9c7ff4b03e9c9d387aea7cd2785273a
GIT binary patch
literal 443
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf<Z~8yL>4nJ
za0`Jj<E6WGe}IBAC9V-A!TD(=<%vb942~)JNvR5MnMJAP`9;~q3eLf%g<Bt+0o93u
z)HxTWCYEI8=P86_=B6^3>Kj_<8yeo7&zs7?z$oJB;uvDlJ9n~e-XRA8xB0qUOE`|!
zwmj(*3SX(@XcE+A@`J4~?*MO6>m7#YY-R4oLU$PMA4v5oZWfv6x_YXs!R0quW%teP
zcMA*7SS9Abm(#RZYK6;^FLNids~upBn6;WQ>h|)+dR?Wvt_L27Rc!Hy7A)MrJ%Q=|
zw40J1u1jX$_<8VwyrAZxO$<H;;a7!z7^roxc_tgs?P15#zHHUh)K8MkdXK(|S?q{D
za)2x2(5&?{@8&jy=IooDcs`2Z`jOUEb-f}H3_Ezz%2Pf(VCg#`JfWvSIDt<ld4b9E
z+Z>JJ(ca&M{lCP2WeNFz;QayPzo%2zb!Pusmv%tp2J>BqTkFMM<ea&h`0J}n+Lzj<
hg^8bX-&p)-G?*Q-s_d@L24Da(c)I$ztaD0e0stb=tyTa4
literal 0
HcmV?d00001
diff --git a/src/public/images/sb_icon_update.png b/src/public/images/sb_icon_update.png
new file mode 100644
index 0000000000000000000000000000000000000000..d394c24cfbe6ec59fdb8ac7bb7a77f72e7b76440
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0vp^d_XL~!3HGNrubO_DVAa<&kznEsNqQI0P;BtJR*x3
z7`TN%nDNrxx<5ccnG)BClHmNblJdl&R0hYC{G?O`x6Go{^8BLgVg=`5)55Kf&4B7e
zLF$}~QWHxu^Yau!GILWIO!W;d^bHN~&gV@9Dwyo);uxYaaqXmwoQDl~T;iSnP4?a6
z)GT&FBlg1q<s-9q2yd}BW4V6p$lJz;I$tarO+2j_kK49ZGB6c<W?(sR{~*Jgm#tBU
zFEK2hS;^q}(Jv|daDrtPgHl0U*3JBwuyAjiGjC?vpOoJlDEmM)cjtsX%PppOUfMnB
z7n9t{>I7ZssMis~6aG$*N)SHrE3^OV<X0Ls4FB{Ljq8gn)q&1q@O1TaS?83{1OQi*
BZesud
literal 0
HcmV?d00001
diff --git a/src/public/images/sb_separator.png b/src/public/images/sb_separator.png
new file mode 100644
index 0000000000000000000000000000000000000000..f50ca46b0e3b875e55c544ee91238002ce8bb7a5
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nRmSQK*5Dp-y;YjHK@;M7UB8wRq
zxP?HN@zUM8KR`j564!{5;QX|b^2DN42FH~Aq*MjB%%art{G#k)1?OPX!mW?Zfa*j+
z>YR&G6H7Al^Atidb5j{i^$jic4GmM3vw-ppqMj~}AsjQ4|NIAn&FSZj3=AC@8KTax
UrLUi}AOobr)78&qol`;+0MbV@ga7~l
literal 0
HcmV?d00001
--
1.7.4.4
12 years