[PATCH] Changes in Deployment Launch
Jan Provaznik
jprovazn at redhat.com
Thu Aug 23 11:23:44 UTC 2012
On 08/13/2012 04:18 PM, jtomasek at redhat.com wrote:
> From: Jiri Tomasek <jtomasek at redhat.com>
>
> Removed disabling the Next button in New Deployment form, established validations
> for Deployment in New Deployment form. Added proper back and continue buttons to
> navigate through Deployment launch process.
> Unified the workflow when launching Deployment from different places in the App.
>
> Deployment Launch workflow teps:
> 1. Deployment details form
> 2. Launch time params
> 3. Deployment Launch Overview
> ---
> src/app/controllers/deployments_controller.rb | 47 ++++++++++++--------
> src/app/models/deployable.rb | 2 +-
> src/app/models/deployment.rb | 8 ++--
> src/app/stylesheets/layout.scss | 6 ++-
> src/app/util/deployable_xml.rb | 8 +++-
> src/app/views/catalogs/_form.html.haml | 2 +-
> src/app/views/deployables/show.html.haml | 2 +-
> src/app/views/deployments/_launch_new.html.haml | 34 ++++----------
> src/app/views/deployments/_overview.html.haml | 34 +++++++-------
> .../deployments/launch_from_catalog.html.haml | 2 +-
> .../views/deployments/launch_time_params.html.haml | 8 +++-
> src/app/views/pools/_pretty_list.html.haml | 2 +-
> src/app/views/pools/show.html.haml | 2 +-
> src/config/locales/en.yml | 7 ++-
> src/features/deployables.feature | 2 +-
> 15 files changed, 87 insertions(+), 79 deletions(-)
>
Hi Jirka,
could you please resend this patch? It probably remained forgotten and
it is not applicable now.
Thanks, Jan
> diff --git a/src/app/controllers/deployments_controller.rb b/src/app/controllers/deployments_controller.rb
> index d9ec800..add9c4d 100644
> --- a/src/app/controllers/deployments_controller.rb
> +++ b/src/app/controllers/deployments_controller.rb
> @@ -1,4 +1,3 @@
> -#
> # Copyright 2011 Red Hat, Inc.
> #
> # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -37,18 +36,20 @@ class DeploymentsController < ApplicationController
> end
> end
>
> - # It is expected that params[:pool_id] will be set on requests into this method
> + # It is expected that params[:deployment][:pool_id] will be set on requests into this method
> def launch_new
> - @title = t 'deployments.new_deployment'
> - @pool = Pool.find(params[:pool_id]) or raise "Invalid pool"
> + @title = t('deployments.new_deployment')
> + @deployment = Deployment.new(params[:deployment])
> + @pool = Pool.find(@deployment.pool_id) or raise "Invalid pool"
> require_privilege(Privilege::CREATE, Deployment, @pool)
> +
> unless @pool.enabled
> flash[:warning] = t 'deployments.flash.warning.disabled_pool'
> redirect_to pool_path(@pool) and return
> end
>
> - @deployment = Deployment.new(:pool_id => @pool.id)
> init_new_deployment_attrs
> +
> respond_to do |format|
> format.html
> format.js { render :partial => 'launch_new' }
> @@ -56,24 +57,26 @@ class DeploymentsController < ApplicationController
> end
> end
>
> -
> -
> def launch_time_params
> @title = t 'deployments.new_deployment'
> - 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
>
> @deployment = Deployment.new(params[:deployment])
> @pool = @deployment.pool
> +
> init_new_deployment_attrs
> + @deployment.deployable_xml = DeployableXML.new(@deployable.xml)
> +
> + unless @deployment.valid? and params.has_key?(:deployable_id)
> + @deployment.errors.add(:base, t('deployments.flash.warning.deployable_not_selected')) unless params.has_key?(:deployable_id)
> + render :launch_new and return
> + end
> +
> require_privilege(Privilege::CREATE, Deployment, @pool)
> require_privilege(Privilege::USE, @deployable)
> img, img2, missing, d_errors = @deployable.get_image_details
> flash[:error] = d_errors unless d_errors.empty?
>
> - unless @deployable && @deployable.xml && @deployment.valid_deployable_xml?(@deployable.xml) && d_errors.empty?
> + unless @deployable && @deployable.xml && @deployment.valid_deployable_xml? && d_errors.empty?
> render 'launch_new' and return
> end
>
> @@ -95,14 +98,21 @@ class DeploymentsController < ApplicationController
> flash[:warning] = [flash[:warning]] if flash[:warning].kind_of? String
> flash[:warning]+=warnings
> end
> -
> +
> end
>
> def overview
> @title = t 'deployments.new_deployment'
> @deployment = Deployment.new(params[:deployment])
> @pool = @deployment.pool
> +
> init_new_deployment_attrs
> + @deployment.deployable_xml = DeployableXML.new(@deployable.xml)
> +
> + if params.delete(:commit) == 'back'
> + render :launch_new and return
> + end
> +
> require_privilege(Privilege::CREATE, Deployment, @pool)
> require_privilege(Privilege::USE, @deployable)
> @launch_parameters_encoded = Base64.encode64(ActiveSupport::JSON.encode(@deployment.launch_parameters))
> @@ -110,7 +120,7 @@ class DeploymentsController < ApplicationController
> flash[:error] = d_errors unless d_errors.empty?
>
> respond_to do |format|
> - if @deployable.xml && @deployment.valid_deployable_xml?(@deployable.xml) && d_errors.empty?
> + if @deployable.xml && @deployment.valid_deployable_xml? && d_errors.empty?
> @errors = @deployment.check_assemblies_matches(current_session,
> current_user)
> set_errors_flash(@errors)
> @@ -138,9 +148,9 @@ class DeploymentsController < ApplicationController
> end
>
> init_new_deployment_attrs
> + @deployment.deployable_xml = DeployableXML.new(@deployable.xml)
> +
> require_privilege(Privilege::USE, @deployable)
> - @deployment.deployable_xml = @deployable.xml
> - @deployment.owner = current_user
>
> if params.delete(:commit) == 'back'
> load_assemblies_services
> @@ -185,7 +195,6 @@ class DeploymentsController < ApplicationController
> @deployment = Deployment.find(params[:id])
> @title = t('deployments.show.name', :name => @deployment.name)
> require_privilege(Privilege::VIEW, @deployment)
> - init_new_deployment_attrs
> save_breadcrumb(deployment_path(@deployment, :viewstate => viewstate_id), @deployment.name)
> @failed_instances = @deployment.failed_instances.list(sort_column(Instance), sort_direction)
> if filter_view?
> @@ -440,8 +449,8 @@ class DeploymentsController < ApplicationController
> :include => :architecture,
> :conditions => {:provider_id => nil}
> )
> - @realm_choices = @realms.map{|r| [r.name, r.id]}
> - @realm_choices.unshift([I18n.t('deployments.launch_new.autoselect'), ''])
> +
> + @deployment.owner = current_user
> end
>
> def load_assemblies_services
> diff --git a/src/app/models/deployable.rb b/src/app/models/deployable.rb
> index 374b4e3..0d91cf0 100644
> --- a/src/app/models/deployable.rb
> +++ b/src/app/models/deployable.rb
> @@ -61,7 +61,7 @@ class Deployable < ActiveRecord::Base
> def validate_deployable_xml
> begin
> deployable_xml = DeployableXML.new(xml)
> - if !deployable_xml.validate!
> + if !deployable_xml.valid?
> errors.add(:xml, I18n.t('catalog_entries.flash.warning.not_valid'))
> elsif !deployable_xml.unique_assembly_names?
> errors.add(:xml, I18n.t('catalog_entries.flash.warning.not_valid_duplicate_assembly_names'))
> diff --git a/src/app/models/deployment.rb b/src/app/models/deployment.rb
> index fa8605f..c57754d 100644
> --- a/src/app/models/deployment.rb
> +++ b/src/app/models/deployment.rb
> @@ -107,7 +107,8 @@ class Deployment < ActiveRecord::Base
>
> def validate_xml
> begin
> - deployable_xml.validate!
> + deployable_xml_errors = deployable_xml.validate!
> + errors.add(:deployable_xml, deployable_xml_errors) unless deployable_xml_errors.empty?
> rescue DeployableXML::ValidationError => e
> errors.add(:deployable_xml, e.message)
> rescue Nokogiri::XML::SyntaxError => e
> @@ -304,10 +305,9 @@ class Deployment < ActiveRecord::Base
> :order => (order_field || 'name') +' '+ (order_dir || 'asc'))
> end
>
> - def valid_deployable_xml?(xml)
> + def valid_deployable_xml?
> begin
> - self.deployable_xml = DeployableXML.new(xml)
> - deployable_xml.validate!
> + deployable_xml.valid?
> true
> rescue
> errors.add(:base, I18n.t("deployments.errors.not_valid_deployable_xml", :msg => "#{$!.message}"))
> diff --git a/src/app/stylesheets/layout.scss b/src/app/stylesheets/layout.scss
> index 1f154ac..3ff0280 100644
> --- a/src/app/stylesheets/layout.scss
> +++ b/src/app/stylesheets/layout.scss
> @@ -2266,7 +2266,11 @@ form.generic.horizontal{
> span.text_instead_input{
> @include display_inline_block;
> font-weight: bold;
> - padding: 6px 0px;
> + padding: 4px 0px 3px 0px;
> + &.em{
> + font-size: 16px;
> + padding: 5px 0px 4px 0px;
> + }
> }
>
> }
> diff --git a/src/app/util/deployable_xml.rb b/src/app/util/deployable_xml.rb
> index cb01cf5..80db118 100644
> --- a/src/app/util/deployable_xml.rb
> +++ b/src/app/util/deployable_xml.rb
> @@ -239,7 +239,7 @@ class DeployableXML
>
> def validate!
> # load the relaxNG file and validate
> - return false if @root.nil?
> + return I18n.t("deployments.errors.empty_deployable_xml") if @root.nil?
> errors = relax.validate(@root.document) || []
> # ...and validate the assembly
> assemblies.each do |assembly|
> @@ -249,7 +249,11 @@ class DeployableXML
> errors << e.message
> end
> end
> - errors.empty?
> + errors
> + end
> +
> + def valid?
> + self.validate!.empty?
> end
>
> def unique_assembly_names?
> diff --git a/src/app/views/catalogs/_form.html.haml b/src/app/views/catalogs/_form.html.haml
> index 111569c..0c76c04 100644
> --- a/src/app/views/catalogs/_form.html.haml
> +++ b/src/app/views/catalogs/_form.html.haml
> @@ -2,7 +2,7 @@
> = render 'layouts/error_messages', :object => @catalog
> %fieldset
> .field
> - = form.label :name
> + = form.label :name, :class => 'em'
> .input
> = form.text_field :name, :class => 'em long'
> .field
> diff --git a/src/app/views/deployables/show.html.haml b/src/app/views/deployables/show.html.haml
> index a7ee021..7a19a5b 100644
> --- a/src/app/views/deployables/show.html.haml
> +++ b/src/app/views/deployables/show.html.haml
> @@ -7,7 +7,7 @@
> = link_to t('.edit_xml'), edit_polymorphic_path([@catalog, @deployable], :edit_xml => true), :class => 'button', :id => 'edit_xml_button'
> = button_to t('.delete'), polymorphic_path([@catalog, @deployable]), :method => 'delete', :confirm => "#{t'catalog_entries.show.confirm_delete'}", :class => 'button danger', :id => 'delete'
>
> - - launch_deployment_button_path = launch_time_params_deployments_path(:deployable_id => @deployable.id, :deployment => { :name => @deployable.name, :pool_id => @catalog.pool })
> + - launch_deployment_button_path = launch_new_deployments_path(:deployable_id => @deployable.id, :deployment => { :name => @deployable.name, :pool_id => @catalog.pool} )
> - if @catalog.present? && @deployable_errors.empty? && @pushed_count > 0
> = link_to t('.launch'), launch_deployment_button_path, :id => :launch_deployment_button, :'data-path' => launch_deployment_button_path
> -else
> diff --git a/src/app/views/deployments/_launch_new.html.haml b/src/app/views/deployments/_launch_new.html.haml
> index 6cfce80..6e3d612 100644
> --- a/src/app/views/deployments/_launch_new.html.haml
> +++ b/src/app/views/deployments/_launch_new.html.haml
> @@ -1,10 +1,8 @@
> = if request.xhr?
> = render :partial => '/layouts/new_notification'
> %header.page-header
> - .obj_actions
> - = link_to t('cancel'), pool_path(@pool), :class => 'button danger', :id => 'cancel_deployment_button'
> %h1.deployments
> - = @title
> + = t('deployments.new_deployment')
> %span= t('deployments.launch_new.to_pool', :name => "#{@pool.name.capitalize}")
>
> %section.content-section.deployment
> @@ -13,34 +11,35 @@
> = t 'deployments.deployment_details'
>
> .content
> - = form_for :deployment, {:url => launch_time_params_deployments_path, :method => :post, :html => {:class => 'generic'}} do
> + = form_for @deployment, {:url => launch_time_params_deployments_path, :method => :post, :html => {:class => 'generic'}} do |f|
> - if @deployment.errors.any?
> = render 'layouts/error_messages', :object => @deployment
> - = hidden_field :deployment, :pool_id
> + = f.hidden_field :pool_id
> %fieldset
> .field
> %label{:for => 'deployment_name'}
> = t 'deployments.deployment_name'
> %span
> = t 'deployments.deployment_name_subtext'
> - = text_field(:deployment, :name, :class => 'em long')
> + = f.text_field :name, :class => 'em long'
> %span#name_avail_indicator
>
> %fieldset
> .field
> %label{:for => 'deployable_id'}
> - = t('catalog_entries.index.deployable')
> - = select_tag :deployable_id, options_for_select(@deployables.map {|d| [d.name, d.id]}, params[:deployable_id])
> + = t('catalog_entries.index.catalog_entry')
> + = select_tag :deployable_id, options_from_collection_for_select(@deployables, :id, :name, params[:deployable_id])
>
> %fieldset
> .field
> %label{:for => 'frontend_realm_id'}
> = t('realms.index.realm')
> - = select :deployment, :frontend_realm_id, @realm_choices
> - %div#realm-description
> + = f.collection_select :frontend_realm_id, @realms, :id, :name, :include_blank => t('deployments.launch_new.autoselect')
> + %span#realm-description
>
> %fieldset.options
> - = submit_tag t('.next'), :class => 'button', :id => "next_button", :disabled => true
> + = link_to t('cancel'), pool_path(@pool), :class => 'button danger', :id => 'cancel_deployment_button'
> + = submit_tag t('.continue'), :class => 'button primary', :id => "next_button"
>
>
> :javascript
> @@ -49,23 +48,10 @@
> // Might be nice to build something in application.js to guard against this, and that also
> // introduces a ~250ms buffer so we don't do a lookup on every single keystroke...
> $(document).ready(function () {
> - $('#deployable_id').change(function(){
> - if($(this).val() !== 'other'){
> - $('#deployable-url-section').hide();
> - }else{
> - $('#deployable-url-section').show();
> - }
> - });
> $('#deployment_name').blur(function(e) {
> e.preventDefault();
> $.get('#{check_name_deployments_path}', {name: $('#deployment_name').val() }, function(data) {
> $('#name_avail_indicator').html(data == "false" ? "#{t'deployments.launch_new.already_in_use'}" : "#{t'deployments.launch_new.name_available'}");
> - if(data == "true" && $('#next_button').is(':disabled')){
> - $('#next_button').removeAttr('disabled');
> - }else if(data == "true" && $('#next_button').is_not(':disabled')){
> - }else{
> - $('#next_button').attr("disabled", "disabled");
> - }
> });
> });
>
> diff --git a/src/app/views/deployments/_overview.html.haml b/src/app/views/deployments/_overview.html.haml
> index d4a90fd..69669d7 100644
> --- a/src/app/views/deployments/_overview.html.haml
> +++ b/src/app/views/deployments/_overview.html.haml
> @@ -1,25 +1,26 @@
> - if @deployment.errors.any?
> = render 'layouts/error_messages', :object => @deployment
> -= form_for @deployment, :html => {:class => 'generic horizontal'} do
> - = hidden_field :deployment, :pool_id
> - = hidden_field :deployment, :frontend_realm_id
> += form_for @deployment, :html => {:class => 'generic horizontal'} do |f|
> + = f.hidden_field :pool_id
> + = f.hidden_field :name
> + = f.hidden_field :frontend_realm_id
> = hidden_field_tag :launch_parameters_encoded, @launch_parameters_encoded
> = hidden_field_tag :deployable_id, params[:deployable_id]
>
> %header.page-header
> - %h1.pools= t('.pool_name', :pool => @pool.name)
> + /%h1.pools= t('.pool_name', :pool => @pool.name)
> + %h1.deployments= t('.header', :deployment => @deployment.name, :pool => @pool.name)
>
> %section.content-section
> %header.align-center
> - %h2= t('.header', :deployment => @deployment.name, :pool => @pool.name)
> %p= t('.confirmation', :deployment => @deployment.name, :pool => @pool.name, :quota => number_to_percentage(@additional_quota, :precision => 0))
>
> .content
> %fieldset
> .field
> - = label_tag :name, t('.name'), :class => 'em'
> + = f.label :name, t('.name'), :class => 'em'
> .input
> - = text_field :deployment, :name, :class => 'em long'
> + %span.text_instead_input.em= @deployment.name
>
> - unless @deployment.deployable_xml.description.blank?
> .field
> @@ -36,15 +37,19 @@
>
> - if @realms.any?
> .field
> - = label_tag :realm, t('realms.index.realm')
> + = f.label :frontend_realm_id
> .input
> - = select :deployment, :frontend_realm_id, @realm_choices
> - %div#realm-description
> + - if @deployment.frontend_realm_id
> + %span.text_instead_input= @deployment.frontend_realm.name
> + /= select :deployment, :frontend_realm_id, @realm_choices
> + %div#realm-description= @deployment.frontend_realm.description
> + - else
> + %span.text_instead_input= t('deployments.launch_new.autoselect')
>
> .field
> - = label_tag :launch_with_errors , t('.launch_with_errors')
> + = f.label :launch_with_errors , t('.launch_with_errors')
> .input
> - = check_box :deployment, :partial_launch
> + = f.check_box :partial_launch
>
> .field
> = label_tag :image_ids, t('.image_ids')
> @@ -58,8 +63,3 @@
> = submit_tag t(:back), :class => 'button', :value => 'back'
> = submit_tag t('.launch'), :id => 'launch_deployment_button', :disabled => (@errors && @errors.any?)
> -# Quota checking to go here as well, once I understand how it works with new code
> -
> -:javascript
> - $(document).ready(function () {
> - Conductor.fetchAjaxDescription($('#deployment_frontend_realm_id'), $('#realm-description'), "#{realms_url}/");
> - });
> diff --git a/src/app/views/deployments/launch_from_catalog.html.haml b/src/app/views/deployments/launch_from_catalog.html.haml
> index cc2cf12..0f7f12a 100644
> --- a/src/app/views/deployments/launch_from_catalog.html.haml
> +++ b/src/app/views/deployments/launch_from_catalog.html.haml
> @@ -17,7 +17,7 @@
> %p= deployable.description
> .controls
> = link_to t(".details"),"#", :class => "collapse"
> - = button_to t(".select"), launch_time_params_deployments_path(:deployment => { :name => deployable.name, :pool_id => @catalog.pool.id }, :deployable_id => deployable.id ), :class=> "button pill"
> + = button_to t(".select"), launch_new_deployments_path(:deployment => { :name => deployable.name, :pool_id => @catalog.pool.id }, :deployable_id => deployable.id ), :class=> "button pill"
> .details.collapsible.collapsed
> %p= deployable.description
> %table
> diff --git a/src/app/views/deployments/launch_time_params.html.haml b/src/app/views/deployments/launch_time_params.html.haml
> index 78cbd69..84a173c 100644
> --- a/src/app/views/deployments/launch_time_params.html.haml
> +++ b/src/app/views/deployments/launch_time_params.html.haml
> @@ -1,7 +1,8 @@
> = render :partial => 'layouts/nav_history'
> %header.page-header
> %h1.deployments
> - = t('pools.header_show.pool_name', :name => @deployment.pool.name)
> + = t('deployments.new_deployment')
> + %span= t('deployments.launch_new.to_pool', :name => @pool.name)
>
> %section.content-section.deployments.launch-time-params
> %h2= t('.configure_launch_time_params')
> @@ -43,7 +44,10 @@
>
> #service-headers
>
> - = submit_tag t('.finalize'), :class => 'button primary', :id => 'submit_params'
> + %fieldset.options.align-center
> + = link_to t(:cancel), pool_path(@pool), :class => 'button danger', :id => 'cancel_deployment_button'
> + = submit_tag t(:back), :class => 'button', :value => 'back'
> + = submit_tag t('.continue'), :class => 'button primary', :id => 'submit_params'
>
> :javascript
> function checkEnteredParams() {
> diff --git a/src/app/views/pools/_pretty_list.html.haml b/src/app/views/pools/_pretty_list.html.haml
> index 4e16b69..0177499 100644
> --- a/src/app/views/pools/_pretty_list.html.haml
> +++ b/src/app/views/pools/_pretty_list.html.haml
> @@ -15,7 +15,7 @@
> = link_to(pool_details_label, pool_path(pool), :class =>'pool_details')
> %li
> - if check_privilege(Privilege::CREATE, Deployment, pool)
> - = link_to t('deployments.new_deployment'), launch_new_deployments_path(:pool_id => pool.id), :class => 'button primary', :id => 'new_deployment_button'
> + = link_to t('deployments.new_deployment'), launch_new_deployments_path(:deployment => { :pool_id => pool.id }), :class => 'button primary', :id => 'new_deployment_button'
> %li.catalog_link
> = render :partial => 'layouts/catalog_dropdown', :locals => {:catalogs => pool.catalogs}
>
> diff --git a/src/app/views/pools/show.html.haml b/src/app/views/pools/show.html.haml
> index 03317b1..db7c774 100644
> --- a/src/app/views/pools/show.html.haml
> +++ b/src/app/views/pools/show.html.haml
> @@ -3,7 +3,7 @@
> .obj_actions
> - if check_privilege(Privilege::CREATE, Deployment, @pool)
> = link_to t('deployments.new_deployment'),
> - launch_new_deployments_path(:pool_id => @pool.id),
> + launch_new_deployments_path(:deployment => {:pool_id => @pool.id}),
> :class => 'button primary',
> :id => 'new_deployment_button'
> .catalog_link
> diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml
> index 151a84e..745b85f 100644
> --- a/src/config/locales/en.yml
> +++ b/src/config/locales/en.yml
> @@ -308,7 +308,7 @@ en:
> launch_time_params:
> title: "Launch-time parameters"
> configure_launch_time_params: "Configure launch-time parameters for your deployment:"
> - finalize: Finalize
> + continue: "Continue"
> reference: "Reference to %{assembly}'s return parameter: %{parameter}"
> overview:
> pool_name: "%{pool} Pool"
> @@ -355,7 +355,7 @@ en:
> to_pool: "to %{name} Pool"
> already_in_use: That name is already in use
> name_available: Name available
> - next: Next
> + continue: "Continue"
> load_definition: Load definition from XML
> other: other
> autoselect: Auto-select
> @@ -388,7 +388,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"
> + deployable_not_selected: "Please select Deployable. It might need to get created first."
> error:
> not_launched: "Some assemblies will not be launched:"
> failed_to_launch_assemblies: "Failed to launch following assemblies:"
> @@ -413,6 +413,7 @@ en:
> cannot_stop: "stop cannot be performed on this instance."
> all_stopped: "All instances must be stopped or running"
> not_valid_deployable_xml: "seems to be not valid deployable XML: %{msg}"
> + empty_deployable_xml: "is empty"
> match_not_found: "Match not found: %{errors}"
> preset_filters:
> all_deployments: All Deployments
> diff --git a/src/features/deployables.feature b/src/features/deployables.feature
> index f63670c..92bab6b 100644
> --- a/src/features/deployables.feature
> +++ b/src/features/deployables.feature
> @@ -47,7 +47,7 @@ Feature: Manage Catalog Entries
> And there is "front_hwp2" conductor hardware profile
> And I am on testdepl's catalog entry page
> When I follow "launch_deployment_button"
> - Then I should be on the launch time params deployments page
> + Then I should be on the launch new deployments page
>
> Scenario: Delete deployables
> Given there is a "default" catalog
>
More information about the aeolus-devel
mailing list