From: Tomas Sedovic <tomas(a)sedovic.cz>
https://www.aeolusproject.org/redmine/issues/2853
It shows the following states: not built, building, not pushed, pushing,
pushed. And it allows the user to rebuild and re-push all images.
As things are now, building and pushing is a 2-step operation.
Note that the page isn't styled properly yet.
---
src/app/controllers/deployables_controller.rb | 91 +++++++++++++++++++++++++
src/app/views/deployables/show.html.haml | 12 ++--
src/config/locales/en.yml | 9 +++
src/config/routes.rb | 1 +
4 files changed, 106 insertions(+), 7 deletions(-)
diff --git a/src/app/controllers/deployables_controller.rb
b/src/app/controllers/deployables_controller.rb
index c5e7a4e..a51b496 100644
--- a/src/app/controllers/deployables_controller.rb
+++ b/src/app/controllers/deployables_controller.rb
@@ -63,6 +63,12 @@ class DeployablesController < ApplicationController
flash[:error] = assembly[key] if key.to_s =~ /^error\w+/
end
end
+ images = @catalog_entry.deployable.fetch_images
+ builder = Aeolus::Image::Factory::Builder.first
+ @build_results = []
+ ProviderAccount.group_by_type(current_user).each do |driver, groups|
+ @build_results << build_status(images, builder, driver,
groups[:accounts].first)
+ end
end
def create
@@ -172,6 +178,23 @@ class DeployablesController < ApplicationController
redirect_to
original_path.merge(original_params).merge("catalog_entries_preset_filter" =>
params[:catalog_entries_preset_filter], "catalog_entries_search" =>
params[:catalog_entries_search])
end
+ def build
+ catalog = Catalog.find(params[:catalog_id])
+ deployable = Deployable.find(params[:deployable_id])
+ require_privilege(Privilege::MODIFY, catalog)
+ require_privilege(Privilege::MODIFY, deployable)
+
+ images = deployable.fetch_images
+ options = params[:build_options].to_sym
+ case options
+ when :rebuild_all
+ build_all(images)
+ when :push_all
+ push_all(images)
+ end
+ redirect_to catalog_deployable_path(catalog, deployable)
+ end
+
private
def set_header
@@ -198,4 +221,72 @@ class DeployablesController < ApplicationController
nil
end
end
+
+ def build_status(images, builder, driver, account)
+ result = { :provider => account.provider.name }
+
+ builds = images.map { |image| image.latest_pushed_or_unpushed_build }
+ return result.merge(:status => :not_built) if builds.any? { |b| b.blank? }
+
+ building = builds.any? { |b| builder.find_active_build(b.id, driver) }
+ return result.merge(:status => :building) if building
+
+ target_images = builds.map do |build|
+ build.target_images.find { |ti| ti.target == driver }
+ end
+
+ if target_images.any? { |ti| ti.blank? }
+ return result.merge(:status => :not_built)
+ end
+
+ pushing = target_images.any? do |ti|
+ builder.find_active_push(ti.id, account.provider.name,
account.credentials_hash["username"])
+ end
+ if pushing
+ return result.merge(:status => :pushing)
+ end
+
+ provider_images = target_images.map do |target_image|
+ target_image.find_provider_image_by_provider_and_account(account.provider.name,
account.warehouse_id).first
+ end
+
+ if provider_images.any? { |pi| pi.blank? }
+ return result.merge(:status => :not_pushed)
+ end
+ return result.merge(:status => :pushed)
+ end
+
+ def build_all(images)
+ images.each do |image|
+ factory_image = Aeolus::Image::Factory::Image.new(:id => image.id)
+ factory_image.targets = Provider.list_for_user(current_user, Privilege::VIEW).map
{|p| p.provider_type.deltacloud_driver}.uniq.join(',')
+ factory_image.template = image.template
+ factory_image.save!
+ end
+ end
+
+ def push_all(images)
+ provider_images = []
+ images.each do |image|
+ ProviderAccount.group_by_type(current_user).each do |driver, groups|
+ account = groups[:accounts].first
+
+ build = image.latest_pushed_or_unpushed_build
+ raise Exception.new t('catalog_entries.errors.images_not_built') unless
build
+ target_image = build.target_images.find { |ti| ti.target == driver }
+ raise Exception.new t('catalog_entries.errors.images_not_built') unless
target_image
+ provider_images << Aeolus::Image::Factory::ProviderImage.new(
+ :provider => account.provider.name,
+ :credentials => account.to_xml(:with_credentials => true),
+ :image_id => image.uuid,
+ :build_id => build.uuid,
+ :target_image_id => target_image.uuid
+ )
+ end
+ end
+
+ provider_images.each do |provider_image|
+ provider_image.save!
+ end
+ end
end
diff --git a/src/app/views/deployables/show.html.haml
b/src/app/views/deployables/show.html.haml
index 1eab46e..02ab7a9 100644
--- a/src/app/views/deployables/show.html.haml
+++ b/src/app/views/deployables/show.html.haml
@@ -39,19 +39,17 @@
%header
%h2= t('.build')
- = form_tag() do
- = select_tag :build_option, options_for_select([[t("rebuild_all"),
1]])
+ = form_tag(catalog_deployable_build_path((a)catalog_entry.catalog,
@catalog_entry.deployable)) do
+ = select_tag :build_options, options_for_select([[t(".rebuild_all"),
:rebuild_all], [t(".push_all"), :push_all]])
= submit_tag t('.start'), :id => :start_build
%p.description= t('.build_description')
%ul#providers-list
- - @providers.each do |provider|
+ - @build_results.each do |result|
%li
- %span.provider= provider.name
- %span.status Building 98%
- -#= form_tag()
- -# %button on/off
+ %span.provider= result[:provider]
+ %span.status= result[:status]
%section.catalogs
diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml
index 64512ec..57e0e41 100644
--- a/src/config/locales/en.yml
+++ b/src/config/locales/en.yml
@@ -783,12 +783,21 @@ en:
not_deleted:
one: "Deployable %{list} was not deleted. There are deployments associated
with it."
other: "Deployables %{list} were not deleted. They have deployments
associated with them."
+ show:
+ build: Build
+ build_description:
+ "Allow this deployable's associated image(s) to be built and pushed to
+ providers by enabling them below."
+ start: Start
+ rebuild_all: Rebuild all images
+ push_all: Push all images
flash:
error:
attribute_not_exist: "Some attribute(s) is missing in XML, please check the
file!"
error:
attribute_not_exists: invalid
hwp_not_exists: "Hardware profile %{name} doesn't exist in DB"
+ images_not_built: Error building images
name: Name
summary: Summary
settings:
diff --git a/src/config/routes.rb b/src/config/routes.rb
index 7a7df6e..b07ba9e 100644
--- a/src/config/routes.rb
+++ b/src/config/routes.rb
@@ -205,6 +205,7 @@ Conductor::Application.routes.draw do
resources :deployables do
delete 'multi_destroy', :on => :collection
post :filter, :on => :collection
+ post :build
end
end
--
1.7.6.4