Conductor UI - some ideas for a better conductor
by Andrew Fitzsimon
Hi all,
I've spent quite some time thinking about global UI improvements we can make to conductor for a future release.
Now it's time for me to share a small summary of those ideas and hopefully get some feedback.
I'll be updating http://ndftz.com/playground/ with much the stuff mentioned below but as of right now it is not a representation of the functionality described; so if you have seen it before, please disregard everything aside from the responsiveness and the vector icons aspects. I'll now switch gears to get the mock interface up to speed with all the client side features described.
(attached is a formatted copy in-case you don't like reading markdown)
.. so here we go..
======================
#Goals for a better UI
> This is a plan to evolve the conductor UI into a lean, adaptive, beautiful and considered experience.
### Specifically, we hope to address:
* Navigating and issuing tasks quickly
* Without unnecessary http-roundtrips just to check on a view.
* Without having to learn new components in every view
* Without having to refer to documentation to be assisted in core tasks.
* Keeping the ‘big 6’ consistent:
* Consistent aesthetic
* Consistent behaviour
* Consistent notification
* Consistent messaging
* Consistent help
* Consistent referencing
* Address as many media types as we can get *for free*
* __Mobile__ - 480px and up via minor accommodations in our UI
* __Workstation__ 640px-1280px - our default view
* __Section 508__ compliance including screen readers
* __Printable__ - As a read-only inventory manifest of a users entire access.
* Feel like a 2012 client app
* Cutting edge UI conventions
* Swiss style visual metaphors & elements of typographic style
* Baseline grid aligned typography consisting of 2 weights with single leading.
* Use only vector graphics
* Blazingly fast client side render times
# Glossary of terms / explanation of features.
## Views
One distinct category of content.
### explained
“the users view” or “the providers view”.
A views name can even be as specific as “userXX-provider-permissions view” or “admin-provider-permissions-userXX view”
For more information on how we implement views, see 'View anchors' below
******
## Classes
Think HTML/CSS/JS classes
Classes track status or content type but not display.
<a href="#provider23" class="provider23 enabling ec2" >online</a>`
<div id="provider23" class="provider23 enabling ec2">Ec2…</div>
### Classing convention
#### Reserved classes
.active
is reserved for navigating views
.enabling .disabling .verifying .deleting .requesting
are action classes reserved for client side action confirmation
.enabled .disabled .verified .complete .building
are action classes reserved for server events
.warning .note .info .tip .caution
are reserved for assistive content
.static-reference .assist-reference
reserved for anchored clones of content via static and assistive referencing (see section)
.progress .loading .building .compiling .altering
are progress classed to be used in conjunction with a numerical class
.50 .10 .20 .25 .75 .100 .30 etc…
are percentage classes to be used in conjunction with a value
e.g.: `<span class="75 usage">75% of 300gb </...`
or better: `<span class="75 usage">225gb of 300gb </...`
.usage .progress .load .capacity
are **status** classes reserved for identifying the **type** of measurement
.instance .provider .user .pool .group
are object classes to be used on any object
### Lack of classes for layout
We will __NOT__ use classes for defining grid layout e.g. `.span-12` or `.left-120/`
All layouts will be defined in CSS via a combination of their parent view and the relevant media query.
for example we will use the CSS
#admin #providers .account .summary{width:33.333%}
rather than relying on injecting style logic into the html like this `<class="summary span-4">`
******
## Graceful degradation
Support for all core functionality in as many scenarios as possible
* New browser features (subtle animation, gradients etc)
* Older browsers lacking features
* Browsers with javascript turned off
* Screen readers (section 508, we’re going there)
******
## Responsive design
Support for viewing from various media eg cellphones, touchscreen devices, kiosks, tv’s, even print.
### Explained
1. We collapse tables into record views for narrow screens.
2. We Grow fonts and icons for tremendously high resolutions or touchable large screens.
3. We use only vector graphics (css /webfonts) for adaptive scaling and themeing.
Anchor referencing with js inlining means repeated content is printed only once. a print version would read like an infrastructure status report from the users perspective.
******
## Visual Metaphors & Vector Graphics
Visual metaphors are graphics symbolic of the function they perform.
Vector graphics are a resolution independent implementation.
### Explained
All icons, visual indicators and ornamental graphics are implemented like this:
* Vector glyphs are encoded into a woff webfont
* The woff font is base64 encoded in the stylesheet to minimise http requests (the current set of 30 icons is ~5k) so this is very acceptable.
* We fallback to url linked images supplies for legacy browsers (no .WOFF support) by using [modernizr](http://www.modernizr.com/) classes `.no-webfonts` and `.webfonts` to discriminate our implementation through css
******
## View anchors - or 'single page app'
View anchors are portions of our design implemented within the one DOM using basic anchoring functionality.
### Explained
In the proposed change, the entire conductor is one page for all default views,
1. Link anchors will activate the specific view or sub-view.
2. Anchors that do not resolve will initiate a "cannot find" message which will most commonly occur when a user does not have access to an object and has manually entered a custom # URL. the two exceptions to this will be ~/# and ~/#top which will initiate the default app view.
### In action
For example:
> The URL below should open the admin > providers > ec2eastcoast > connectivity view.
https://conductor/#ec2eastcoast-connectivity
^ ^ ^
Server ObjectID ChildView
#### What the html does
e.g. the `<div>` representing admin > providers > ec2eastcoast would look like
<div id="ec2eastcoast">.. ec2 east coast information goes here
and the connectivity tab which exists inside the ec2eastcoast provider would look like
<div id="ec2eastcoast-connectivity">
^ ^
objectID ChildViewname
Why?
Because the provider _ec2eastcoast_ lives natively within the _admin > provider_ section, it does not need to be referenced in the ID.. it simply has to be unique. But because the connectivity tab is only unique because of the provider it is associated with, it needs to be prefixed with the objectID
All direct links to the provider view would look like `<a href=#ec2eastcoast>EC2 East Coast</a> which would activate the provider tab.
#### what JS does
1. JS hides all non active views except for the default view (classed as active by the js)
2.
3. when an ID is requested the object and all parent views get classed `.active`
4. [hashchange for old browsers](http://benalman.com/projects/jquery-hashchange-plugin/) to preserve browsing history
#### what the CSS does
The body class `.nojs` is removed once Javascript is loaded so the CSS specifies that only views be visible when they are classed as `.active`
.js div{display:none} // Hiding all views
.js div.active{display:block} // Showing active views
.nojs div{display:block} // All views are shown when tabs don't work.
******
## Referenced content
> Referenced content is a live-copy of any existing part of the application. It can be implemented with static references or assistive references
> See [this JS Fiddle demo](http://jsfiddle.net/andyfitz/hRqGa/191/)
#### example
1. Global help content can be referenced from many places at once so as to avoid redundancy and annoying ajax requests.. if the section the help comes from is loaded, so is the help.
2. Inspecting an object via a link can call the objects entire content into view.
******
### Static-references
Where an anchor link to another section has been replaced with a live copy of the section it links to.
.static-reference
> An example would be any monitoring view that requires various metrics already rendered elsewhere be included.
******
### Assist-references
like a static reference but with the link-text preserved and the section only visible when the link-text has focus (has been clicked).
.assist-reference
> An example would be a permissions editor referencing the objects that a user has permissions to by name and allowing the user to inspect that object in-place with a single click, without having to visit the object in questions default view.
******
## Help & content
Written content to help describe a feature or scenario.
Combined with admonition classes
.warning .note .info .tip .caution
Often implemented via one of the following methods
* Included in the view relevant to its description
* As static-references where the help content can be dismissed (via an X in the top right corner)
* As assist-references where the help content can be revealed upon clicking a referring link
Practically speaking this is text that can be placed inline with a view that it represents or hidden in a non displayed useful content area to be static or assist-referenced by many places.
### Explained
For example: _“don’t be silly“_ is a generic tip that may apply to an enormous variety of contexts. This is useful to be placed in the "generic tips" area and linked to via `<a href=”#dont be-silly” class=”assist-reference”>now please remember..</a>` which means it wil be rendered inline of where it is referenced.
******
##Client-side status polling
All objects relevant to a view are classed with the viewname
On any action inside the view, a status classname is added to the view as well as any objects that reference it regardless of where they are displayed
<a href=#user class=”userXX enabling”>link</a>
<div id=#”userXX” class=”userXX enabling” >UserXX View</div>.
We watch the referenced views classes and mimic them on all referencing links always as they can contain or be updated with new event styles (for example: failed, warning, upgraded, admin-only etc)
******
## Server status events *investigating*
Right now we can use ajax calls to update each view but in future it would make sense to use eventSource for more advanced monitoring: [eventSource: server sent events](http://html5doctor.com/server-sent-events/)
******
## Client verification / fast feedback
Interactive assurance that an action has been requested without the verification that the server has performed the action.
For example a user clicks the enable button.. we immediately apply “enabling” status to the button but wait for the server to return with the “enabled” confirmation...
### How it works
> **Assumption** intermittent states like verifying, enabling and disabling states are safe for client side validation.
> They confirm an action has been requested but not applied.
As a rule, all elements are given the status of the objects they represent as well as classed with the object ID.. e.g.: all buttons with `class="providerid12451-*"` get the additional class of their intermittent state ``"enabling/disabling/verifying/whatever"`` When a functional object related to them has been actioned.
1. On the client javascript side, we set the actioning classname to all elements with the same object objectid class.
2. Once the action has been done an ajax call confirm the change and refreshes the class to "enabled/disabled/done/whatever" and removes the intermediary state
******
## Important action certification
[JS Fiddle demo](http://jsfiddle.net/andyfitz/mvdST/)
Requiring the user to certify that they understand the action before allowing it to take place.
for example:
> “Do you understand what you are doing?[yes] okay, here’s the button [click]”
###explained
> Enabling and disabling providers, deleting users etc
We will use three methods to verify that a user has accepted the severity of the task they are about to perform:
1. CSS physical obfuscation.
Where the confirmation toggle sits physically on top of the action toggle so that an action can not be clicked without clicking the confirmation toggle first. this helps simplify the component to one physical space part of the same consideration set.
2. javascript validation.
The action button beneath is disabled until the confirmation toggle has been clicked
3. final server verification.
the submitted action is not accepted by the system unless the post contains both the verification enabled and the action. the server then pushes the update
******
##Global status and system notification stack.
Important information about the entire system or a current process, displayed prominently.
###explained
Using the referenced content heavily, we throw system, warning and notification content to the top of the page in a collapsing, growl-style notification system”
<div id="notifications">
<h1>System Messages</h1>
<p class=”system”>you should to install aeolus-all to properly use conductor</p>
<p class=”status provider123 build”>
<a
href=”provider123-build-status”
class=”reflink 50”>
building provider123 <span>50% Complete</span>
</a>
</p>
</div>
******
## Printable manifest
Because our content is not replicated, and all enabled views are included in the DOM;
our app can actually print as if it were a manifest for the authenticated user.
We get this feature for free by proxy of our method for referencing views and content.
Having the ability to produce a hard copy infrastructure report may be a gimmick, but it's an easy way to show how conductor can help respond an IT audit situation.
### example print stylesheet changes
@media print {
a:after {
content: " ("attr(href)") ";}
div:before{
content: " ("attr(id)") ";}}
}
This will preserve all references and links throughout the UI.
Also, we can manually define sections to be printed.
@media print {
div{display:none}
#providers, #instances, #users, #global-tips {display:block !important}
}
Which means only sections we desire to be included in the manifest get printed
also
@media print {
.tabs:before{
page-break-before: always;
content:"This section contains the following:";
.tabs li a:after{content:""}
.tabs { font-size: 2em;page-break-after: always;}
.tabs li{display:list}
}
Which will convert our tabs into whole page section summaries.
> remember, this feature is free because we are designing conductor to gracefully degrade. Very little effort goes into preserving this feature so long as our standards are maintained.
# Existing conductor paradigms
These changes don't create any changes to terminology, or have much impact for pre-existing views for components already built into conductor. It is likely that the majority of what has already been done will be preserved and only undergo minor changes to the HAML/SASS so that features may be integrated into the global view.
This has been written purely to start discussion on how we evolve Conductor going forward and I'd love to hear your thoughts: [andy.fitzsimon(a)redhat.com ](mailto:andy.fitzsimon@redhat.com)
12 years
[PATCH conductor] Fold aeolus-all spec into conductor spec
by John Eckersberg
This simplifies things a bit and will make transitioning to tito
easier
---
Makefile | 4 +-
aeolus-all.spec.in | 287 ----------------------------------------------
aeolus-conductor.spec.in | 29 +++++
3 files changed, 30 insertions(+), 290 deletions(-)
delete mode 100644 aeolus-all.spec.in
diff --git a/Makefile b/Makefile
index 496f4dd..dc118b0 100644
--- a/Makefile
+++ b/Makefile
@@ -42,7 +42,6 @@ endif
dist:
sed -e "s|@VERSION@|$(VERSION)|;s|^\(Release:[^%]*\)|\1$(EXTRA_RELEASE)|" aeolus-conductor.spec.in > aeolus-conductor.spec
- sed -e "s|@VERSION@|$(VERSION)|;s|^\(Release:[^%]*\)|\1$(EXTRA_RELEASE)|" aeolus-all.spec.in > aeolus-all.spec
mkdir -p dist/aeolus-conductor-$(VERSION)
cp -a aeolus-conductor.spec AUTHORS conf COPYING Makefile src \
@@ -52,7 +51,6 @@ dist:
rpms: dist
rpmbuild $(RPM_FLAGS) -ta aeolus-conductor-$(VERSION).tar.gz
- rpmbuild $(RPM_FLAGS) -ba aeolus-all.spec
srpms: dist
rpmbuild $(RPM_FLAGS) -ts aeolus-conductor-$(VERSION).tar.gz
@@ -67,6 +65,6 @@ genlangs:
cd src && rake updatepo && rake makemo
clean:
- rm -rf dist aeolus-conductor-$(VERSION).tar.gz aeolus-all.spec aeolus-conductor.spec
+ rm -rf dist aeolus-conductor-$(VERSION).tar.gz aeolus-conductor.spec
.PHONY: dist rpms publish srpms genlangs
diff --git a/aeolus-all.spec.in b/aeolus-all.spec.in
deleted file mode 100644
index caaeaf9..0000000
--- a/aeolus-all.spec.in
+++ /dev/null
@@ -1,287 +0,0 @@
-Name: aeolus-all
-Version: @VERSION@
-Release: 0%{?dist}
-Summary: A meta-package to pull in all components for Aeolus
-
-Group: Applications/Internet
-License: GPLv2+
-URL: http://aeolusproject.org
-
-Requires: aeolus-conductor-daemons = %{version}-%{release}
-Requires: aeolus-conductor-doc = %{version}-%{release}
-Requires: iwhd
-Requires: aeolus-configure
-Requires: imagefactory
-Requires: imagefactory-jeosconf-ec2-fedora
-Requires: imagefactory-jeosconf-ec2-rhel
-Requires: qpid-cpp-server
-Requires: rubygem(aeolus-image)
-Requires: rubygem(aeolus-cli)
-Requires: mongodb-server
-Requires: mod_ssl
-Requires: deltacloud-core
-Requires: deltacloud-core-ec2
-Requires: deltacloud-core-rhevm
-Requires: deltacloud-core-vsphere
-Requires: ntp
-Requires: rsyslog-relp
-
-BuildArch: noarch
-
-%description
-This is the aeolus meta-package. If you want to install aeolus and all of its
-dependencies on a single machine, you should install this package and then
-run aeolus-configure to configure everything.
-
-%files
-
-%post
-
-%changelog
-* Mon Jan 09 2012 Steve Linabery <slinaber(a)redhat.com> - 0.8.0-2
-- 18ba534 Merge branch 'master' of github.com:aeolusproject/conductor
-- 0a37767 API - Added template checking when creating an image
-- 33d63a3 -change method of ensuring poolIds are unique, removed hard tab
-- 4aa3fce updated deployment index refresh to categorize deployments by pool
-- a2885b4 added pool ID to div identifier
-- 0a020e7 Support for multiple accounts per provider.
-- 6fa3ce3 Backbone will always use preset_filter value if present
-- 5e068fe Bump release
-- a18865d Update changelog entries
-- 9c027cd Fix autoupdate with table filters
-- 15c740b Adding 'No catalog' label when no catalog available for the deployable when creating image
-- 0c98f1b Use a lambda to delay the evaluation of Provider in conjunction with scope
-- d2a37e2 Reference lib/image by full path
-- 342c552 Display a specific error message for image import with a blank ID
-- a7ae8ec Add missing style to image import form
-- 90826d7 Rename Catalog Entries to Deployables in the UI
-- 55b28c5 update pools count with applying filters in pools table (bz770620)
-- 5adcc24 Autoupdating pretty view fixed on Pools#index for multiline array of deployments
-- 61934bc Fixing new deployable form
-- fdd00ab Fixing failing rspec tests
-- dd1d2db Localise instance count indicator in pretty view
-- eea7d11 Fix the uptime format
-- a627c74 BZ#755933 Last login,Last login IP fields empty.
-- 46ac73e Added architecture check
-- 7b24128 Removed duplicit vcr definition for aeolus-image
-- df5f048 BZ 769635, added scope enabled to Provider and ProviderAccount
-- 1853d01 Error displayed after provider destroy fails
-- 810714c Redirect to catalog detail after catalog entry is created succesfully
-- be4735d Fixing the date format in Deployment's json representation
-- 188c848 Table striping fixed for autoupdating on the table view of pools#index
-- fc0c339 Fixing autoupdating issues
-- d23ed06 Fixed error rendering for AJAX requests
-- 4c43e02 Fixing the permission partial
-- f5d8de1 Error message fixed for creating new deployable without providing url for the xml
-- d7d7a29 Deployable XML parsing switched to strict mode
-- fe236fc BZ#766163 Add reboot_multiple to grid view of instances,controller method and localization.
-- 0bae59e fix user dropdown in masthead
-
-* Wed Jan 04 2012 Steve Linabery <slinaber(a)redhat.com> - 0.8.0-1
-- d98cb57 Verify image exists before importing it from provider
-- 314c90e Allow creating deployables from imported images
-- b1e8993 Add realm selection to Deployment Overview
-- b94664f Added support to DeployablesController to handle deployables without catalog
-- 8d446e2 Fixing return_path in permissions#set_permission_object
-- 4297b08 Change version of aeolus-image gem to 0.3.0
-- 43440b1 Fixing jQuery template on deployments#show
-- 9762232 Fixing autoupdate on deployments#show
-- f1e6529 Prevent launching invalid deployments
-- 77b349b Removed edit pool family button from pool families table (bz768154)
-- a362758 Fix catalog dropdown when no catalog exist, bz769279
-- cb5bf9b BZ 768089: Add model and UI for provider account priority
-- e47d1a4 BZ 768089: spec test for provider account priority (revised)
-- a3164ca BZ 768089: Refactor provider account matching to facilitate stubbing (revised)
-- 93f464c Drop pretty/filter toggle from deployment details
-- c3b896d Rake task to insert ldap users.
-- 6512cb9 BZ 760901 - removed line touching unused lock file
-- 02dfa3f fix for bz #765901: fix pools_in_use calculation
-- 4f380bf new catalog entry from image, catalog select javascript
-- 5be3de8 error messages in flash hud
-- 3173e62 Replace description xml with name image import
-- 77014ab Add a View Template XML option to Image Details
-- 8668a57 BZ 767214 Removed the New Pool button from _section_header in pools controller
-- 879c6eb catalog entries checkbox in header to enable select all listed catalog entries, catalog entries new_from_image i18n fix
-- b062bc3 Fix message on launch from catalog
-- 53ccabe pool_family_id param added to new_pool_path
-- d5e79ff Deployable forms styling
-- ab67147 Image import uses lib/image.rb class
-- 0525111 Images#show properly detects ProviderAccount for imported image
-- f0dea6c Fix failing RSpec tests
-- a30691a images#show only shows the relevant provider for imported images
-- 74143b3 API import (used by aeolus-cli) requires Provider Account now.
-- c633f4c Image import is now linked to Provider Account, not just Provider
-- 203b032 Log any errors encountered during image import
-- 05f5067 Rescues a possible exception when creating a ProviderImage
-- 04254b9 Hides build and upload buttons for imported images
-- 72d9bf9 Image import uses new Image.import method
-- b4019c2 fix afterdestroy callback for instance
-- 003398f Fixed sort column
-- 93d196a Fix deployable xml link on the launch overview page
-- 415bddb Autoupdating deployments list on Pools#index
-- 17c333b Show pool enabled/disabled status in Environments
-- a211d72 added deployable name to create_from_image, BZ767109
-- 725ad8f buildpush ui icons and styling
-- d59142d Fix the pool families tests
-- a20c7fd Add Images tab to the Pool Family details page
-- 57afb0c Add "New Image" button to the images list
-- 53548d1 Remove User Treatment from User form BZ767189
-- 93d99a8 Fixed tests after removing warehouse models
-- cd330fb Fixed deployable link
-- c9c271a Removed warehouse models
-- bf22438 Removed some methods from warehouse models
-- 02d8dea Removed provider_images_for_image_list from image model
-- 245fa3e Fix for bz #765907: change permissions tab label from 'Users' to 'Role Assignments'
-- 057bf3b Fix missing translation on Import image button
-- 4438a1a BZ#753917 Added target to API Build Output
-- 926e1ac BZ#753917 Updated API to return Provider/Account on Push
-- 547e1a5 Fixing jQuery template on deployments#show
-- cf8cf19 Fixup for #761134
-- 01e9383 Fixing recognize_path calls when the path contains prefix
-- c784c3a Require a template file on the upload page
-- cd06da9 Style Image Details' header buttons
-- e15298b Don't display 'Download key' if there is not instance key
-- 1b4af97 Fixup for bz761096
-- 3ef5ea4 Quick Fix, destroy method is not called for ec2 and Mock instances, or if instance is in CREATE_FAILED state
-- 34db60c new administer section navigation icons
-- b196025 BUG-2751 - Delete instance on provider side when deleted in conductor
-- ea32f34 rootpw param in template XML changed is now required
-- 72fc9ac deployable details icons
-- 859c1c1 fix launch deployable test
-- 0978d61 deployable details Images part
-- cec00a2 fixed bug with updating deployable xml
-- c6dfc66 deployable details page styles, deployable details image section errors
-- f31b995 Use names correctly on template upload
-- 138d64d Input validation for new deployable from image
-- 243d454 Fixing deployment card on Pools#index
-- f11f6de Fix for bug #766038
-- ef2c43d fix for BZ #761509: User quota and other stats
-- 4c20a16 Allow changing deployment name on the Overview page
-- c02a0c4 BZ761132 fix broken translations for template xml
-- 32517e0 Fix flash message in images_controller#edit_xml
-- 13f897e Disabling Add button if no available catalog exists
-- ec56568 Condition added to XML validation in Deployable
-- 4f813b4 Fixed deprecation warning in pool_families#edit
-- 87cd77e Remove "load definition from XML" option from launch new deployment page
-- a6ea1ef Replaced new_catalog_entry_path with new_deployable_path to work with new controller structure
-- acd1159 Fixed a wrong regex on grep
-- a37aaf5 Added rake task to verify the status of licenses in the project
-- b7b467f Fixed list of catalog entries on deployables show page
-- bc11e96 deployable detail styles and fixes through biuldpush ui
-- 2c9a31d pool families list fix
-- f23ac0c RM 2879 - Secondary method for creating provider accounts using a provider name instead of an id
-- b24e67f BZ#754956 Return appropriate error code when parent not found
-- 971aaf2 List of users added to permissions page
-- ad124c6 Clean up Permission-related flash messages
-- 972777f Add Build & Push to Deployable Details
-- 978a43a Deploaybles and catalog_entries cleanups
-- 03f7931 Redmine #2254: Always compile scss in dev enviroment.
-- 122e55a Change sql statement to use rails helpers.
-- 869c8a6 Fix this migration so it also works on sqlite.
-- 077a18a Moving from GPL to ASL
-- 3bd07b2 Add relp dependency to metapackage.
-- 79e6dc9 bump version in Makefile and reset release
-- 9fe1011 Add changelog and bump release on specfile for 0.7.0 RC
-
-* Thu Dec 1 2011 Steve Linabery <slinaber(a)redhat.com> - 0.7.0-1
-- 4178a0a Adds functionality to delete deployment configurations from config server
-- cce4c7e Added pagination to events on instance detail page
-- bf3868b Clean up minor unneeded test output.
-- a9c520d Fixing aeolus-conductor.spec.in
-- 0e2b2d4 format_value is more cautious with calling .split
-- f35d2d7 Redmine #2515: Write and test actual logging behavior.
-- 9a4be2b Redmine #2514: Write and test transformation of api data into correct log format.
-- 3c1cc5c RM #2822: Add way to retrieve full list of attributes for validation.
-- 2723e13 Comments out EventSpec for now
-- d5f05a3 Rescue possibly-risky calls when creating a CDDR
-- fc2cafa Fixing message for user creation
-- 0167f7d Adding required fields indicator for user form
-- c5c1b98 remove repeating sql statements in rails.log
-- c239f6c Added build timestamp to image list view
-- 32f5ea0 Updated images controller to use TemplateXML
-- 1f447f4 Created TemplateXML model
-- d86537c Correct bad call left after rubygem refactor
-- af0ab18 Display the details for each image on the Deployable Details page
-- 81a2c60 Event.rb uses full path to lib/aeolus/event
-- 9df721a Fix for creating new Deployable page
-- ad13160 Allow Deployable XML files to contain in-line configurations
-- 42597dd Registering/deregistering multiple catalogs to deployment Renaming CatalogEntriesController to DeployablesController
-- 35d6fef catalogs dropdown in Create new catalog entry from template, new catalog_entry form styling
-- 79d5ab7 Buildpush layout
-- fcc950a obscured launch parameter if it is password
-- b0ed5b9 Update Image show UI
-- c44778d Return provider cleanup content via API
-- 2e3ead5 Updated Gemfile.lock for aeolus-image 0.2.0
-- 7e068e9 Permissions page for deployables.
-- a5ff27c Fixes failing test introduced by previous commit.
-- 1aecfb4 Deployment flash error is no longer mashed together.
-- 11b82d9 extracted apply_filters and apply_preset_filters methods to common_filter_methods module
-- 01ab731 Cucumber tests for search and filters
-- dd41e62 Added filter method, updated filters and search through the application
-- ba22842 Added filters and search to tables through application
-- 9016b1f Fixes bugs and warnings exposed by tests
-- 4b78e5d Adds tests for Events
-- 60e6245 lib/aeolus/event code is included in RPM and called for Events
-- b86f1fd DBomatic does not write events; after-save hooks already handle this
-- bd26168 InstanceObserver includes :status_code, :change_hash parameters to Event
-- 3317495 Event model calls Event API after_create
-- de655cf Define start_time and end_time for Deployment
-- 8fc332f Remove secret_token.rb from conductor rpm - v2
-- e36fa46 internationalize api error messages
-- ae2cdf6 Fix pagginate on launch_from_catalog site
-- a4b892b Image import GUI
-- cecbf26 Fixes pool family detail, pools tab. Adds generic table instead of pool_families one
-- 24fa151 BZ744713 - changed font styles for catalog images
-- 99eda06 BZ#755933 Last login, Last login IP fields empty
-- 5e1b27a Launch deployment from the Deployable Details page
-- 8c8ae24 Correct bad call in Api::TargetImagesController
-- 5d4d456 Updated API for new aeolus-image-rubygem changes
-- 7da907f added reraising of BuildNotFound exception
-- d2b1de1 changed return text to xml, add targets to import params
-- f0d2b77 added reraising of ProviderImageNotFound expection
-- 838179e API::ProviderImages spec, mock in #create + minor fixes
-- ecacfa4 API::Images spec, minor xml fixes
-- e3e193b API::Builds spec, minor return expectations fixes
-- 2707489 API::TargetImages spec, #destroy
-- b983da4 API::ProviderImages spec, #create #destroy
-- 9f2c3e8 API::ImagesController spec, #create #destroy
-- 9ee78b8 API::BuildsController spec #create #destroy
-- 7b904f4 Display the backend provider image ID when deleted
-- 6c7802e UI - create catalog entry from an image
-- 2b43395 Removed unused rescue block when creating a template
-- 56a2d9f Fix broken the Catalog Entries Cucumber feature
-- eeac165 Add the skeleton for the Deployable Details page
-- 131887d Add the name of belonging provider in provder_account#new/edit form
-- 304c42b Change dropdown of catalogs to the name of belonging catalog in catalog_entry#new/edit form
-- 6decf95 spec and cucumber changes for catalog_entry/deployable refactoring
-- 1671422 view and controller changes for catalog_entry/deployable refactoring
-- ff83dda Refactored catalog_entry model into catalog_entry and deployable models.
-- 77dce31 Implementing pretty view for instances
-- 4823c2b Changed aeolus user to 180:180 per bz 754274
-- 0301070 dbomatic only writes instance events if they have changed
-- 279331f Added options for creating catalog entry via upload XML or url to XML
-- 0e7a2f9 Added tabs to catalog_entries#new form
-- d88865d Fix tests after removing URL of catalog entry from launch form
-- 4705924 Remove URL of catalog entry from launch UI
-- bd41e3a Fixed specs and cukes after the change in catalog entries.
-- 28e8fb8 Changes for catalog entry new/edit form.
-- 39632a8 Added migration, that deletes URL attribute from catalog_entries and adds 2 column(xml, and xml_filename)
-- 8e6f8dc Save template in warehouse
-- d207889 Improved tests performance
-- 65c7a75 Comments failing Image test
-- 63903e6 Bump version number following imminent release of 0.6.0 from the 0.6.x branch
-- 3a8a4d3 Updates ProviderType to use Rails 3 syntax
-- f2f751b Add screens for template import
-- 6f0b310 Fix spec so rpm builds.
-- 690eb08 Task #2710 reboot of instance
-- 62d2b4d Add initial 2 events to be sent.
-- a6c4081 Initial Event API implementation.
-- 57c4066 Added image detail page
-- 78b505b Added images index view
-- 6534ce1 Added empty images controller
-
-* Thu Jul 21 2011 Mo Morsi <mmorsi(a)redhat.com> - 0.3.0-2
-- Updates to conform to Fedora guidelines
-
-* Mon Apr 04 2011 Chris Lalancette <clalance(a)redhat.com> - 0.3.0-1
-- Initial build
diff --git a/aeolus-conductor.spec.in b/aeolus-conductor.spec.in
index e6a2659..2a851e0 100644
--- a/aeolus-conductor.spec.in
+++ b/aeolus-conductor.spec.in
@@ -94,6 +94,33 @@ Requires: rubygem(launchy)
%description devel
Tests and other development tools for the Aeolus Conductor.
+%package -n aeolus-all
+Summary: A meta-package to pull in all components for Aeolus
+Group: Applications/Internet
+Requires: aeolus-conductor-daemons = %{version}-%{release}
+Requires: aeolus-conductor-doc = %{version}-%{release}
+Requires: iwhd
+Requires: aeolus-configure
+Requires: imagefactory
+Requires: imagefactory-jeosconf-ec2-fedora
+Requires: imagefactory-jeosconf-ec2-rhel
+Requires: qpid-cpp-server
+Requires: rubygem(aeolus-image)
+Requires: rubygem(aeolus-cli)
+Requires: mongodb-server
+Requires: mod_ssl
+Requires: deltacloud-core
+Requires: deltacloud-core-ec2
+Requires: deltacloud-core-rhevm
+Requires: deltacloud-core-vsphere
+Requires: ntp
+Requires: rsyslog-relp
+
+%description -n aeolus-all
+This is the aeolus meta-package. If you want to install aeolus and all of its
+dependencies on a single machine, you should install this package and then
+run aeolus-configure to configure everything.
+
%prep
%setup -q
@@ -321,6 +348,8 @@ fi
%{app_root}/script
%{app_root}/spec
+%files -n aeolus-all
+
%changelog
* Mon Jan 09 2012 Steve Linabery <slinaber(a)redhat.com> - 0.8.0-2
- 18ba534 Merge branch 'master' of github.com:aeolusproject/conductor
--
1.7.7.6
12 years
[PATCH conductor] BZ#770902 - Deployment creation with blank entries displays The record you tried to access does not exists, it may have been deleted
by Tomas Hrcka
---
src/app/controllers/deployments_controller.rb | 5 +++++
src/app/views/deployments/_launch_new.html.haml | 2 +-
src/config/locales/en.yml | 1 +
3 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/src/app/controllers/deployments_controller.rb b/src/app/controllers/deployments_controller.rb
index a03ea4d..3fb128e 100644
--- a/src/app/controllers/deployments_controller.rb
+++ b/src/app/controllers/deployments_controller.rb
@@ -56,6 +56,11 @@ class DeploymentsController < ApplicationController
def launch_time_params
+ unless params.has_key?(:deployable_id)
+ flash[:error] = t('deployments.flash.warning.deployable_not_selected')
+ redirect_to launch_new_deployments_path(:pool_id => params[:deployment][:pool_id]) and return
+ end
+
@deployable = Deployable.find(params[:deployable_id])
@deployment = Deployment.new(params[:deployment])
@pool = @deployment.pool
diff --git a/src/app/views/deployments/_launch_new.html.haml b/src/app/views/deployments/_launch_new.html.haml
index d8e62f5..6403f76 100644
--- a/src/app/views/deployments/_launch_new.html.haml
+++ b/src/app/views/deployments/_launch_new.html.haml
@@ -37,7 +37,7 @@
%p
%label{:for => 'frontend_realm_id'}
= t('realms.index.realm')
- = select :deployment, :frontend_realm_id, @realms.map{|r| [r.name, r.id]}, :include_blank => true
+ = select :deployment, :frontend_realm_id, @realms.map{|r| [r.name, r.id]}
%fieldset.options
= submit_tag t('.next'), :class => 'button', :id => "next_button"
diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml
index ad5f784..330ddda 100644
--- a/src/config/locales/en.yml
+++ b/src/config/locales/en.yml
@@ -247,6 +247,7 @@ en:
warning:
disabled_pool: "Cannot launch a Deployment in this Pool. The pool has been disabled."
failed_to_launch: "Deployment launch failed!"
+ deployable_not_selected: "You need to select deployable"
error:
not_launched: "Some assemblies will not be launched:"
failed_to_launch_assemblies: "Failed to launch following assemblies:"
--
1.7.7.5
12 years, 1 month
[PATCH conductor] BZ#783218 added pessimistic database locking for quota to prevent updating with old values
by Tomas Hrcka
---
src/app/models/instance_observer.rb | 20 ++++++++++++++------
1 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/src/app/models/instance_observer.rb b/src/app/models/instance_observer.rb
index 9d13fb0..06ba2ef 100644
--- a/src/app/models/instance_observer.rb
+++ b/src/app/models/instance_observer.rb
@@ -65,13 +65,21 @@ class InstanceObserver < ActiveRecord::Observer
elsif RUNNING_STATES.include?(state_from) && !RUNNING_STATES.include?(state_to)
quota.running_instances -= 1
end
-
- if !ACTIVE_STATES.include?(state_from) && ACTIVE_STATES.include?(state_to)
- quota.total_instances += 1
- elsif ACTIVE_STATES.include?(state_from) && !ACTIVE_STATES.include?(state_to)
- quota.total_instances -= 1
- end
- quota.save!
+ quota.transaction do
+ quota.lock!
+ if !RUNNING_STATES.include?(state_from) && RUNNING_STATES.include?(state_to)
+ quota.running_instances += 1
+ elsif RUNNING_STATES.include?(state_from) && !RUNNING_STATES.include?(state_to)
+ quota.running_instances -= 1
+ end
+
+ if !ACTIVE_STATES.include?(state_from) && ACTIVE_STATES.include?(state_to)
+ quota.total_instances += 1
+ elsif ACTIVE_STATES.include?(state_from) && !ACTIVE_STATES.include?(state_to)
+ quota.total_instances -= 1
+ end
+ quota.save!
+ end
end
end
end
--
1.7.1
12 years, 1 month
[PATCH conductor] BZ 782879 fixes images count in images table in deployable detail page
by Jirka Tomasek
From: Jiri Tomasek <jtomasek(a)redhat.com>
---
src/app/models/deployable.rb | 2 +-
src/app/util/deployable_xml.rb | 4 ++++
2 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/src/app/models/deployable.rb b/src/app/models/deployable.rb
index a90232e..c9df4c5 100644
--- a/src/app/models/deployable.rb
+++ b/src/app/models/deployable.rb
@@ -121,7 +121,7 @@ class Deployable < ActiveRecord::Base
deployable_xml.assemblies.each do |assembly|
assembly_hash ||= {:name => assembly.name}
assembly_hash[:image_uuid] = assembly.image_id
- assembly_hash[:images_count] = assembly.image.count
+ assembly_hash[:images_count] = assembly.images_count
if assembly.hwp
hwp_name = assembly.hwp
hwp = HardwareProfile.find_by_name(hwp_name)
diff --git a/src/app/util/deployable_xml.rb b/src/app/util/deployable_xml.rb
index 9ece7b5..3032b5e 100644
--- a/src/app/util/deployable_xml.rb
+++ b/src/app/util/deployable_xml.rb
@@ -108,6 +108,10 @@ class AssemblyXML
@image ||= @root.at("image")
end
+ def images_count
+ @root.xpath('./image').count
+ end
+
def image_id
@image_id ||= image['id']
end
--
1.7.7.6
12 years, 1 month
[PATCH configure] BZ #783220 - change default admin email to 'root@localhost'
by Mo Morsi
---
recipes/aeolus/manifests/profiles/conductor.pp | 6 +++---
recipes/aeolus/manifests/profiles/custom.pp | 6 +++---
recipes/aeolus/manifests/profiles/default.pp | 6 +++---
recipes/aeolus/manifests/profiles/ec2.pp | 6 +++---
recipes/aeolus/manifests/profiles/mock.pp | 6 +++---
recipes/aeolus/manifests/profiles/rhevm.pp | 6 +++---
recipes/aeolus/manifests/profiles/vsphere.pp | 6 +++---
7 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/recipes/aeolus/manifests/profiles/conductor.pp b/recipes/aeolus/manifests/profiles/conductor.pp
index 83e0731..aabd98f 100644
--- a/recipes/aeolus/manifests/profiles/conductor.pp
+++ b/recipes/aeolus/manifests/profiles/conductor.pp
@@ -15,10 +15,10 @@
class aeolus::profiles::conductor {
aeolus::conductor::site_admin{"admin":
- email => 'dcuser(a)aeolusproject.org',
+ email => 'root@localhost',
password => "password",
- first_name => 'aeolus',
- last_name => 'user'}
+ first_name => 'Administrator',
+ last_name => ''}
aeolus::conductor::login{"admin": password => "password",
require => Aeolus::Conductor::Site_admin['admin']}
diff --git a/recipes/aeolus/manifests/profiles/custom.pp b/recipes/aeolus/manifests/profiles/custom.pp
index d87c0fe..fdbe126 100644
--- a/recipes/aeolus/manifests/profiles/custom.pp
+++ b/recipes/aeolus/manifests/profiles/custom.pp
@@ -15,10 +15,10 @@
class aeolus::profiles::custom {
aeolus::conductor::site_admin{"admin":
- email => 'dcuser(a)aeolusproject.org',
+ email => 'root@localhost',
password => "password",
- first_name => 'aeolus',
- last_name => 'user'}
+ first_name => 'Administrator',
+ last_name => ''}
aeolus::conductor::login{"admin": password => "password",
require => Aeolus::Conductor::Site_admin['admin']}
diff --git a/recipes/aeolus/manifests/profiles/default.pp b/recipes/aeolus/manifests/profiles/default.pp
index c3a58cd..8ac8ab3 100644
--- a/recipes/aeolus/manifests/profiles/default.pp
+++ b/recipes/aeolus/manifests/profiles/default.pp
@@ -17,10 +17,10 @@ class aeolus::profiles::default {
aeolus::create_bucket{"aeolus":}
aeolus::conductor::site_admin{"admin":
- email => 'dcuser(a)aeolusproject.org',
+ email => 'root@localhost',
password => "password",
- first_name => 'aeolus',
- last_name => 'user'}
+ first_name => 'Administrator',
+ last_name => ''}
aeolus::conductor::login{"admin": password => "password",
require => Aeolus::Conductor::Site_admin['admin']}
diff --git a/recipes/aeolus/manifests/profiles/ec2.pp b/recipes/aeolus/manifests/profiles/ec2.pp
index 0cec35f..d8f408d 100644
--- a/recipes/aeolus/manifests/profiles/ec2.pp
+++ b/recipes/aeolus/manifests/profiles/ec2.pp
@@ -18,10 +18,10 @@ class aeolus::profiles::ec2 {
aeolus::create_bucket{"aeolus":}
aeolus::conductor::site_admin{"admin":
- email => 'dcuser(a)aeolusproject.org',
+ email => 'root@localhost',
password => "password",
- first_name => 'aeolus',
- last_name => 'user'}
+ first_name => 'Administrator',
+ last_name => ''}
aeolus::conductor::login{"admin": password => "password",
require => Aeolus::Conductor::Site_admin['admin']}
diff --git a/recipes/aeolus/manifests/profiles/mock.pp b/recipes/aeolus/manifests/profiles/mock.pp
index c96a48c..a4b4b83 100644
--- a/recipes/aeolus/manifests/profiles/mock.pp
+++ b/recipes/aeolus/manifests/profiles/mock.pp
@@ -17,10 +17,10 @@ class aeolus::profiles::mock {
aeolus::create_bucket{"aeolus":}
aeolus::conductor::site_admin{"admin":
- email => 'dcuser(a)aeolusproject.org',
+ email => 'root@localhost',
password => "password",
- first_name => 'aeolus',
- last_name => 'user'}
+ first_name => 'Administrator',
+ last_name => ''}
aeolus::conductor::login{"admin": password => "password",
require => Aeolus::Conductor::Site_admin['admin']}
diff --git a/recipes/aeolus/manifests/profiles/rhevm.pp b/recipes/aeolus/manifests/profiles/rhevm.pp
index 0663a47..5322f30 100644
--- a/recipes/aeolus/manifests/profiles/rhevm.pp
+++ b/recipes/aeolus/manifests/profiles/rhevm.pp
@@ -52,10 +52,10 @@ class aeolus::profiles::rhevm {
aeolus::create_bucket{"aeolus":}
aeolus::conductor::site_admin{"admin":
- email => 'dcuser(a)aeolusproject.org',
+ email => 'root@localhost',
password => "password",
- first_name => 'aeolus',
- last_name => 'user'}
+ first_name => 'Administrator',
+ last_name => ''}
aeolus::conductor::login{"admin": password => "password",
require => Aeolus::Conductor::Site_admin['admin']}
diff --git a/recipes/aeolus/manifests/profiles/vsphere.pp b/recipes/aeolus/manifests/profiles/vsphere.pp
index 130a80a..c28e7e1 100644
--- a/recipes/aeolus/manifests/profiles/vsphere.pp
+++ b/recipes/aeolus/manifests/profiles/vsphere.pp
@@ -31,10 +31,10 @@ class aeolus::profiles::vsphere {
require => Package['aeolus-conductor-daemons'] }
aeolus::conductor::site_admin{"admin":
- email => 'dcuser(a)aeolusproject.org',
+ email => 'root@localhost',
password => "password",
- first_name => 'aeolus',
- last_name => 'user'}
+ first_name => 'Administrator',
+ last_name => ''}
aeolus::conductor::login{"admin": password => "password",
require => Aeolus::Conductor::Site_admin['admin']}
--
1.7.6.5
12 years, 1 month
[PATCH conductor 1/2] BZ 785231: deployments: reworked launch time params form
by Maros Zatko
From: Maros Zatko <mzatko(a)redhat.com>
https://bugzilla.redhat.com/show_bug.cgi?id=785231
This allows you to fill in launch time parameters
when there are more than five parameters in a service.
---
.../views/deployments/launch_time_params.html.haml | 47 +++++++++++--------
1 files changed, 27 insertions(+), 20 deletions(-)
diff --git a/src/app/views/deployments/launch_time_params.html.haml b/src/app/views/deployments/launch_time_params.html.haml
index 9e633f8..f342256 100644
--- a/src/app/views/deployments/launch_time_params.html.haml
+++ b/src/app/views/deployments/launch_time_params.html.haml
@@ -13,27 +13,30 @@
= hidden_field_tag :deployable_id, params[:deployable_id]
%section.services
+ .labels
+ - @services.each do |service, assembly_name|
+ %h4.service{:id => service.id}= service.name.titleize
+ %p.hidden.description= service.description
+
%header
%h3.service
%p.description
- - @services.each do |service, assembly_name|
- %h4.service= service.name.titleize
- %p.hidden.description= service.description
-
- .parameters
- - service.parameters.each do |parameter|
- .parameter
- - if not parameter.reference?
- - id = "deployment[launch_parameters][#{assembly_name}][#{service.name}][#{parameter.name}]"
- = label_tag id, parameter.name.titleize + ':'
- - value = get_hash_multi(params, [:deployment, :launch_parameters, assembly_name, service.name, parameter.name])
- - if parameter.type == "password"
- = password_field_tag id, (parameter.value or value)
+ .params-container
+ - @services.each do |service, assembly_name|
+ .parameters{:id => service.id}
+ - service.parameters.each do |parameter|
+ .parameter
+ - if not parameter.reference?
+ - id = "deployment[launch_parameters][#{assembly_name}][#{service.name}][#{parameter.name}]"
+ = label_tag id, parameter.name.titleize + ':'
+ - value = get_hash_multi(params, [:deployment, :launch_parameters, assembly_name, service.name, parameter.name])
+ - if parameter.type == "password"
+ = password_field_tag id, (parameter.value or value)
+ - else
+ = text_field_tag id, (parameter.value or value)
- else
- = text_field_tag id, (parameter.value or value)
- - else
- = t('.reference', :assembly => parameter.reference_assembly, :parameter => parameter.reference_parameter)
+ = t('.reference', :assembly => parameter.reference_assembly, :parameter => parameter.reference_parameter)
#service-headers
@@ -42,10 +45,13 @@
:javascript
(function () {
function selectService($service) {
- $('.service.selected').next().next('.parameters').hide();
+ var old_param_id = $('.service.selected').attr('id');
+ $('div.params-container').find('#' + old_param_id).hide();
$('.service.selected').removeClass('selected');
+
$service.addClass('selected');
- $service.next().next('.parameters').show();
+ var new_param_id = $service.attr('id');
+ $('div.params-container').find('#' + new_param_id).show();
$service.parents('.services').find('header .service').text($service.text());
$service.parents('.services').find('header .description')
@@ -58,12 +64,13 @@
var filledOut = _.all($parameters, function(item) {
return ! _.isEmpty($(item).val());
});
- $(this).prev().prev('.service').toggleClass('filled-out', filledOut);
+ var param_id = $(this).attr('id');
+ $('.labels').find('#' + param_id).toggleClass('filled-out', filledOut);
$('#submit_params').attr('disabled', !filledOut);
});
}
- var $services = $('.launch-time-params .services h4.service');
+ var $services = $('.launch-time-params .services .labels h4.service');
selectService($services.first());
$services.live('click', function(e) { selectService($(this)); });
--
1.7.7.6
12 years, 1 month
[PATCH conductor] Fixing syntax error in model.js
by Imre Farkas
From: Imre Farkas <ifarkas(a)redhat.com>
---
src/public/javascripts/backbone/models.js | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/public/javascripts/backbone/models.js b/src/public/javascripts/backbone/models.js
index 9c33fd8..cb43f18 100644
--- a/src/public/javascripts/backbone/models.js
+++ b/src/public/javascripts/backbone/models.js
@@ -2,12 +2,12 @@ Conductor.Models = Conductor.Models || {}
Conductor.Models.Pool = Backbone.Model.extend({
- urlRoot: Conductor.prefixedPath('/pools')
+ urlRoot: Conductor.prefixedPath('/pools'),
initialize: function() {
this.deployments = new Conductor.Models.Deployments().filter(function(attributes) {
- return attributes.pool.id == this.id;
- });
+ return attributes.pool.id == this.id;
+ });
}
});
--
1.7.6.5
12 years, 1 month
rake spec output format
by Jason Guiditta
Question for the group: would anyone be opposed to me changing the
output format default for rspec in conductor to be the same style as
cucumber? I drives me crazy to see the progress dots for 10 minutes
and hav no clue what test(s) failed until the run is complete. I find
the doc format much more usable. If I dont hear any strong 'NO's,
I'll push this chnge sometime tomorrow (to give folks in earlier time
zones a chance to respond). Remember that silence is implicit
agreement.
-j
12 years, 1 month