[PATCH 1/8] UI interface to select specific providers to upload build images to
by Richard Su
---
.../controllers/image_factory/builds_controller.rb | 7 +++++
.../image_factory/templates_controller.rb | 14 +++++++++-
src/app/models/image.rb | 6 ++--
src/app/views/image_factory/templates/_builds.haml | 25 ++++++++++++++-----
src/config/routes.rb | 2 +-
5 files changed, 41 insertions(+), 13 deletions(-)
diff --git a/src/app/controllers/image_factory/builds_controller.rb b/src/app/controllers/image_factory/builds_controller.rb
index 9b83bd7..9f0579f 100644
--- a/src/app/controllers/image_factory/builds_controller.rb
+++ b/src/app/controllers/image_factory/builds_controller.rb
@@ -43,6 +43,13 @@ class ImageFactory::BuildsController < ApplicationController
render :action => 'new'
end
end
+
+ def upload_or_delete
+ @tpl = Template.find(params[:template_id])
+ # FIXME: add logic to upload image
+ # or delete image depending on which button was used
+ redirect_to image_factory_template_path(@tpl, :details_tab => 'builds')
+ end
def edit
# FIXME: is @tpl defined here? do we need check_permission here?
diff --git a/src/app/controllers/image_factory/templates_controller.rb b/src/app/controllers/image_factory/templates_controller.rb
index c79cdce..eef4e61 100644
--- a/src/app/controllers/image_factory/templates_controller.rb
+++ b/src/app/controllers/image_factory/templates_controller.rb
@@ -196,20 +196,30 @@ class ImageFactory::TemplatesController < ApplicationController
def load_images(tpl)
@images_header = [
+ {:name => '', :sort_attr => 'select'},
{:name => 'ARCH', :sort_attr => 'templates.architecture'},
{:name => 'PROVIDER', :sort_attr => 'provider'},
{:name => 'STATUS', :sort_attr => 'status'},
{:name => 'UPLOADED?', :sort_attr => 'images.uploaded'},
]
-
@imaged_provider_types = {}
+ @targets_not_built = {}
+ @target_build_status = {}
+
+ Image.available_targets.each do |id, target|
+ @targets_not_built[id] = target
+ end
+
tpl.images.each do |img|
+ @target_build_status[img.target] = img.status
+ @targets_not_built.delete(img.target)
img.provider_images.each do |pimg|
@imaged_provider_types[pimg.provider_id] = img.target
end
end
+ @targets_not_built = @targets_not_built.invert
- @providers_not_uploaded = Provider.find_all_by_provider_type((a)imaged_provider_types.keys.uniq)
+ @providers_not_uploaded = Provider.find_all_by_provider_type((a)imaged_provider_types.values.uniq)
@providers_not_uploaded.each do |provider|
if @imaged_provider_types.has_key?(provider.id)
@providers_not_uploaded.delete(provider)
diff --git a/src/app/models/image.rb b/src/app/models/image.rb
index 7d71089..aee6e98 100644
--- a/src/app/models/image.rb
+++ b/src/app/models/image.rb
@@ -82,11 +82,11 @@ class Image < ActiveRecord::Base
if Image.find_by_template_id_and_target(template.id, target)
raise ImageExistsError, "An attempted build of this template for the target '#{target}' already exists"
end
-
+
unless provider = Provider.find_by_target_with_account(target)
raise "There is no provider for '#{target}' type with valid account."
end
-
+
img = nil
Image.transaction do
img = Image.create!(
@@ -97,7 +97,7 @@ class Image < ActiveRecord::Base
)
ProviderImage.create!(
:image_id => img.id,
- :provider_id => provider
+ :provider_id => provider.id
)
end
return img
diff --git a/src/app/views/image_factory/templates/_builds.haml b/src/app/views/image_factory/templates/_builds.haml
index a9822f0..f1a98c8 100644
--- a/src/app/views/image_factory/templates/_builds.haml
+++ b/src/app/views/image_factory/templates/_builds.haml
@@ -3,11 +3,20 @@ Builds for
= @tpl.platform_version
, template "#{(a)tpl.name}"
-- form_tag :action => "" do
+- form_tag(image_factory_builds_path, { :action => 'create', :method => :post }) do
+ = hidden_field_tag :template_id, @tpl.id
+ New Build for
+ = select( "targets", "", options_for_select(@targets_not_built))
+ = submit_tag "Go", :name => "build"
+
+- form_tag(upload_or_delete_image_factory_builds_path, { :action => "destroy", :method => :post }) do
+ = hidden_field_tag :template_id, @tpl.id
/= restful_submit_tag "Cancel Job", :name => "job_details", :disabled => true, :class => "icon"
/= restful_submit_tag "Show Job Details", :name => "job_details", :disabled => true, :class => "icon"
/= restful_submit_tag "Show Job Log", :name => "job_log", :disabled => true, :class => "icon"
/= restful_submit_tag "Clear Job History", :name => "job_history", :disabled => true, :class => "icon"
+ = submit_tag "Upload", :name => "upload"
+ = submit_tag "Delete", :name => "delete"
%table
= sortable_table_header(@images_header)
@@ -19,13 +28,15 @@ Builds for
- @images.each do |img|
- img.provider_images.each do |pimg|
%tr
+ %td= check_box_tag 'selected[]', pimg.provider_id, @url_params[:select] == 'all', :id => "selected_#{pimg.provider_id}"
%td= img.template.architecture
%td= pimg.provider.nil? ? '' : pimg.provider.name
%td= img.status
%td= pimg.uploaded? ? 'yes' : 'no'
- - @providers_not_uploaded.each do |provider|
- %tr
- %td= @tpl.architecture
- %td= provider.name
- %td= img.status
- %td no
\ No newline at end of file
+ - @providers_not_uploaded.each do |provider|
+ %tr
+ %td= check_box_tag 'selected[]', provider.id, @url_params[:select] == 'all', :id => "selected_#{provider.id}"
+ %td= @tpl.architecture
+ %td= provider.name
+ %td= @target_build_status[provider.provider_type]
+ %td no
\ No newline at end of file
diff --git a/src/config/routes.rb b/src/config/routes.rb
index ee65acb..48853da 100644
--- a/src/config/routes.rb
+++ b/src/config/routes.rb
@@ -45,7 +45,7 @@ ActionController::Routing::Routes.draw do |map|
r.resources :assemblies
r.resources :deployables, :collection => { :multi_destroy => :delete }
r.resources :templates, :collection => {:collections => :get, :add_selected => :get, :metagroup_packages => :get, :remove_package => :get, :multi_destroy => :delete}
- r.resources :builds
+ r.resources :builds, :collection => { :upload_or_delete => :delete }
end
map.namespace 'admin' do |r|
--
1.7.4
12 years, 6 months
[PATCH aeolus] Image Warehouse API library for conductor
by Maros Zatko
From: Maros Zatko <mzatko(a)redhat.com>
---
src/lib/warehouse_client.rb | 154 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 154 insertions(+), 0 deletions(-)
create mode 100644 src/lib/warehouse_client.rb
diff --git a/src/lib/warehouse_client.rb b/src/lib/warehouse_client.rb
new file mode 100644
index 0000000..9431e47
--- /dev/null
+++ b/src/lib/warehouse_client.rb
@@ -0,0 +1,154 @@
+require 'rubygems'
+
+require 'rest-client'
+require 'nokogiri'
+
+#TODO: perform iwhd version-dependent URI mapping
+
+module Warehouse
+
+ class BucketObject
+ attr_reader :key
+
+ def initialize(connection, key, bucket)
+ @connection = connection
+ @key = key
+ @bucket = bucket
+ @path = "/#{@bucket.name}/#{(a)key}"
+ end
+
+ def self.create(connection, key, bucket, body, attrs = {})
+ obj = new(connection, key, bucket)
+ obj.set_body(body)
+ obj.set_attrs(attrs)
+ obj
+ end
+
+ def body
+ @connection.do_request @path, :plain => true
+ end
+
+ def set_body(body)
+ @connection.do_request @path, :content => body, :method => :put
+ end
+
+ def attr_list
+ result = @connection.do_request @path, :content => 'op=parts', :method => :post
+ return result.xpath('/object/object_attr/@name').to_a.map {|item| item.value}
+ end
+
+ def attrs(list)
+ attrs = {}
+ list.each do |att|
+ attrs[att] = (@connection.do_request("#{@path}/#{att}", :plain => true) rescue nil)
+ end
+ attrs
+ end
+
+ def attr(name)
+ attrs([name]).first
+ end
+
+ def set_attrs(hash)
+ hash.each do |name, content|
+ set_attr(name, content)
+ end
+ end
+
+ def set_attr(name, content)
+ path = "#{@path}/#{name}"
+ @connection.do_request path, :content => content, :method => :put
+ end
+
+ def delete!
+ @connection.do_request @path, :method => :delete
+ true
+ end
+
+ end
+
+ class Bucket
+ attr_accessor :name
+
+ def initialize(name, connection)
+ @name = name
+ @connection = connection
+ end
+
+ def to_s
+ "Bucket: #{@name}"
+ end
+
+ def object_names
+ result = @connection.do_request "/#{@name}"
+ result.xpath('/objects/object').map do |obj|
+ obj.at_xpath('./key/text()').to_s
+ end
+ end
+
+ def objects
+ object_names.map do |name|
+ object(name)
+ end
+ end
+
+ def object(key)
+ BucketObject.new @connection, key, self
+ end
+
+ def create_object(key, body, attrs)
+ BucketObject.create(@connection, key, self, body, attrs)
+ end
+ end
+
+ class Connection
+ attr_accessor :uri
+
+ def initialize(uri)
+ @uri = uri
+ end
+
+ def do_request(path = '', opts={})
+ opts[:method] ||= :get
+ opts[:content] ||= ''
+ opts[:plain] ||= false
+ opts[:headers] ||= {}
+
+ result = RestClient::Request.execute :method => opts[:method], :url => @uri + path, :payload => opts[:content], :headers => opts[:headers]
+
+ return Nokogiri::XML result unless opts[:plain]
+ return result
+ end
+
+ end
+
+ class Client
+
+ def initialize(uri)
+ @connection = Connection.new(uri)
+ end
+
+ def create_bucket(bucket)
+ @connection.do_request "/#{bucket}", :method => :put
+ Bucket.new(bucket, @connection)
+ end
+
+ def bucket(bucket)
+ Bucket.new bucket, @connection
+ end
+
+ def buckets
+ @connection.do_request.xpath('/api/link[@rel="bucket"]').map do |obj|
+ obj.at_xpath('./@href').to_s.gsub(/.*\//, '')
+ end
+ end
+
+ def get_iwhd_version
+ result = @connection.do_request.at_xpath('/api[@service="image_warehouse"]/@version')
+ raise "Response does not contain <api> tag or version information" if result == nil
+ return result.value
+ end
+
+ end
+
+end
--
1.7.4
12 years, 6 months
[PATCH] Added delayed_job service start/stop
by Jan Provazník
From: Jan Provaznik <jprovazn(a)redhat.com>
---
recipes/aeolus_recipe/manifests/conductor.pp | 16 +++++++++++-----
1 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/recipes/aeolus_recipe/manifests/conductor.pp b/recipes/aeolus_recipe/manifests/conductor.pp
index 2c22d4f..b886cdc 100644
--- a/recipes/aeolus_recipe/manifests/conductor.pp
+++ b/recipes/aeolus_recipe/manifests/conductor.pp
@@ -37,7 +37,8 @@ class aeolus::conductor inherits aeolus {
require => File['/var/lib/condor/condor_config.local'] }
service { ['aeolus-conductor',
'conductor-condor_refreshd',
- 'conductor-dbomatic']:
+ 'conductor-dbomatic',
+ 'conductor-delayed_job']:
ensure => 'running',
enable => true,
hasstatus => true,
@@ -140,6 +141,7 @@ class aeolus::conductor inherits aeolus {
environment => "RAILS_ENV=production",
require => Rails::Migrate::Db['migrate_aeolus_database']}
+
### Setup apache for deltacloud
include apache
if $enable_security {
@@ -166,7 +168,8 @@ class aeolus::conductor::disabled {
'conductor-condor_refreshd',
'conductor-dbomatic',
'imagefactoryd',
- 'conductor-image_builder_service']}
+ 'conductor-image_builder_service',
+ 'conductor-delayed_job']}
package {'aeolus-conductor':
provider => 'yum', ensure => 'absent',
@@ -191,10 +194,12 @@ class aeolus::conductor::disabled {
enable => false,
require => Service['aeolus-conductor',
'conductor-condor_refreshd',
- 'conductor-dbomatic'] }
+ 'conductor-dbomatic',
+ 'conductor-delayed_job'] }
service { ['aeolus-conductor',
'conductor-condor_refreshd',
- 'conductor-dbomatic']:
+ 'conductor-dbomatic',
+ 'conductor-delayed_job']:
ensure => 'stopped',
enable => false,
hasstatus => true }
@@ -206,7 +211,8 @@ class aeolus::conductor::disabled {
require => Service["aeolus-conductor",
"conductor-condor_refreshd",
"conductor-dbomatic",
- "conductor-image_builder_service"]}
+ "conductor-image_builder_service",
+ "conductor-delayed_job"]}
postgres::user{"aeolus":
ensure => 'dropped',
require => Rails::Drop::Db["drop_aeolus_database"]}
--
1.7.4
12 years, 6 months
Warehouse integration
by Jan Provazník
Hi, this is first version of warehouse integration.
build and push methods for image building are now mocked up, there is not real
image_builder_service call in their body.
Requires patches: delayed_job, provider type, Image Warehouse API library for
conductor.
12 years, 6 months
[PATCH] Omitted a few associations with the deployments patch
by Scott Seago
Signed-off-by: Scott Seago <sseago(a)redhat.com>
---
src/app/models/pool.rb | 1 +
src/app/models/pool_family.rb | 4 ++++
src/app/models/user.rb | 1 +
3 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/src/app/models/pool.rb b/src/app/models/pool.rb
index ce36d7d..39fa489 100644
--- a/src/app/models/pool.rb
+++ b/src/app/models/pool.rb
@@ -41,6 +41,7 @@ class Pool < ActiveRecord::Base
text :name, :as => :code_substring
end
has_many :instances, :dependent => :destroy
+ has_many :deployments, :dependent => :destroy
belongs_to :quota
belongs_to :pool_family
diff --git a/src/app/models/pool_family.rb b/src/app/models/pool_family.rb
index 8d5c951..175f6ac 100644
--- a/src/app/models/pool_family.rb
+++ b/src/app/models/pool_family.rb
@@ -39,6 +39,10 @@ class PoolFamily < ActiveRecord::Base
has_many :pools, :dependent => :destroy
has_and_belongs_to_many :provider_accounts
+ has_many :permissions, :as => :permission_object, :dependent => :destroy,
+ :include => [:role],
+ :order => "permissions.id ASC"
+
validates_presence_of :name
validates_uniqueness_of :name
def self.default
diff --git a/src/app/models/user.rb b/src/app/models/user.rb
index 4d95adc..4d387e8 100644
--- a/src/app/models/user.rb
+++ b/src/app/models/user.rb
@@ -58,6 +58,7 @@ class User < ActiveRecord::Base
has_many :permissions
has_many :owned_instances, :class_name => "Instance", :foreign_key => "owner_id"
+ has_many :owned_deployments, :class_name => "Deployment", :foreign_key => "owner_id"
belongs_to :quota, :autosave => true
accepts_nested_attributes_for :quota
--
1.7.3.4
12 years, 6 months
Provider Type model(rev.2)
by jzigmund@redhat.com
Patchset implements new model for Provider Types, does all refactoring according Provider Type model
and fixes tests after refactoring.
12 years, 6 months