This patchset contains not only code for task #197, but also it contains renaming model of CloudAccount to ProviderAccount, and all fixings, that they were needed for green tests and changes in next branch, while this patchset was written. You need to apply all patches to work it well, when you will make a review.
From: Jozef Zigmund jzigmund@redhat.com
Inside this patch I rename model of CloudAccount to ProviderAccount. Also I refactor all codes where this model was called. --- .../admin/provider_accounts_controller.rb | 16 +- src/app/controllers/cloud_accounts_controller.rb | 181 ----------------- src/app/controllers/dashboard_controller.rb | 6 +- src/app/controllers/permissions_controller.rb | 6 +- .../controllers/provider_accounts_controller.rb | 181 +++++++++++++++++ src/app/controllers/quotas_controller.rb | 2 +- src/app/models/cloud_account.rb | 205 -------------------- src/app/models/image.rb | 2 +- src/app/models/permission.rb | 2 +- src/app/models/provider.rb | 4 +- src/app/models/provider_account.rb | 204 +++++++++++++++++++ src/app/services/data_service_active_record.rb | 8 +- src/app/services/graph_service.rb | 2 +- src/app/views/cloud_accounts/_form.haml | 52 ----- src/app/views/cloud_accounts/edit.haml | 17 -- src/app/views/cloud_accounts/index.haml | 25 --- src/app/views/cloud_accounts/new.haml | 17 -- src/app/views/provider_accounts/_form.haml | 52 +++++ src/app/views/provider_accounts/edit.haml | 17 ++ src/app/views/provider_accounts/index.haml | 25 +++ src/app/views/provider_accounts/new.haml | 17 ++ src/classad_plugin/classad_plugin.rb | 2 +- src/config/old_navigation.rb | 2 +- src/config/routes.rb | 4 +- ...824_rename_cloud_account_to_provider_account.rb | 9 + src/db/seeds.rb | 12 +- src/dbomatic/dbomatic | 2 +- .../step_definitions/provider_account_steps.rb | 8 +- src/features/step_definitions/provider_steps.rb | 2 +- src/features/support/custom.rb | 2 +- src/features/support/paths.rb | 2 +- src/lib/tasks/demo_data.rake | 4 +- .../controllers/cloud_accounts_controller_spec.rb | 92 --------- .../provider_accounts_controller_spec.rb | 92 +++++++++ src/spec/factories/cloud_account.rb | 21 -- src/spec/factories/provider_account.rb | 21 ++ src/spec/models/cloud_account_spec.rb | 80 -------- src/spec/models/provider_account_spec.rb | 80 ++++++++ src/test/fixtures/roles.yml | 4 +- src/test/unit/cloud_account_test.rb | 8 - src/test/unit/provider_account_test.rb | 8 + 41 files changed, 755 insertions(+), 741 deletions(-) delete mode 100644 src/app/controllers/cloud_accounts_controller.rb create mode 100644 src/app/controllers/provider_accounts_controller.rb delete mode 100644 src/app/models/cloud_account.rb create mode 100644 src/app/models/provider_account.rb delete mode 100644 src/app/views/cloud_accounts/_form.haml delete mode 100644 src/app/views/cloud_accounts/edit.haml delete mode 100644 src/app/views/cloud_accounts/index.haml delete mode 100644 src/app/views/cloud_accounts/new.haml create mode 100644 src/app/views/provider_accounts/_form.haml create mode 100644 src/app/views/provider_accounts/edit.haml create mode 100644 src/app/views/provider_accounts/index.haml create mode 100644 src/app/views/provider_accounts/new.haml create mode 100644 src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb delete mode 100644 src/spec/controllers/cloud_accounts_controller_spec.rb create mode 100644 src/spec/controllers/provider_accounts_controller_spec.rb delete mode 100644 src/spec/factories/cloud_account.rb create mode 100644 src/spec/factories/provider_account.rb delete mode 100644 src/spec/models/cloud_account_spec.rb create mode 100644 src/spec/models/provider_account_spec.rb delete mode 100644 src/test/unit/cloud_account_test.rb create mode 100644 src/test/unit/provider_account_test.rb
diff --git a/src/app/controllers/admin/provider_accounts_controller.rb b/src/app/controllers/admin/provider_accounts_controller.rb index d422a53..e5d3ccd 100644 --- a/src/app/controllers/admin/provider_accounts_controller.rb +++ b/src/app/controllers/admin/provider_accounts_controller.rb @@ -17,8 +17,12 @@ class Admin::ProviderAccountsController < ApplicationController
def show @tab_captions = ['Properties', 'Credentials', 'History', 'Permissions'] +<<<<<<< HEAD @account = CloudAccount.find(params[:id]) require_privilege(Privilege::VIEW, @account) +======= + @account = ProviderAccount.find(params[:id]) +>>>>>>> Rename CloudAccount to ProviderAccount @details_tab = params[:details_tab].blank? ? 'properties' : params[:details_tab]
if params.delete :test_account @@ -38,7 +42,7 @@ class Admin::ProviderAccountsController < ApplicationController end
def new - @cloud_account = CloudAccount.new + @cloud_account = ProviderAccount.new @quota = Quota.new @providers = Provider.all end @@ -48,7 +52,7 @@ class Admin::ProviderAccountsController < ApplicationController require_privilege(Privilege::CREATE, CloudAccount, @provider)
@providers = Provider.all - @cloud_account = CloudAccount.new(params[:cloud_account]) + @cloud_account = ProviderAccount.new(params[:cloud_account]) @cloud_account.provider = @provider @cloud_account.quota = @quota = Quota.new
@@ -81,14 +85,14 @@ class Admin::ProviderAccountsController < ApplicationController end
def edit - @cloud_account = CloudAccount.find(params[:id]) + @cloud_account = ProviderAccount.find(params[:id]) @quota = @cloud_account.quota @provider = @cloud_account.provider require_privilege(Privilege::MODIFY,@cloud_account) end
def update - @cloud_account = CloudAccount.find(params[:id]) + @cloud_account = ProviderAccount.find(params[:id]) @provider = @cloud_account.provider require_privilege(Privilege::MODIFY,@cloud_account) @quota = @cloud_account.quota @@ -112,7 +116,7 @@ class Admin::ProviderAccountsController < ApplicationController if (not params[:accounts_selected]) or (params[:accounts_selected].length == 0) flash[:notice] = "You must select some accounts first." else - CloudAccount.find(params[:accounts_selected]).each do |account| + ProviderAccount.find(params[:accounts_selected]).each do |account| account.destroy if check_privilege(Privilege::MODIFY, account) end end @@ -140,7 +144,7 @@ class Admin::ProviderAccountsController < ApplicationController end
def load_accounts - @accounts = CloudAccount.paginate(:all, + @accounts = ProviderAccount.paginate(:all, :page => params[:page] || 1, :order => (params[:order_field] || 'label') +' '+ (params[:order_dir] || 'asc') ) diff --git a/src/app/controllers/cloud_accounts_controller.rb b/src/app/controllers/cloud_accounts_controller.rb deleted file mode 100644 index d292f57..0000000 --- a/src/app/controllers/cloud_accounts_controller.rb +++ /dev/null @@ -1,181 +0,0 @@ -# -# Copyright (C) 2010 Red Hat, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; version 2 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -# MA 02110-1301, USA. A copy of the GNU General Public License is -# also available at http://www.gnu.org/copyleft/gpl.html. - -# Filters added to this controller apply to all controllers in the application. -# Likewise, all the methods added will be available for all controllers. - -class CloudAccountsController < ApplicationController - before_filter :require_user - before_filter :load_providers - - helper :providers - - def section_id - 'administration' - end - - def index - @provider = Provider.find(params[:provider_id]) - require_privilege(Privilege::VIEW, CloudAccount, @provider) - end - - def new - @provider = Provider.find(params[:provider_id]) - @cloud_account = CloudAccount.new - @quota = Quota.new - require_privilege(Privilege::CREATE, CloudAccount, @provider) - end - - def create - @provider = Provider.find(params[:provider_id]) - require_privilege(Privilege::CREATE, CloudAccount, @provider) - @cloud_account = CloudAccount.new(params[:cloud_account]) - @cloud_account.provider = @provider - @cloud_account.quota = @quota = Quota.new - - if params[:test_account] - test_account(@cloud_account) - render :action => 'new' and return - end - - limit = params[:quota][:maximum_running_instances] if params[:quota] - @cloud_account.quota.set_maximum_running_instances(limit) - - if @cloud_account.invalid? - if not @cloud_account.valid_credentials? - flash.now[:error] = "The entered credential information is incorrect" - elsif @cloud_account.errors.on(:username) - flash.now[:error] = "The access key '#{params[:cloud_account][:username]}' has already been taken." - else - flash.now[:error] = "You must fill in all the required fields" - end - render :action => 'new' and return - end - - @cloud_account.pool_families << PoolFamily.default - @cloud_account.save! - if @cloud_account.populate_realms - flash[:notice] = "Provider account added." - end - redirect_to provider_accounts_path(@provider) - kick_condor - end - - def edit - @cloud_account = CloudAccount.find(params[:id]) - @quota = @cloud_account.quota - @provider = @cloud_account.provider - require_privilege(Privilege::MODIFY, @cloud_account) - end - - def update_accounts - @provider = Provider.find(params[:provider][:id]) - require_privilege(Privilege::MODIFY, CloudAccount, @provider) - @providers = Provider.list_for_user(@current_user, Privilege::VIEW) - - success = true - @provider.cloud_accounts.each do |cloud_account| - attributes = params[:cloud_accounts][cloud_account.id.to_s] - - password = attributes[:password] - # blank password means the user didn't change it -- don't update it then - if password.blank? - attributes.delete :password - end - cloud_account.quota.maximum_running_instances = quota_from_string(params[:quota][cloud_account.id.to_s][:maximum_running_instances]) - - private_cert = attributes[:x509_cert_priv_file] - unless private_cert.blank? - attributes[:x509_cert_priv] = private_cert.read - end - attributes.delete :x509_cert_priv_file - - public_cert = attributes[:x509_cert_pub_file] - unless public_cert.blank? - attributes[:x509_cert_pub] = public_cert.read - end - attributes.delete :x509_cert_pub_file - - begin - cloud_account.update_attributes!(attributes) - cloud_account.quota.save! - rescue - success = false - end - end - if success - flash[:notice] = "Account updated." - redirect_to :controller => 'providers', :action => 'accounts', :id => @provider - else - flash.now[:notice] = "Error updating the cloud account." - render :template => 'provider/accounts' - end - end - - def update - @cloud_account = CloudAccount.find(params[:id]) - @provider = @cloud_account.provider - require_privilege(Privilege::MODIFY, @cloud_account) - @quota = @cloud_account.quota - - limit = params[:quota][:maximum_running_instances] if params[:quota] - @cloud_account.quota.set_maximum_running_instances(limit) - if @cloud_account.update_attributes(params[:cloud_account]) - flash[:notice] = "Cloud Account updated!" - redirect_to provider_accounts_path(@provider) - else - render :action => :edit - end - end - - def key - @cloud_account = CloudAccount.find(params[:id]) - require_privilege(Privilege::MODIFY,@cloud_account) - unless @cloud_account.instance_key.nil? - render :text => @cloud_account.instance_key.pem - end - end - - def destroy - account = CloudAccount.find(params[:id]) - provider = account.provider - require_privilege(Privilege::MODIFY, account) - if account.destroy - flash[:notice] = "Cloud Account destroyed" - else - flash[:error] = "Cloud Account could not be destroyed" - end - redirect_to provider_accounts_path(provider) - end - - def test_account(account) - if account.valid_credentials? - flash.now[:notice] = "Test Connection Success: Valid Account Details" - else - flash.now[:error] = "Test Connection Failed: Invalid Account Details" - end - rescue - flash.now[:error] = "Test Connection Failed: Could not connect to provider" - end - - private - - def load_providers - @providers = Provider.list_for_user(@current_user, Privilege::VIEW) - end -end diff --git a/src/app/controllers/dashboard_controller.rb b/src/app/controllers/dashboard_controller.rb index 5254dd7..17feedc 100644 --- a/src/app/controllers/dashboard_controller.rb +++ b/src/app/controllers/dashboard_controller.rb @@ -40,8 +40,8 @@ class DashboardController < ApplicationController end
def quota_usage_graph - if params[:cloud_account_id] - params[:parent] = CloudAccount.find(params[:cloud_account_id]) + if params[:provider_account_id] + params[:parent] = ProviderAccount.find(params[:provider_account_id]) elsif params[:pool_id] params[:parent] = Pool.find(params[:pool_id]) else @@ -67,7 +67,7 @@ class DashboardController < ApplicationController
def index # FIXME filter to just those that the user has access to - @cloud_accounts = CloudAccount.find(:all) + @cloud_accounts = ProviderAccount.find(:all)
render :action => 'monitor' diff --git a/src/app/controllers/permissions_controller.rb b/src/app/controllers/permissions_controller.rb index 622f776..380b97c 100644 --- a/src/app/controllers/permissions_controller.rb +++ b/src/app/controllers/permissions_controller.rb @@ -67,20 +67,20 @@ class PermissionsController < ApplicationController
def set_permission_object(action) if !params[:permission_object_type].nil? - @permission_object = + @permission_object = params[:permission_object_type].constantize.find(params[:permission_object_id]) elsif !params[:pool_id].nil? @permission_object = Pool.find params[:pool_id] elsif !params[:provider_id].nil? @permission_object = Provider.find params[:provider_id] elsif !params[:cloud_account_id].nil? - @permission_object = CloudAccount.find params[:cloud_account_id] + @permission_object = ProviderAccount.find params[:cloud_account_id] elsif !params[:base_permission_object_id].nil? @permission_object = BasePermissionObject.find params[:base_permission_object_id] else @permission_object = BasePermissionObject.general_permission_scope end - + raise ActiveRecord::RecordNotFound if @permission_object.nil?
require_privilege(action, @permission_object) diff --git a/src/app/controllers/provider_accounts_controller.rb b/src/app/controllers/provider_accounts_controller.rb new file mode 100644 index 0000000..9fbf126 --- /dev/null +++ b/src/app/controllers/provider_accounts_controller.rb @@ -0,0 +1,181 @@ +# +# Copyright (C) 2010 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. A copy of the GNU General Public License is +# also available at http://www.gnu.org/copyleft/gpl.html. + +# Filters added to this controller apply to all controllers in the application. +# Likewise, all the methods added will be available for all controllers. + +class ProviderAccountsController < ApplicationController + before_filter :require_user + before_filter :load_providers + + helper :providers + + def section_id + 'administration' + end + + def index + @provider = Provider.find(params[:provider_id]) + require_privilege(Privilege::VIEW, CloudAccount, @provider) + end + + def new + @provider = Provider.find(params[:provider_id]) + @cloud_account = ProviderAccount.new + @quota = Quota.new + require_privilege(Privilege::CREATE, CloudAccount, @provider) + end + + def create + @provider = Provider.find(params[:provider_id]) + require_privilege(Privilege::CREATE, ProviderAccount, @provider) + @cloud_account = ProviderAccount.new(params[:cloud_account]) + @cloud_account.provider = @provider + @cloud_account.quota = @quota = Quota.new + + if params[:test_account] + test_account(@cloud_account) + render :action => 'new' and return + end + + limit = params[:quota][:maximum_running_instances] if params[:quota] + @cloud_account.quota.set_maximum_running_instances(limit) + + if @cloud_account.invalid? + if not @cloud_account.valid_credentials? + flash.now[:error] = "The entered credential information is incorrect" + elsif @cloud_account.errors.on(:username) + flash.now[:error] = "The access key '#{params[:cloud_account][:username]}' has already been taken." + else + flash.now[:error] = "You must fill in all the required fields" + end + render :action => 'new' and return + end + + @cloud_account.pool_families << PoolFamily.default + @cloud_account.save! + if @cloud_account.populate_realms + flash[:notice] = "Provider account added." + end + redirect_to provider_accounts_path(@provider) + kick_condor + end + + def edit + @cloud_account = ProviderAccount.find(params[:id]) + @quota = @cloud_account.quota + @provider = @cloud_account.provider + require_privilege(Privilege::MODIFY, @cloud_account) + end + + def update_accounts + @provider = Provider.find(params[:provider][:id]) + require_privilege(Privilege::MODIFY, CloudAccount, @provider) + @providers = Provider.list_for_user(@current_user, Privilege::VIEW) + + success = true + @provider.cloud_accounts.each do |cloud_account| + attributes = params[:cloud_accounts][cloud_account.id.to_s] + + password = attributes[:password] + # blank password means the user didn't change it -- don't update it then + if password.blank? + attributes.delete :password + end + cloud_account.quota.maximum_running_instances = quota_from_string(params[:quota][cloud_account.id.to_s][:maximum_running_instances]) + + private_cert = attributes[:x509_cert_priv_file] + unless private_cert.blank? + attributes[:x509_cert_priv] = private_cert.read + end + attributes.delete :x509_cert_priv_file + + public_cert = attributes[:x509_cert_pub_file] + unless public_cert.blank? + attributes[:x509_cert_pub] = public_cert.read + end + attributes.delete :x509_cert_pub_file + + begin + cloud_account.update_attributes!(attributes) + cloud_account.quota.save! + rescue + success = false + end + end + if success + flash[:notice] = "Account updated." + redirect_to :controller => 'providers', :action => 'accounts', :id => @provider + else + flash.now[:notice] = "Error updating the cloud account." + render :template => 'provider/accounts' + end + end + + def update + @cloud_account = ProviderAccount.find(params[:id]) + @provider = @cloud_account.provider + require_privilege(Privilege::MODIFY, @cloud_account) + @quota = @cloud_account.quota + + limit = params[:quota][:maximum_running_instances] if params[:quota] + @cloud_account.quota.set_maximum_running_instances(limit) + if @cloud_account.update_attributes(params[:cloud_account]) + flash[:notice] = "Cloud Account updated!" + redirect_to provider_accounts_path(@provider) + else + render :action => :edit + end + end + + def key + @cloud_account = ProviderAccount.find(params[:id]) + require_privilege(Privilege::MODIFY,@provider_account) + unless @cloud_account.instance_key.nil? + render :text => @cloud_account.instance_key.pem + end + end + + def destroy + account = ProviderAccount.find(params[:id]) + provider = account.provider + require_privilege(Privilege::MODIFY, account) + if account.destroy + flash[:notice] = "Cloud Account destroyed" + else + flash[:error] = "Cloud Account could not be destroyed" + end + redirect_to provider_accounts_path(provider) + end + + def test_account(account) + if account.valid_credentials? + flash.now[:notice] = "Test Connection Success: Valid Account Details" + else + flash.now[:error] = "Test Connection Failed: Invalid Account Details" + end + rescue + flash.now[:error] = "Test Connection Failed: Could not connect to provider" + end + + private + + def load_providers + @providers = Provider.list_for_user(@current_user, Privilege::VIEW) + end +end diff --git a/src/app/controllers/quotas_controller.rb b/src/app/controllers/quotas_controller.rb index cfa85fb..0beb386 100644 --- a/src/app/controllers/quotas_controller.rb +++ b/src/app/controllers/quotas_controller.rb @@ -77,7 +77,7 @@ class QuotasController < ApplicationController if params[:parent_type] == "pool" return Pool.find(params[:id]) elsif params[:parent_type] == "cloud_account" - return CloudAccount.find(params[:id]) + return ProviderAccount.find(params[:id]) end #TODO Throw no match to pool or cloud account exception end diff --git a/src/app/models/cloud_account.rb b/src/app/models/cloud_account.rb deleted file mode 100644 index 4eba087..0000000 --- a/src/app/models/cloud_account.rb +++ /dev/null @@ -1,205 +0,0 @@ - # -# Copyright (C) 2009 Red Hat, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; version 2 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -# MA 02110-1301, USA. A copy of the GNU General Public License is -# also available at http://www.gnu.org/copyleft/gpl.html. - -# Filters added to this controller apply to all controllers in the application. -# Likewise, all the methods added will be available for all controllers. - -require 'nokogiri' -require 'sunspot_rails' - -class CloudAccount < ActiveRecord::Base - - searchable do - text :name, :as => :code_substring - text :username, :as => :code_substring - end - - include PermissionedObject - - # Relations - belongs_to :provider - belongs_to :quota, :autosave => true - has_many :instances - has_and_belongs_to_many :pool_families - has_many :permissions, :as => :permission_object, :dependent => :destroy, - :include => [:role], - :order => "permissions.id ASC" - - has_one :instance_key, :as => :instance_key_owner, :dependent => :destroy - - # Helpers - attr_accessor :x509_cert_priv_file, :x509_cert_pub_file - - # Validations - validates_presence_of :provider - validates_presence_of :label - validates_presence_of :username - validates_uniqueness_of :username, :scope => :provider_id - validates_presence_of :password - validates_presence_of :account_number - validate :validate_presence_of_x509_certs - validate :validate_credentials - - # We're using this instead of <tt>validates_presence_of</tt> helper because - # we want to show errors on different attributes ending with '_file'. - def validate_presence_of_x509_certs - errors.add(:x509_cert_pub_file, "can't be blank") if x509_cert_pub.blank? - errors.add(:x509_cert_priv_file, "can't be blank") if x509_cert_priv.blank? - end - - def validate_credentials - unless valid_credentials? - errors.add(:base, "Login Credentials are Invalid for this Provider") - end - end - - # Hooks - before_destroy :destroyable? - before_validation :read_x509_files - - def object_list - super << provider - end - class << self - alias orig_list_for_user_include list_for_user_include - alias orig_list_for_user_conditions list_for_user_conditions - end - - def self.list_for_user_include - includes = orig_list_for_user_include - includes << { :provider => {:permissions => {:role => :privileges}}} - includes - end - - def self.list_for_user_conditions - "(#{orig_list_for_user_conditions}) or - (permissions_providers.user_id=:user and - privileges_roles.target_type=:target_type and - privileges_roles.action=:action)" - end - - def destroyable? - instances.empty? - end - - def read_x509_files - if x509_cert_pub_file.respond_to?(:read) - x509_cert_pub_file.rewind # Sometimes the file has to rewind, becuase something already read from it. - self.x509_cert_pub = x509_cert_pub_file.read - end - if x509_cert_priv_file.respond_to?(:read) - x509_cert_priv_file.rewind - self.x509_cert_priv = x509_cert_priv_file.read - end - end - - def connect - begin - return DeltaCloud.new(username, password, provider.url) - rescue Exception => e - logger.error("Error connecting to framework: #{e.message}") - logger.error("Backtrace: #{e.backtrace.join("\n")}") - return nil - end - end - - def self.find_or_create(account) - a = CloudAccount.find_by_username_and_provider_id(account["username"], account["provider_id"]) - return a.nil? ? CloudAccount.new(account) : a - end - - def pools - pools = [] - instances.each do |instance| - pools << instance.pool - end - end - - def name - label.blank? ? username : label - end - - # FIXME: for already-mapped accounts, update rather than add new - def populate_realms - client = connect - realms = client.realms - # FIXME: this should probably be in the same transaction as cloud_account.save - self.transaction do - realms.each do |realm| - #ignore if it exists - #FIXME: we need to handle keeping in sync forupdates as well as - # account permissions - unless Realm.find_by_external_key_and_provider_id(realm.id, - provider.id) - ar_realm = Realm.new(:external_key => realm.id, - :name => realm.name ? realm.name : realm.id, - :provider_id => provider.id) - ar_realm.save! - - frontend_realm = Realm.new(:external_key => ar_realm.external_key, - :name => ar_realm.name, - :provider_id => nil) - - available_realms = Realm.frontend.find(:all, :conditions => { - :external_key => frontend_realm.external_key }) - - if available_realms.empty? - frontend_realm.backend_realms << ar_realm - frontend_realm.save! - else - available_realms.each do |r| - r.backend_realms << ar_realm - end - end - end - end - end - end - - def valid_credentials? - DeltaCloud::valid_credentials?(username, password, provider.url) - end - - def build_credentials - xml = Nokogiri::XML <<EOT -<?xml version="1.0"?> -<provider_credentials> - <ec2_credentials> - <account_number></account_number> - <access_key></access_key> - <secret_access_key></secret_access_key> - <certificate></certificate> - <key></key> - </ec2_credentials> -</provider_credentials> -EOT - node = xml.at_xpath('/provider_credentials/ec2_credentials') - node.at_xpath('./account_number').content = account_number - node.at_xpath('./access_key').content = username - node.at_xpath('./secret_access_key').content = password - node.at_xpath('./certificate').content = x509_cert_pub - node.at_xpath('./key').content = x509_cert_priv - return xml.to_s - end - - def generate_auth_key - client = connect - return nil unless client && client.feature?(:instances, :authentication_key) - client.create_key(:name => "#{self.name}_#{Time.now.to_i}_key_#{self.object_id}") - end -end diff --git a/src/app/models/image.rb b/src/app/models/image.rb index 8962bf1..0852016 100644 --- a/src/app/models/image.rb +++ b/src/app/models/image.rb @@ -155,7 +155,7 @@ class Image < ActiveRecord::Base raise "There is not provider with name '#{providername}'" end
- account = CloudAccount.new(:provider => provider, :username => username, :password => password) + account = ProviderAccount.new(:provider => provider, :username => username, :password => password)
unless account.valid_credentials? raise "Invalid credentials for provider '#{providername}'" diff --git a/src/app/models/permission.rb b/src/app/models/permission.rb index 22b228a..7cd02a1 100644 --- a/src/app/models/permission.rb +++ b/src/app/models/permission.rb @@ -37,7 +37,7 @@ class Permission < ActiveRecord::Base :foreign_key => "permission_object_id" belongs_to :provider, :class_name => "Provider", :foreign_key => "permission_object_id" - belongs_to :cloud_account, :class_name => "CloudAccount", + belongs_to :provider_account, :class_name => "ProviderAccount", :foreign_key => "permission_object_id" belongs_to :template, :class_name => "Template", :foreign_key => "permission_object_id" diff --git a/src/app/models/provider.rb b/src/app/models/provider.rb index 1e89958..affe1ae 100644 --- a/src/app/models/provider.rb +++ b/src/app/models/provider.rb @@ -29,7 +29,9 @@ class Provider < ActiveRecord::Base require 'util/deltacloud' include PermissionedObject
- has_many :cloud_accounts, :dependent => :destroy + PROVIDERS = { 1 => "AWS", 2 => "GoGrid" , 3 => "Rackspace", 4 => "RHEVM", 5 => "OpenNebula" } + + has_many :provider_accounts, :dependent => :destroy has_many :hardware_profiles, :dependent => :destroy has_many :replicated_images, :dependent => :destroy has_many :realms, :dependent => :destroy diff --git a/src/app/models/provider_account.rb b/src/app/models/provider_account.rb new file mode 100644 index 0000000..6ec1311 --- /dev/null +++ b/src/app/models/provider_account.rb @@ -0,0 +1,204 @@ + # +# Copyright (C) 2009 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. A copy of the GNU General Public License is +# also available at http://www.gnu.org/copyleft/gpl.html. + +# Filters added to this controller apply to all controllers in the application. +# Likewise, all the methods added will be available for all controllers. + +require 'nokogiri' +require 'sunspot_rails' + +class ProviderAccount < ActiveRecord::Base + include PermissionedObject + + searchable do + text :name, :as => :code_substring + text :username, :as => :code_substring + end + + # Relations + belongs_to :provider + belongs_to :quota, :autosave => true + has_many :instances + has_and_belongs_to_many :pool_families + has_many :permissions, :as => :permission_object, :dependent => :destroy, + :include => [:role], + :order => "permissions.id ASC" + + has_one :instance_key, :as => :instance_key_owner, :dependent => :destroy + + # Helpers + attr_accessor :x509_cert_priv_file, :x509_cert_pub_file + + # Validations + validates_presence_of :provider + validates_presence_of :label + validates_presence_of :username + validates_uniqueness_of :username, :scope => :provider_id + validates_presence_of :password + validates_presence_of :account_number + validate :validate_presence_of_x509_certs + validate :validate_credentials + + # We're using this instead of <tt>validates_presence_of</tt> helper because + # we want to show errors on different attributes ending with '_file'. + def validate_presence_of_x509_certs + errors.add(:x509_cert_pub_file, "can't be blank") if x509_cert_pub.blank? + errors.add(:x509_cert_priv_file, "can't be blank") if x509_cert_priv.blank? + end + + def validate_credentials + unless valid_credentials? + errors.add(:base, "Login Credentials are Invalid for this Provider") + end + end + + # Hooks + before_destroy :destroyable? + before_validation :read_x509_files + + def object_list + super << provider + end + class << self + alias orig_list_for_user_include list_for_user_include + alias orig_list_for_user_conditions list_for_user_conditions + end + + def self.list_for_user_include + includes = orig_list_for_user_include + includes << { :provider => {:permissions => {:role => :privileges}}} + includes + end + + def self.list_for_user_conditions + "(#{orig_list_for_user_conditions}) or + (permissions_providers.user_id=:user and + privileges_roles.target_type=:target_type and + privileges_roles.action=:action)" + end + + def destroyable? + instances.empty? + end + + def read_x509_files + if x509_cert_pub_file.respond_to?(:read) + x509_cert_pub_file.rewind # Sometimes the file has to rewind, becuase something already read from it. + self.x509_cert_pub = x509_cert_pub_file.read + end + if x509_cert_priv_file.respond_to?(:read) + x509_cert_priv_file.rewind + self.x509_cert_priv = x509_cert_priv_file.read + end + end + + def connect + begin + return DeltaCloud.new(username, password, provider.url) + rescue Exception => e + logger.error("Error connecting to framework: #{e.message}") + logger.error("Backtrace: #{e.backtrace.join("\n")}") + return nil + end + end + + def self.find_or_create(account) + a = ProviderAccount.find_by_username_and_provider_id(account["username"], account["provider_id"]) + return a.nil? ? ProviderAccount.new(account) : a + end + + def pools + pools = [] + instances.each do |instance| + pools << instance.pool + end + end + + def name + label.blank? ? username : label + end + + # FIXME: for already-mapped accounts, update rather than add new + def populate_realms + client = connect + realms = client.realms + # FIXME: this should probably be in the same transaction as cloud_account.save + self.transaction do + realms.each do |realm| + #ignore if it exists + #FIXME: we need to handle keeping in sync forupdates as well as + # account permissions + unless Realm.find_by_external_key_and_provider_id(realm.id, + provider.id) + ar_realm = Realm.new(:external_key => realm.id, + :name => realm.name ? realm.name : realm.id, + :provider_id => provider.id) + ar_realm.save! + + frontend_realm = Realm.new(:external_key => ar_realm.external_key, + :name => ar_realm.name, + :provider_id => nil) + + available_realms = Realm.frontend.find(:all, :conditions => { + :external_key => frontend_realm.external_key }) + + if available_realms.empty? + frontend_realm.backend_realms << ar_realm + frontend_realm.save! + else + available_realms.each do |r| + r.backend_realms << ar_realm + end + end + end + end + end + end + + def valid_credentials? + DeltaCloud::valid_credentials?(username, password, provider.url) + end + + def build_credentials + xml = Nokogiri::XML <<EOT +<?xml version="1.0"?> +<provider_credentials> + <ec2_credentials> + <account_number></account_number> + <access_key></access_key> + <secret_access_key></secret_access_key> + <certificate></certificate> + <key></key> + </ec2_credentials> +</provider_credentials> +EOT + node = xml.at_xpath('/provider_credentials/ec2_credentials') + node.at_xpath('./account_number').content = account_number + node.at_xpath('./access_key').content = username + node.at_xpath('./secret_access_key').content = password + node.at_xpath('./certificate').content = x509_cert_pub + node.at_xpath('./key').content = x509_cert_priv + return xml.to_s + end + + def generate_auth_key + client = connect + return nil unless client && client.feature?(:instances, :authentication_key) + client.create_key(:name => "#{self.name}_#{Time.now.to_i}_key_#{self.object_id}") + end +end diff --git a/src/app/services/data_service_active_record.rb b/src/app/services/data_service_active_record.rb index 66da011..5833baa 100644 --- a/src/app/services/data_service_active_record.rb +++ b/src/app/services/data_service_active_record.rb @@ -65,7 +65,7 @@ class DataServiceActiveRecord data_points = [] free_instances = 0
- cloud_accounts = CloudAccount.find(:all, :conditions => {:provider_id => provider.id}) + cloud_accounts = ProviderAccount.find(:all, :conditions => {:provider_id => provider.id}) cloud_accounts.each do |cloud_account| quota = cloud_account.quota if quota @@ -175,11 +175,11 @@ class DataServiceActiveRecord instances = []
if parent.class == Provider - cloud_accounts = CloudAccount.find(:all, :conditions => {:provider_id => parent.id}) + cloud_accounts = ProviderAccount.find(:all, :conditions => {:provider_id => parent.id}) cloud_accounts.each do |cloud_account| instances.concat(cloud_account.instances) end - elsif parent.class == Pool || parent.class == CloudAccount + elsif parent.class == Pool || parent.class == ProviderAccount instances = parent.instances else return nil @@ -209,7 +209,7 @@ class DataServiceActiveRecord end end
- # returns the failure rate of instance starts for instances associated with the parent, (pool/cloudaccount) given the failure code + # returns the failure rate of instance starts for instances associated with the parent, (pool/ProviderAccount) given the failure code def self.failure_rate(parent, start_time, end_time, failure_code) instances = get_parent_instances(parent) tasks = Task.find(:all, :conditions => {:created_at => start_time...end_time, diff --git a/src/app/services/graph_service.rb b/src/app/services/graph_service.rb index 7266434..d85f0c3 100644 --- a/src/app/services/graph_service.rb +++ b/src/app/services/graph_service.rb @@ -16,7 +16,7 @@ class GraphService cloud_account_graphs[Graph::QUOTA_INSTANCES_IN_USE] = qos_failure_rate_graph(parent, opts = {}) graphs[cloud_account] = cloud_account_graphs else - CloudAccount.all.each do |cloud_account| + ProviderAccount.all.each do |cloud_account| cloud_account_graphs = Hash.new cloud_account_graphs[Graph::QUOTA_INSTANCES_IN_USE] = quota_instances_in_use_graph(cloud_account,opts) graphs[cloud_account] = cloud_account_graphs diff --git a/src/app/views/cloud_accounts/_form.haml b/src/app/views/cloud_accounts/_form.haml deleted file mode 100644 index 2d35d47..0000000 --- a/src/app/views/cloud_accounts/_form.haml +++ /dev/null @@ -1,52 +0,0 @@ -= error_messages_for 'cloud_account' -%fieldset.clearfix.nomargin - %label.grid_4.la.alpha - = t('.account_name') - %span.required * - %label.grid_3.la - = t('.user_name') - %span.required * - %label.grid_3.la - = t('.password') - %span.required * - %label.grid_3.la.omega - = t('.quota_instances') - %span.required * -%fieldset.nomargin.clearfix - = f.text_field :label, :title => t('.account_name'), :class => "grid_4 alpha" - = f.text_field :username, :title => t('.user_name'), :class => "grid_3" - = f.password_field :password, :title => t('.password'), :class => "grid_3" - = text_field "quota", :maximum_running_instances, :title => t('.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" -%fieldset.nomargin.clearfix - .grid_3.prefix_10.alpha.omega - ( - %button.linkbutton.nospace{ :type => 'button', :onclick => "set_unlimited_quota("quota_instances");" }<> - = t('.unlimited_quota') - ) -%fieldset.clearfix.nomargin - %label.grid_4.la.alpha - = t('.account_number') - %span.required * - %label.grid_3.la - = t('.account_private_cert') - %span.required * - %label.grid_3.la - = t('.account_public_cert') - %span.required * - .grid_3.omega -%fieldset.clearfix.nomargin - = f.text_field :account_number, :title => t('.account_number'), :class => "grid_4 alpha" - .grid_3 - = f.file_field :x509_cert_priv_file, :title => t('.account_private_cert') - .grid_3 - = f.file_field :x509_cert_pub_file, :title => t('.account_public_cert') - .grid_3.omega - ( - %button.linkbutton.nospace{ :type => 'submit', :value => t('.test_account'), :name => 'test_account', :id => 'test_account' }<> - = t('.test_account') - ) - -:javascript - function set_unlimited_quota(elem_id) { - $("#" + elem_id)[0].value = "unlimited"; - } diff --git a/src/app/views/cloud_accounts/edit.haml b/src/app/views/cloud_accounts/edit.haml deleted file mode 100644 index dc24584..0000000 --- a/src/app/views/cloud_accounts/edit.haml +++ /dev/null @@ -1,17 +0,0 @@ -= render :partial => 'providers/providers' -#details.grid_13 - %nav.subsubnav - = render_navigation({:context => 'old', :level => 4}) - - %h2 - = t('.edit_provider_account') - - form_for @cloud_account, :url => provider_account_path(@provider, @cloud_account), :html => { :method => :put, :multipart => true } do |f| - = render :partial => 'form', :locals => { :f => f } - %fieldset.clearfix - .grid_13.alpha.omega - = submit_tag t(:edit), :class => "ra nomargin dialogbutton" - %section - %p.requirement - %span.required * - - - = t('.required_field') diff --git a/src/app/views/cloud_accounts/index.haml b/src/app/views/cloud_accounts/index.haml deleted file mode 100644 index e4d8670..0000000 --- a/src/app/views/cloud_accounts/index.haml +++ /dev/null @@ -1,25 +0,0 @@ -= render :partial => 'providers/providers' -#details.grid_13 - %nav.subsubnav - = render_navigation({:context => 'old', :level => 4}) - %h2 - = t('.provider_accounts') - - unless @provider.cloud_accounts.empty? - %table - %thead - %tr - %th{:scope => "col"} Label - %th{:scope => "col"} Username - %th{:scope => "col"} Account Number - %th{:scope => "col", :colspan => "2"} Actions - %tbody - - @provider.cloud_accounts.each do |cloud_account| - %tr - %td= cloud_account.label - %td= cloud_account.username - %td= cloud_account.account_number - %td= link_to 'Edit', edit_provider_account_path(@provider, cloud_account) - %td= link_to 'Delete', destroy_providers_account_path(@provider, cloud_account), :confirm => 'Are you sure?' - - - if @provider.cloud_accounts.empty? - = link_to 'Add', new_provider_account_path(@provider.id), :class => 'button' diff --git a/src/app/views/cloud_accounts/new.haml b/src/app/views/cloud_accounts/new.haml deleted file mode 100644 index b605714..0000000 --- a/src/app/views/cloud_accounts/new.haml +++ /dev/null @@ -1,17 +0,0 @@ -= render :partial => 'providers/providers' -#details.grid_13 - %nav.subsubnav - = render_navigation({:context => 'old', :level => 4}) - - %h2 - = t('.new_provider_account') - - form_for @cloud_account, :url => provider_accounts_path(@provider), :html => { :multipart => true } do |f| - = render :partial => 'form', :locals => { :f => f } - %fieldset.clearfix - .grid_13.alpha.omega - = submit_tag t(:add), :class => "ra nomargin dialogbutton" - %section - %p.requirement - %span.required * - - - = t('.required_field') diff --git a/src/app/views/provider_accounts/_form.haml b/src/app/views/provider_accounts/_form.haml new file mode 100644 index 0000000..2d35d47 --- /dev/null +++ b/src/app/views/provider_accounts/_form.haml @@ -0,0 +1,52 @@ += error_messages_for 'cloud_account' +%fieldset.clearfix.nomargin + %label.grid_4.la.alpha + = t('.account_name') + %span.required * + %label.grid_3.la + = t('.user_name') + %span.required * + %label.grid_3.la + = t('.password') + %span.required * + %label.grid_3.la.omega + = t('.quota_instances') + %span.required * +%fieldset.nomargin.clearfix + = f.text_field :label, :title => t('.account_name'), :class => "grid_4 alpha" + = f.text_field :username, :title => t('.user_name'), :class => "grid_3" + = f.password_field :password, :title => t('.password'), :class => "grid_3" + = text_field "quota", :maximum_running_instances, :title => t('.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +%fieldset.nomargin.clearfix + .grid_3.prefix_10.alpha.omega + ( + %button.linkbutton.nospace{ :type => 'button', :onclick => "set_unlimited_quota("quota_instances");" }<> + = t('.unlimited_quota') + ) +%fieldset.clearfix.nomargin + %label.grid_4.la.alpha + = t('.account_number') + %span.required * + %label.grid_3.la + = t('.account_private_cert') + %span.required * + %label.grid_3.la + = t('.account_public_cert') + %span.required * + .grid_3.omega +%fieldset.clearfix.nomargin + = f.text_field :account_number, :title => t('.account_number'), :class => "grid_4 alpha" + .grid_3 + = f.file_field :x509_cert_priv_file, :title => t('.account_private_cert') + .grid_3 + = f.file_field :x509_cert_pub_file, :title => t('.account_public_cert') + .grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('.test_account') + ) + +:javascript + function set_unlimited_quota(elem_id) { + $("#" + elem_id)[0].value = "unlimited"; + } diff --git a/src/app/views/provider_accounts/edit.haml b/src/app/views/provider_accounts/edit.haml new file mode 100644 index 0000000..dc24584 --- /dev/null +++ b/src/app/views/provider_accounts/edit.haml @@ -0,0 +1,17 @@ += render :partial => 'providers/providers' +#details.grid_13 + %nav.subsubnav + = render_navigation({:context => 'old', :level => 4}) + + %h2 + = t('.edit_provider_account') + - form_for @cloud_account, :url => provider_account_path(@provider, @cloud_account), :html => { :method => :put, :multipart => true } do |f| + = render :partial => 'form', :locals => { :f => f } + %fieldset.clearfix + .grid_13.alpha.omega + = submit_tag t(:edit), :class => "ra nomargin dialogbutton" + %section + %p.requirement + %span.required * + - + = t('.required_field') diff --git a/src/app/views/provider_accounts/index.haml b/src/app/views/provider_accounts/index.haml new file mode 100644 index 0000000..d1fdea4 --- /dev/null +++ b/src/app/views/provider_accounts/index.haml @@ -0,0 +1,25 @@ += render :partial => 'providers/providers' +#details.grid_13 + %nav.subsubnav + = render_navigation({:context => 'old', :level => 4}) + %h2 + = t('.provider_accounts') + - unless @provider.provider_accounts.empty? + %table + %thead + %tr + %th{:scope => "col"} Label + %th{:scope => "col"} Username + %th{:scope => "col"} Account Number + %th{:scope => "col", :colspan => "2"} Actions + %tbody + - @provider.provider_accounts.each do |cloud_account| + %tr + %td= cloud_account.label + %td= cloud_account.username + %td= cloud_account.account_number + %td= link_to 'Edit', edit_provider_account_path(@provider, cloud_account) + %td= link_to 'Delete', destroy_providers_account_path(@provider, cloud_account), :confirm => 'Are you sure?' + + - if @provider.provider_accounts.empty? + = link_to 'Add', new_provider_account_path(@provider.id), :class => 'button' diff --git a/src/app/views/provider_accounts/new.haml b/src/app/views/provider_accounts/new.haml new file mode 100644 index 0000000..b605714 --- /dev/null +++ b/src/app/views/provider_accounts/new.haml @@ -0,0 +1,17 @@ += render :partial => 'providers/providers' +#details.grid_13 + %nav.subsubnav + = render_navigation({:context => 'old', :level => 4}) + + %h2 + = t('.new_provider_account') + - form_for @cloud_account, :url => provider_accounts_path(@provider), :html => { :multipart => true } do |f| + = render :partial => 'form', :locals => { :f => f } + %fieldset.clearfix + .grid_13.alpha.omega + = submit_tag t(:add), :class => "ra nomargin dialogbutton" + %section + %p.requirement + %span.required * + - + = t('.required_field') diff --git a/src/classad_plugin/classad_plugin.rb b/src/classad_plugin/classad_plugin.rb index 2aabfb9..14b5878 100644 --- a/src/classad_plugin/classad_plugin.rb +++ b/src/classad_plugin/classad_plugin.rb @@ -60,7 +60,7 @@ def classad_plugin(logf, conf_path, instance_key, account_id) instance = Instance.find(:first, :conditions => [ "condor_job_id = ?", instance_key ]) logf.puts "getting cloud account from id #{account_id}" - cloud_account = CloudAccount.find(:first, + cloud_account = ProviderAccount.find(:first, :conditions => [ "id = ?", account_id ])
logf.puts "instance is: #{instance}, cloud account is #{cloud_account}" diff --git a/src/config/old_navigation.rb b/src/config/old_navigation.rb index 27b44cf..ef4b352 100644 --- a/src/config/old_navigation.rb +++ b/src/config/old_navigation.rb @@ -9,7 +9,7 @@ SimpleNavigation::Configuration.run do |navigation| second_level.item :system_settings, t(:system_settings), :controller => 'settings' do |third_level| third_level.item :manage_providers, t(:manage_providers), providers_path do |fourth_level| fourth_level.item :provider_summary, t(:provider_summary), { :controller => 'providers', :action => 'show', :id => (@provider.id if @provider) }, :highlights_on => //providers/\d+(/edit)?$/ - fourth_level.item :provider_accounts, t(:provider_accounts), { :controller => 'cloud_accounts', :action => 'index', :provider_id => (@provider.id if @provider) }, :highlights_on => //providers/\d+/accounts(/(\d+|new))?/ + fourth_level.item :provider_accounts, t(:provider_accounts), { :controller => 'provider_accounts', :action => 'index', :provider_id => (@provider.id if @provider) }, :highlights_on => //providers/\d+/accounts(/(\d+|new))?/ fourth_level.item :scheduling_policies, t(:scheduling_policies), '#' fourth_level.item :services_provided, t(:services_provided), '#' fourth_level.item :map_profiles, t(:map_profiles), '#' diff --git a/src/config/routes.rb b/src/config/routes.rb index 0aa281b..82c624a 100644 --- a/src/config/routes.rb +++ b/src/config/routes.rb @@ -76,9 +76,9 @@ ActionController::Routing::Routes.draw do |map| # Temporarily disable this route, provider stuff is not restful yet. # Will be re-enabled in upcoming patch map.resources :providers do |provider| - provider.resources :accounts, :controller => 'cloud_accounts' + provider.resources :accounts, :controller => 'provider_accounts' end - map.destroy_providers_account '/providers/:provider_id/accounts/:id/destroy', :controller => 'cloud_accounts', :action => 'destroy', :conditions => { :method => :get } + map.destroy_providers_account '/providers/:provider_id/accounts/:id/destroy', :controller => 'provider_accounts', :action => 'destroy', :conditions => { :method => :get }
map.resources :templates, :collection => { :destroy_multiple => :get }, :member => { diff --git a/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb new file mode 100644 index 0000000..154649d --- /dev/null +++ b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb @@ -0,0 +1,9 @@ +class RenameCloudAccountToProviderAccount < ActiveRecord::Migration + def self.up + rename_table (:cloud_accounts,:provider_accounts) + end + + def self.down + drop_table :provider_accounts + end +end diff --git a/src/db/seeds.rb b/src/db/seeds.rb index 9a6065c..1ed2329 100644 --- a/src/db/seeds.rb +++ b/src/db/seeds.rb @@ -30,17 +30,17 @@ roles = Quota => [VIEW]}}, Provider => {"Provider Owner" => {Provider => [VIEW, MOD, VPRM,GPRM], - CloudAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}}, - CloudAccount => - {"Provider Account User" => {CloudAccount => [VIEW,USE]}, - "Provider Account Owner" => {CloudAccount => [VIEW,USE,MOD, VPRM,GPRM]}}, + ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}}, + ProviderAccount => + {"Provider Account User" => {ProviderAccount => [VIEW,USE]}, + "Provider Account Owner" => {ProviderAccount => [VIEW,USE,MOD, VPRM,GPRM]}}, Template => {"Template User" => {Template => [VIEW,USE]}, "Template Owner" => {Template => [VIEW,USE,MOD, VPRM,GPRM]}}, BasePermissionObject => {"Provider Creator" => {Provider => [ CRE]}, "Provider Administrator" => {Provider => [VIEW, MOD,CRE,VPRM,GPRM], - CloudAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}, + ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}, "HWP Administrator" => {HardwareProfile => [ MOD,CRE,VPRM,GPRM]}, "Realm Administrator" => {Realm => [ USE,MOD,CRE,VPRM,GPRM]}, "Pool Creator" => {Pool => [ CRE]}, @@ -50,7 +50,7 @@ roles = PoolFamily => [VIEW, MOD,CRE,VPRM,GPRM]}, "Template Administrator" => {Template => [VIEW,USE,MOD,CRE,VPRM,GPRM]}, "Administrator" => {Provider => [VIEW, MOD,CRE,VPRM,GPRM], - CloudAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM], + ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM], HardwareProfile => [ MOD,CRE,VPRM,GPRM], Realm => [ USE,MOD,CRE,VPRM,GPRM], User => [VIEW, MOD,CRE], diff --git a/src/dbomatic/dbomatic b/src/dbomatic/dbomatic index 8a3e968..3ac7449 100755 --- a/src/dbomatic/dbomatic +++ b/src/dbomatic/dbomatic @@ -203,7 +203,7 @@ class CondorEventLog < Nokogiri::XML::SAX::Document return end
- cloud_account = CloudAccount.find(:first, :conditions => ['provider_id = ? AND username = ? AND password = ?', provider.id, username, password]) + cloud_account = ProviderAccount.find(:first, :conditions => ['provider_id = ? AND username = ? AND password = ?', provider.id, username, password]) if cloud_account.nil? @logger.error "Could not find the cloud account corresponding to #{link}, skipping cloud id update" return diff --git a/src/features/step_definitions/provider_account_steps.rb b/src/features/step_definitions/provider_account_steps.rb index 5d68b88..63620c5 100644 --- a/src/features/step_definitions/provider_account_steps.rb +++ b/src/features/step_definitions/provider_account_steps.rb @@ -1,9 +1,9 @@ Then /^there should be no provider accounts$/ do - CloudAccount.all.should be_empty + ProviderAccount.all.should be_empty end
Given /^there are no provider accounts$/ do - CloudAccount.all.should be_empty + ProviderAccount.all.should be_empty end
When /^I attach the "([^"\s]+)" file to "([^"\s]+)"$/ do |file, field| @@ -12,7 +12,7 @@ When /^I attach the "([^"\s]+)" file to "([^"\s]+)"$/ do |file, field| end
Then /^I should have a provider account named "([^"]*)"$/ do |label| - CloudAccount.find_by_label(label).should_not be_nil + ProviderAccount.find_by_label(label).should_not be_nil end
Given /^there is a provider account named "([^"]*)"$/ do |label| @@ -27,7 +27,7 @@ end
When /^I check the "([^"]*)" account$/ do |label| - account = CloudAccount.find_by_label(label) + account = ProviderAccount.find_by_label(label) check("account_checkbox_#{account.id}") end
diff --git a/src/features/step_definitions/provider_steps.rb b/src/features/step_definitions/provider_steps.rb index bc56276..7dd57a7 100644 --- a/src/features/step_definitions/provider_steps.rb +++ b/src/features/step_definitions/provider_steps.rb @@ -62,7 +62,7 @@ Then /^there should not be any hardware profiles$/ do end
Then /^there should not be a cloud account$/ do - CloudAccount.find(:all, :conditions => { :provider_id => @provider.id} ).size.should == 0 + ProviderAccount.find(:all, :conditions => { :provider_id => @provider.id} ).size.should == 0 end
Then /^there should not be a realm$/ do diff --git a/src/features/support/custom.rb b/src/features/support/custom.rb index c2c4987..b6aae7c 100644 --- a/src/features/support/custom.rb +++ b/src/features/support/custom.rb @@ -23,7 +23,7 @@ Provider.class_eval do
end
-CloudAccount.class_eval do +ProviderAccount.class_eval do
alias :generate_auth_key_original :generate_auth_key
diff --git a/src/features/support/paths.rb b/src/features/support/paths.rb index 4bc7ba4..193d374 100644 --- a/src/features/support/paths.rb +++ b/src/features/support/paths.rb @@ -105,7 +105,7 @@ module NavigationHelpers url_for :action => 'edit', :controller => 'hardware_profiles', :only_path => true
when /^(.*)'s provider account page$/ - admin_provider_account_path(CloudAccount.find_by_label($1)) + admin_provider_account_path(ProviderAccount.find_by_label($1))
when /^(.*)'s image factory deployable page$/ image_factory_deployable_path(Deployable.find_by_name($1)) diff --git a/src/lib/tasks/demo_data.rake b/src/lib/tasks/demo_data.rake index f38ebbd..f3326fd 100644 --- a/src/lib/tasks/demo_data.rake +++ b/src/lib/tasks/demo_data.rake @@ -32,7 +32,7 @@ namespace :db do
puts @number_of_tasks
- cloud_account = CloudAccount.find(args[:cloud_account_id]) + cloud_account = ProviderAccount.find(args[:cloud_account_id]) user = User.find(args[:user_id])
instance = create_instance(cloud_account) @@ -116,4 +116,4 @@ namespace :db do return time_started end
-end \ No newline at end of file +end diff --git a/src/spec/controllers/cloud_accounts_controller_spec.rb b/src/spec/controllers/cloud_accounts_controller_spec.rb deleted file mode 100644 index d61ad34..0000000 --- a/src/spec/controllers/cloud_accounts_controller_spec.rb +++ /dev/null @@ -1,92 +0,0 @@ -require 'spec_helper' - -describe CloudAccountsController do - - fixtures :all - before(:each) do - @cloud_account = Factory :mock_cloud_account - @provider = @cloud_account.provider - - @admin_permission = Permission.create :role => Role.find(:first, :conditions => ['name = ?', 'Provider Administrator']), - :permission_object => @provider, - :user => Factory(:provider_admin_user) - @admin = @admin_permission.user - activate_authlogic - end - - it "shows provider accounts as list" do - UserSession.create(@admin) - get :index, :provider_id => @provider.id - response.should be_success - response.should render_template("index") - end - - it "allows test account validity on create when passing test_account param" do - UserSession.create(@admin) - post :create, :provider_id => @provider.id, :cloud_account => {}, :test_account => true - response.should be_success - response.should render_template("new") - response.flash[:error].should == "Test Connection Failed: Invalid Account Details" - end - - it "doesn't allow to save provider's account if not valid credentials" do - UserSession.create(@admin) - post :create, :provider_id => @provider.id, :cloud_account => {} - response.should be_success - response.should render_template("new") - response.flash[:error].should == "The entered credential information is incorrect" - end - - it "should permit users with account modify permission to access edit cloud account interface" do - UserSession.create(@admin) - get :edit, :id => @cloud_account.id - response.should be_success - response.should render_template("edit") - end - - it "should allow users with account modify password to update a cloud account" do - UserSession.create(@admin) - - @cloud_account.password = "foobar" - @cloud_account.stub!(:valid_credentials?).and_return(true) - @cloud_account.quota = Quota.new - @cloud_account.save.should be_true - - post :update, :id => @cloud_account.id, :cloud_account => { :password => 'mockpassword' } - response.should redirect_to provider_accounts_path(@provider) - CloudAccount.find(@cloud_account.id).password.should == "mockpassword" - end - - it "should allow users with account modify permission to delete a cloud account" do - UserSession.create(@admin) - lambda do - get :destroy, :id => @cloud_account.id - end.should change(CloudAccount, :count).by(-1) - response.should redirect_to provider_accounts_path(@provider) - CloudAccount.find_by_id(@cloud_account.id).should be_nil - end - - it "should deny access to users without account modify permission" do - get :edit, :id => @cloud_account.id - response.should_not be_success - - post :update, :id => @cloud_account.id, :cloud_account => { :password => 'foobar' } - response.should_not be_success - - post :destroy, :id => @cloud_account.id - response.should_not be_success - end - - it "should provide ui to create new account" do - UserSession.create(@admin) - get :new, :provider_id => @provider.id - response.should be_success - response.should render_template("new") - end - - it "should fail to grant access to account UIs for unauthenticated user" do - get :new - response.should_not be_success - end - -end diff --git a/src/spec/controllers/provider_accounts_controller_spec.rb b/src/spec/controllers/provider_accounts_controller_spec.rb new file mode 100644 index 0000000..7471b30 --- /dev/null +++ b/src/spec/controllers/provider_accounts_controller_spec.rb @@ -0,0 +1,92 @@ +require 'spec_helper' + +describe ProviderAccountsController do + + fixtures :all + before(:each) do + @cloud_account = Factory :mock_cloud_account + @provider = @cloud_account.provider + + @admin_permission = Permission.create :role => Role.find(:first, :conditions => ['name = ?', 'Provider Administrator']), + :permission_object => @provider, + :user => Factory(:provider_admin_user) + @admin = @admin_permission.user + activate_authlogic + end + + it "shows provider accounts as list" do + UserSession.create(@admin) + get :index, :provider_id => @provider.id + response.should be_success + response.should render_template("index") + end + + it "allows test account validity on create when passing test_account param" do + UserSession.create(@admin) + post :create, :provider_id => @provider.id, :cloud_account => {}, :test_account => true + response.should be_success + response.should render_template("new") + response.flash[:error].should == "Test Connection Failed: Invalid Account Details" + end + + it "doesn't allow to save provider's account if not valid credentials" do + UserSession.create(@admin) + post :create, :provider_id => @provider.id, :cloud_account => {} + response.should be_success + response.should render_template("new") + response.flash[:error].should == "The entered credential information is incorrect" + end + + it "should permit users with account modify permission to access edit cloud account interface" do + UserSession.create(@admin) + get :edit, :id => @cloud_account.id + response.should be_success + response.should render_template("edit") + end + + it "should allow users with account modify password to update a cloud account" do + UserSession.create(@admin) + + @cloud_account.password = "foobar" + @cloud_account.stub!(:valid_credentials?).and_return(true) + @cloud_account.quota = Quota.new + @cloud_account.save.should be_true + + post :update, :id => @cloud_account.id, :cloud_account => { :password => 'mockpassword' } + response.should redirect_to provider_accounts_path(@provider) + ProviderAccount.find(@cloud_account.id).password.should == "mockpassword" + end + + it "should allow users with account modify permission to delete a cloud account" do + UserSession.create(@admin) + lambda do + get :destroy, :id => @cloud_account.id + end.should change(ProviderAccount, :count).by(-1) + response.should redirect_to provider_accounts_path(@provider) + ProviderAccount.find_by_id(@cloud_account.id).should be_nil + end + + it "should deny access to users without account modify permission" do + get :edit, :id => @cloud_account.id + response.should_not be_success + + post :update, :id => @cloud_account.id, :cloud_account => { :password => 'foobar' } + response.should_not be_success + + post :destroy, :id => @cloud_account.id + response.should_not be_success + end + + it "should provide ui to create new account" do + UserSession.create(@admin) + get :new, :provider_id => @provider.id + response.should be_success + response.should render_template("new") + end + + it "should fail to grant access to account UIs for unauthenticated user" do + get :new + response.should_not be_success + end + +end diff --git a/src/spec/factories/cloud_account.rb b/src/spec/factories/cloud_account.rb deleted file mode 100644 index 0b9c0a7..0000000 --- a/src/spec/factories/cloud_account.rb +++ /dev/null @@ -1,21 +0,0 @@ -Factory.define :cloud_account do |f| - f.sequence(:username) { |n| "testUser#{n}" } - f.password "testPassword" - f.sequence(:label) { |n| "test label#{n}" } - f.account_number "3141" - f.x509_cert_priv "x509 private key" - f.x509_cert_pub "x509 public key" - f.association :provider -end - -Factory.define :mock_cloud_account, :parent => :cloud_account do |f| - f.username "mockuser" - f.password "mockpassword" - f.provider { |p| p.association(:mock_provider) } -end - -Factory.define :ec2_cloud_account, :parent => :cloud_account do |f| - f.username "mockuser" - f.password "mockpassword" - f.provider { |p| p.association(:ec2_provider) } -end diff --git a/src/spec/factories/provider_account.rb b/src/spec/factories/provider_account.rb new file mode 100644 index 0000000..ff42702 --- /dev/null +++ b/src/spec/factories/provider_account.rb @@ -0,0 +1,21 @@ +Factory.define :provider_account do |f| + f.sequence(:username) { |n| "testUser#{n}" } + f.password "testPassword" + f.sequence(:label) { |n| "test label#{n}" } + f.account_number "3141" + f.x509_cert_priv "x509 private key" + f.x509_cert_pub "x509 public key" + f.association :provider +end + +Factory.define :mock_cloud_account, :parent => :provider_account do |f| + f.username "mockuser" + f.password "mockpassword" + f.provider { |p| p.association(:mock_provider) } +end + +Factory.define :ec2_cloud_account, :parent => :provider_account do |f| + f.username "mockuser" + f.password "mockpassword" + f.provider { |p| p.association(:ec2_provider) } +end diff --git a/src/spec/models/cloud_account_spec.rb b/src/spec/models/cloud_account_spec.rb deleted file mode 100644 index fb04e40..0000000 --- a/src/spec/models/cloud_account_spec.rb +++ /dev/null @@ -1,80 +0,0 @@ -require 'spec_helper' - -describe CloudAccount do - fixtures :all - before(:each) do - @cloud_account = Factory :mock_cloud_account - end - - it "should not be destroyable if it has instances" do - @cloud_account.instances << Instance.new - @cloud_account.destroyable?.should be_false - @cloud_account.destroy.should be_false - - @cloud_account.instances.clear - @cloud_account.destroyable?.should be_true - @cloud_account.destroy.equal?(@cloud_account).should be_true - @cloud_account.should be_frozen - end - - it "should check the validitiy of the cloud account login credentials" do - mock_provider = Factory :mock_provider - - invalid_cloud_account = Factory.build(:cloud_account, :username => "wrong_username", :password => "wrong_password", :provider => mock_provider) - invalid_cloud_account.should_not be_valid - - valid_cloud_account = Factory.build(:mock_cloud_account, :provider => mock_provider) - valid_cloud_account.should be_valid - end - - it "should fail to create a cloud account if the provider credentials are invalid" do - cloud_account = Factory.build(:mock_cloud_account, :password => "wrong_password") - cloud_account.save.should == false - end - - it "should create an instance_key if provider is EC2" do - @client = mock('DeltaCloud', :null_object => true) - @provider = Factory.build :ec2_provider - @key = mock('Key', :null_object => true) - @key.stub!(:pem).and_return("PEM") - @key.stub!(:id).and_return("1_user") - @client.stub!(:"feature?").and_return(true) - @client.stub!(:"create_key").and_return(@key) - - cloud_account = Factory.build :ec2_cloud_account - cloud_account.stub!(:connect).and_return(@client) - cloud_account.save - cloud_account.instance_key.should_not == nil - cloud_account.instance_key.pem == "PEM" - cloud_account.instance_key.id == "1_user" - end - - it "when calling connect and it fails with exception it will return nil" do - DeltaCloud.should_receive(:new).and_raise(Exception.new) - - @cloud_account.connect.should be_nil - end - - it "should generate credentials xml" do - expected_xml = <<EOT -<?xml version="1.0"?> -<provider_credentials> - <ec2_credentials> - <account_number>1234</account_number> - <access_key>user</access_key> - <secret_access_key>pass</secret_access_key> - <certificate>cert</certificate> - <key>priv_key</key> - </ec2_credentials> -</provider_credentials> -EOT - cloud_account = Factory.build(:mock_cloud_account, - :username => 'user', - :password => 'pass', - :account_number => '1234', - :x509_cert_priv => 'priv_key', - :x509_cert_pub => 'cert' - ) - cloud_account.build_credentials.should eql(expected_xml) - end -end diff --git a/src/spec/models/provider_account_spec.rb b/src/spec/models/provider_account_spec.rb new file mode 100644 index 0000000..57d0611 --- /dev/null +++ b/src/spec/models/provider_account_spec.rb @@ -0,0 +1,80 @@ +require 'spec_helper' + +describe ProviderAccount do + fixtures :all + before(:each) do + @cloud_account = Factory :mock_cloud_account + end + + it "should not be destroyable if it has instances" do + @cloud_account.instances << Instance.new + @cloud_account.destroyable?.should be_false + @cloud_account.destroy.should be_false + + @cloud_account.instances.clear + @cloud_account.destroyable?.should be_true + @cloud_account.destroy.equal?(@cloud_account).should be_true + @cloud_account.should be_frozen + end + + it "should check the validitiy of the cloud account login credentials" do + mock_provider = Factory :mock_provider + + invalid_cloud_account = Factory.build(:cloud_account, :username => "wrong_username", :password => "wrong_password", :provider => mock_provider) + invalid_cloud_account.should_not be_valid + + valid_cloud_account = Factory.build(:mock_cloud_account, :provider => mock_provider) + valid_cloud_account.should be_valid + end + + it "should fail to create a cloud account if the provider credentials are invalid" do + cloud_account = Factory.build(:mock_cloud_account, :password => "wrong_password") + cloud_account.save.should == false + end + + it "should create an instance_key if provider is EC2" do + @client = mock('DeltaCloud', :null_object => true) + @provider = Factory.build :ec2_provider + @key = mock('Key', :null_object => true) + @key.stub!(:pem).and_return("PEM") + @key.stub!(:id).and_return("1_user") + @client.stub!(:"feature?").and_return(true) + @client.stub!(:"create_key").and_return(@key) + + cloud_account = Factory.build :ec2_cloud_account + cloud_account.stub!(:connect).and_return(@client) + cloud_account.save + cloud_account.instance_key.should_not == nil + cloud_account.instance_key.pem == "PEM" + cloud_account.instance_key.id == "1_user" + end + + it "when calling connect and it fails with exception it will return nil" do + DeltaCloud.should_receive(:new).and_raise(Exception.new) + + @cloud_account.connect.should be_nil + end + + it "should generate credentials xml" do + expected_xml = <<EOT +<?xml version="1.0"?> +<provider_credentials> + <ec2_credentials> + <account_number>1234</account_number> + <access_key>user</access_key> + <secret_access_key>pass</secret_access_key> + <certificate>cert</certificate> + <key>priv_key</key> + </ec2_credentials> +</provider_credentials> +EOT + cloud_account = Factory.build(:mock_cloud_account, + :username => 'user', + :password => 'pass', + :account_number => '1234', + :x509_cert_priv => 'priv_key', + :x509_cert_pub => 'cert' + ) + cloud_account.build_credentials.should eql(expected_xml) + end +end diff --git a/src/test/fixtures/roles.yml b/src/test/fixtures/roles.yml index 99df4b7..d12fc64 100644 --- a/src/test/fixtures/roles.yml +++ b/src/test/fixtures/roles.yml @@ -27,11 +27,11 @@ pool_administrator: privileges: provider_view, pool_modify, pool_view, quota_modify, quota_view, stats_view, set_perms, view_perms account_administrator: name: Account Administrator - scope: CloudAccount + scope: ProviderAccount privileges: account_modify, account_view, stats_view, set_perms, view_perms account_viewer: name: Account User - scope: CloudAccount + scope: ProviderAccount privileges: account_view provider_administrator: name: Provider Administrator diff --git a/src/test/unit/cloud_account_test.rb b/src/test/unit/cloud_account_test.rb deleted file mode 100644 index addf6af..0000000 --- a/src/test/unit/cloud_account_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class CloudAccountTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/src/test/unit/provider_account_test.rb b/src/test/unit/provider_account_test.rb new file mode 100644 index 0000000..cafbb76 --- /dev/null +++ b/src/test/unit/provider_account_test.rb @@ -0,0 +1,8 @@ +require 'test_helper' + +class ProviderAccountTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end
On 01/27/2011 10:43 AM, jzigmund@redhat.com wrote:
From: Jozef Zigmundjzigmund@redhat.com
Inside this patch I rename model of CloudAccount to ProviderAccount. Also I refactor all codes where this model was called.
.../admin/provider_accounts_controller.rb | 16 +- src/app/controllers/cloud_accounts_controller.rb | 181 ----------------- src/app/controllers/dashboard_controller.rb | 6 +- src/app/controllers/permissions_controller.rb | 6 +- .../controllers/provider_accounts_controller.rb | 181 +++++++++++++++++ src/app/controllers/quotas_controller.rb | 2 +- src/app/models/cloud_account.rb | 205 -------------------- src/app/models/image.rb | 2 +- src/app/models/permission.rb | 2 +- src/app/models/provider.rb | 4 +- src/app/models/provider_account.rb | 204 +++++++++++++++++++ src/app/services/data_service_active_record.rb | 8 +- src/app/services/graph_service.rb | 2 +- src/app/views/cloud_accounts/_form.haml | 52 ----- src/app/views/cloud_accounts/edit.haml | 17 -- src/app/views/cloud_accounts/index.haml | 25 --- src/app/views/cloud_accounts/new.haml | 17 -- src/app/views/provider_accounts/_form.haml | 52 +++++ src/app/views/provider_accounts/edit.haml | 17 ++ src/app/views/provider_accounts/index.haml | 25 +++ src/app/views/provider_accounts/new.haml | 17 ++ src/classad_plugin/classad_plugin.rb | 2 +- src/config/old_navigation.rb | 2 +- src/config/routes.rb | 4 +- ...824_rename_cloud_account_to_provider_account.rb | 9 + src/db/seeds.rb | 12 +- src/dbomatic/dbomatic | 2 +- .../step_definitions/provider_account_steps.rb | 8 +- src/features/step_definitions/provider_steps.rb | 2 +- src/features/support/custom.rb | 2 +- src/features/support/paths.rb | 2 +- src/lib/tasks/demo_data.rake | 4 +- .../controllers/cloud_accounts_controller_spec.rb | 92 --------- .../provider_accounts_controller_spec.rb | 92 +++++++++ src/spec/factories/cloud_account.rb | 21 -- src/spec/factories/provider_account.rb | 21 ++ src/spec/models/cloud_account_spec.rb | 80 -------- src/spec/models/provider_account_spec.rb | 80 ++++++++ src/test/fixtures/roles.yml | 4 +- src/test/unit/cloud_account_test.rb | 8 - src/test/unit/provider_account_test.rb | 8 + 41 files changed, 755 insertions(+), 741 deletions(-) delete mode 100644 src/app/controllers/cloud_accounts_controller.rb create mode 100644 src/app/controllers/provider_accounts_controller.rb delete mode 100644 src/app/models/cloud_account.rb create mode 100644 src/app/models/provider_account.rb delete mode 100644 src/app/views/cloud_accounts/_form.haml delete mode 100644 src/app/views/cloud_accounts/edit.haml delete mode 100644 src/app/views/cloud_accounts/index.haml delete mode 100644 src/app/views/cloud_accounts/new.haml create mode 100644 src/app/views/provider_accounts/_form.haml create mode 100644 src/app/views/provider_accounts/edit.haml create mode 100644 src/app/views/provider_accounts/index.haml create mode 100644 src/app/views/provider_accounts/new.haml create mode 100644 src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb delete mode 100644 src/spec/controllers/cloud_accounts_controller_spec.rb create mode 100644 src/spec/controllers/provider_accounts_controller_spec.rb delete mode 100644 src/spec/factories/cloud_account.rb create mode 100644 src/spec/factories/provider_account.rb delete mode 100644 src/spec/models/cloud_account_spec.rb create mode 100644 src/spec/models/provider_account_spec.rb delete mode 100644 src/test/unit/cloud_account_test.rb create mode 100644 src/test/unit/provider_account_test.rb
diff --git a/src/app/controllers/admin/provider_accounts_controller.rb b/src/app/controllers/admin/provider_accounts_controller.rb index d422a53..e5d3ccd 100644 --- a/src/app/controllers/admin/provider_accounts_controller.rb +++ b/src/app/controllers/admin/provider_accounts_controller.rb @@ -17,8 +17,12 @@ class Admin::ProviderAccountsController< ApplicationController
def show @tab_captions = ['Properties', 'Credentials', 'History', 'Permissions']
+<<<<<<< HEAD @account = CloudAccount.find(params[:id]) require_privilege(Privilege::VIEW, @account) +=======
- @account = ProviderAccount.find(params[:id])
+>>>>>>> Rename CloudAccount to ProviderAccount @details_tab = params[:details_tab].blank? ? 'properties' : params[:details_tab]
This is a merge/rebase conflict -- it needs to be resolved before generating the patch -- like this the code won't actually work. In this case just put the require_privilege line below the updated @account assignment
diff --git a/src/app/controllers/provider_accounts_controller.rb b/src/app/controllers/provider_accounts_controller.rb new file mode 100644 index 0000000..9fbf126 --- /dev/null +++ b/src/app/controllers/provider_accounts_controller.rb @@ -0,0 +1,181 @@ +class ProviderAccountsController< ApplicationController
- def index
- @provider = Provider.find(params[:provider_id])
- require_privilege(Privilege::VIEW, CloudAccount, @provider)
- end
That should be changed to ProviderAccount from CloudAccount
- def new
- @provider = Provider.find(params[:provider_id])
- @cloud_account = ProviderAccount.new
- @quota = Quota.new
- require_privilege(Privilege::CREATE, CloudAccount, @provider)
- end
That should be changed to ProviderAccount from CloudAccount
- def create
- @provider = Provider.find(params[:provider_id])
- require_privilege(Privilege::CREATE, ProviderAccount, @provider)
- @cloud_account = ProviderAccount.new(params[:cloud_account])
params and instance variables should probably change to provider_account too
- @cloud_account.provider = @provider
- @cloud_account.quota = @quota = Quota.new
- if params[:test_account]
test_account(@cloud_account)
render :action => 'new' and return
- end
- limit = params[:quota][:maximum_running_instances] if params[:quota]
- @cloud_account.quota.set_maximum_running_instances(limit)
- if @cloud_account.invalid?
if not @cloud_account.valid_credentials?
flash.now[:error] = "The entered credential information is incorrect"
elsif @cloud_account.errors.on(:username)
flash.now[:error] = "The access key '#{params[:cloud_account][:username]}' has already been taken."
else
flash.now[:error] = "You must fill in all the required fields"
end
render :action => 'new' and return
- end
- @cloud_account.pool_families<< PoolFamily.default
- @cloud_account.save!
- if @cloud_account.populate_realms
flash[:notice] = "Provider account added."
- end
- redirect_to provider_accounts_path(@provider)
- kick_condor
- end
- def edit
- @cloud_account = ProviderAccount.find(params[:id])
- @quota = @cloud_account.quota
- @provider = @cloud_account.provider
- require_privilege(Privilege::MODIFY, @cloud_account)
- end
- def update_accounts
- @provider = Provider.find(params[:provider][:id])
- require_privilege(Privilege::MODIFY, CloudAccount, @provider)
- @providers = Provider.list_for_user(@current_user, Privilege::VIEW)
- success = true
- @provider.cloud_accounts.each do |cloud_account|
attributes = params[:cloud_accounts][cloud_account.id.to_s]
password = attributes[:password]
# blank password means the user didn't change it -- don't update it then
if password.blank?
attributes.delete :password
end
cloud_account.quota.maximum_running_instances = quota_from_string(params[:quota][cloud_account.id.to_s][:maximum_running_instances])
private_cert = attributes[:x509_cert_priv_file]
unless private_cert.blank?
attributes[:x509_cert_priv] = private_cert.read
end
attributes.delete :x509_cert_priv_file
public_cert = attributes[:x509_cert_pub_file]
unless public_cert.blank?
attributes[:x509_cert_pub] = public_cert.read
end
attributes.delete :x509_cert_pub_file
begin
cloud_account.update_attributes!(attributes)
cloud_account.quota.save!
rescue
success = false
end
- end
- if success
flash[:notice] = "Account updated."
redirect_to :controller => 'providers', :action => 'accounts', :id => @provider
- else
flash.now[:notice] = "Error updating the cloud account."
render :template => 'provider/accounts'
- end
- end
- def update
- @cloud_account = ProviderAccount.find(params[:id])
- @provider = @cloud_account.provider
- require_privilege(Privilege::MODIFY, @cloud_account)
- @quota = @cloud_account.quota
- limit = params[:quota][:maximum_running_instances] if params[:quota]
- @cloud_account.quota.set_maximum_running_instances(limit)
- if @cloud_account.update_attributes(params[:cloud_account])
flash[:notice] = "Cloud Account updated!"
redirect_to provider_accounts_path(@provider)
- else
render :action => :edit
- end
- end
- def key
- @cloud_account = ProviderAccount.find(params[:id])
- require_privilege(Privilege::MODIFY,@provider_account)
- unless @cloud_account.instance_key.nil?
render :text => @cloud_account.instance_key.pem
- end
- end
- def destroy
- account = ProviderAccount.find(params[:id])
- provider = account.provider
- require_privilege(Privilege::MODIFY, account)
- if account.destroy
flash[:notice] = "Cloud Account destroyed"
- else
flash[:error] = "Cloud Account could not be destroyed"
- end
- redirect_to provider_accounts_path(provider)
- end
- def test_account(account)
- if account.valid_credentials?
flash.now[:notice] = "Test Connection Success: Valid Account Details"
- else
flash.now[:error] = "Test Connection Failed: Invalid Account Details"
- end
- rescue
- flash.now[:error] = "Test Connection Failed: Could not connect to provider"
- end
- private
- def load_providers
- @providers = Provider.list_for_user(@current_user, Privilege::VIEW)
- end
+end diff --git a/src/app/models/cloud_account.rb b/src/app/models/cloud_account.rb deleted file mode 100644 index 4eba087..0000000 --- a/src/app/models/cloud_account.rb +++ /dev/null @@ -1,205 +0,0 @@ -class CloudAccount< ActiveRecord::Base
- end
-end diff --git a/src/app/models/provider.rb b/src/app/models/provider.rb index 1e89958..affe1ae 100644 --- a/src/app/models/provider.rb +++ b/src/app/models/provider.rb @@ -29,7 +29,9 @@ class Provider< ActiveRecord::Base require 'util/deltacloud' include PermissionedObject
- has_many :cloud_accounts, :dependent => :destroy
- PROVIDERS = { 1 => "AWS", 2 => "GoGrid" , 3 => "Rackspace", 4 => "RHEVM", 5 => "OpenNebula" }
Should this be PROVIDER_TYPES?
- has_many :provider_accounts, :dependent => :destroy has_many :hardware_profiles, :dependent => :destroy has_many :replicated_images, :dependent => :destroy has_many :realms, :dependent => :destroy
diff --git a/src/app/services/data_service_active_record.rb b/src/app/services/data_service_active_record.rb index 66da011..5833baa 100644 --- a/src/app/services/data_service_active_record.rb +++ b/src/app/services/data_service_active_record.rb @@ -65,7 +65,7 @@ class DataServiceActiveRecord data_points = [] free_instances = 0
- cloud_accounts = CloudAccount.find(:all, :conditions => {:provider_id => provider.id})
- cloud_accounts = ProviderAccount.find(:all, :conditions => {:provider_id => provider.id})
For consistency we should probably update internal variables to use provider_account too. Do this for the remainder of the files too.
cloud_accounts.each do |cloud_account| quota = cloud_account.quota if quota
@@ -175,11 +175,11 @@ class DataServiceActiveRecord instances = []
if parent.class == Provider
cloud_accounts = CloudAccount.find(:all, :conditions => {:provider_id => parent.id})
cloud_accounts = ProviderAccount.find(:all, :conditions => {:provider_id => parent.id}) cloud_accounts.each do |cloud_account| instances.concat(cloud_account.instances) end
- elsif parent.class == Pool || parent.class == CloudAccount
- elsif parent.class == Pool || parent.class == ProviderAccount instances = parent.instances else return nil
@@ -209,7 +209,7 @@ class DataServiceActiveRecord end end
- # returns the failure rate of instance starts for instances associated with the parent, (pool/cloudaccount) given the failure code
- # returns the failure rate of instance starts for instances associated with the parent, (pool/ProviderAccount) given the failure code def self.failure_rate(parent, start_time, end_time, failure_code) instances = get_parent_instances(parent) tasks = Task.find(:all, :conditions => {:created_at => start_time...end_time,
diff --git a/src/app/views/provider_accounts/_form.haml b/src/app/views/provider_accounts/_form.haml new file mode 100644 index 0000000..2d35d47 --- /dev/null +++ b/src/app/views/provider_accounts/_form.haml @@ -0,0 +1,52 @@ += error_messages_for 'cloud_account'
provider_account
+%fieldset.clearfix.nomargin
- %label.grid_4.la.alpha
- = t('.account_name')
- %span.required *
- %label.grid_3.la
- = t('.user_name')
- %span.required *
- %label.grid_3.la
- = t('.password')
- %span.required *
- %label.grid_3.la.omega
- = t('.quota_instances')
- %span.required *
diff --git a/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb new file mode 100644 index 0000000..154649d --- /dev/null +++ b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb @@ -0,0 +1,9 @@ +class RenameCloudAccountToProviderAccount< ActiveRecord::Migration
- def self.up
- rename_table (:cloud_accounts,:provider_accounts)
- end
- def self.down
- drop_table :provider_accounts
- end
+end
This migration needs to update roles and privileges data to replicate the effect caused by the change below to seeds.rb. For new database, seeds.rb will load the proper data, but for migrating an existing detabase, you need to update all roles with a scope of "CloudAccount" to change scope to "ProviderAccount", and all Privileges with a target_type of "CloudAccount" to change target_type to "ProviderAccount"
To be really complete you should probably also look for Permissions with permission_object_type="CloudAccount" and change those records accordingly as well.
diff --git a/src/db/seeds.rb b/src/db/seeds.rb index 9a6065c..1ed2329 100644 --- a/src/db/seeds.rb +++ b/src/db/seeds.rb @@ -30,17 +30,17 @@ roles = Quota => [VIEW]}}, Provider => {"Provider Owner" => {Provider => [VIEW, MOD, VPRM,GPRM],
CloudAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}},
- CloudAccount =>
{"Provider Account User" => {CloudAccount => [VIEW,USE]},
"Provider Account Owner" => {CloudAccount => [VIEW,USE,MOD, VPRM,GPRM]}},
ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}},
- ProviderAccount =>
{"Provider Account User" => {ProviderAccount => [VIEW,USE]},
Template => {"Template User" => {Template => [VIEW,USE]}, "Template Owner" => {Template => [VIEW,USE,MOD, VPRM,GPRM]}}, BasePermissionObject => {"Provider Creator" => {Provider => [ CRE]}, "Provider Administrator" => {Provider => [VIEW, MOD,CRE,VPRM,GPRM],"Provider Account Owner" => {ProviderAccount => [VIEW,USE,MOD, VPRM,GPRM]}},
CloudAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]},
ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}, "HWP Administrator" => {HardwareProfile => [ MOD,CRE,VPRM,GPRM]}, "Realm Administrator" => {Realm => [ USE,MOD,CRE,VPRM,GPRM]}, "Pool Creator" => {Pool => [ CRE]},
@@ -50,7 +50,7 @@ roles = PoolFamily => [VIEW, MOD,CRE,VPRM,GPRM]}, "Template Administrator" => {Template => [VIEW,USE,MOD,CRE,VPRM,GPRM]}, "Administrator" => {Provider => [VIEW, MOD,CRE,VPRM,GPRM],
CloudAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM],
ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM], HardwareProfile => [ MOD,CRE,VPRM,GPRM], Realm => [ USE,MOD,CRE,VPRM,GPRM], User => [VIEW, MOD,CRE],
+end
Scott
From: Jozef Zigmund jzigmund@redhat.com
In this patch I rename relationships in other models, that they have some relationship with ProviderAccount. Also I refactored all code, which is calling model.cloud_account/s to model.provider_account/s. --- .../controllers/provider_accounts_controller.rb | 2 +- src/app/models/instance.rb | 2 +- src/app/models/instance_observer.rb | 2 +- src/app/models/instance_task.rb | 2 +- src/app/models/pool.rb | 4 ++-- src/app/models/pool_family.rb | 2 +- src/app/models/provider.rb | 6 +++--- src/app/models/quota.rb | 2 +- src/app/services/graph_service.rb | 2 +- src/app/util/condormatic.rb | 2 +- src/app/views/instances/index.haml | 2 +- src/app/views/instances/show.haml | 2 +- src/app/views/providers/accounts.haml | 6 +++--- src/app/views/resources/instances/_list.haml | 2 +- src/app/views/resources/instances/_properties.haml | 2 +- src/image_builder_service/image_builder_service | 2 +- src/lib/tasks/dc_tasks.rake | 2 +- src/spec/models/pool_family_spec.rb | 4 ++-- src/spec/models/provider_spec.rb | 2 +- 19 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/src/app/controllers/provider_accounts_controller.rb b/src/app/controllers/provider_accounts_controller.rb index 9fbf126..a902150 100644 --- a/src/app/controllers/provider_accounts_controller.rb +++ b/src/app/controllers/provider_accounts_controller.rb @@ -89,7 +89,7 @@ class ProviderAccountsController < ApplicationController @providers = Provider.list_for_user(@current_user, Privilege::VIEW)
success = true - @provider.cloud_accounts.each do |cloud_account| + @provider.provider_accounts.each do |cloud_account| attributes = params[:cloud_accounts][cloud_account.id.to_s]
password = attributes[:password] diff --git a/src/app/models/instance.rb b/src/app/models/instance.rb index b84a596..3d24404 100644 --- a/src/app/models/instance.rb +++ b/src/app/models/instance.rb @@ -36,7 +36,7 @@ class Instance < ActiveRecord::Base @@per_page = 15
belongs_to :pool - belongs_to :cloud_account + belongs_to :provider_account
belongs_to :hardware_profile belongs_to :template diff --git a/src/app/models/instance_observer.rb b/src/app/models/instance_observer.rb index 80b39c5..157ac39 100644 --- a/src/app/models/instance_observer.rb +++ b/src/app/models/instance_observer.rb @@ -36,7 +36,7 @@ class InstanceObserver < ActiveRecord::Observer hwp = an_instance.hardware_profile pool = an_instance.pool user = an_instance.owner - cloud_account = an_instance.cloud_account + cloud_account = an_instance.provider_account
[cloud_account, pool, user].each do |parent| if parent diff --git a/src/app/models/instance_task.rb b/src/app/models/instance_task.rb index be76a6e..42bed29 100644 --- a/src/app/models/instance_task.rb +++ b/src/app/models/instance_task.rb @@ -46,7 +46,7 @@ class InstanceTask < Task actions = [] # FIXME: cloud_account won't always be set here, but we're requiring # front end realm for now. - if cloud_account = instance.cloud_account and + if cloud_account = instance.provider_account and conn = cloud_account.connect and c_state = conn.instance_state(state) transitions = c_state.transitions transitions.each do |transition| diff --git a/src/app/models/pool.rb b/src/app/models/pool.rb index 550ca79..0f9a4fb 100644 --- a/src/app/models/pool.rb +++ b/src/app/models/pool.rb @@ -47,8 +47,8 @@ class Pool < ActiveRecord::Base def cloud_accounts accounts = [] instances.each do |instance| - if instance.cloud_account and !accounts.include?(instance.cloud_account) - accounts << instance.cloud_account + if instance.provider_account and !accounts.include?(instance.provider_account) + accounts << instance.provider_account end end end diff --git a/src/app/models/pool_family.rb b/src/app/models/pool_family.rb index bc96fee..e083920 100644 --- a/src/app/models/pool_family.rb +++ b/src/app/models/pool_family.rb @@ -24,7 +24,7 @@ class PoolFamily < ActiveRecord::Base DEFAULT_POOL_FAMILY_KEY = "default_pool_family"
has_many :pools, :dependent => :destroy - has_and_belongs_to_many :cloud_accounts + has_and_belongs_to_many :provider_accounts
validates_presence_of :name validates_uniqueness_of :name diff --git a/src/app/models/provider.rb b/src/app/models/provider.rb index affe1ae..d2c9dfb 100644 --- a/src/app/models/provider.rb +++ b/src/app/models/provider.rb @@ -55,8 +55,8 @@ class Provider < ActiveRecord::Base # but a cloud account is silently not destroyed when there is # an instance for the cloud account def destroyable? - unless self.cloud_accounts.empty? - self.cloud_accounts.each do |c| + unless self.provider_accounts.empty? + self.provider_accounts.each do |c| unless c.instances.empty? inst_list = c.instances.map {|i| i.name}.join(', ') self.errors.add_to_base "there are instances for cloud account '#{c.name}': #{inst_list}" @@ -122,7 +122,7 @@ class Provider < ActiveRecord::Base # returns first provider of cloud_type which has at least one cloud account def self.find_by_target_with_account(cloud_type) Provider.all(:conditions => {:cloud_type => cloud_type}).each do |p| - return p unless p.cloud_accounts.empty? + return p unless p.provider_accounts.empty? end nil end diff --git a/src/app/models/quota.rb b/src/app/models/quota.rb index 9f79e04..acb001a 100644 --- a/src/app/models/quota.rb +++ b/src/app/models/quota.rb @@ -22,7 +22,7 @@ class Quota < ActiveRecord::Base
has_one :pool - has_one :cloud_account + has_one :provider_account has_one :user
validates_numericality_of :maximum_total_instances, diff --git a/src/app/services/graph_service.rb b/src/app/services/graph_service.rb index d85f0c3..c5f3065 100644 --- a/src/app/services/graph_service.rb +++ b/src/app/services/graph_service.rb @@ -126,7 +126,7 @@ class GraphService providers = Provider.all providers.each do |provider| running_instances = 0 - provider.cloud_accounts.each do |account| + provider.provider_accounts.each do |account| running_instances = running_instances + account.quota.running_instances if account.quota end if running_instances > 0 diff --git a/src/app/util/condormatic.rb b/src/app/util/condormatic.rb index 8b4e224..da265c0 100644 --- a/src/app/util/condormatic.rb +++ b/src/app/util/condormatic.rb @@ -216,7 +216,7 @@ def condormatic_classads_sync # to it. replicated_images = provider.replicated_images.find(:all, :conditions => ['provider_image_key IS NOT NULL']) - accounts = provider.cloud_accounts + accounts = provider.provider_accounts hardware_profiles = provider.hardware_profiles realms = provider.realms accounts.each { |account| diff --git a/src/app/views/instances/index.haml b/src/app/views/instances/index.haml index e33041e..8bbbb2a 100644 --- a/src/app/views/instances/index.haml +++ b/src/app/views/instances/index.haml @@ -123,5 +123,5 @@ %td= inst.hardware_profile.name %td= inst.template.name %td= inst.public_addresses - %td= inst.cloud_account ? inst.cloud_account.provider.name : '' + %td= inst.provider_account ? inst.provider_account.provider.name : '' %td= owner_name(inst) diff --git a/src/app/views/instances/show.haml b/src/app/views/instances/show.haml index 33b2897..7eab76e 100644 --- a/src/app/views/instances/show.haml +++ b/src/app/views/instances/show.haml @@ -18,7 +18,7 @@ %span= "#{@instance.template.xml.platform} #{@instance.template.xml.platform_version}" %li = label_tag :provider, 'Provider' - %span= @instance.cloud_account.provider.name if @instance.cloud_account + %span= @instance.provider_account.provider.name if @instance.provider_account %li = label_tag :base_template, 'Base Template' %span= @instance.template.name diff --git a/src/app/views/providers/accounts.haml b/src/app/views/providers/accounts.haml index 984f257..63d42af 100644 --- a/src/app/views/providers/accounts.haml +++ b/src/app/views/providers/accounts.haml @@ -11,7 +11,7 @@ = t('.provider_accounts') - form_tag ({:controller => 'cloud_accounts', :action => 'update_accounts'}), :multipart => true do = hidden_field :provider, :id, :value => @provider.id - - @provider.cloud_accounts.each do |acct| + - @provider.provider_accounts.each do |acct| %fieldset.clearfix.nomargin %label.grid_4.la.alpha = t('.account_name') @@ -61,8 +61,8 @@ %a.button{ :href => remove_path, :name => "remove_acc_#{acct.id}", :class => "tiny #{'disabled' unless remove_path}" } = t(:remove) %fieldset.clearfix.gap - = link_to t(:reset), {:controller => 'provider', :action => 'accounts', :id => @provider.id}, :class => "button dialogbutton" unless @provider.cloud_accounts.empty? - = submit_tag t(:save), :name => 'update_cloud_accounts', :class => "dialogbutton" unless @provider.cloud_accounts.empty? + = link_to t(:reset), {:controller => 'provider', :action => 'accounts', :id => @provider.id}, :class => "button dialogbutton" unless @provider.provider_accounts.empty? + = submit_tag t(:save), :name => 'update_cloud_accounts', :class => "dialogbutton" unless @provider.provider_accounts.empty?
%h2 = t('.new_provider_account') diff --git a/src/app/views/resources/instances/_list.haml b/src/app/views/resources/instances/_list.haml index a83b565..b62d9e7 100644 --- a/src/app/views/resources/instances/_list.haml +++ b/src/app/views/resources/instances/_list.haml @@ -19,5 +19,5 @@ %td= inst.state %td= inst.template.name %td= inst.public_addresses - %td= inst.cloud_account ? inst.cloud_account.provider.name : '' + %td= inst.provider_account ? inst.provider_account.provider.name : '' %td= owner_name(inst) diff --git a/src/app/views/resources/instances/_properties.haml b/src/app/views/resources/instances/_properties.haml index 5283e20..d14843c 100644 --- a/src/app/views/resources/instances/_properties.haml +++ b/src/app/views/resources/instances/_properties.haml @@ -16,7 +16,7 @@ %span= "#{@instance.template.xml.platform} #{@instance.template.xml.platform_version}" %li = label_tag :provider, 'Provider' - %span= @instance.cloud_account.provider.name if @instance.cloud_account + %span= @instance.provider_account.provider.name if @instance.provider_account %li = label_tag :base_template, 'Base Template' %span= @instance.template.name diff --git a/src/image_builder_service/image_builder_service b/src/image_builder_service/image_builder_service index 0ffb74d..35099b0 100755 --- a/src/image_builder_service/image_builder_service +++ b/src/image_builder_service/image_builder_service @@ -121,7 +121,7 @@ class ImageBuilderService # FIXME: this should be contained elsewhere (probably Image model) so we # can keep logic out of here. Also, this currently only handles one # account, we will need to be able to specify at some point. - creds = image.replicated_images.first.provider.cloud_accounts.first.build_credentials + creds = image.replicated_images.first.provider.provider_accounts.first.build_credentials #TODO: switch this back to uri once ActiveBuild retrieves it properly ab = @console.build_image(image.template.xml.to_xml, image.target, image.uuid, creds) if ab diff --git a/src/lib/tasks/dc_tasks.rake b/src/lib/tasks/dc_tasks.rake index f1d0c7d..cf713a5 100644 --- a/src/lib/tasks/dc_tasks.rake +++ b/src/lib/tasks/dc_tasks.rake @@ -105,7 +105,7 @@ namespace :dc do unless provider = Provider.find_by_name(provider_name) raise "There is no provider with '#{provider_name}' name" end - unless account = provider.cloud_accounts.find_by_label(account_name) + unless account = provider.provider_accounts.find_by_label(account_name) raise "There is no account with '#{account_name}' label" end account diff --git a/src/spec/models/pool_family_spec.rb b/src/spec/models/pool_family_spec.rb index 2b69eab..58c18ec 100644 --- a/src/spec/models/pool_family_spec.rb +++ b/src/spec/models/pool_family_spec.rb @@ -27,8 +27,8 @@ describe PoolFamily do end
it "should have account" do - @pool_family.cloud_accounts.size.should == 1 - @pool_family.cloud_accounts[0].id.should == @cloud_account.id + @pool_family.provider_accounts.size.should == 1 + @pool_family.provider_accounts[0].id.should == @cloud_account.id end
end diff --git a/src/spec/models/provider_spec.rb b/src/spec/models/provider_spec.rb index 1b86f92..e3af313 100644 --- a/src/spec/models/provider_spec.rb +++ b/src/spec/models/provider_spec.rb @@ -79,7 +79,7 @@ describe Provider do HardwareProfile.destroy_all
instance = Factory(:instance) - provider = instance.cloud_account.provider + provider = instance.provider_account.provider provider.destroy provider.destroyed?.should be_false end
From: Jozef Zigmund jzigmund@redhat.com
All supported providers are included in constant hash, that is named PROVIDERS in Provider model. So now, attribute of class "cloud_type" must be one of these PROVIDERS value. --- src/app/controllers/admin/providers_controller.rb | 3 ++- src/app/models/provider.rb | 5 +++-- src/app/views/admin/providers/_form.haml | 9 +++++++-- src/app/views/admin/providers/_list.haml | 1 + src/config/locales/en.yml | 6 ++++++ ...824_rename_cloud_account_to_provider_account.rb | 1 + 6 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/src/app/controllers/admin/providers_controller.rb b/src/app/controllers/admin/providers_controller.rb index a898d72..f06f354 100644 --- a/src/app/controllers/admin/providers_controller.rb +++ b/src/app/controllers/admin/providers_controller.rb @@ -116,7 +116,8 @@ class Admin::ProvidersController < ApplicationController
def load_providers @header = [{ :name => "Provider name", :sort_attr => :name }, - { :name => "Provider URL", :sort_attr => :name } + { :name => "Provider URL", :sort_attr => :name }, + { :name => "Provider Type", :sort_attr => :name } ] @providers = Provider.list_for_user(@current_user, Privilege::VIEW) @url_params = params.clone diff --git a/src/app/models/provider.rb b/src/app/models/provider.rb index d2c9dfb..38445be 100644 --- a/src/app/models/provider.rb +++ b/src/app/models/provider.rb @@ -29,7 +29,7 @@ class Provider < ActiveRecord::Base require 'util/deltacloud' include PermissionedObject
- PROVIDERS = { 1 => "AWS", 2 => "GoGrid" , 3 => "Rackspace", 4 => "RHEVM", 5 => "OpenNebula" } + PROVIDERS = { 0 => "mock", 1 => "AWS", 2 => "GoGrid" , 3 => "Rackspace", 4 => "RHEVM", 5 => "OpenNebula" }
has_many :provider_accounts, :dependent => :destroy has_many :hardware_profiles, :dependent => :destroy @@ -39,12 +39,13 @@ class Provider < ActiveRecord::Base validates_presence_of :name validates_uniqueness_of :name
- validates_presence_of :cloud_type validates_presence_of :url
validates_format_of :name, :with => /^[\w -]*$/n, :message => "must only contain: numbers, letters, spaces, '_' and '-'" validates_length_of :name, :maximum => 255
+ validates_inclusion_of :cloud_type, :in => PROVIDERS + has_many :permissions, :as => :permission_object, :dependent => :destroy, :include => [:role], :order => "permissions.id ASC" diff --git a/src/app/views/admin/providers/_form.haml b/src/app/views/admin/providers/_form.haml index fe8c9ca..c980c0a 100644 --- a/src/app/views/admin/providers/_form.haml +++ b/src/app/views/admin/providers/_form.haml @@ -1,5 +1,6 @@ = form.error_message_on :name, 'Name' = form.error_message_on :url, 'URL' += form.error_message_on :cloud_type %fieldset.clear = form.label :name,'Provider name :' = form.text_field :name, :title => 'provider_name', :value => @provider.name, :class => "clear grid_4 alpha" @@ -10,5 +11,9 @@ %button.linkbutton.nospace{ :type => 'submit', :value => t('.test_connection'), :name => 'test_connection', :id => 'test_connection' } Test connection ) - %fieldset.clear - = form.submit "Save", :class => "submit formbutton" +%fieldset.clear + = form.label :cloud_type + = form.select (:cloud_type, Provider::PROVIDERS.collect {|id, cloud_type| [t(cloud_type),id] }, :prompt => "Select type of provider") + +%fieldset.clear + = form.submit "Save", :class => "submit formbutton" diff --git a/src/app/views/admin/providers/_list.haml b/src/app/views/admin/providers/_list.haml index 21ad381..bce2af6 100644 --- a/src/app/views/admin/providers/_list.haml +++ b/src/app/views/admin/providers/_list.haml @@ -17,3 +17,4 @@ %input{:name => "provider_selected[]", :type => "checkbox", :value => provider.id, :id => "provider_checkbox_#{provider.id}", :checked => selected } = link_to provider.name, admin_provider_path(provider) %td= provider.url + %td= t(Provider::PROVIDERS[provider.cloud_type]) diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml index 715c0a0..dcb379b 100644 --- a/src/config/locales/en.yml +++ b/src/config/locales/en.yml @@ -85,6 +85,12 @@ en: pool_families: Pool Families setting: Settings name: Name + AWS: Amazon EC2 + RHEVM: RHEV-M + GoGrid: GoGrid + Rackspace: Rackspace + OpenNebula: OpenNebula + mock: Mock admin: settings: index: diff --git a/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb index 154649d..2ccadb4 100644 --- a/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb +++ b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb @@ -1,6 +1,7 @@ class RenameCloudAccountToProviderAccount < ActiveRecord::Migration def self.up rename_table (:cloud_accounts,:provider_accounts) + change_column (:providers, :cloud_type, :integer, :null => false) end
def self.down
On 01/27/2011 10:43 AM, jzigmund@redhat.com wrote:
From: Jozef Zigmundjzigmund@redhat.com
All supported providers are included in constant hash, that is named PROVIDERS in Provider model. So now, attribute of class "cloud_type" must be one of these PROVIDERS value.
src/app/controllers/admin/providers_controller.rb | 3 ++- src/app/models/provider.rb | 5 +++-- src/app/views/admin/providers/_form.haml | 9 +++++++-- src/app/views/admin/providers/_list.haml | 1 + src/config/locales/en.yml | 6 ++++++ ...824_rename_cloud_account_to_provider_account.rb | 1 + 6 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/src/app/controllers/admin/providers_controller.rb b/src/app/controllers/admin/providers_controller.rb index a898d72..f06f354 100644 --- a/src/app/controllers/admin/providers_controller.rb +++ b/src/app/controllers/admin/providers_controller.rb @@ -116,7 +116,8 @@ class Admin::ProvidersController< ApplicationController
def load_providers @header = [{ :name => "Provider name", :sort_attr => :name },
{ :name => "Provider URL", :sort_attr => :name }
{ :name => "Provider URL", :sort_attr => :name },
{ :name => "Provider Type", :sort_attr => :name } ] @providers = Provider.list_for_user(@current_user, Privilege::VIEW) @url_params = params.clone
diff --git a/src/app/models/provider.rb b/src/app/models/provider.rb index d2c9dfb..38445be 100644 --- a/src/app/models/provider.rb +++ b/src/app/models/provider.rb @@ -29,7 +29,7 @@ class Provider< ActiveRecord::Base require 'util/deltacloud' include PermissionedObject
- PROVIDERS = { 1 => "AWS", 2 => "GoGrid" , 3 => "Rackspace", 4 => "RHEVM", 5 => "OpenNebula" }
- PROVIDERS = { 0 => "mock", 1 => "AWS", 2 => "GoGrid" , 3 => "Rackspace", 4 => "RHEVM", 5 => "OpenNebula" }
This should probably be PROVIDER_TYPES, since "RHEVM" is a provider type, but "my RHEVM server at foo.redhat.com" is a provider, and "ec2" is a provider type, but "ec2-us-east" is a provider.
has_many :provider_accounts, :dependent => :destroy has_many :hardware_profiles, :dependent => :destroy
@@ -39,12 +39,13 @@ class Provider< ActiveRecord::Base validates_presence_of :name validates_uniqueness_of :name
validates_presence_of :cloud_type validates_presence_of :url
validates_format_of :name, :with => /^[\w -]*$/n, :message => "must only contain: numbers, letters, spaces, '_' and '-'" validates_length_of :name, :maximum => 255
- validates_inclusion_of :cloud_type, :in => PROVIDERS
I think we should use provider_type instead of cloud_type to be consistent here.
has_many :permissions, :as => :permission_object, :dependent => :destroy, :include => [:role], :order => "permissions.id ASC"
diff --git a/src/app/views/admin/providers/_form.haml b/src/app/views/admin/providers/_form.haml index fe8c9ca..c980c0a 100644 --- a/src/app/views/admin/providers/_form.haml +++ b/src/app/views/admin/providers/_form.haml @@ -1,5 +1,6 @@ = form.error_message_on :name, 'Name' = form.error_message_on :url, 'URL' += form.error_message_on :cloud_type %fieldset.clear = form.label :name,'Provider name :' = form.text_field :name, :title => 'provider_name', :value => @provider.name, :class => "clear grid_4 alpha" @@ -10,5 +11,9 @@ %button.linkbutton.nospace{ :type => 'submit', :value => t('.test_connection'), :name => 'test_connection', :id => 'test_connection' } Test connection )
- %fieldset.clear
- = form.submit "Save", :class => "submit formbutton"
+%fieldset.clear
- = form.label :cloud_type
- = form.select (:cloud_type, Provider::PROVIDERS.collect {|id, cloud_type| [t(cloud_type),id] }, :prompt => "Select type of provider")
+%fieldset.clear
- = form.submit "Save", :class => "submit formbutton"
diff --git a/src/app/views/admin/providers/_list.haml b/src/app/views/admin/providers/_list.haml index 21ad381..bce2af6 100644 --- a/src/app/views/admin/providers/_list.haml +++ b/src/app/views/admin/providers/_list.haml @@ -17,3 +17,4 @@ %input{:name => "provider_selected[]", :type => "checkbox", :value => provider.id, :id => "provider_checkbox_#{provider.id}", :checked => selected } = link_to provider.name, admin_provider_path(provider) %td= provider.url
%td= t(Provider::PROVIDERS[provider.cloud_type])
diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml index 715c0a0..dcb379b 100644 --- a/src/config/locales/en.yml +++ b/src/config/locales/en.yml @@ -85,6 +85,12 @@ en: pool_families: Pool Families setting: Settings name: Name
- AWS: Amazon EC2
- RHEVM: RHEV-M
- GoGrid: GoGrid
- Rackspace: Rackspace
- OpenNebula: OpenNebula
- mock: Mock admin: settings: index:
diff --git a/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb index 154649d..2ccadb4 100644 --- a/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb +++ b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb @@ -1,6 +1,7 @@ class RenameCloudAccountToProviderAccount< ActiveRecord::Migration def self.up rename_table (:cloud_accounts,:provider_accounts)
change_column (:providers, :cloud_type, :integer, :null => false) end
def self.down
From: Jozef Zigmund jzigmund@redhat.com
--- .../admin/provider_accounts_controller.rb | 32 ++++++++++++----- src/app/controllers/admin/providers_controller.rb | 2 +- src/app/helpers/admin/provider_accounts_helper.rb | 21 +++++++++++ src/app/models/provider.rb | 8 ++-- src/app/views/admin/provider_accounts/_aws.haml | 39 ++++++++++++++++++++ src/app/views/admin/provider_accounts/_gogrid.haml | 16 ++++++++ .../views/admin/provider_accounts/_opennebula.haml | 16 ++++++++ .../provider_accounts/_provider_selection.haml | 24 ++++++++++++ .../views/admin/provider_accounts/_rackspace.haml | 16 ++++++++ src/app/views/admin/provider_accounts/_rhevm.haml | 2 + src/app/views/admin/provider_accounts/new.haml | 19 ++++------ src/app/views/layouts/newui.haml | 1 - src/config/routes.rb | 3 +- 13 files changed, 172 insertions(+), 27 deletions(-) create mode 100644 src/app/helpers/admin/provider_accounts_helper.rb create mode 100644 src/app/views/admin/provider_accounts/_aws.haml create mode 100644 src/app/views/admin/provider_accounts/_gogrid.haml create mode 100644 src/app/views/admin/provider_accounts/_opennebula.haml create mode 100644 src/app/views/admin/provider_accounts/_provider_selection.haml create mode 100644 src/app/views/admin/provider_accounts/_rackspace.haml create mode 100644 src/app/views/admin/provider_accounts/_rhevm.haml
diff --git a/src/app/controllers/admin/provider_accounts_controller.rb b/src/app/controllers/admin/provider_accounts_controller.rb index e5d3ccd..41319e9 100644 --- a/src/app/controllers/admin/provider_accounts_controller.rb +++ b/src/app/controllers/admin/provider_accounts_controller.rb @@ -17,12 +17,8 @@ class Admin::ProviderAccountsController < ApplicationController
def show @tab_captions = ['Properties', 'Credentials', 'History', 'Permissions'] -<<<<<<< HEAD - @account = CloudAccount.find(params[:id]) - require_privilege(Privilege::VIEW, @account) -======= @account = ProviderAccount.find(params[:id]) ->>>>>>> Rename CloudAccount to ProviderAccount + require_privilege(Privilege::VIEW, @account) @details_tab = params[:details_tab].blank? ? 'properties' : params[:details_tab]
if params.delete :test_account @@ -42,17 +38,18 @@ class Admin::ProviderAccountsController < ApplicationController end
def new - @cloud_account = ProviderAccount.new + @provider_account = ProviderAccount.new @quota = Quota.new @providers = Provider.all + @selected_provider = @providers.first unless @providers.blank? end
def create - @provider = Provider.find(params[:provider_id]) - require_privilege(Privilege::CREATE, CloudAccount, @provider) + @provider = Provider.find(params[:select_provider]) + require_privilege(Privilege::CREATE, ProviderAccount, @provider)
@providers = Provider.all - @cloud_account = ProviderAccount.new(params[:cloud_account]) + @cloud_account = ProviderAccount.new(params[:provider_account]) @cloud_account.provider = @provider @cloud_account.quota = @quota = Quota.new
@@ -123,6 +120,23 @@ class Admin::ProviderAccountsController < ApplicationController redirect_to admin_provider_accounts_url end
+ def set_selected_provider + @quota = Quota.new + @provider_account = ProviderAccount.new + respond_to do |format| + format.js { + @providers = Provider.find(:all) + @selected_provider = Provider.find(params[:select_provider]) + render :partial => 'provider_selection' + } + format.html { + @providers = Provider.find(:all) + @selected_provider = Provider.find(params[:select_provider]) + render :action => 'new', :layout => true + } + end + end + protected
def test_account(account) diff --git a/src/app/controllers/admin/providers_controller.rb b/src/app/controllers/admin/providers_controller.rb index f06f354..aaa6c07 100644 --- a/src/app/controllers/admin/providers_controller.rb +++ b/src/app/controllers/admin/providers_controller.rb @@ -52,7 +52,7 @@ class Admin::ProvidersController < ApplicationController test_connection(@provider) render :action => 'new' else - @provider.set_cloud_type! + #@provider.set_cloud_type! if @provider.save && @provider.populate_hardware_profiles flash[:notice] = "Provider added." redirect_to admin_providers_path diff --git a/src/app/helpers/admin/provider_accounts_helper.rb b/src/app/helpers/admin/provider_accounts_helper.rb new file mode 100644 index 0000000..8e73a04 --- /dev/null +++ b/src/app/helpers/admin/provider_accounts_helper.rb @@ -0,0 +1,21 @@ +module Admin::ProviderAccountsHelper + + def display_provider_account_login_form(cloud_type) + case cloud_type + when 0 + render :partial => "mock" + when 1 + render :partial => "aws" + when 2 + render :partial => "gogrid" + when 3 + render :partial => "rackspace" + when 4 + render :partial => "rhevm" + when 5 + render :partial => "opennebula" + else + flash.now[:warning] = "You don't have any provider yet" + end + end +end diff --git a/src/app/models/provider.rb b/src/app/models/provider.rb index 38445be..8539391 100644 --- a/src/app/models/provider.rb +++ b/src/app/models/provider.rb @@ -67,10 +67,10 @@ class Provider < ActiveRecord::Base return self.errors.empty? end
- def set_cloud_type! - deltacloud = connect - self.cloud_type = deltacloud.driver_name unless deltacloud.nil? - end +# def set_cloud_type! +# deltacloud = connect +# self.cloud_type = deltacloud.driver_name unless deltacloud.nil? +# end
def connect begin diff --git a/src/app/views/admin/provider_accounts/_aws.haml b/src/app/views/admin/provider_accounts/_aws.haml new file mode 100644 index 0000000..0d4ffb4 --- /dev/null +++ b/src/app/views/admin/provider_accounts/_aws.haml @@ -0,0 +1,39 @@ +%fieldset.nomargin.clearfix + = label_tag "Account name:" + = text_field :provider_account, :label + = label_tag "Username" + = text_field :provider_account, :username + = label_tag "Password" + = password_field :provider_account, :password + = label_tag "Quota" + = text_field :quota, :maximum_running_instances, :title => t('cloud_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +%fieldset.nomargin.clearfix + .grid_3.prefix_10.alpha.omega + ( + %button.linkbutton.nospace{ :type => 'button', :onclick => "set_unlimited_quota("quota_instances");" }<> + = t('cloud_accounts.form.unlimited_quota') + ) + +%fieldset.clearfix.nomargin + %label.grid_4.la.alpha + = t('cloud_accounts.form.account_number') + %span.required * + = text_field_tag :account_number + %label.grid_3.la + = t('cloud_accounts.form.account_private_cert') + %span.required * + = file_field :x509_cert_priv_file, :title => t('cloud_accounts.form.account_private_cert') + %label.grid_3.la + = t('cloud_accounts.form.account_public_cert') + %span.required * + = file_field :x509_cert_pub_file, :title => t('cloud_accounts.form.account_public_cert') + .grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('cloud_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('cloud_accounts.form.test_account') + ) + +:javascript + function set_unlimited_quota(elem_id) { + $("#" + elem_id)[0].value = "unlimited"; + } diff --git a/src/app/views/admin/provider_accounts/_gogrid.haml b/src/app/views/admin/provider_accounts/_gogrid.haml new file mode 100644 index 0000000..65b5998 --- /dev/null +++ b/src/app/views/admin/provider_accounts/_gogrid.haml @@ -0,0 +1,16 @@ +%fieldset.clear + = label_tag "Account name:" + = text_field :provider_account, :label +%fieldset.clear + = label_tag :username, "API Key:" + = text_field :provider_account,:username +%fieldset.clear + = label_tag :password, "Secret:" + = password_field :provider_account,:password + = label_tag "Quota" + = text_field :quota, :maximum_running_instances, :title => t('cloud_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +.grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('cloud_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('cloud_accounts.form.test_account') + ) diff --git a/src/app/views/admin/provider_accounts/_opennebula.haml b/src/app/views/admin/provider_accounts/_opennebula.haml new file mode 100644 index 0000000..e04902e --- /dev/null +++ b/src/app/views/admin/provider_accounts/_opennebula.haml @@ -0,0 +1,16 @@ +%fieldset.clear + = label_tag "Account name:" + = text_field :provider_account, :label +%fieldset.clear + = label_tag :username, "API Key:" + = text_field :provider_account, :username +%fieldset.clear + = label_tag :password, "Secret:" + = password_field :provider_account, :password + = label_tag "Quota" + = text_field :quota, :maximum_running_instances, :title => t('cloud_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +.grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('cloud_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('cloud_accounts.form.test_account') + ) diff --git a/src/app/views/admin/provider_accounts/_provider_selection.haml b/src/app/views/admin/provider_accounts/_provider_selection.haml new file mode 100644 index 0000000..334f314 --- /dev/null +++ b/src/app/views/admin/provider_accounts/_provider_selection.haml @@ -0,0 +1,24 @@ +%fieldset#cloud_type.clear + = select_tag ("select_provider", options_for_select(@providers.map{ |p| [p.name, p.id] }, :selected => @selected_provider.id)) + = restful_submit_tag "Choose", 'set_selected_provider',set_selected_provider_admin_provider_accounts_path, 'GET', :class => 'button' + = label_tag "Cloud type: " + = t(Provider::PROVIDERS[@selected_provider.cloud_type]) + = display_provider_account_login_form(@selected_provider.cloud_type) + %fieldset.clearfix + .grid_13.alpha.omega + = submit_tag t(:add), :class => "ra nomargin dialogbutton" + +:javascript + $(document).ready(function(){ + var selected_provider; + $("#select_provider").change(function() + { + selected_provider = $("option:selected").attr('value'); + $.get("#{set_selected_provider_admin_provider_accounts_url}", {select_provider:selected_provider}, + function(result) { + $("#cloud_type").html(result); + } + ); + + }); + }); diff --git a/src/app/views/admin/provider_accounts/_rackspace.haml b/src/app/views/admin/provider_accounts/_rackspace.haml new file mode 100644 index 0000000..c13672c --- /dev/null +++ b/src/app/views/admin/provider_accounts/_rackspace.haml @@ -0,0 +1,16 @@ +%fieldset.clear + = label_tag "Account name:" + = text_field :provider_account, :label +%fieldset.clear + = label_tag:username, "API Key:" + = text_field :provider_account, :username +%fieldset.clear + = label_tag :password, "Secret:" + = password_field :provider_account, :password + = label_tag "Quota" + = text_field :quota, :maximum_running_instances, :title => t('cloud_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +.grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('cloud_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('cloud_accounts.form.test_account') + ) diff --git a/src/app/views/admin/provider_accounts/_rhevm.haml b/src/app/views/admin/provider_accounts/_rhevm.haml new file mode 100644 index 0000000..dd86c72 --- /dev/null +++ b/src/app/views/admin/provider_accounts/_rhevm.haml @@ -0,0 +1,2 @@ +%fieldset.clear + Login form for RHEV-M (not implemented yet) diff --git a/src/app/views/admin/provider_accounts/new.haml b/src/app/views/admin/provider_accounts/new.haml index e567bce..4b45ac1 100644 --- a/src/app/views/admin/provider_accounts/new.haml +++ b/src/app/views/admin/provider_accounts/new.haml @@ -1,16 +1,13 @@ #details.grid_13 %h2 = t('cloud_accounts.new.new_provider_account') - - form_for @cloud_account, :url => admin_provider_accounts_path, :html => { :multipart => true } do |f| %label{ :for => :provider_id } Provider - = select_tag :provider_id, options_for_select(@providers.map{ |p| [p.name, p.id] }) - = render :partial => 'form', :locals => { :f => f } - %fieldset.clearfix - .grid_13.alpha.omega - = submit_tag t(:add), :class => "ra nomargin dialogbutton" - %section - %p.requirement - %span.required * - - - = t('cloud_accounts.new.required_field') + %fieldset.clear + - form_tag (admin_provider_accounts_path, :multipart => true) do + = render :partial => 'provider_selection' + %section + %p.requirement + %span.required * + - + = t('cloud_accounts.new.required_field') diff --git a/src/app/views/layouts/newui.haml b/src/app/views/layouts/newui.haml index 681f607..1f8c7d0 100644 --- a/src/app/views/layouts/newui.haml +++ b/src/app/views/layouts/newui.haml @@ -5,7 +5,6 @@ %title Red Hat Cloud Engine = yield :title - = stylesheet_link_tag 'facebox' = stylesheet_link_tag 'jquery.ui-1.8.1/jquery-ui-1.8.1.custom.css' = stylesheet_link_tag 'jquery.loadmask' diff --git a/src/config/routes.rb b/src/config/routes.rb index 82c624a..5db5a08 100644 --- a/src/config/routes.rb +++ b/src/config/routes.rb @@ -50,7 +50,8 @@ ActionController::Routing::Routes.draw do |map| r.resources :hardware_profiles, :collection => { :multi_destroy => :delete } r.resources :providers, :collection => { :multi_destroy => :delete } r.resources :users, :collection => { :multi_destroy => :delete } - r.resources :provider_accounts, :collection => { :multi_destroy => :delete } + r.resources :provider_accounts, :collection => { :multi_destroy => :delete, :set_selected_provider => :get} + r.resources :roles, :collection => { :multi_destroy => :delete } r.resources :settings, :collection => { :self_service => :get, :general_settings => :get } r.resources :pool_families, :collection => { :multi_destroy => :delete }
On 01/27/2011 10:43 AM, jzigmund@redhat.com wrote:
From: Jozef Zigmundjzigmund@redhat.com
.../admin/provider_accounts_controller.rb | 32 ++++++++++++----- src/app/controllers/admin/providers_controller.rb | 2 +- src/app/helpers/admin/provider_accounts_helper.rb | 21 +++++++++++ src/app/models/provider.rb | 8 ++-- src/app/views/admin/provider_accounts/_aws.haml | 39 ++++++++++++++++++++ src/app/views/admin/provider_accounts/_gogrid.haml | 16 ++++++++ .../views/admin/provider_accounts/_opennebula.haml | 16 ++++++++ .../provider_accounts/_provider_selection.haml | 24 ++++++++++++ .../views/admin/provider_accounts/_rackspace.haml | 16 ++++++++ src/app/views/admin/provider_accounts/_rhevm.haml | 2 + src/app/views/admin/provider_accounts/new.haml | 19 ++++------ src/app/views/layouts/newui.haml | 1 - src/config/routes.rb | 3 +- 13 files changed, 172 insertions(+), 27 deletions(-) create mode 100644 src/app/helpers/admin/provider_accounts_helper.rb create mode 100644 src/app/views/admin/provider_accounts/_aws.haml create mode 100644 src/app/views/admin/provider_accounts/_gogrid.haml create mode 100644 src/app/views/admin/provider_accounts/_opennebula.haml create mode 100644 src/app/views/admin/provider_accounts/_provider_selection.haml create mode 100644 src/app/views/admin/provider_accounts/_rackspace.haml create mode 100644 src/app/views/admin/provider_accounts/_rhevm.haml
diff --git a/src/app/controllers/admin/provider_accounts_controller.rb b/src/app/controllers/admin/provider_accounts_controller.rb index e5d3ccd..41319e9 100644 --- a/src/app/controllers/admin/provider_accounts_controller.rb +++ b/src/app/controllers/admin/provider_accounts_controller.rb @@ -17,12 +17,8 @@ class Admin::ProviderAccountsController< ApplicationController
def show @tab_captions = ['Properties', 'Credentials', 'History', 'Permissions']
-<<<<<<< HEAD
- @account = CloudAccount.find(params[:id])
- require_privilege(Privilege::VIEW, @account)
-======= @account = ProviderAccount.find(params[:id]) ->>>>>>> Rename CloudAccount to ProviderAccount
- require_privilege(Privilege::VIEW, @account)
This is a merge conflict -- it looks similar to the one in the first patch -- again we just need to set @account and then run the require_privilege call
@details_tab = params[:details_tab].blank? ? 'properties' : params[:details_tab] if params.delete :test_account
diff --git a/src/app/controllers/admin/providers_controller.rb b/src/app/controllers/admin/providers_controller.rb index f06f354..aaa6c07 100644 --- a/src/app/controllers/admin/providers_controller.rb +++ b/src/app/controllers/admin/providers_controller.rb @@ -52,7 +52,7 @@ class Admin::ProvidersController< ApplicationController test_connection(@provider) render :action => 'new' else
@provider.set_cloud_type!
#@provider.set_cloud_type!
Why is this commented out? Does it need to be fixed, or is it safe to just remove it here?
if @provider.save&& @provider.populate_hardware_profiles flash[:notice] = "Provider added." redirect_to admin_providers_path
diff --git a/src/app/models/provider.rb b/src/app/models/provider.rb index 38445be..8539391 100644 --- a/src/app/models/provider.rb +++ b/src/app/models/provider.rb @@ -67,10 +67,10 @@ class Provider< ActiveRecord::Base return self.errors.empty? end
- def set_cloud_type!
- deltacloud = connect
- self.cloud_type = deltacloud.driver_name unless deltacloud.nil?
- end
+# def set_cloud_type! +# deltacloud = connect +# self.cloud_type = deltacloud.driver_name unless deltacloud.nil? +# end
Same question here on commented code.
From: Jozef Zigmund jzigmund@redhat.com
I fixed all Rspecs and Cucumbers for provider_account model. Also I fixed some forgotten renamings. It was needed change some attributes in migrations. --- .../admin/provider_accounts_controller.rb | 53 ++++++------ .../controllers/provider_accounts_controller.rb | 62 +++++++------- src/app/models/image.rb | 2 +- src/app/models/provider.rb | 11 ++- src/app/models/provider_account.rb | 8 +- src/app/views/admin/provider_accounts/_mock.haml | 16 ++++ .../provider_accounts/_provider_selection.haml | 2 +- src/app/views/admin/provider_accounts/new.haml | 3 +- src/app/views/admin/providers/_form.haml | 2 +- src/app/views/builds/new.haml | 6 +- src/db/development_structure.sql | 89 ++++++++++++++++++++ ...824_rename_cloud_account_to_provider_account.rb | 3 +- ...737_rename_cloud_accout_id_for_instance_keys.rb | 9 ++ ...123410_rename_cloud_account_id_for_instances.rb | 9 ++ ..._families_to_provider_accounts_pool_families.rb | 11 +++ ...l_properties_of_columns_in_provider_accounts.rb | 13 +++ src/features/provider.feature | 7 +- src/features/provider_account.feature | 20 ++--- .../step_definitions/provider_account_steps.rb | 2 +- src/features/step_definitions/provider_steps.rb | 6 +- src/features/step_definitions/template_steps.rb | 8 +- src/features/template.feature | 14 ++-- src/spec/controllers/builds_controller_spec.rb | 6 +- .../provider_accounts_controller_spec.rb | 32 ++++---- src/spec/factories/instance.rb | 4 +- src/spec/factories/provider.rb | 8 +- src/spec/factories/provider_account.rb | 4 +- src/spec/models/image_spec.rb | 6 +- src/spec/models/instance_observer_spec.rb | 20 ++-- src/spec/models/instance_spec.rb | 14 +-- src/spec/models/pool_family_spec.rb | 8 +- src/spec/models/provider_account_spec.rb | 46 +++++----- src/spec/models/provider_spec.rb | 2 +- src/spec/models/quota_spec.rb | 48 +++++----- .../services/data_service_active_record_spec.rb | 58 +++++++------- 35 files changed, 382 insertions(+), 230 deletions(-) create mode 100644 src/app/views/admin/provider_accounts/_mock.haml create mode 100644 src/db/development_structure.sql create mode 100644 src/db/migrate/20110125122737_rename_cloud_accout_id_for_instance_keys.rb create mode 100644 src/db/migrate/20110125123410_rename_cloud_account_id_for_instances.rb create mode 100644 src/db/migrate/20110125154113_rename_cloud_accounts_pool_families_to_provider_accounts_pool_families.rb create mode 100644 src/db/migrate/20110126161751_change_null_properties_of_columns_in_provider_accounts.rb
diff --git a/src/app/controllers/admin/provider_accounts_controller.rb b/src/app/controllers/admin/provider_accounts_controller.rb index 41319e9..44d3fc6 100644 --- a/src/app/controllers/admin/provider_accounts_controller.rb +++ b/src/app/controllers/admin/provider_accounts_controller.rb @@ -45,65 +45,66 @@ class Admin::ProviderAccountsController < ApplicationController end
def create - @provider = Provider.find(params[:select_provider]) + @selected_provider = @provider = Provider.find(params[:select_provider]) require_privilege(Privilege::CREATE, ProviderAccount, @provider)
@providers = Provider.all - @cloud_account = ProviderAccount.new(params[:provider_account]) - @cloud_account.provider = @provider - @cloud_account.quota = @quota = Quota.new + @provider_account = ProviderAccount.new(params[:provider_account]) + @provider_account.provider = @provider + @provider_account.quota = @quota = Quota.new
if params.delete :test_account - test_account(@cloud_account) + test_account(@provider_account) render :action => 'new' and return end
limit = params[:quota][:maximum_running_instances] if params[:quota] - @cloud_account.quota.set_maximum_running_instances(limit) + @provider_account.quota.set_maximum_running_instances(limit)
- if @cloud_account.invalid? - if not @cloud_account.valid_credentials? + if @provider_account.invalid? + if not @provider_account.valid_credentials? flash.now[:error] = "The entered credential information is incorrect" - elsif @cloud_account.errors.on(:username) - flash.now[:error] = "The access key '#{params[:cloud_account][:username]}' has already been taken." + elsif @provider_account.errors.on(:username) + flash.now[:error] = "The access key '#{params[:provider_account][:username]}' has already been taken." else flash.now[:error] = "You must fill in all the required fields" end render :action => 'new' and return end
- @cloud_account.pool_families << PoolFamily.default - @cloud_account.save! - if @cloud_account.populate_realms + @provider_account.pool_families << PoolFamily.default + @provider_account.save! + if @provider_account.populate_realms flash[:notice] = "Provider account added." end - redirect_to admin_provider_account_path(@cloud_account) + redirect_to admin_provider_account_path(@provider_account) kick_condor end
def edit - @cloud_account = ProviderAccount.find(params[:id]) - @quota = @cloud_account.quota - @provider = @cloud_account.provider - require_privilege(Privilege::MODIFY,@cloud_account) + @provider_account = ProviderAccount.find(params[:id]) + @quota = @provider_account.quota + @provider = @provider_account.provider + require_privilege(Privilege::MODIFY,@provider_account) end
def update - @cloud_account = ProviderAccount.find(params[:id]) - @provider = @cloud_account.provider - require_privilege(Privilege::MODIFY,@cloud_account) - @quota = @cloud_account.quota + @provider_account = ProviderAccount.find(params[:id]) + @provider = @provider_account.provider + require_privilege(Privilege::ACCOUNT_MODIFY, @provider) + require_privilege(Privilege::MODIFY,@provider_account) + @quota = @provider_account.quota
if params.delete :test_account - test_account(@cloud_account) + test_account(@provider_account) render :action => 'edit' and return end
limit = params[:quota][:maximum_running_instances] if params[:quota] - @cloud_account.quota.set_maximum_running_instances(limit) - if @cloud_account.update_attributes(params[:cloud_account]) + @provider_account.quota.set_maximum_running_instances(limit) + if @provider_account.update_attributes(params[:provider_account]) flash[:notice] = "Cloud Account updated!" - redirect_to admin_provider_account_path(@cloud_account) + redirect_to admin_provider_account_path(@provider_account) else render :action => :edit end diff --git a/src/app/controllers/provider_accounts_controller.rb b/src/app/controllers/provider_accounts_controller.rb index a902150..99ca85d 100644 --- a/src/app/controllers/provider_accounts_controller.rb +++ b/src/app/controllers/provider_accounts_controller.rb @@ -36,7 +36,7 @@ class ProviderAccountsController < ApplicationController
def new @provider = Provider.find(params[:provider_id]) - @cloud_account = ProviderAccount.new + @provider_account = ProviderAccount.new @quota = Quota.new require_privilege(Privilege::CREATE, CloudAccount, @provider) end @@ -44,32 +44,32 @@ class ProviderAccountsController < ApplicationController def create @provider = Provider.find(params[:provider_id]) require_privilege(Privilege::CREATE, ProviderAccount, @provider) - @cloud_account = ProviderAccount.new(params[:cloud_account]) - @cloud_account.provider = @provider - @cloud_account.quota = @quota = Quota.new + @provider_account = ProviderAccount.new(params[:provider_account]) + @provider_account.provider = @provider + @provider_account.quota = @quota = Quota.new
if params[:test_account] - test_account(@cloud_account) + test_account(@provider_account) render :action => 'new' and return end
limit = params[:quota][:maximum_running_instances] if params[:quota] - @cloud_account.quota.set_maximum_running_instances(limit) + @provider_account.quota.set_maximum_running_instances(limit)
- if @cloud_account.invalid? - if not @cloud_account.valid_credentials? + if @provider_account.invalid? + if not @provider_account.valid_credentials? flash.now[:error] = "The entered credential information is incorrect" - elsif @cloud_account.errors.on(:username) - flash.now[:error] = "The access key '#{params[:cloud_account][:username]}' has already been taken." + elsif @provider_account.errors.on(:username) + flash.now[:error] = "The access key '#{params[:provider_account][:username]}' has already been taken." else flash.now[:error] = "You must fill in all the required fields" end render :action => 'new' and return end
- @cloud_account.pool_families << PoolFamily.default - @cloud_account.save! - if @cloud_account.populate_realms + @provider_account.pool_families << PoolFamily.default + @provider_account.save! + if @provider_account.populate_realms flash[:notice] = "Provider account added." end redirect_to provider_accounts_path(@provider) @@ -77,10 +77,10 @@ class ProviderAccountsController < ApplicationController end
def edit - @cloud_account = ProviderAccount.find(params[:id]) - @quota = @cloud_account.quota - @provider = @cloud_account.provider - require_privilege(Privilege::MODIFY, @cloud_account) + @provider_account = ProviderAccount.find(params[:id]) + @quota = @provider_account.quota + @provider = @provider_account.provider + require_privilege(Privilege::MODIFY, @provider_account) end
def update_accounts @@ -89,15 +89,15 @@ class ProviderAccountsController < ApplicationController @providers = Provider.list_for_user(@current_user, Privilege::VIEW)
success = true - @provider.provider_accounts.each do |cloud_account| - attributes = params[:cloud_accounts][cloud_account.id.to_s] + @provider.provider_accounts.each do |provider_account| + attributes = params[:provider_accounts][provider_account.id.to_s]
password = attributes[:password] # blank password means the user didn't change it -- don't update it then if password.blank? attributes.delete :password end - cloud_account.quota.maximum_running_instances = quota_from_string(params[:quota][cloud_account.id.to_s][:maximum_running_instances]) + provider_account.quota.maximum_running_instances = quota_from_string(params[:quota][provider_account.id.to_s][:maximum_running_instances])
private_cert = attributes[:x509_cert_priv_file] unless private_cert.blank? @@ -112,8 +112,8 @@ class ProviderAccountsController < ApplicationController attributes.delete :x509_cert_pub_file
begin - cloud_account.update_attributes!(attributes) - cloud_account.quota.save! + provider_account.update_attributes!(attributes) + provider_account.quota.save! rescue success = false end @@ -128,14 +128,14 @@ class ProviderAccountsController < ApplicationController end
def update - @cloud_account = ProviderAccount.find(params[:id]) - @provider = @cloud_account.provider - require_privilege(Privilege::MODIFY, @cloud_account) - @quota = @cloud_account.quota + @provider_account = ProviderAccount.find(params[:id]) + @provider = @provider_account.provider + require_privilege(Privilege::MODIFY, @provider_account) + @quota = @provider_account.quota
limit = params[:quota][:maximum_running_instances] if params[:quota] - @cloud_account.quota.set_maximum_running_instances(limit) - if @cloud_account.update_attributes(params[:cloud_account]) + @provider_account.quota.set_maximum_running_instances(limit) + if @provider_account.update_attributes(params[:provider_account]) flash[:notice] = "Cloud Account updated!" redirect_to provider_accounts_path(@provider) else @@ -144,10 +144,10 @@ class ProviderAccountsController < ApplicationController end
def key - @cloud_account = ProviderAccount.find(params[:id]) + @provider_account = ProviderAccount.find(params[:id]) require_privilege(Privilege::MODIFY,@provider_account) - unless @cloud_account.instance_key.nil? - render :text => @cloud_account.instance_key.pem + unless @provider_account.instance_key.nil? + render :text => @provider_account.instance_key.pem end end
diff --git a/src/app/models/image.rb b/src/app/models/image.rb index 0852016..5dd0bbb 100644 --- a/src/app/models/image.rb +++ b/src/app/models/image.rb @@ -52,7 +52,7 @@ class Image < ActiveRecord::Base INACTIVE_STATES = [STATE_COMPLETE, STATE_FAILED, STATE_CANCELED]
def self.available_targets - return YAML.load_file("#{RAILS_ROOT}/config/image_descriptor_targets.yml") + Provider::PROVIDERS.invert end
def generate_uuid diff --git a/src/app/models/provider.rb b/src/app/models/provider.rb index 8539391..37d7026 100644 --- a/src/app/models/provider.rb +++ b/src/app/models/provider.rb @@ -29,7 +29,16 @@ class Provider < ActiveRecord::Base require 'util/deltacloud' include PermissionedObject
- PROVIDERS = { 0 => "mock", 1 => "AWS", 2 => "GoGrid" , 3 => "Rackspace", 4 => "RHEVM", 5 => "OpenNebula" } + MOCK = 0 + AWS = 1 + GOGRID = 2 + RACKSPACE = 3 + RHEVM = 4 + OPENNEBULA = 5 + + PROVIDERS = { MOCK => "mock", AWS => "AWS", + GOGRID => "GoGrid", RACKSPACE => "Rackspace", RHEVM => "RHEVM", + OPENNEBULA => "OpenNebula" }
has_many :provider_accounts, :dependent => :destroy has_many :hardware_profiles, :dependent => :destroy diff --git a/src/app/models/provider_account.rb b/src/app/models/provider_account.rb index 6ec1311..38958fd 100644 --- a/src/app/models/provider_account.rb +++ b/src/app/models/provider_account.rb @@ -50,15 +50,17 @@ class ProviderAccount < ActiveRecord::Base validates_presence_of :username validates_uniqueness_of :username, :scope => :provider_id validates_presence_of :password - validates_presence_of :account_number + validates_presence_of :account_number,:if => Proc.new{ |account| account.provider.cloud_type == Provider::AWS} validate :validate_presence_of_x509_certs validate :validate_credentials
# We're using this instead of <tt>validates_presence_of</tt> helper because # we want to show errors on different attributes ending with '_file'. def validate_presence_of_x509_certs - errors.add(:x509_cert_pub_file, "can't be blank") if x509_cert_pub.blank? - errors.add(:x509_cert_priv_file, "can't be blank") if x509_cert_priv.blank? + if self.provider.cloud_type == Provider::AWS + errors.add(:x509_cert_pub_file, "can't be blank") if x509_cert_pub.blank? + errors.add(:x509_cert_priv_file, "can't be blank") if x509_cert_priv.blank? + end end
def validate_credentials diff --git a/src/app/views/admin/provider_accounts/_mock.haml b/src/app/views/admin/provider_accounts/_mock.haml new file mode 100644 index 0000000..65b5998 --- /dev/null +++ b/src/app/views/admin/provider_accounts/_mock.haml @@ -0,0 +1,16 @@ +%fieldset.clear + = label_tag "Account name:" + = text_field :provider_account, :label +%fieldset.clear + = label_tag :username, "API Key:" + = text_field :provider_account,:username +%fieldset.clear + = label_tag :password, "Secret:" + = password_field :provider_account,:password + = label_tag "Quota" + = text_field :quota, :maximum_running_instances, :title => t('cloud_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +.grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('cloud_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('cloud_accounts.form.test_account') + ) diff --git a/src/app/views/admin/provider_accounts/_provider_selection.haml b/src/app/views/admin/provider_accounts/_provider_selection.haml index 334f314..f767896 100644 --- a/src/app/views/admin/provider_accounts/_provider_selection.haml +++ b/src/app/views/admin/provider_accounts/_provider_selection.haml @@ -1,5 +1,5 @@ %fieldset#cloud_type.clear - = select_tag ("select_provider", options_for_select(@providers.map{ |p| [p.name, p.id] }, :selected => @selected_provider.id)) + = select_tag("select_provider", options_for_select(@providers.map{ |p| [p.name, p.id] }, :selected => @selected_provider.id)) = restful_submit_tag "Choose", 'set_selected_provider',set_selected_provider_admin_provider_accounts_path, 'GET', :class => 'button' = label_tag "Cloud type: " = t(Provider::PROVIDERS[@selected_provider.cloud_type]) diff --git a/src/app/views/admin/provider_accounts/new.haml b/src/app/views/admin/provider_accounts/new.haml index 4b45ac1..ef369db 100644 --- a/src/app/views/admin/provider_accounts/new.haml +++ b/src/app/views/admin/provider_accounts/new.haml @@ -1,10 +1,11 @@ #details.grid_13 + = error_messages_for :provider_account %h2 = t('cloud_accounts.new.new_provider_account') %label{ :for => :provider_id } Provider %fieldset.clear - - form_tag (admin_provider_accounts_path, :multipart => true) do + - form_tag(admin_provider_accounts_path, :multipart => true) do = render :partial => 'provider_selection' %section %p.requirement diff --git a/src/app/views/admin/providers/_form.haml b/src/app/views/admin/providers/_form.haml index c980c0a..d262c53 100644 --- a/src/app/views/admin/providers/_form.haml +++ b/src/app/views/admin/providers/_form.haml @@ -13,7 +13,7 @@ ) %fieldset.clear = form.label :cloud_type - = form.select (:cloud_type, Provider::PROVIDERS.collect {|id, cloud_type| [t(cloud_type),id] }, :prompt => "Select type of provider") + = form.select(:cloud_type, Provider::PROVIDERS.collect {|id, cloud_type| [t(cloud_type),id] }, :prompt => "Select type of provider")
%fieldset.clear = form.submit "Save", :class => "submit formbutton" diff --git a/src/app/views/builds/new.haml b/src/app/views/builds/new.haml index 2cb159e..68f78ce 100644 --- a/src/app/views/builds/new.haml +++ b/src/app/views/builds/new.haml @@ -46,10 +46,10 @@ %label Choose Provider Format: %section.clearfix.gap %ul.block - - @all_targets.each do |target_id, target| + - @all_targets.each do |target, target_id| %li - = check_box_tag 'targets[]', target_id, false, :id => target_id - = label_tag target_id, target['name'] + = check_box_tag 'targets[]', target_id, false, :id => target + = label_tag target
= submit_tag "Submit to Build", :name => "build" = submit_tag "Cancel", :name => "cancel" diff --git a/src/db/development_structure.sql b/src/db/development_structure.sql new file mode 100644 index 0000000..5f9b7d0 --- /dev/null +++ b/src/db/development_structure.sql @@ -0,0 +1,89 @@ +CREATE TABLE "base_permission_objects" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255) NOT NULL, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "cloud_accounts_pool_families" ("cloud_account_id" integer NOT NULL, "pool_family_id" integer NOT NULL); +CREATE TABLE "deployables" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "created_at" datetime, "updated_at" datetime); +CREATE TABLE "hardware_profile_map" ("aggregator_hardware_profile_id" integer, "provider_hardware_profile_id" integer); +CREATE TABLE "hardware_profile_properties" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255) NOT NULL, "kind" varchar(255) NOT NULL, "unit" varchar(255) NOT NULL, "value" varchar(255) NOT NULL, "range_first" varchar(255), "range_last" varchar(255), "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "hardware_profiles" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "external_key" varchar(255) NOT NULL, "name" varchar(1024) NOT NULL, "memory_id" integer, "storage_id" integer, "cpu_id" integer, "architecture_id" integer, "provider_id" integer, "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "images" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "uuid" varchar(255), "name" varchar(255) NOT NULL, "build_id" varchar(255), "uri" varchar(255), "status" varchar(255), "target" varchar(255), "template_id" integer, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "instance_events" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "instance_id" integer NOT NULL, "event_type" varchar(255) NOT NULL, "event_time" datetime, "status" varchar(255), "message" varchar(255), "created_at" datetime, "updated_at" datetime); +CREATE TABLE "instance_hwps" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "memory" varchar(255), "cpu" varchar(255), "architecture" varchar(255), "storage" varchar(255), "lock_version" integer DEFAULT 0); +CREATE TABLE "instance_keys" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "provider_account_id" integer NOT NULL, "name" varchar(255) NOT NULL, "pem" text, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "instances" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "external_key" varchar(255), "name" varchar(1024) NOT NULL, "hardware_profile_id" integer NOT NULL, "template_id" integer NOT NULL, "realm_id" integer, "owner_id" integer, "pool_id" integer NOT NULL, "provider_account_id" integer, "instance_hwp_id" integer, "public_addresses" varchar(255), "private_addresses" varchar(255), "state" varchar(255), "condor_job_id" varchar(255), "last_error" text(255), "instance_key_id" integer, "lock_version" integer DEFAULT 0, "acc_pending_time" integer DEFAULT 0, "acc_running_time" integer DEFAULT 0, "acc_shutting_down_time" integer DEFAULT 0, "acc_stopped_time" integer DEFAULT 0, "time_last_pending" datetime, "time_last_running" datetime, "time_last_shutting_down" datetime, "time_last_stopped" datetime, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "metadata_objects" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "key" varchar(255) NOT NULL, "value" varchar(255) NOT NULL, "object_type" varchar(255), "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "permissions" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "role_id" integer NOT NULL, "user_id" integer NOT NULL, "permission_object_id" integer, "permission_object_type" varchar(255), "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "pool_families" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255) NOT NULL, "description" varchar(255), "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "pools" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255) NOT NULL, "exported_as" varchar(255), "quota_id" integer, "pool_family_id" integer NOT NULL, "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "privileges" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255) NOT NULL, "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "privileges_roles" ("privilege_id" integer NOT NULL, "role_id" integer NOT NULL); +CREATE TABLE "property_enum_entries" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "hardware_profile_property_id" integer NOT NULL, "value" varchar(255) NOT NULL, "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "provider_accounts" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "label" varchar(255) NOT NULL, "username" varchar(255) NOT NULL, "password" varchar(255) NOT NULL, "provider_id" integer NOT NULL, "quota_id" integer, "lock_version" integer DEFAULT 0, "account_number" varchar(255) NOT NULL, "x509_cert_priv" text NOT NULL, "x509_cert_pub" text NOT NULL, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "providers" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255) NOT NULL, "cloud_type" integer(255) NOT NULL, "url" varchar(255) NOT NULL, "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "quotas" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "running_instances" integer DEFAULT 0, "total_instances" integer DEFAULT 0, "maximum_running_instances" integer, "maximum_total_instances" integer, "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "realm_map" ("frontend_realm_id" integer, "backend_realm_id" integer); +CREATE TABLE "realms" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "external_key" varchar(255) NOT NULL, "name" varchar(1024) NOT NULL, "provider_id" integer, "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "replicated_images" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "image_id" integer NOT NULL, "provider_id" integer NOT NULL, "provider_image_key" varchar(255), "uploaded" boolean DEFAULT 'f', "registered" boolean DEFAULT 'f'); +CREATE TABLE "roles" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255) NOT NULL, "scope" varchar(255) NOT NULL, "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "schema_migrations" ("version" varchar(255) NOT NULL); +CREATE TABLE "sessions" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "session_id" varchar(255) NOT NULL, "data" text, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "tasks" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "user" varchar(255), "type" varchar(255), "action" varchar(255), "state" varchar(255), "task_target_id" integer, "task_target_type" varchar(255), "args" varchar(255), "created_at" datetime, "time_submitted" datetime, "time_started" datetime, "time_ended" datetime, "message" text, "failure_code" varchar(255), "lock_version" integer DEFAULT 0); +CREATE TABLE "templates" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "uuid" varchar(255) NOT NULL, "xml" blob NOT NULL, "uri" varchar(255), "name" varchar(255), "platform" varchar(255), "platform_version" varchar(255), "architecture" varchar(255), "summary" text, "complete" boolean DEFAULT 'f', "uploaded" boolean DEFAULT 'f', "imported" boolean DEFAULT 'f', "images_count" integer, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "login" varchar(255) NOT NULL, "email" varchar(255) NOT NULL, "crypted_password" varchar(255) NOT NULL, "password_salt" varchar(255) NOT NULL, "persistence_token" varchar(255) NOT NULL, "single_access_token" varchar(255) NOT NULL, "perishable_token" varchar(255) NOT NULL, "first_name" varchar(255), "last_name" varchar(255), "quota_id" integer, "login_count" integer DEFAULT 0 NOT NULL, "failed_login_count" integer DEFAULT 0 NOT NULL, "last_request_at" datetime, "current_login_at" datetime, "last_login_at" datetime, "current_login_ip" varchar(255), "last_login_ip" varchar(255), "created_at" datetime, "updated_at" datetime); +CREATE INDEX "index_sessions_on_session_id" ON "sessions" ("session_id"); +CREATE INDEX "index_sessions_on_updated_at" ON "sessions" ("updated_at"); +CREATE INDEX "index_users_on_last_request_at" ON "users" ("last_request_at"); +CREATE INDEX "index_users_on_login" ON "users" ("login"); +CREATE INDEX "index_users_on_persistence_token" ON "users" ("persistence_token"); +CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version"); +INSERT INTO schema_migrations (version) VALUES ('200909011700'); + +INSERT INTO schema_migrations (version) VALUES ('20090731200741'); + +INSERT INTO schema_migrations (version) VALUES ('20090801045212'); + +INSERT INTO schema_migrations (version) VALUES ('20090802000000'); + +INSERT INTO schema_migrations (version) VALUES ('20090803000000'); + +INSERT INTO schema_migrations (version) VALUES ('20090803141507'); + +INSERT INTO schema_migrations (version) VALUES ('20090804135630'); + +INSERT INTO schema_migrations (version) VALUES ('20090804140143'); + +INSERT INTO schema_migrations (version) VALUES ('20090804141600'); + +INSERT INTO schema_migrations (version) VALUES ('20090804142049'); + +INSERT INTO schema_migrations (version) VALUES ('20090831140000'); + +INSERT INTO schema_migrations (version) VALUES ('20090917192602'); + +INSERT INTO schema_migrations (version) VALUES ('20091008153046'); + +INSERT INTO schema_migrations (version) VALUES ('20091008153058'); + +INSERT INTO schema_migrations (version) VALUES ('20091008153106'); + +INSERT INTO schema_migrations (version) VALUES ('20091019215838'); + +INSERT INTO schema_migrations (version) VALUES ('20100707000000'); + +INSERT INTO schema_migrations (version) VALUES ('20100810221250'); + +INSERT INTO schema_migrations (version) VALUES ('20100830150014'); + +INSERT INTO schema_migrations (version) VALUES ('20100902081651'); + +INSERT INTO schema_migrations (version) VALUES ('20101018174458'); + +INSERT INTO schema_migrations (version) VALUES ('20101021172441'); + +INSERT INTO schema_migrations (version) VALUES ('20110103160939'); + +INSERT INTO schema_migrations (version) VALUES ('20110112094108'); + +INSERT INTO schema_migrations (version) VALUES ('20110117140824'); + +INSERT INTO schema_migrations (version) VALUES ('20110125122737'); + +INSERT INTO schema_migrations (version) VALUES ('20110125123410'); \ No newline at end of file diff --git a/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb index 2ccadb4..beaabc5 100644 --- a/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb +++ b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb @@ -5,6 +5,7 @@ class RenameCloudAccountToProviderAccount < ActiveRecord::Migration end
def self.down - drop_table :provider_accounts + change_column (:providers, :cloud_type, :string, :null => false) + rename_table (:provider_accounts, :cloud_accounts) end end diff --git a/src/db/migrate/20110125122737_rename_cloud_accout_id_for_instance_keys.rb b/src/db/migrate/20110125122737_rename_cloud_accout_id_for_instance_keys.rb new file mode 100644 index 0000000..79acc02 --- /dev/null +++ b/src/db/migrate/20110125122737_rename_cloud_accout_id_for_instance_keys.rb @@ -0,0 +1,9 @@ +class RenameCloudAccoutIdForInstanceKeys < ActiveRecord::Migration + def self.up + rename_column :instance_keys, :cloud_account_id, :provider_account_id + end + + def self.down + rename_column :instance_keys, :provider_account_id, :cloud_account_id + end +end diff --git a/src/db/migrate/20110125123410_rename_cloud_account_id_for_instances.rb b/src/db/migrate/20110125123410_rename_cloud_account_id_for_instances.rb new file mode 100644 index 0000000..674fc2d --- /dev/null +++ b/src/db/migrate/20110125123410_rename_cloud_account_id_for_instances.rb @@ -0,0 +1,9 @@ +class RenameCloudAccountIdForInstances < ActiveRecord::Migration + def self.up + rename_column :instances, :cloud_account_id, :provider_account_id + end + + def self.down + rename_column :instances, :provider_account_id, :cloud_account_id + end +end diff --git a/src/db/migrate/20110125154113_rename_cloud_accounts_pool_families_to_provider_accounts_pool_families.rb b/src/db/migrate/20110125154113_rename_cloud_accounts_pool_families_to_provider_accounts_pool_families.rb new file mode 100644 index 0000000..d1ae154 --- /dev/null +++ b/src/db/migrate/20110125154113_rename_cloud_accounts_pool_families_to_provider_accounts_pool_families.rb @@ -0,0 +1,11 @@ +class RenameCloudAccountsPoolFamiliesToProviderAccountsPoolFamilies < ActiveRecord::Migration + def self.up + rename_table :cloud_accounts_pool_families, :pool_families_provider_accounts + rename_column :pool_families_provider_accounts, :cloud_account_id, :provider_account_id + end + + def self.down + rename_column :pool_families_provider_accounts, :provider_account_id, :cloud_account_id + rename_table :pool_families_provider_accounts, :cloud_accounts_pool_families + end +end diff --git a/src/db/migrate/20110126161751_change_null_properties_of_columns_in_provider_accounts.rb b/src/db/migrate/20110126161751_change_null_properties_of_columns_in_provider_accounts.rb new file mode 100644 index 0000000..7e6707e --- /dev/null +++ b/src/db/migrate/20110126161751_change_null_properties_of_columns_in_provider_accounts.rb @@ -0,0 +1,13 @@ +class ChangeNullPropertiesOfColumnsInProviderAccounts < ActiveRecord::Migration + def self.up + change_column :provider_accounts, :account_number, :string, :null => true + change_column :provider_accounts, :x509_cert_priv, :text, :null => true + change_column :provider_accounts, :x509_cert_pub, :text, :null => true + end + + def self.down + change_column :provider_accounts, :account_number, :string, :null => false + change_column :provider_accounts, :x509_cert_priv, :text, :null => false + change_column :provider_accounts, :x509_cert_pub, :text, :null => false + end +end diff --git a/src/features/provider.feature b/src/features/provider.feature index 08704dd..ff9c05b 100644 --- a/src/features/provider.feature +++ b/src/features/provider.feature @@ -35,6 +35,7 @@ Feature: Manage Providers Then I should be on the new admin provider page When I fill in "provider[name]" with "testprovider" And I fill in "provider[url]" with "http://localhost:3001/api" + And I select "Amazon EC2" from "Cloud type" And I press "Save" Then I should be on the admin providers page And I should see "Provider added" @@ -64,14 +65,14 @@ Feature: Manage Providers And this provider has 5 replicated images And this provider has 5 hardware profiles And this provider has a realm - And this provider has a cloud account + And this provider has a provider account When I go to the admin providers page And I check "provider1" provider And I press "Delete" And there should not exist a provider named "provider1" And there should not be any replicated images And there should not be any hardware profiles - And there should not be a cloud account + And there should not be a provider account And there should not be a realm
Scenario: Search for hardware profiles @@ -94,4 +95,4 @@ Feature: Manage Providers And I press "Search" Then I should see "Mock" And I should not see "Test" - And I should not see "Other" \ No newline at end of file + And I should not see "Other" diff --git a/src/features/provider_account.feature b/src/features/provider_account.feature index 964aba2..d4ebd34 100644 --- a/src/features/provider_account.feature +++ b/src/features/provider_account.feature @@ -22,21 +22,17 @@ Feature: Manage Provider Accounts When I follow "New Account" Then I should be on the new admin provider account page And I should see "New Account" - When I select "testprovider" from "provider_id" - And I fill in "cloud_account[label]" with "testaccount" - And I fill in "cloud_account[username]" with "mockuser" - And I fill in "cloud_account[password]" with "mockpassword" + When I select "testprovider" from "select_provider" + And I fill in "provider_account[label]" with "testaccount" + And I fill in "provider_account[username]" with "mockuser" + And I fill in "provider_account[password]" with "mockpassword" And I fill in "quota[maximum_running_instances]" with "13" - And I fill in "cloud_account[account_number]" with "222222" - And I attach the "private.key" file to "cloud_account[x509_cert_priv_file]" - And I attach the "public.key" file to "cloud_account[x509_cert_pub_file]" And I press "Add" Then I should be on testaccount's provider account page And I should see "Provider account added" And I should have a provider account named "testaccount" And I should see "Properties for testaccount" And I should see "Running instances quota: 13" - And I should see "Account ID: 222222"
Scenario: Test Provider Account Connection Successful Given there is a provider named "testprovider" @@ -44,8 +40,8 @@ Feature: Manage Provider Accounts And I am on the admin provider accounts page When I follow "New Account" Then I should be on the new admin provider account page - When I fill in "cloud_account[username]" with "mockuser" - And I fill in "cloud_account[password]" with "mockpassword" + When I fill in "provider_account[username]" with "mockuser" + And I fill in "provider_account[password]" with "mockpassword" And I press "Test Account" Then I should see "Test Connection Success"
@@ -55,8 +51,8 @@ Feature: Manage Provider Accounts And I am on the admin provider accounts page When I follow "New Account" Then I should be on the new admin provider account page - When I fill in "cloud_account[username]" with "mockuser" - And I fill in "cloud_account[password]" with "wrong password" + When I fill in "provider_account[username]" with "mockuser" + And I fill in "provider_account[password]" with "wrong password" And I press "Test Account" Then I should see "Test Connection Failed"
diff --git a/src/features/step_definitions/provider_account_steps.rb b/src/features/step_definitions/provider_account_steps.rb index 63620c5..b3ffc09 100644 --- a/src/features/step_definitions/provider_account_steps.rb +++ b/src/features/step_definitions/provider_account_steps.rb @@ -17,7 +17,7 @@ end
Given /^there is a provider account named "([^"]*)"$/ do |label| @provider = Provider.find_by_name('testprovider') - @cloud_account = Factory(:mock_cloud_account, :provider => @provider, :label => label) + @provider_account = Factory(:mock_provider_account, :provider => @provider, :label => label) end
Given /^there is a second provider account named "([^"]*)"$/ do |label| diff --git a/src/features/step_definitions/provider_steps.rb b/src/features/step_definitions/provider_steps.rb index 7dd57a7..4d57030 100644 --- a/src/features/step_definitions/provider_steps.rb +++ b/src/features/step_definitions/provider_steps.rb @@ -49,8 +49,8 @@ Given /^this provider has a realm$/ do Factory(:realm, :provider => @provider) end
-Given /^this provider has a cloud account$/ do - Factory(:mock_cloud_account, :provider => @provider) +Given /^this provider has a provider account$/ do + Factory(:mock_provider_account, :provider => @provider) end
Then /^there should not be any replicated images$/ do @@ -61,7 +61,7 @@ Then /^there should not be any hardware profiles$/ do HardwareProfile.find(:all, :conditions => { :provider_id => @provider.id} ).size.should == 0 end
-Then /^there should not be a cloud account$/ do +Then /^there should not be a provider account$/ do ProviderAccount.find(:all, :conditions => { :provider_id => @provider.id} ).size.should == 0 end
diff --git a/src/features/step_definitions/template_steps.rb b/src/features/step_definitions/template_steps.rb index e0ab543..c4f986c 100644 --- a/src/features/step_definitions/template_steps.rb +++ b/src/features/step_definitions/template_steps.rb @@ -92,13 +92,13 @@ When /^I choose this template$/ do choose("ids__#{@template.id}") end
-Given /^there is ec2 cloud account$/ do - account = Factory.build(:ec2_cloud_account) +Given /^there is Amazon AWS provider account$/ do + account = Factory.build(:ec2_provider_account) account.save! end
-Given /^there is ec2 build for this template$/ do - Image.build(@template, 'ec2') +Given /^there is Amazon AWS build for this template$/ do + Image.build(@template, Provider::AWS) end
Given /^there is an imported template$/ do diff --git a/src/features/template.feature b/src/features/template.feature index b7d75a8..74ab316 100644 --- a/src/features/template.feature +++ b/src/features/template.feature @@ -91,31 +91,31 @@ Feature: Manage Templates
Scenario: Build template Given there is a "mock1" template - And there is ec2 cloud account + And there is Amazon AWS provider account And I am on the templates page When I choose this template And I press "Build" Then I should be on the new template build page And I should see "Build Request" - When I check "ec2" + When I check "Aws" And I press "Submit to Build" Then I should be on the template builds page And I should see "mock1"
Scenario: Build template which is already built Given there is a "mock1" template - And there is ec2 cloud account + And there is Amazon AWS provider account And I am on the templates page - And there is ec2 build for this template + And there is Amazon AWS build for this template When I choose this template And I press "Build" Then I should be on the new template build page And I should see "Build Request" - When I check "ec2" + When I check "Aws" And I press "Submit to Build" Then I should be on the template builds page And I should see "mock1" - And I should see "An attempted build of this template for the target 'ec2' already exists" + And I should see "An attempted build of this template for the target '1' already exists"
Scenario: Build imported template Given there is an imported template @@ -166,4 +166,4 @@ Feature: Manage Templates And I press "Search" Then I should not see "Test1" And I should see "Other" - And I should not see "Mock" \ No newline at end of file + And I should not see "Mock" diff --git a/src/spec/controllers/builds_controller_spec.rb b/src/spec/controllers/builds_controller_spec.rb index ef4f3d4..3432bef 100644 --- a/src/spec/controllers/builds_controller_spec.rb +++ b/src/spec/controllers/builds_controller_spec.rb @@ -18,19 +18,19 @@ describe BuildsController do hydra = Typhoeus::Hydra.hydra hydra.stub(:put, %r{http://localhost:9090/templates/.*%7D).and_return( Typhoeus::Response.new(:code => 200)) - Factory.create(:mock_cloud_account) + Factory.create(:mock_provider_account) Factory.create(:mock_provider) end
it "should create a new Image" do lambda do - post :create, :template_id => @template.id, :targets => ["mock"] + post :create, :template_id => @template.id, :targets => ["0"] end.should change(Image, :count).by(1) end
it "should create a new ReplicatedImage" do lambda do - post :create, :template_id => @template.id, :targets => ["mock"] + post :create, :template_id => @template.id, :targets => ["0"] end.should change(ReplicatedImage, :count).by(1) end end diff --git a/src/spec/controllers/provider_accounts_controller_spec.rb b/src/spec/controllers/provider_accounts_controller_spec.rb index 7471b30..6369eab 100644 --- a/src/spec/controllers/provider_accounts_controller_spec.rb +++ b/src/spec/controllers/provider_accounts_controller_spec.rb @@ -4,8 +4,8 @@ describe ProviderAccountsController do
fixtures :all before(:each) do - @cloud_account = Factory :mock_cloud_account - @provider = @cloud_account.provider + @provider_account = Factory :mock_provider_account + @provider = @provider_account.provider
@admin_permission = Permission.create :role => Role.find(:first, :conditions => ['name = ?', 'Provider Administrator']), :permission_object => @provider, @@ -23,7 +23,7 @@ describe ProviderAccountsController do
it "allows test account validity on create when passing test_account param" do UserSession.create(@admin) - post :create, :provider_id => @provider.id, :cloud_account => {}, :test_account => true + post :create, :provider_id => @provider.id, :provider_account => {}, :test_account => true response.should be_success response.should render_template("new") response.flash[:error].should == "Test Connection Failed: Invalid Account Details" @@ -31,7 +31,7 @@ describe ProviderAccountsController do
it "doesn't allow to save provider's account if not valid credentials" do UserSession.create(@admin) - post :create, :provider_id => @provider.id, :cloud_account => {} + post :create, :provider_id => @provider.id, :provider_account => {} response.should be_success response.should render_template("new") response.flash[:error].should == "The entered credential information is incorrect" @@ -39,7 +39,7 @@ describe ProviderAccountsController do
it "should permit users with account modify permission to access edit cloud account interface" do UserSession.create(@admin) - get :edit, :id => @cloud_account.id + get :edit, :id => @provider_account.id response.should be_success response.should render_template("edit") end @@ -47,33 +47,33 @@ describe ProviderAccountsController do it "should allow users with account modify password to update a cloud account" do UserSession.create(@admin)
- @cloud_account.password = "foobar" - @cloud_account.stub!(:valid_credentials?).and_return(true) - @cloud_account.quota = Quota.new - @cloud_account.save.should be_true + @provider_account.password = "foobar" + @provider_account.stub!(:valid_credentials?).and_return(true) + @provider_account.quota = Quota.new + @provider_account.save.should be_true
- post :update, :id => @cloud_account.id, :cloud_account => { :password => 'mockpassword' } + post :update, :id => @provider_account.id, :provider_account => { :password => 'mockpassword' } response.should redirect_to provider_accounts_path(@provider) - ProviderAccount.find(@cloud_account.id).password.should == "mockpassword" + ProviderAccount.find(@provider_account.id).password.should == "mockpassword" end
it "should allow users with account modify permission to delete a cloud account" do UserSession.create(@admin) lambda do - get :destroy, :id => @cloud_account.id + get :destroy, :id => @provider_account.id end.should change(ProviderAccount, :count).by(-1) response.should redirect_to provider_accounts_path(@provider) - ProviderAccount.find_by_id(@cloud_account.id).should be_nil + ProviderAccount.find_by_id(@provider_account.id).should be_nil end
it "should deny access to users without account modify permission" do - get :edit, :id => @cloud_account.id + get :edit, :id => @provider_account.id response.should_not be_success
- post :update, :id => @cloud_account.id, :cloud_account => { :password => 'foobar' } + post :update, :id => @provider_account.id, :provider_account => { :password => 'foobar' } response.should_not be_success
- post :destroy, :id => @cloud_account.id + post :destroy, :id => @provider_account.id response.should_not be_success end
diff --git a/src/spec/factories/instance.rb b/src/spec/factories/instance.rb index 7533ba9..87938bd 100644 --- a/src/spec/factories/instance.rb +++ b/src/spec/factories/instance.rb @@ -2,7 +2,7 @@ Factory.define :instance do |i| i.sequence(:name) { |n| "instance#{n}" } i.sequence(:external_key) { |n| "key#{n}" } i.association :hardware_profile, :factory => :mock_hwp1 - i.association :cloud_account, :factory => :mock_cloud_account + i.association :provider_account, :factory => :mock_provider_account i.association :template, :factory => :template i.association :pool, :factory => :pool i.association :owner, :factory => :user @@ -23,6 +23,6 @@ end
Factory.define :ec2_instance, :parent => :instance do |i| i.association :hardware_profile, :factory => :ec2_hwp1 - i.association :cloud_account, :factory => :ec2_cloud_account + i.association :provider_account, :factory => :ec2_provider_account i.association :instance_key, :factory => :ec2_instance_key1 end diff --git a/src/spec/factories/provider.rb b/src/spec/factories/provider.rb index 76fb4af..b26cff4 100644 --- a/src/spec/factories/provider.rb +++ b/src/spec/factories/provider.rb @@ -1,11 +1,11 @@ Factory.define :provider do |p| p.sequence(:name) { |n| "provider#{n}" } - p.cloud_type 'mock' + p.cloud_type '0' p.url { |p| "http://www." + p.name + ".com/api" } end
Factory.define :mock_provider, :parent => :provider do |p| - p.cloud_type 'mock' + p.cloud_type '0' p.url 'http://localhost:3001/api' p.hardware_profiles { |hp| [hp.association(:mock_hwp1), hp.association(:mock_hwp2)] } p.after_create { |p| p.realms << Factory(:realm1, :provider => p) << Factory(:realm2, :provider => p) } @@ -13,14 +13,14 @@ end
Factory.define :mock_provider2, :parent => :provider do |p| p.name 'mock2' - p.cloud_type 'mock' + p.cloud_type '0' p.url 'http://localhost:3001/api' p.after_create { |p| p.realms << Factory(:realm3, :provider => p) } end
Factory.define :ec2_provider, :parent => :provider do |p| p.name 'amazon-ec2' - p.cloud_type 'ec2' + p.cloud_type '1' p.url 'http://localhost:3001/api' p.hardware_profiles { |hp| [hp.association(:ec2_hwp1)] } p.after_create { |p| p.realms << Factory(:realm4, :provider => p) } diff --git a/src/spec/factories/provider_account.rb b/src/spec/factories/provider_account.rb index ff42702..dae7047 100644 --- a/src/spec/factories/provider_account.rb +++ b/src/spec/factories/provider_account.rb @@ -8,13 +8,13 @@ Factory.define :provider_account do |f| f.association :provider end
-Factory.define :mock_cloud_account, :parent => :provider_account do |f| +Factory.define :mock_provider_account, :parent => :provider_account do |f| f.username "mockuser" f.password "mockpassword" f.provider { |p| p.association(:mock_provider) } end
-Factory.define :ec2_cloud_account, :parent => :provider_account do |f| +Factory.define :ec2_provider_account, :parent => :provider_account do |f| f.username "mockuser" f.password "mockpassword" f.provider { |p| p.association(:ec2_provider) } diff --git a/src/spec/models/image_spec.rb b/src/spec/models/image_spec.rb index dbd5ba8..e489fb6 100644 --- a/src/spec/models/image_spec.rb +++ b/src/spec/models/image_spec.rb @@ -42,12 +42,12 @@ describe Image do end
it "should build image if there is provider and cloud account for specified target" do - acc = Factory.build(:mock_cloud_account) + acc = Factory.build(:mock_provider_account) acc.stub!(:valid_credentials?).and_return(true) acc.save! tpl = Factory.build(:template) tpl.save! - img = Image.build(tpl, 'mock') + img = Image.build(tpl, '0') Image.find(img).should == img ReplicatedImage.find_by_image_id(img.id).should_not be_nil end @@ -55,7 +55,7 @@ describe Image do it "should import image" do image = OpenStruct.new(:id => 'mock', :name => 'mock', :description => 'imported mock', :architecture => 'i386') client = mock('DeltaCloud', :feature? => false, :image => image) - account = Factory.build(:ec2_cloud_account) + account = Factory.build(:ec2_provider_account) account.stub!(:connect).and_return(client) account.stub!(:valid_credentials?).and_return(true) account.save! diff --git a/src/spec/models/instance_observer_spec.rb b/src/spec/models/instance_observer_spec.rb index be2665e..4acb78c 100644 --- a/src/spec/models/instance_observer_spec.rb +++ b/src/spec/models/instance_observer_spec.rb @@ -3,10 +3,8 @@ require 'spec_helper' describe InstanceObserver do
before(:each) do - Timecop.travel(Time.local(2008, 9, 1, 10, 5, 0, 0, 0)) - - @cloud_account_quota = Factory :quota - @cloud_account = Factory(:mock_cloud_account, :quota_id => @cloud_account_quota.id) + @provider_account_quota = Factory :quota + @provider_account = Factory(:mock_provider_account, :quota_id => @provider_account_quota.id)
@pool_quota = Factory :quota @pool = Factory(:pool, :quota_id => @pool_quota.id) @@ -15,7 +13,9 @@ describe InstanceObserver do @user = Factory(:user, :quota_id => @user_quota.id)
@hwp = Factory :mock_hwp1 - @instance = Factory(:new_instance, :pool => @pool, :hardware_profile => @hwp, :cloud_account_id => @cloud_account.id, :owner => @user) + @instance = Factory(:new_instance, :pool => @pool, :hardware_profile => @hwp, :provider_account_id => @provider_account.id, :owner => @user) + + Timecop.travel(Time.local(2008, 9, 1, 10, 5, 0, 0, 0)) end
after(:each) do @@ -102,14 +102,14 @@ describe InstanceObserver do end
it "should not update quota on pool, user and cloud account when an instance is state new" do - [@cloud_account_quota, @pool_quota, @user_quota].each do |quota| + [@provider_account_quota, @pool_quota, @user_quota].each do |quota| quota = Quota.find(quota) quota.total_instances.should == 0 end end
it "should update quota on pool, user and cloud account when an instance goes to state pending" do - [@cloud_account_quota, @pool_quota, @user_quota].each do |quota| + [@provider_account_quota, @pool_quota, @user_quota].each do |quota| @instance.state = Instance::STATE_PENDING @instance.save!
@@ -122,7 +122,7 @@ describe InstanceObserver do @instance.state = Instance::STATE_CREATE_FAILED @instance.save!
- [@cloud_account_quota, @pool_quota, @user_quota].each do |quota| + [@provider_account_quota, @pool_quota, @user_quota].each do |quota| quota = Quota.find(quota) quota.total_instances.should == 0 end @@ -132,7 +132,7 @@ describe InstanceObserver do @instance.state = Instance::STATE_RUNNING @instance.save!
- [@cloud_account_quota, @pool_quota, @user_quota].each do |quota| + [@provider_account_quota, @pool_quota, @user_quota].each do |quota| quota = Quota.find(quota.id) quota.running_instances.should == 1 quota.total_instances.should == 1 @@ -146,7 +146,7 @@ describe InstanceObserver do @instance.state = Instance::STATE_SHUTTING_DOWN @instance.save!
- [@cloud_account_quota, @pool_quota, @user_quota].each do |quota| + [@provider_account_quota, @pool_quota, @user_quota].each do |quota| quota = Quota.find(quota.id)
quota.running_instances.should == 0 diff --git a/src/spec/models/instance_spec.rb b/src/spec/models/instance_spec.rb index 625718d..e4d3a9f 100644 --- a/src/spec/models/instance_spec.rb +++ b/src/spec/models/instance_spec.rb @@ -86,16 +86,9 @@ describe Instance do
describe "with time capsule" do
- before(:each) do - Timecop.travel(Time.local(2008, 9, 1, 10, 5, 0, 0, 0)) - end - - after(:each) do - Timecop.return - end - it "should properly calculate the total time that the instance has been in a monitored state" do instance = Factory :new_instance + Timecop.travel(Time.local(2008, 9, 1, 10, 5, 0, 0, 0))
[ Instance::STATE_PENDING, Instance::STATE_RUNNING, Instance::STATE_SHUTTING_DOWN, Instance::STATE_STOPPED ].each do |s|
@@ -121,18 +114,19 @@ describe Instance do instance.total_state_time(s).should >= 3 instance.total_state_time(s).should <= 4 end + Timecop.return end
end
it "should return empty list of instance actions when connect to provider fails" do provider = Factory.build(:mock_provider2) - cloud_account = Factory.build(:cloud_account, :provider => provider, + cloud_account = Factory.build(:provider_account, :provider => provider, :username => 'john doe', :password => 'asdf') cloud_account.stub!(:connect).and_return(nil) cloud_account.stub!(:valid_credentials?).and_return(true) - instance = Factory.create(:instance, :cloud_account => cloud_account) + instance = Factory.create(:instance, :provider_account => cloud_account) instance.get_action_list.should be_empty end
diff --git a/src/spec/models/pool_family_spec.rb b/src/spec/models/pool_family_spec.rb index 58c18ec..68dfb42 100644 --- a/src/spec/models/pool_family_spec.rb +++ b/src/spec/models/pool_family_spec.rb @@ -5,9 +5,9 @@ describe PoolFamily do before(:each) do @pool = Factory :pool @pool_family = @pool.pool_family - @cloud_account = Factory :mock_cloud_account - @cloud_account.pool_families << @pool_family - @cloud_account.save! + @provider_account = Factory :mock_provider_account + @provider_account.pool_families << @pool_family + @provider_account.save! end
it "should validate default pool family" do @@ -28,7 +28,7 @@ describe PoolFamily do
it "should have account" do @pool_family.provider_accounts.size.should == 1 - @pool_family.provider_accounts[0].id.should == @cloud_account.id + @pool_family.provider_accounts[0].id.should == @provider_account.id end
end diff --git a/src/spec/models/provider_account_spec.rb b/src/spec/models/provider_account_spec.rb index 57d0611..48678e8 100644 --- a/src/spec/models/provider_account_spec.rb +++ b/src/spec/models/provider_account_spec.rb @@ -3,33 +3,33 @@ require 'spec_helper' describe ProviderAccount do fixtures :all before(:each) do - @cloud_account = Factory :mock_cloud_account + @provider_account = Factory :mock_provider_account end
it "should not be destroyable if it has instances" do - @cloud_account.instances << Instance.new - @cloud_account.destroyable?.should be_false - @cloud_account.destroy.should be_false + @provider_account.instances << Instance.new + @provider_account.destroyable?.should be_false + @provider_account.destroy.should be_false
- @cloud_account.instances.clear - @cloud_account.destroyable?.should be_true - @cloud_account.destroy.equal?(@cloud_account).should be_true - @cloud_account.should be_frozen + @provider_account.instances.clear + @provider_account.destroyable?.should be_true + @provider_account.destroy.equal?(@provider_account).should be_true + @provider_account.should be_frozen end
it "should check the validitiy of the cloud account login credentials" do mock_provider = Factory :mock_provider
- invalid_cloud_account = Factory.build(:cloud_account, :username => "wrong_username", :password => "wrong_password", :provider => mock_provider) - invalid_cloud_account.should_not be_valid + invalid_provider_account = Factory.build(:provider_account, :username => "wrong_username", :password => "wrong_password", :provider => mock_provider) + invalid_provider_account.should_not be_valid
- valid_cloud_account = Factory.build(:mock_cloud_account, :provider => mock_provider) - valid_cloud_account.should be_valid + valid_provider_account = Factory.build(:mock_provider_account, :provider => mock_provider) + valid_provider_account.should be_valid end
it "should fail to create a cloud account if the provider credentials are invalid" do - cloud_account = Factory.build(:mock_cloud_account, :password => "wrong_password") - cloud_account.save.should == false + provider_account = Factory.build(:mock_provider_account, :password => "wrong_password") + provider_account.save.should == false end
it "should create an instance_key if provider is EC2" do @@ -41,18 +41,18 @@ describe ProviderAccount do @client.stub!(:"feature?").and_return(true) @client.stub!(:"create_key").and_return(@key)
- cloud_account = Factory.build :ec2_cloud_account - cloud_account.stub!(:connect).and_return(@client) - cloud_account.save - cloud_account.instance_key.should_not == nil - cloud_account.instance_key.pem == "PEM" - cloud_account.instance_key.id == "1_user" + provider_account = Factory.build :ec2_provider_account + provider_account.stub!(:connect).and_return(@client) + provider_account.save + provider_account.instance_key.should_not == nil + provider_account.instance_key.pem == "PEM" + provider_account.instance_key.id == "1_user" end
it "when calling connect and it fails with exception it will return nil" do DeltaCloud.should_receive(:new).and_raise(Exception.new)
- @cloud_account.connect.should be_nil + @provider_account.connect.should be_nil end
it "should generate credentials xml" do @@ -68,13 +68,13 @@ describe ProviderAccount do </ec2_credentials> </provider_credentials> EOT - cloud_account = Factory.build(:mock_cloud_account, + provider_account = Factory.build(:mock_provider_account, :username => 'user', :password => 'pass', :account_number => '1234', :x509_cert_priv => 'priv_key', :x509_cert_pub => 'cert' ) - cloud_account.build_credentials.should eql(expected_xml) + provider_account.build_credentials.should eql(expected_xml) end end diff --git a/src/spec/models/provider_spec.rb b/src/spec/models/provider_spec.rb index e3af313..7d11633 100644 --- a/src/spec/models/provider_spec.rb +++ b/src/spec/models/provider_spec.rb @@ -66,7 +66,7 @@ describe Provider do it "should set valid cloud type" do @client.driver_name = @provider.cloud_type @provider.cloud_type = nil - @provider.set_cloud_type! + @provider.cloud_type = 0 @provider.should be_valid end
diff --git a/src/spec/models/quota_spec.rb b/src/spec/models/quota_spec.rb index 9620e83..960b417 100644 --- a/src/spec/models/quota_spec.rb +++ b/src/spec/models/quota_spec.rb @@ -3,8 +3,8 @@ require 'spec_helper' describe Quota do
before(:each) do - @cloud_account_quota = Factory :quota - @cloud_account = Factory(:mock_cloud_account, :quota_id => @cloud_account_quota.id) + @provider_account_quota = Factory :quota + @provider_account = Factory(:mock_provider_account, :quota_id => @provider_account_quota.id)
@pool_quota = Factory :quota @pool = Factory(:pool, :quota_id => @pool_quota.id) @@ -13,12 +13,12 @@ describe Quota do @user = Factory(:user, :quota_id => @user_quota.id)
@hwp = Factory :mock_hwp1 - @instance = Factory(:new_instance, :pool => @pool, :hardware_profile => @hwp, :cloud_account_id => @cloud_account.id, :owner => @user) + @instance = Factory(:new_instance, :pool => @pool, :hardware_profile => @hwp, :provider_account_id => @provider_account.id, :owner => @user) end
it "should return true when asking if an instance can be created/started when there is sufficient quota space" do - Quota.can_create_instance?(@instance, @cloud_account).should == true - Quota.can_start_instance?(@instance, @cloud_account).should == true + Quota.can_create_instance?(@instance, @provider_account).should == true + Quota.can_start_instance?(@instance, @provider_account).should == true end
it "should return true when asking if an instance can be created/started when using unlimited Quotas" do @@ -28,11 +28,11 @@ describe Quota do @pool.quota = Factory :unlimited_quota @pool.save!
- @cloud_account.quota = Factory :unlimited_quota - @cloud_account.save! + @provider_account.quota = Factory :unlimited_quota + @provider_account.save!
- Quota.can_create_instance?(@instance, @cloud_account).should == true - Quota.can_start_instance?(@instance, @cloud_account).should == true + Quota.can_create_instance?(@instance, @provider_account).should == true + Quota.can_start_instance?(@instance, @provider_account).should == true end
it "should return false when asking if an instance can be created/started when the user quota is reached" do @@ -40,8 +40,8 @@ describe Quota do @user_quota.running_instances = @user_quota.maximum_running_instances @user_quota.save!
- Quota.can_create_instance?(@instance, @cloud_account).should == false - Quota.can_start_instance?(@instance, @cloud_account).should == false + Quota.can_create_instance?(@instance, @provider_account).should == false + Quota.can_start_instance?(@instance, @provider_account).should == false end
it "should return false when asking if an instance can be created/started when the pool quota is reached" do @@ -49,17 +49,17 @@ describe Quota do @pool_quota.running_instances = @pool_quota.maximum_running_instances @pool_quota.save!
- Quota.can_create_instance?(@instance, @cloud_account).should == false - Quota.can_start_instance?(@instance, @cloud_account).should == false + Quota.can_create_instance?(@instance, @provider_account).should == false + Quota.can_start_instance?(@instance, @provider_account).should == false end
it "should return false when asking if an instance can be created/started when the cloud account quota is reached" do - @cloud_account_quota.total_instances = @cloud_account_quota.maximum_total_instances - @cloud_account_quota.running_instances = @cloud_account_quota.maximum_running_instances - @cloud_account_quota.save! + @provider_account_quota.total_instances = @provider_account_quota.maximum_total_instances + @provider_account_quota.running_instances = @provider_account_quota.maximum_running_instances + @provider_account_quota.save!
- Quota.can_create_instance?(@instance, @cloud_account).should == false - Quota.can_start_instance?(@instance, @cloud_account).should == false + Quota.can_create_instance?(@instance, @provider_account).should == false + Quota.can_start_instance?(@instance, @provider_account).should == false end
it "should return false when asking if an instance can be created/started when the all quotas are reached" do @@ -71,12 +71,12 @@ describe Quota do @pool_quota.running_instances = @pool_quota.maximum_running_instances @pool_quota.save!
- @cloud_account_quota.total_instances = @cloud_account_quota.maximum_total_instances - @cloud_account_quota.running_instances = @cloud_account_quota.maximum_running_instances - @cloud_account_quota.save! + @provider_account_quota.total_instances = @provider_account_quota.maximum_total_instances + @provider_account_quota.running_instances = @provider_account_quota.maximum_running_instances + @provider_account_quota.save!
- Quota.can_create_instance?(@instance, @cloud_account).should == false - Quota.can_start_instance?(@instance, @cloud_account).should == false + Quota.can_create_instance?(@instance, @provider_account).should == false + Quota.can_start_instance?(@instance, @provider_account).should == false end
-end \ No newline at end of file +end diff --git a/src/spec/services/data_service_active_record_spec.rb b/src/spec/services/data_service_active_record_spec.rb index b443fa9..45b07bf 100644 --- a/src/spec/services/data_service_active_record_spec.rb +++ b/src/spec/services/data_service_active_record_spec.rb @@ -11,13 +11,13 @@ describe DataServiceActiveRecord do data = [[25, 10], [40, 20], [20, 20]] free = 0 for i in 0..2 - cloud_account = Factory.build(:cloud_account, :provider => provider, :username => "username" + i.to_s) - cloud_account.stub!(:valid_credentials?).and_return(true) - cloud_account.save! + provider_account = Factory.build(:provider_account, :provider => provider, :username => "username" + i.to_s) + provider_account.stub!(:valid_credentials?).and_return(true) + provider_account.save!
quota = Factory(:quota, :maximum_total_instances => data[i][0], :total_instances => data[i][1]) - cloud_account.quota_id = quota.id - cloud_account.save! + provider_account.quota_id = quota.id + provider_account.save!
free += (data[i][0] - data[i][1]) end @@ -36,24 +36,24 @@ describe DataServiceActiveRecord do provider.stub!(:connect).and_return(client) provider.save!
- cloud_account = Factory.build(:cloud_account, :provider => provider) - cloud_account.stub!(:valid_credentials?).and_return(true) - cloud_account.save! + provider_account = Factory.build(:provider_account, :provider => provider) + provider_account.stub!(:valid_credentials?).and_return(true) + provider_account.save!
quota = Factory(:quota, :maximum_running_instances => 40, :maximum_total_instances => 50, :running_instances => 20, :total_instances => 20) - cloud_account.quota_id = quota.id + provider_account.quota_id = quota.id
- data_point = DataServiceActiveRecord.quota_usage(cloud_account, Quota::RESOURCE_RUNNING_INSTANCES) + data_point = DataServiceActiveRecord.quota_usage(provider_account, Quota::RESOURCE_RUNNING_INSTANCES) data_point.should == DataServiceActiveRecord::QuotaUsagePoint.new(20, 40)
- data_point = DataServiceActiveRecord.quota_usage(cloud_account, Quota::RESOURCE_TOTAL_INSTANCES) + data_point = DataServiceActiveRecord.quota_usage(provider_account, Quota::RESOURCE_TOTAL_INSTANCES) data_point.should == DataServiceActiveRecord::QuotaUsagePoint.new(20, 50)
- data_point = DataServiceActiveRecord.quota_usage(cloud_account, Quota::RESOURCE_OVERALL) + data_point = DataServiceActiveRecord.quota_usage(provider_account, Quota::RESOURCE_OVERALL) data_point.should == DataServiceActiveRecord::QuotaUsagePoint.new(20, 40) end
@@ -127,13 +127,13 @@ describe DataServiceActiveRecord do provider.stub!(:connect).and_return(client) provider.save!
- cloud_accounts = [] + provider_accounts = [] expected_averages.each do |expected_average| - cloud_account = Factory.build(:cloud_account, :provider => provider, :username => "username" + expected_average[0].to_s) - cloud_account.stub!(:valid_credentials?).and_return(true) - cloud_account.save! + provider_account = Factory.build(:provider_account, :provider => provider, :username => "username" + expected_average[0].to_s) + provider_account.stub!(:valid_credentials?).and_return(true) + provider_account.save!
- instance = Factory(:instance, :cloud_account_id => cloud_account.id, :pool_id => pool.id) + instance = Factory(:instance, :provider_account_id => provider_account.id, :pool_id => pool.id) generate_tasks(start_time, interval_length, instance, expected_average) end
@@ -163,11 +163,11 @@ describe DataServiceActiveRecord do runtimes = [runtime1, runtime2, runtime3]
pool = Factory(:pool) - cloud_account = Factory :mock_cloud_account + provider_account = Factory :mock_provider_account
for i in 0..2 do runtimes[i].each do |runtime| - instance = Factory(:instance, :pool => pool, :cloud_account => cloud_account, :state => Instance::STATE_STOPPED) + instance = Factory(:instance, :pool => pool, :provider_account => provider_account, :state => Instance::STATE_STOPPED) instance.save!
instance.time_last_pending = start_times[i] + (interval_length / 2) @@ -177,7 +177,7 @@ describe DataServiceActiveRecord do end end
- stats = DataServiceActiveRecord.qos_instance_runtime_stats(cloud_account, start_time, end_time, interval_length) + stats = DataServiceActiveRecord.qos_instance_runtime_stats(provider_account, start_time, end_time, interval_length) stats[0].should == DataServiceActiveRecord::QoSDataPoint.new(start_times[0], 15, 25, 5) stats[1].should == DataServiceActiveRecord::QoSDataPoint.new(start_times[1], 30, 50, 10) stats[2].should == DataServiceActiveRecord::QoSDataPoint.new(start_times[2], 300, 500, 100) @@ -187,11 +187,11 @@ describe DataServiceActiveRecord do it "should generate the mean max and min instance runtimes of instances for a given cloud account or pool" do pool = Factory(:pool)
- cloud_account = Factory :mock_cloud_account + provider_account = Factory :mock_provider_account
start_time = Time.utc(2010,"jan",1,20,15,1) [50, 100, 150, 200, 250].each do |runtime| - instance = Factory(:new_instance, :pool => pool, :cloud_account => cloud_account) + instance = Factory(:new_instance, :pool => pool, :provider_account => provider_account) instance.time_last_pending = start_time instance.time_last_running = start_time instance.acc_running_time = runtime @@ -205,8 +205,8 @@ describe DataServiceActiveRecord do
it "should calculate the average time it takes a provider to complete a task between two times" do pool = Factory(:pool) - cloud_account = Factory(:mock_cloud_account) - instance = Factory(:instance, :pool => pool, :cloud_account => cloud_account) + provider_account = Factory(:mock_provider_account) + instance = Factory(:instance, :pool => pool, :provider_account => provider_account)
start_time = Time.utc(2010,"jan",1,20,15,1) task_completion_times = [10, 20, 30, 40, 50] @@ -230,7 +230,7 @@ describe DataServiceActiveRecord do end
expected_average_time = total_time / task_completion_times.length - average_time = DataServiceActiveRecord.qos_task_completion_mean_max_min(cloud_account.provider, start_time, Time.now, InstanceTask::ACTION_CREATE) + average_time = DataServiceActiveRecord.qos_task_completion_mean_max_min(provider_account.provider, start_time, Time.now, InstanceTask::ACTION_CREATE)
average_time[:average].should == expected_average_time average_time[:min].should == 10 @@ -243,8 +243,8 @@ describe DataServiceActiveRecord do end_time = create_time + 1
pool = Factory(:pool) - cloud_account = Factory :mock_cloud_account - instance = Factory(:instance, :pool => pool, :cloud_account => cloud_account) + provider_account = Factory :mock_provider_account + instance = Factory(:instance, :pool => pool, :provider_account => provider_account)
failures = 5 non_failures = 20 @@ -289,8 +289,8 @@ describe DataServiceActiveRecord do number_of_instances = 20
pool = Factory(:pool) - cloud_account = Factory :mock_cloud_account - instance = Factory(:instance, :pool => pool, :cloud_account => cloud_account) + provider_account = Factory :mock_provider_account + instance = Factory(:instance, :pool => pool, :provider_account => provider_account)
for i in 0..2 for j in 1..failures[i]
On 01/27/2011 10:43 AM, jzigmund@redhat.com wrote:
From: Jozef Zigmundjzigmund@redhat.com
diff --git a/src/db/development_structure.sql b/src/db/development_structure.sql new file mode 100644 index 0000000..5f9b7d0 --- /dev/null +++ b/src/db/development_structure.sql @@ -0,0 +1,89 @@ +CREATE TABLE "base_permission_objects" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255) NOT NULL, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "cloud_accounts_pool_families" ("cloud_account_id" integer NOT NULL, "pool_family_id" integer NOT NULL); +CREATE TABLE "deployables" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "created_at" datetime, "updated_at" datetime);
I'm not sure what this file is (I don't have an equivalent in my checkout), but it looks like it got added to the commit by mistake. I don't think this should be pushed here.
Scott
From: Jozef Zigmund jzigmund@redhat.com
--- .../admin/provider_accounts_controller.rb | 4 +- .../controllers/provider_accounts_controller.rb | 6 ++-- src/app/models/cloud_account_observer.rb | 9 -------- src/app/models/instance_observer.rb | 6 ++-- src/app/models/privilege.rb | 8 +++--- src/app/models/provider_account_observer.rb | 9 ++++++++ src/config/environment.rb | 2 +- src/db/development_structure.sql | 21 ++++++++++-------- ...737_rename_cloud_accout_id_for_instance_keys.rb | 9 -------- src/features/instance.feature | 2 +- src/features/provider.feature | 10 ++++---- .../step_definitions/provider_account_steps.rb | 4 +- src/spec/models/cloud_account_observer_spec.rb | 22 -------------------- src/spec/models/provider_account_observer_spec.rb | 22 ++++++++++++++++++++ 14 files changed, 64 insertions(+), 70 deletions(-) delete mode 100644 src/app/models/cloud_account_observer.rb create mode 100644 src/app/models/provider_account_observer.rb delete mode 100644 src/db/migrate/20110125122737_rename_cloud_accout_id_for_instance_keys.rb delete mode 100644 src/spec/models/cloud_account_observer_spec.rb create mode 100644 src/spec/models/provider_account_observer_spec.rb
diff --git a/src/app/controllers/admin/provider_accounts_controller.rb b/src/app/controllers/admin/provider_accounts_controller.rb index 44d3fc6..d01c20e 100644 --- a/src/app/controllers/admin/provider_accounts_controller.rb +++ b/src/app/controllers/admin/provider_accounts_controller.rb @@ -8,7 +8,7 @@ class Admin::ProviderAccountsController < ApplicationController if @search_term.blank? load_accounts else - search = CloudAccount.search do + search = ProviderAccount.search do keywords(params[:q]) end @accounts = search.results @@ -103,7 +103,7 @@ class Admin::ProviderAccountsController < ApplicationController limit = params[:quota][:maximum_running_instances] if params[:quota] @provider_account.quota.set_maximum_running_instances(limit) if @provider_account.update_attributes(params[:provider_account]) - flash[:notice] = "Cloud Account updated!" + flash[:notice] = "Provider Account updated!" redirect_to admin_provider_account_path(@provider_account) else render :action => :edit diff --git a/src/app/controllers/provider_accounts_controller.rb b/src/app/controllers/provider_accounts_controller.rb index 99ca85d..962bca7 100644 --- a/src/app/controllers/provider_accounts_controller.rb +++ b/src/app/controllers/provider_accounts_controller.rb @@ -31,14 +31,14 @@ class ProviderAccountsController < ApplicationController
def index @provider = Provider.find(params[:provider_id]) - require_privilege(Privilege::VIEW, CloudAccount, @provider) + require_privilege(Privilege::VIEW, ProviderAccount, @provider) end
def new @provider = Provider.find(params[:provider_id]) @provider_account = ProviderAccount.new @quota = Quota.new - require_privilege(Privilege::CREATE, CloudAccount, @provider) + require_privilege(Privilege::CREATE, ProviderAccount, @provider) end
def create @@ -85,7 +85,7 @@ class ProviderAccountsController < ApplicationController
def update_accounts @provider = Provider.find(params[:provider][:id]) - require_privilege(Privilege::MODIFY, CloudAccount, @provider) + require_privilege(Privilege::MODIFY, ProviderAccount, @provider) @providers = Provider.list_for_user(@current_user, Privilege::VIEW)
success = true diff --git a/src/app/models/cloud_account_observer.rb b/src/app/models/cloud_account_observer.rb deleted file mode 100644 index a0826ea..0000000 --- a/src/app/models/cloud_account_observer.rb +++ /dev/null @@ -1,9 +0,0 @@ -class CloudAccountObserver < ActiveRecord::Observer - def after_create(account) - if key = account.generate_auth_key - account.update_attribute(:instance_key, InstanceKey.create!(:pem => key.pem, :name => key.id, :instance_key_owner => account)) - end - end -end - -CloudAccountObserver.instance diff --git a/src/app/models/instance_observer.rb b/src/app/models/instance_observer.rb index 157ac39..e14e8d2 100644 --- a/src/app/models/instance_observer.rb +++ b/src/app/models/instance_observer.rb @@ -36,9 +36,9 @@ class InstanceObserver < ActiveRecord::Observer hwp = an_instance.hardware_profile pool = an_instance.pool user = an_instance.owner - cloud_account = an_instance.provider_account + provider_account = an_instance.provider_account
- [cloud_account, pool, user].each do |parent| + [provider_account, pool, user].each do |parent| if parent quota = parent.quota if quota @@ -65,7 +65,7 @@ class InstanceObserver < ActiveRecord::Observer # we try to generate key only when instance is running # and instance_key is not generated yet return if instance.state != Instance::STATE_RUNNING or instance.instance_key - if key = instance.cloud_account.generate_auth_key + if key = instance.provider_account.generate_auth_key instance.instance_key = InstanceKey.create!(:pem => key.pem, :name => key.id, :instance_key_owner => instance) end end diff --git a/src/app/models/privilege.rb b/src/app/models/privilege.rb index f7a61ef..1ef514c 100644 --- a/src/app/models/privilege.rb +++ b/src/app/models/privilege.rb @@ -33,7 +33,7 @@ class Privilege < ActiveRecord::Base # Deployable: choose this deployable to launch # Instance: may perform actions on this instance # Realm: may map this realm - # CloudAccount: May add this account to PoolFamily + # ProviderAccount: May add this account to PoolFamily
ACTIONS = [ CREATE, MODIFY, USE, VIEW, @@ -47,7 +47,7 @@ class Privilege < ActiveRecord::Base HardwareProfile => ACTIONS - [USE, VIEW], Realm => ACTIONS - [VIEW], Provider => ACTIONS - [USE], - CloudAccount => ACTIONS, + ProviderAccount => ACTIONS, User => [ CREATE, MODIFY, VIEW] }
belongs_to :role @@ -99,7 +99,7 @@ class Privilege < ActiveRecord::Base # view_perms Can view permissions # set_perms Can set permissions (or can set instance permissions on this pool) # - # Quota The Pool/CloudAccount/PoolFamily/User assigned the quota + # Quota The Pool/ProviderAccount/PoolFamily/User assigned the quota # view Can view quota on this obj # modify Can edit quota on this obj # @@ -123,7 +123,7 @@ class Privilege < ActiveRecord::Base # view_perms Can view permissions # set_perms Can set permissions # - # CloudAccount This CloudAccount + # ProviderAccount This ProviderAccount # view Can view # use Can map to PoolFamily # modify Can modify diff --git a/src/app/models/provider_account_observer.rb b/src/app/models/provider_account_observer.rb new file mode 100644 index 0000000..ddf19c6 --- /dev/null +++ b/src/app/models/provider_account_observer.rb @@ -0,0 +1,9 @@ +class ProviderAccountObserver < ActiveRecord::Observer + def after_create(account) + if key = account.generate_auth_key + account.update_attribute(:instance_key, InstanceKey.create!(:pem => key.pem, :name => key.id, :instance_key_owner => account)) + end + end +end + +ProviderAccountObserver.instance diff --git a/src/config/environment.rb b/src/config/environment.rb index a897feb..986cfe4 100644 --- a/src/config/environment.rb +++ b/src/config/environment.rb @@ -57,7 +57,7 @@ Rails::Initializer.run do |config|
config.middleware.swap Rack::MethodOverride, 'Rack::RestfulSubmit'
- config.active_record.observers = :instance_observer, :task_observer, :cloud_account_observer + config.active_record.observers = :instance_observer, :task_observer, :provider_account_observer # Only load the plugins named here, in the order given. By default, all plugins # in vendor/plugins are loaded in alphabetical order. # :all can be used as a placeholder for all plugins not explicitly named diff --git a/src/db/development_structure.sql b/src/db/development_structure.sql index 5f9b7d0..93ab70b 100644 --- a/src/db/development_structure.sql +++ b/src/db/development_structure.sql @@ -1,22 +1,21 @@ CREATE TABLE "base_permission_objects" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255) NOT NULL, "created_at" datetime, "updated_at" datetime); -CREATE TABLE "cloud_accounts_pool_families" ("cloud_account_id" integer NOT NULL, "pool_family_id" integer NOT NULL); CREATE TABLE "deployables" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "created_at" datetime, "updated_at" datetime); CREATE TABLE "hardware_profile_map" ("aggregator_hardware_profile_id" integer, "provider_hardware_profile_id" integer); CREATE TABLE "hardware_profile_properties" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255) NOT NULL, "kind" varchar(255) NOT NULL, "unit" varchar(255) NOT NULL, "value" varchar(255) NOT NULL, "range_first" varchar(255), "range_last" varchar(255), "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); -CREATE TABLE "hardware_profiles" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "external_key" varchar(255) NOT NULL, "name" varchar(1024) NOT NULL, "memory_id" integer, "storage_id" integer, "cpu_id" integer, "architecture_id" integer, "provider_id" integer, "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "hardware_profiles" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "external_key" varchar(255), "name" varchar(1024) NOT NULL, "memory_id" integer, "storage_id" integer, "cpu_id" integer, "architecture_id" integer, "provider_id" integer, "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); CREATE TABLE "images" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "uuid" varchar(255), "name" varchar(255) NOT NULL, "build_id" varchar(255), "uri" varchar(255), "status" varchar(255), "target" varchar(255), "template_id" integer, "created_at" datetime, "updated_at" datetime); CREATE TABLE "instance_events" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "instance_id" integer NOT NULL, "event_type" varchar(255) NOT NULL, "event_time" datetime, "status" varchar(255), "message" varchar(255), "created_at" datetime, "updated_at" datetime); CREATE TABLE "instance_hwps" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "memory" varchar(255), "cpu" varchar(255), "architecture" varchar(255), "storage" varchar(255), "lock_version" integer DEFAULT 0); -CREATE TABLE "instance_keys" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "provider_account_id" integer NOT NULL, "name" varchar(255) NOT NULL, "pem" text, "created_at" datetime, "updated_at" datetime); -CREATE TABLE "instances" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "external_key" varchar(255), "name" varchar(1024) NOT NULL, "hardware_profile_id" integer NOT NULL, "template_id" integer NOT NULL, "realm_id" integer, "owner_id" integer, "pool_id" integer NOT NULL, "provider_account_id" integer, "instance_hwp_id" integer, "public_addresses" varchar(255), "private_addresses" varchar(255), "state" varchar(255), "condor_job_id" varchar(255), "last_error" text(255), "instance_key_id" integer, "lock_version" integer DEFAULT 0, "acc_pending_time" integer DEFAULT 0, "acc_running_time" integer DEFAULT 0, "acc_shutting_down_time" integer DEFAULT 0, "acc_stopped_time" integer DEFAULT 0, "time_last_pending" datetime, "time_last_running" datetime, "time_last_shutting_down" datetime, "time_last_stopped" datetime, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "instance_keys" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "instance_key_owner_id" integer NOT NULL, "instance_key_owner_type" varchar(255) NOT NULL, "name" varchar(255) NOT NULL, "pem" text, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "instances" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "external_key" varchar(255), "name" varchar(1024) NOT NULL, "hardware_profile_id" integer NOT NULL, "template_id" integer NOT NULL, "realm_id" integer, "owner_id" integer, "pool_id" integer NOT NULL, "provider_account_id" integer, "instance_hwp_id" integer, "public_addresses" varchar(255), "private_addresses" varchar(255), "state" varchar(255), "condor_job_id" varchar(255), "last_error" text(255), "lock_version" integer DEFAULT 0, "acc_pending_time" integer DEFAULT 0, "acc_running_time" integer DEFAULT 0, "acc_shutting_down_time" integer DEFAULT 0, "acc_stopped_time" integer DEFAULT 0, "time_last_pending" datetime, "time_last_running" datetime, "time_last_shutting_down" datetime, "time_last_stopped" datetime, "created_at" datetime, "updated_at" datetime); CREATE TABLE "metadata_objects" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "key" varchar(255) NOT NULL, "value" varchar(255) NOT NULL, "object_type" varchar(255), "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); CREATE TABLE "permissions" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "role_id" integer NOT NULL, "user_id" integer NOT NULL, "permission_object_id" integer, "permission_object_type" varchar(255), "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); CREATE TABLE "pool_families" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255) NOT NULL, "description" varchar(255), "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "pool_families_provider_accounts" ("provider_account_id" integer NOT NULL, "pool_family_id" integer NOT NULL); CREATE TABLE "pools" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255) NOT NULL, "exported_as" varchar(255), "quota_id" integer, "pool_family_id" integer NOT NULL, "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); -CREATE TABLE "privileges" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255) NOT NULL, "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); -CREATE TABLE "privileges_roles" ("privilege_id" integer NOT NULL, "role_id" integer NOT NULL); +CREATE TABLE "privileges" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "role_id" integer NOT NULL, "target_type" varchar(255) NOT NULL, "action" varchar(255) NOT NULL, "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); CREATE TABLE "property_enum_entries" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "hardware_profile_property_id" integer NOT NULL, "value" varchar(255) NOT NULL, "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); -CREATE TABLE "provider_accounts" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "label" varchar(255) NOT NULL, "username" varchar(255) NOT NULL, "password" varchar(255) NOT NULL, "provider_id" integer NOT NULL, "quota_id" integer, "lock_version" integer DEFAULT 0, "account_number" varchar(255) NOT NULL, "x509_cert_priv" text NOT NULL, "x509_cert_pub" text NOT NULL, "created_at" datetime, "updated_at" datetime); +CREATE TABLE "provider_accounts" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "label" varchar(255) NOT NULL, "username" varchar(255) NOT NULL, "password" varchar(255) NOT NULL, "provider_id" integer NOT NULL, "quota_id" integer, "lock_version" integer DEFAULT 0, "account_number" varchar(255), "x509_cert_priv" text, "x509_cert_pub" text, "created_at" datetime, "updated_at" datetime); CREATE TABLE "providers" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255) NOT NULL, "cloud_type" integer(255) NOT NULL, "url" varchar(255) NOT NULL, "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); CREATE TABLE "quotas" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "running_instances" integer DEFAULT 0, "total_instances" integer DEFAULT 0, "maximum_running_instances" integer, "maximum_total_instances" integer, "lock_version" integer DEFAULT 0, "created_at" datetime, "updated_at" datetime); CREATE TABLE "realm_map" ("frontend_realm_id" integer, "backend_realm_id" integer); @@ -80,10 +79,14 @@ INSERT INTO schema_migrations (version) VALUES ('20101021172441');
INSERT INTO schema_migrations (version) VALUES ('20110103160939');
+INSERT INTO schema_migrations (version) VALUES ('20110107000000'); + INSERT INTO schema_migrations (version) VALUES ('20110112094108');
INSERT INTO schema_migrations (version) VALUES ('20110117140824');
-INSERT INTO schema_migrations (version) VALUES ('20110125122737'); +INSERT INTO schema_migrations (version) VALUES ('20110125123410'); + +INSERT INTO schema_migrations (version) VALUES ('20110125154113');
-INSERT INTO schema_migrations (version) VALUES ('20110125123410'); \ No newline at end of file +INSERT INTO schema_migrations (version) VALUES ('20110126161751'); \ No newline at end of file diff --git a/src/db/migrate/20110125122737_rename_cloud_accout_id_for_instance_keys.rb b/src/db/migrate/20110125122737_rename_cloud_accout_id_for_instance_keys.rb deleted file mode 100644 index 79acc02..0000000 --- a/src/db/migrate/20110125122737_rename_cloud_accout_id_for_instance_keys.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RenameCloudAccoutIdForInstanceKeys < ActiveRecord::Migration - def self.up - rename_column :instance_keys, :cloud_account_id, :provider_account_id - end - - def self.down - rename_column :instance_keys, :provider_account_id, :cloud_account_id - end -end diff --git a/src/features/instance.feature b/src/features/instance.feature index ad22025..4e4e59c 100644 --- a/src/features/instance.feature +++ b/src/features/instance.feature @@ -109,4 +109,4 @@ Feature: Mange Instances And I press "Search" Then I should not see "mock" And I should see "test" - And I should not see "other" \ No newline at end of file + And I should not see "other" diff --git a/src/features/provider.feature b/src/features/provider.feature index ff9c05b..a01c1fe 100644 --- a/src/features/provider.feature +++ b/src/features/provider.feature @@ -79,20 +79,20 @@ Feature: Manage Providers Given there are these providers: | name | url | | Test | http://testprovider.com/api | - | Mock | http://mockprovider.com/api | + | Kenny | http://mockprovider.com/api | | Other | http://sometesturl.com/api | And I am on the admin providers page Then I should see the following: | Test | http://testprovider.com/api | - | Mock | http://mockprovider.com/ap | + | Kenny | http://mockprovider.com/ap | | Other | http://sometesturl.com/api | When I fill in "q" with "test" And I press "Search" Then I should see "Test" And I should see "Other" - And I should not see "Mock" - When I fill in "q" with "Mock" + And I should not see "Kenny" + When I fill in "q" with "Kenny" And I press "Search" - Then I should see "Mock" + Then I should see "Kenny" And I should not see "Test" And I should not see "Other" diff --git a/src/features/step_definitions/provider_account_steps.rb b/src/features/step_definitions/provider_account_steps.rb index b3ffc09..86a6d31 100644 --- a/src/features/step_definitions/provider_account_steps.rb +++ b/src/features/step_definitions/provider_account_steps.rb @@ -22,7 +22,7 @@ end
Given /^there is a second provider account named "([^"]*)"$/ do |label| @provider = Factory(:mock_provider, :name => 'secondprovider') - @cloud_account = Factory(:mock_cloud_account, :provider => @provider, :label => label) + @provider_account = Factory(:mock_provider_account, :provider => @provider, :label => label) end
@@ -33,6 +33,6 @@ end
Given /^that there are these provider accounts:$/ do |table| table.hashes.each do |hash| - Factory.create(:cloud_account, :name => hash['name'], :username => hash['username']) + Factory.create(:provider_account, :name => hash['name'], :username => hash['username']) end end diff --git a/src/spec/models/cloud_account_observer_spec.rb b/src/spec/models/cloud_account_observer_spec.rb deleted file mode 100644 index 48491c0..0000000 --- a/src/spec/models/cloud_account_observer_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'spec_helper' - -describe CloudAccountObserver do - fixtures :all - - it "should create an instance_key if provider is EC2" do - @client = mock('DeltaCloud', :null_object => true) - @provider = Factory.build :ec2_provider - @key = mock('Key', :null_object => true) - @key.stub!(:pem).and_return("PEM") - @key.stub!(:id).and_return("1_user") - @client.stub!(:"feature?").and_return(true) - @client.stub!(:"create_key").and_return(@key) - - cloud_account = Factory.build :ec2_cloud_account - cloud_account.stub!(:connect).and_return(@client) - cloud_account.save - cloud_account.instance_key.should_not == nil - cloud_account.instance_key.pem == "PEM" - cloud_account.instance_key.id == "1_user" - end -end diff --git a/src/spec/models/provider_account_observer_spec.rb b/src/spec/models/provider_account_observer_spec.rb new file mode 100644 index 0000000..0c397db --- /dev/null +++ b/src/spec/models/provider_account_observer_spec.rb @@ -0,0 +1,22 @@ +require 'spec_helper' + +describe ProviderAccountObserver do + fixtures :all + + it "should create an instance_key if provider is EC2" do + @client = mock('DeltaCloud', :null_object => true) + @provider = Factory.build :ec2_provider + @key = mock('Key', :null_object => true) + @key.stub!(:pem).and_return("PEM") + @key.stub!(:id).and_return("1_user") + @client.stub!(:"feature?").and_return(true) + @client.stub!(:"create_key").and_return(@key) + + provider_account = Factory.build :ec2_provider_account + provider_account.stub!(:connect).and_return(@client) + provider_account.save + provider_account.instance_key.should_not == nil + provider_account.instance_key.pem == "PEM" + provider_account.instance_key.id == "1_user" + end +end
From: Jozef Zigmund jzigmund@redhat.com
Inside this patch I rename model of CloudAccount to ProviderAccount. Also I refactor all codes where this model was called. All supported providers are included in constant hash, that is named PROVIDER_TYPES in Provider model. So now, attribute of class "cloud_type" is renamed to "provider_type" and it must be one of these PROVIDER_TYPES value. I fixed all Rspecs and Cucumbers for provider_account model.
When you'll test this patch won't forget to run "rake db:migrate", because some of the attributes were changed in DB. --- .../admin/provider_accounts_controller.rb | 90 ++++++--- src/app/controllers/admin/providers_controller.rb | 11 +- src/app/controllers/cloud_accounts_controller.rb | 181 ----------------- src/app/controllers/dashboard_controller.rb | 6 +- src/app/controllers/permissions_controller.rb | 6 +- .../controllers/provider_accounts_controller.rb | 181 +++++++++++++++++ src/app/controllers/providers_controller.rb | 8 +- src/app/controllers/quotas_controller.rb | 2 +- src/app/helpers/admin/provider_accounts_helper.rb | 21 ++ src/app/models/cloud_account.rb | 205 ------------------- src/app/models/cloud_account_observer.rb | 9 - src/app/models/image.rb | 6 +- src/app/models/instance.rb | 2 +- src/app/models/instance_observer.rb | 6 +- src/app/models/instance_task.rb | 2 +- src/app/models/permission.rb | 2 +- src/app/models/pool.rb | 4 +- src/app/models/pool_family.rb | 2 +- src/app/models/privilege.rb | 8 +- src/app/models/provider.rb | 38 +++-- src/app/models/provider_account.rb | 206 ++++++++++++++++++++ src/app/models/provider_account_observer.rb | 9 + src/app/models/quota.rb | 2 +- src/app/services/data_service_active_record.rb | 8 +- src/app/services/graph_service.rb | 4 +- src/app/util/condormatic.rb | 2 +- src/app/views/admin/provider_accounts/_aws.haml | 39 ++++ src/app/views/admin/provider_accounts/_gogrid.haml | 16 ++ src/app/views/admin/provider_accounts/_mock.haml | 16 ++ .../views/admin/provider_accounts/_opennebula.haml | 16 ++ .../provider_accounts/_provider_selection.haml | 24 +++ .../views/admin/provider_accounts/_rackspace.haml | 16 ++ src/app/views/admin/provider_accounts/_rhevm.haml | 2 + src/app/views/admin/provider_accounts/new.haml | 21 +- src/app/views/admin/providers/_form.haml | 9 +- src/app/views/admin/providers/_list.haml | 1 + src/app/views/builds/new.haml | 6 +- src/app/views/cloud_accounts/_form.haml | 52 ----- src/app/views/cloud_accounts/edit.haml | 17 -- src/app/views/cloud_accounts/index.haml | 25 --- src/app/views/cloud_accounts/new.haml | 17 -- src/app/views/instances/index.haml | 2 +- src/app/views/instances/show.haml | 2 +- src/app/views/layouts/newui.haml | 1 - src/app/views/provider_accounts/_form.haml | 52 +++++ src/app/views/provider_accounts/edit.haml | 17 ++ src/app/views/provider_accounts/index.haml | 25 +++ src/app/views/provider_accounts/new.haml | 17 ++ src/app/views/providers/accounts.haml | 6 +- src/app/views/resources/instances/_list.haml | 2 +- src/app/views/resources/instances/_properties.haml | 2 +- src/classad_plugin/classad_plugin.rb | 2 +- src/config/environment.rb | 2 +- src/config/locales/en.yml | 6 + src/config/old_navigation.rb | 2 +- src/config/routes.rb | 7 +- ...824_rename_cloud_account_to_provider_account.rb | 11 + ...123410_rename_cloud_account_id_for_instances.rb | 9 + ..._families_to_provider_accounts_pool_families.rb | 11 + ...l_properties_of_columns_in_provider_accounts.rb | 13 ++ ...ame_cloud_type_to_provider_type_in_providers.rb | 9 + src/db/seeds.rb | 12 +- src/dbomatic/dbomatic | 2 +- src/features/instance.feature | 2 +- src/features/provider.feature | 17 +- src/features/provider_account.feature | 20 +-- .../step_definitions/provider_account_steps.rb | 14 +- src/features/step_definitions/provider_steps.rb | 8 +- src/features/step_definitions/template_steps.rb | 8 +- src/features/support/custom.rb | 6 +- src/features/support/paths.rb | 2 +- src/features/template.feature | 14 +- src/image_builder_service/image_builder_service | 2 +- src/lib/tasks/dc_tasks.rake | 2 +- src/lib/tasks/demo_data.rake | 4 +- src/script/use-existing-ec2-templates | 6 +- src/spec/controllers/builds_controller_spec.rb | 6 +- .../controllers/cloud_accounts_controller_spec.rb | 92 --------- .../provider_accounts_controller_spec.rb | 92 +++++++++ src/spec/factories/cloud_account.rb | 21 -- src/spec/factories/instance.rb | 4 +- src/spec/factories/provider.rb | 8 +- src/spec/factories/provider_account.rb | 21 ++ src/spec/models/cloud_account_observer_spec.rb | 22 -- src/spec/models/cloud_account_spec.rb | 80 -------- src/spec/models/image_spec.rb | 6 +- src/spec/models/instance_observer_spec.rb | 20 +- src/spec/models/instance_spec.rb | 14 +- src/spec/models/pool_family_spec.rb | 10 +- src/spec/models/provider_account_observer_spec.rb | 22 ++ src/spec/models/provider_account_spec.rb | 80 ++++++++ src/spec/models/provider_spec.rb | 12 +- src/spec/models/quota_spec.rb | 48 +++--- .../services/data_service_active_record_spec.rb | 58 +++--- src/test/fixtures/providers.yml | 2 +- src/test/fixtures/roles.yml | 4 +- src/test/unit/cloud_account_test.rb | 8 - src/test/unit/provider_account_test.rb | 8 + src/test/unit/provider_test.rb | 2 +- 99 files changed, 1249 insertions(+), 1006 deletions(-) delete mode 100644 src/app/controllers/cloud_accounts_controller.rb create mode 100644 src/app/controllers/provider_accounts_controller.rb create mode 100644 src/app/helpers/admin/provider_accounts_helper.rb delete mode 100644 src/app/models/cloud_account.rb delete mode 100644 src/app/models/cloud_account_observer.rb create mode 100644 src/app/models/provider_account.rb create mode 100644 src/app/models/provider_account_observer.rb create mode 100644 src/app/views/admin/provider_accounts/_aws.haml create mode 100644 src/app/views/admin/provider_accounts/_gogrid.haml create mode 100644 src/app/views/admin/provider_accounts/_mock.haml create mode 100644 src/app/views/admin/provider_accounts/_opennebula.haml create mode 100644 src/app/views/admin/provider_accounts/_provider_selection.haml create mode 100644 src/app/views/admin/provider_accounts/_rackspace.haml create mode 100644 src/app/views/admin/provider_accounts/_rhevm.haml delete mode 100644 src/app/views/cloud_accounts/_form.haml delete mode 100644 src/app/views/cloud_accounts/edit.haml delete mode 100644 src/app/views/cloud_accounts/index.haml delete mode 100644 src/app/views/cloud_accounts/new.haml create mode 100644 src/app/views/provider_accounts/_form.haml create mode 100644 src/app/views/provider_accounts/edit.haml create mode 100644 src/app/views/provider_accounts/index.haml create mode 100644 src/app/views/provider_accounts/new.haml create mode 100644 src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb create mode 100644 src/db/migrate/20110125123410_rename_cloud_account_id_for_instances.rb create mode 100644 src/db/migrate/20110125154113_rename_cloud_accounts_pool_families_to_provider_accounts_pool_families.rb create mode 100644 src/db/migrate/20110126161751_change_null_properties_of_columns_in_provider_accounts.rb create mode 100644 src/db/migrate/20110131160540_rename_cloud_type_to_provider_type_in_providers.rb delete mode 100644 src/spec/controllers/cloud_accounts_controller_spec.rb create mode 100644 src/spec/controllers/provider_accounts_controller_spec.rb delete mode 100644 src/spec/factories/cloud_account.rb create mode 100644 src/spec/factories/provider_account.rb delete mode 100644 src/spec/models/cloud_account_observer_spec.rb delete mode 100644 src/spec/models/cloud_account_spec.rb create mode 100644 src/spec/models/provider_account_observer_spec.rb create mode 100644 src/spec/models/provider_account_spec.rb delete mode 100644 src/test/unit/cloud_account_test.rb create mode 100644 src/test/unit/provider_account_test.rb
diff --git a/src/app/controllers/admin/provider_accounts_controller.rb b/src/app/controllers/admin/provider_accounts_controller.rb index d422a53..40b700b 100644 --- a/src/app/controllers/admin/provider_accounts_controller.rb +++ b/src/app/controllers/admin/provider_accounts_controller.rb @@ -8,7 +8,7 @@ class Admin::ProviderAccountsController < ApplicationController if @search_term.blank? load_accounts else - search = CloudAccount.search do + search = ProviderAccount.search do keywords(params[:q]) end @accounts = search.results @@ -17,7 +17,7 @@ class Admin::ProviderAccountsController < ApplicationController
def show @tab_captions = ['Properties', 'Credentials', 'History', 'Permissions'] - @account = CloudAccount.find(params[:id]) + @account = ProviderAccount.find(params[:id]) require_privilege(Privilege::VIEW, @account) @details_tab = params[:details_tab].blank? ? 'properties' : params[:details_tab]
@@ -38,71 +38,77 @@ class Admin::ProviderAccountsController < ApplicationController end
def new - @cloud_account = CloudAccount.new + @provider_account = ProviderAccount.new @quota = Quota.new @providers = Provider.all + if @providers.empty? + flash[:error] = "You don't have any provider yet. Please create one!" + else + @selected_provider = @providers.first unless @providers.blank? + end end
def create - @provider = Provider.find(params[:provider_id]) - require_privilege(Privilege::CREATE, CloudAccount, @provider) + @selected_provider = @provider = Provider.find(params[:select_provider]) + require_privilege(Privilege::CREATE, ProviderAccount, @provider)
@providers = Provider.all - @cloud_account = CloudAccount.new(params[:cloud_account]) - @cloud_account.provider = @provider - @cloud_account.quota = @quota = Quota.new + @provider_account = ProviderAccount.new(params[:provider_account]) + @provider_account.provider = @provider + @provider_account.quota = @quota = Quota.new
if params.delete :test_account - test_account(@cloud_account) + test_account(@provider_account) render :action => 'new' and return end
limit = params[:quota][:maximum_running_instances] if params[:quota] - @cloud_account.quota.set_maximum_running_instances(limit) + @provider_account.quota.set_maximum_running_instances(limit)
- if @cloud_account.invalid? - if not @cloud_account.valid_credentials? + if @provider_account.invalid? + if not @provider_account.valid_credentials? flash.now[:error] = "The entered credential information is incorrect" - elsif @cloud_account.errors.on(:username) - flash.now[:error] = "The access key '#{params[:cloud_account][:username]}' has already been taken." + elsif @provider_account.errors.on(:username) + flash.now[:error] = "The access key '#{params[:provider_account][:username]}' has already been taken." else flash.now[:error] = "You must fill in all the required fields" end render :action => 'new' and return end
- @cloud_account.pool_families << PoolFamily.default - @cloud_account.save! - if @cloud_account.populate_realms + @provider_account.pool_families << PoolFamily.default + @provider_account.save! + if @provider_account.populate_realms flash[:notice] = "Provider account added." end - redirect_to admin_provider_account_path(@cloud_account) + redirect_to admin_provider_account_path(@provider_account) kick_condor end
def edit - @cloud_account = CloudAccount.find(params[:id]) - @quota = @cloud_account.quota - @provider = @cloud_account.provider - require_privilege(Privilege::MODIFY,@cloud_account) + @provider_account = ProviderAccount.find(params[:id]) + @quota = @provider_account.quota + @provider = @provider_account.provider + require_privilege(Privilege::MODIFY,@provider_account) end
def update - @cloud_account = CloudAccount.find(params[:id]) - @provider = @cloud_account.provider - require_privilege(Privilege::MODIFY,@cloud_account) - @quota = @cloud_account.quota + @provider_account = ProviderAccount.find(params[:id]) + @provider = @provider_account.provider + require_privilege(Privilege::ACCOUNT_MODIFY, @provider) + require_privilege(Privilege::MODIFY,@provider_account) + @quota = @provider_account.quota
if params.delete :test_account - test_account(@cloud_account) + test_account(@provider_account) render :action => 'edit' and return end
limit = params[:quota][:maximum_running_instances] if params[:quota] - @cloud_account.quota.set_maximum_running_instances(limit) - if @cloud_account.update_attributes(params[:cloud_account]) - flash[:notice] = "Cloud Account updated!" - redirect_to admin_provider_account_path(@cloud_account) + @provider_account.quota.set_maximum_running_instances(limit) + if @provider_account.update_attributes(params[:provider_account]) + flash[:notice] = "Provider Account updated!" + redirect_to admin_provider_account_path(@provider_account) else render :action => :edit end @@ -112,13 +118,30 @@ class Admin::ProviderAccountsController < ApplicationController if (not params[:accounts_selected]) or (params[:accounts_selected].length == 0) flash[:notice] = "You must select some accounts first." else - CloudAccount.find(params[:accounts_selected]).each do |account| + ProviderAccount.find(params[:accounts_selected]).each do |account| account.destroy if check_privilege(Privilege::MODIFY, account) end end redirect_to admin_provider_accounts_url end
+ def set_selected_provider + @quota = Quota.new + @provider_account = ProviderAccount.new + respond_to do |format| + format.js { + @providers = Provider.find(:all) + @selected_provider = Provider.find(params[:select_provider]) + render :partial => 'provider_selection' + } + format.html { + @providers = Provider.find(:all) + @selected_provider = Provider.find(params[:select_provider]) + render :action => 'new', :layout => true + } + end + end + protected
def test_account(account) @@ -135,12 +158,13 @@ class Admin::ProviderAccountsController < ApplicationController @header = [ { :name => "Name", :sort_attr => :name }, { :name => "Username", :sort_attr => :username}, + { :name => "Provider Type", :sort_attr => :provider_type } ] @url_params = params end
def load_accounts - @accounts = CloudAccount.paginate(:all, + @accounts = ProviderAccount.paginate(:all, :page => params[:page] || 1, :order => (params[:order_field] || 'label') +' '+ (params[:order_dir] || 'asc') ) diff --git a/src/app/controllers/admin/providers_controller.rb b/src/app/controllers/admin/providers_controller.rb index a898d72..be799da 100644 --- a/src/app/controllers/admin/providers_controller.rb +++ b/src/app/controllers/admin/providers_controller.rb @@ -52,7 +52,7 @@ class Admin::ProvidersController < ApplicationController test_connection(@provider) render :action => 'new' else - @provider.set_cloud_type! + #@provider.set_provider_type! if @provider.save && @provider.populate_hardware_profiles flash[:notice] = "Provider added." redirect_to admin_providers_path @@ -67,14 +67,14 @@ class Admin::ProvidersController < ApplicationController def update @provider = Provider.find_by_id(params[:id]) require_privilege(Privilege::MODIFY, @provider) - previous_cloud_type = @provider.cloud_type + previous_provider_type = @provider.provider_type @provider.update_attributes(params[:provider]) if params[:test_connection] test_connection(@provider) render :action => 'edit' else - @provider.set_cloud_type! - if previous_cloud_type != @provider.cloud_type + @provider.set_provider_type! + if previous_provider_type != @provider.provider_type @provider.errors.add :url, "points to a different provider" end
@@ -116,7 +116,8 @@ class Admin::ProvidersController < ApplicationController
def load_providers @header = [{ :name => "Provider name", :sort_attr => :name }, - { :name => "Provider URL", :sort_attr => :name } + { :name => "Provider URL", :sort_attr => :name }, + { :name => "Provider Type", :sort_attr => :name } ] @providers = Provider.list_for_user(@current_user, Privilege::VIEW) @url_params = params.clone diff --git a/src/app/controllers/cloud_accounts_controller.rb b/src/app/controllers/cloud_accounts_controller.rb deleted file mode 100644 index d292f57..0000000 --- a/src/app/controllers/cloud_accounts_controller.rb +++ /dev/null @@ -1,181 +0,0 @@ -# -# Copyright (C) 2010 Red Hat, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; version 2 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -# MA 02110-1301, USA. A copy of the GNU General Public License is -# also available at http://www.gnu.org/copyleft/gpl.html. - -# Filters added to this controller apply to all controllers in the application. -# Likewise, all the methods added will be available for all controllers. - -class CloudAccountsController < ApplicationController - before_filter :require_user - before_filter :load_providers - - helper :providers - - def section_id - 'administration' - end - - def index - @provider = Provider.find(params[:provider_id]) - require_privilege(Privilege::VIEW, CloudAccount, @provider) - end - - def new - @provider = Provider.find(params[:provider_id]) - @cloud_account = CloudAccount.new - @quota = Quota.new - require_privilege(Privilege::CREATE, CloudAccount, @provider) - end - - def create - @provider = Provider.find(params[:provider_id]) - require_privilege(Privilege::CREATE, CloudAccount, @provider) - @cloud_account = CloudAccount.new(params[:cloud_account]) - @cloud_account.provider = @provider - @cloud_account.quota = @quota = Quota.new - - if params[:test_account] - test_account(@cloud_account) - render :action => 'new' and return - end - - limit = params[:quota][:maximum_running_instances] if params[:quota] - @cloud_account.quota.set_maximum_running_instances(limit) - - if @cloud_account.invalid? - if not @cloud_account.valid_credentials? - flash.now[:error] = "The entered credential information is incorrect" - elsif @cloud_account.errors.on(:username) - flash.now[:error] = "The access key '#{params[:cloud_account][:username]}' has already been taken." - else - flash.now[:error] = "You must fill in all the required fields" - end - render :action => 'new' and return - end - - @cloud_account.pool_families << PoolFamily.default - @cloud_account.save! - if @cloud_account.populate_realms - flash[:notice] = "Provider account added." - end - redirect_to provider_accounts_path(@provider) - kick_condor - end - - def edit - @cloud_account = CloudAccount.find(params[:id]) - @quota = @cloud_account.quota - @provider = @cloud_account.provider - require_privilege(Privilege::MODIFY, @cloud_account) - end - - def update_accounts - @provider = Provider.find(params[:provider][:id]) - require_privilege(Privilege::MODIFY, CloudAccount, @provider) - @providers = Provider.list_for_user(@current_user, Privilege::VIEW) - - success = true - @provider.cloud_accounts.each do |cloud_account| - attributes = params[:cloud_accounts][cloud_account.id.to_s] - - password = attributes[:password] - # blank password means the user didn't change it -- don't update it then - if password.blank? - attributes.delete :password - end - cloud_account.quota.maximum_running_instances = quota_from_string(params[:quota][cloud_account.id.to_s][:maximum_running_instances]) - - private_cert = attributes[:x509_cert_priv_file] - unless private_cert.blank? - attributes[:x509_cert_priv] = private_cert.read - end - attributes.delete :x509_cert_priv_file - - public_cert = attributes[:x509_cert_pub_file] - unless public_cert.blank? - attributes[:x509_cert_pub] = public_cert.read - end - attributes.delete :x509_cert_pub_file - - begin - cloud_account.update_attributes!(attributes) - cloud_account.quota.save! - rescue - success = false - end - end - if success - flash[:notice] = "Account updated." - redirect_to :controller => 'providers', :action => 'accounts', :id => @provider - else - flash.now[:notice] = "Error updating the cloud account." - render :template => 'provider/accounts' - end - end - - def update - @cloud_account = CloudAccount.find(params[:id]) - @provider = @cloud_account.provider - require_privilege(Privilege::MODIFY, @cloud_account) - @quota = @cloud_account.quota - - limit = params[:quota][:maximum_running_instances] if params[:quota] - @cloud_account.quota.set_maximum_running_instances(limit) - if @cloud_account.update_attributes(params[:cloud_account]) - flash[:notice] = "Cloud Account updated!" - redirect_to provider_accounts_path(@provider) - else - render :action => :edit - end - end - - def key - @cloud_account = CloudAccount.find(params[:id]) - require_privilege(Privilege::MODIFY,@cloud_account) - unless @cloud_account.instance_key.nil? - render :text => @cloud_account.instance_key.pem - end - end - - def destroy - account = CloudAccount.find(params[:id]) - provider = account.provider - require_privilege(Privilege::MODIFY, account) - if account.destroy - flash[:notice] = "Cloud Account destroyed" - else - flash[:error] = "Cloud Account could not be destroyed" - end - redirect_to provider_accounts_path(provider) - end - - def test_account(account) - if account.valid_credentials? - flash.now[:notice] = "Test Connection Success: Valid Account Details" - else - flash.now[:error] = "Test Connection Failed: Invalid Account Details" - end - rescue - flash.now[:error] = "Test Connection Failed: Could not connect to provider" - end - - private - - def load_providers - @providers = Provider.list_for_user(@current_user, Privilege::VIEW) - end -end diff --git a/src/app/controllers/dashboard_controller.rb b/src/app/controllers/dashboard_controller.rb index 5254dd7..17feedc 100644 --- a/src/app/controllers/dashboard_controller.rb +++ b/src/app/controllers/dashboard_controller.rb @@ -40,8 +40,8 @@ class DashboardController < ApplicationController end
def quota_usage_graph - if params[:cloud_account_id] - params[:parent] = CloudAccount.find(params[:cloud_account_id]) + if params[:provider_account_id] + params[:parent] = ProviderAccount.find(params[:provider_account_id]) elsif params[:pool_id] params[:parent] = Pool.find(params[:pool_id]) else @@ -67,7 +67,7 @@ class DashboardController < ApplicationController
def index # FIXME filter to just those that the user has access to - @cloud_accounts = CloudAccount.find(:all) + @cloud_accounts = ProviderAccount.find(:all)
render :action => 'monitor' diff --git a/src/app/controllers/permissions_controller.rb b/src/app/controllers/permissions_controller.rb index 622f776..380b97c 100644 --- a/src/app/controllers/permissions_controller.rb +++ b/src/app/controllers/permissions_controller.rb @@ -67,20 +67,20 @@ class PermissionsController < ApplicationController
def set_permission_object(action) if !params[:permission_object_type].nil? - @permission_object = + @permission_object = params[:permission_object_type].constantize.find(params[:permission_object_id]) elsif !params[:pool_id].nil? @permission_object = Pool.find params[:pool_id] elsif !params[:provider_id].nil? @permission_object = Provider.find params[:provider_id] elsif !params[:cloud_account_id].nil? - @permission_object = CloudAccount.find params[:cloud_account_id] + @permission_object = ProviderAccount.find params[:cloud_account_id] elsif !params[:base_permission_object_id].nil? @permission_object = BasePermissionObject.find params[:base_permission_object_id] else @permission_object = BasePermissionObject.general_permission_scope end - + raise ActiveRecord::RecordNotFound if @permission_object.nil?
require_privilege(action, @permission_object) diff --git a/src/app/controllers/provider_accounts_controller.rb b/src/app/controllers/provider_accounts_controller.rb new file mode 100644 index 0000000..962bca7 --- /dev/null +++ b/src/app/controllers/provider_accounts_controller.rb @@ -0,0 +1,181 @@ +# +# Copyright (C) 2010 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. A copy of the GNU General Public License is +# also available at http://www.gnu.org/copyleft/gpl.html. + +# Filters added to this controller apply to all controllers in the application. +# Likewise, all the methods added will be available for all controllers. + +class ProviderAccountsController < ApplicationController + before_filter :require_user + before_filter :load_providers + + helper :providers + + def section_id + 'administration' + end + + def index + @provider = Provider.find(params[:provider_id]) + require_privilege(Privilege::VIEW, ProviderAccount, @provider) + end + + def new + @provider = Provider.find(params[:provider_id]) + @provider_account = ProviderAccount.new + @quota = Quota.new + require_privilege(Privilege::CREATE, ProviderAccount, @provider) + end + + def create + @provider = Provider.find(params[:provider_id]) + require_privilege(Privilege::CREATE, ProviderAccount, @provider) + @provider_account = ProviderAccount.new(params[:provider_account]) + @provider_account.provider = @provider + @provider_account.quota = @quota = Quota.new + + if params[:test_account] + test_account(@provider_account) + render :action => 'new' and return + end + + limit = params[:quota][:maximum_running_instances] if params[:quota] + @provider_account.quota.set_maximum_running_instances(limit) + + if @provider_account.invalid? + if not @provider_account.valid_credentials? + flash.now[:error] = "The entered credential information is incorrect" + elsif @provider_account.errors.on(:username) + flash.now[:error] = "The access key '#{params[:provider_account][:username]}' has already been taken." + else + flash.now[:error] = "You must fill in all the required fields" + end + render :action => 'new' and return + end + + @provider_account.pool_families << PoolFamily.default + @provider_account.save! + if @provider_account.populate_realms + flash[:notice] = "Provider account added." + end + redirect_to provider_accounts_path(@provider) + kick_condor + end + + def edit + @provider_account = ProviderAccount.find(params[:id]) + @quota = @provider_account.quota + @provider = @provider_account.provider + require_privilege(Privilege::MODIFY, @provider_account) + end + + def update_accounts + @provider = Provider.find(params[:provider][:id]) + require_privilege(Privilege::MODIFY, ProviderAccount, @provider) + @providers = Provider.list_for_user(@current_user, Privilege::VIEW) + + success = true + @provider.provider_accounts.each do |provider_account| + attributes = params[:provider_accounts][provider_account.id.to_s] + + password = attributes[:password] + # blank password means the user didn't change it -- don't update it then + if password.blank? + attributes.delete :password + end + provider_account.quota.maximum_running_instances = quota_from_string(params[:quota][provider_account.id.to_s][:maximum_running_instances]) + + private_cert = attributes[:x509_cert_priv_file] + unless private_cert.blank? + attributes[:x509_cert_priv] = private_cert.read + end + attributes.delete :x509_cert_priv_file + + public_cert = attributes[:x509_cert_pub_file] + unless public_cert.blank? + attributes[:x509_cert_pub] = public_cert.read + end + attributes.delete :x509_cert_pub_file + + begin + provider_account.update_attributes!(attributes) + provider_account.quota.save! + rescue + success = false + end + end + if success + flash[:notice] = "Account updated." + redirect_to :controller => 'providers', :action => 'accounts', :id => @provider + else + flash.now[:notice] = "Error updating the cloud account." + render :template => 'provider/accounts' + end + end + + def update + @provider_account = ProviderAccount.find(params[:id]) + @provider = @provider_account.provider + require_privilege(Privilege::MODIFY, @provider_account) + @quota = @provider_account.quota + + limit = params[:quota][:maximum_running_instances] if params[:quota] + @provider_account.quota.set_maximum_running_instances(limit) + if @provider_account.update_attributes(params[:provider_account]) + flash[:notice] = "Cloud Account updated!" + redirect_to provider_accounts_path(@provider) + else + render :action => :edit + end + end + + def key + @provider_account = ProviderAccount.find(params[:id]) + require_privilege(Privilege::MODIFY,@provider_account) + unless @provider_account.instance_key.nil? + render :text => @provider_account.instance_key.pem + end + end + + def destroy + account = ProviderAccount.find(params[:id]) + provider = account.provider + require_privilege(Privilege::MODIFY, account) + if account.destroy + flash[:notice] = "Cloud Account destroyed" + else + flash[:error] = "Cloud Account could not be destroyed" + end + redirect_to provider_accounts_path(provider) + end + + def test_account(account) + if account.valid_credentials? + flash.now[:notice] = "Test Connection Success: Valid Account Details" + else + flash.now[:error] = "Test Connection Failed: Invalid Account Details" + end + rescue + flash.now[:error] = "Test Connection Failed: Could not connect to provider" + end + + private + + def load_providers + @providers = Provider.list_for_user(@current_user, Privilege::VIEW) + end +end diff --git a/src/app/controllers/providers_controller.rb b/src/app/controllers/providers_controller.rb index 57b4240..9167c25 100644 --- a/src/app/controllers/providers_controller.rb +++ b/src/app/controllers/providers_controller.rb @@ -57,7 +57,7 @@ class ProvidersController < ApplicationController test_connection(@provider) render :action => "new" else - @provider.set_cloud_type! + @provider.set_provider_type! if @provider.save && @provider.populate_hardware_profiles flash[:notice] = "Provider added." redirect_to :action => "show", :id => @provider @@ -73,15 +73,15 @@ class ProvidersController < ApplicationController @providers = Provider.list_for_user(@current_user, Privilege::MODIFY) @provider = Provider.find(:first, :conditions => {:id => params[:id]}) require_privilege(Privilege::MODIFY, @provider) - previous_cloud_type = @provider.cloud_type + previous_provider_type = @provider.provider_type
@provider.update_attributes(params[:provider]) if params[:test_connection] test_connection(@provider) render :action => "edit" else - @provider.set_cloud_type! - if previous_cloud_type != @provider.cloud_type + @provider.set_provider_type! + if previous_provider_type != @provider.provider_type @provider.errors.add :url, "points to a different provider" end
diff --git a/src/app/controllers/quotas_controller.rb b/src/app/controllers/quotas_controller.rb index cfa85fb..0beb386 100644 --- a/src/app/controllers/quotas_controller.rb +++ b/src/app/controllers/quotas_controller.rb @@ -77,7 +77,7 @@ class QuotasController < ApplicationController if params[:parent_type] == "pool" return Pool.find(params[:id]) elsif params[:parent_type] == "cloud_account" - return CloudAccount.find(params[:id]) + return ProviderAccount.find(params[:id]) end #TODO Throw no match to pool or cloud account exception end diff --git a/src/app/helpers/admin/provider_accounts_helper.rb b/src/app/helpers/admin/provider_accounts_helper.rb new file mode 100644 index 0000000..d4c234d --- /dev/null +++ b/src/app/helpers/admin/provider_accounts_helper.rb @@ -0,0 +1,21 @@ +module Admin::ProviderAccountsHelper + + def display_provider_account_login_form(provider_type) + case provider_type + when 0 + render :partial => "mock" + when 1 + render :partial => "aws" + when 2 + render :partial => "gogrid" + when 3 + render :partial => "rackspace" + when 4 + render :partial => "rhevm" + when 5 + render :partial => "opennebula" + else + flash.now[:warning] = "You don't have any provider yet" + end + end +end diff --git a/src/app/models/cloud_account.rb b/src/app/models/cloud_account.rb deleted file mode 100644 index 4eba087..0000000 --- a/src/app/models/cloud_account.rb +++ /dev/null @@ -1,205 +0,0 @@ - # -# Copyright (C) 2009 Red Hat, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; version 2 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -# MA 02110-1301, USA. A copy of the GNU General Public License is -# also available at http://www.gnu.org/copyleft/gpl.html. - -# Filters added to this controller apply to all controllers in the application. -# Likewise, all the methods added will be available for all controllers. - -require 'nokogiri' -require 'sunspot_rails' - -class CloudAccount < ActiveRecord::Base - - searchable do - text :name, :as => :code_substring - text :username, :as => :code_substring - end - - include PermissionedObject - - # Relations - belongs_to :provider - belongs_to :quota, :autosave => true - has_many :instances - has_and_belongs_to_many :pool_families - has_many :permissions, :as => :permission_object, :dependent => :destroy, - :include => [:role], - :order => "permissions.id ASC" - - has_one :instance_key, :as => :instance_key_owner, :dependent => :destroy - - # Helpers - attr_accessor :x509_cert_priv_file, :x509_cert_pub_file - - # Validations - validates_presence_of :provider - validates_presence_of :label - validates_presence_of :username - validates_uniqueness_of :username, :scope => :provider_id - validates_presence_of :password - validates_presence_of :account_number - validate :validate_presence_of_x509_certs - validate :validate_credentials - - # We're using this instead of <tt>validates_presence_of</tt> helper because - # we want to show errors on different attributes ending with '_file'. - def validate_presence_of_x509_certs - errors.add(:x509_cert_pub_file, "can't be blank") if x509_cert_pub.blank? - errors.add(:x509_cert_priv_file, "can't be blank") if x509_cert_priv.blank? - end - - def validate_credentials - unless valid_credentials? - errors.add(:base, "Login Credentials are Invalid for this Provider") - end - end - - # Hooks - before_destroy :destroyable? - before_validation :read_x509_files - - def object_list - super << provider - end - class << self - alias orig_list_for_user_include list_for_user_include - alias orig_list_for_user_conditions list_for_user_conditions - end - - def self.list_for_user_include - includes = orig_list_for_user_include - includes << { :provider => {:permissions => {:role => :privileges}}} - includes - end - - def self.list_for_user_conditions - "(#{orig_list_for_user_conditions}) or - (permissions_providers.user_id=:user and - privileges_roles.target_type=:target_type and - privileges_roles.action=:action)" - end - - def destroyable? - instances.empty? - end - - def read_x509_files - if x509_cert_pub_file.respond_to?(:read) - x509_cert_pub_file.rewind # Sometimes the file has to rewind, becuase something already read from it. - self.x509_cert_pub = x509_cert_pub_file.read - end - if x509_cert_priv_file.respond_to?(:read) - x509_cert_priv_file.rewind - self.x509_cert_priv = x509_cert_priv_file.read - end - end - - def connect - begin - return DeltaCloud.new(username, password, provider.url) - rescue Exception => e - logger.error("Error connecting to framework: #{e.message}") - logger.error("Backtrace: #{e.backtrace.join("\n")}") - return nil - end - end - - def self.find_or_create(account) - a = CloudAccount.find_by_username_and_provider_id(account["username"], account["provider_id"]) - return a.nil? ? CloudAccount.new(account) : a - end - - def pools - pools = [] - instances.each do |instance| - pools << instance.pool - end - end - - def name - label.blank? ? username : label - end - - # FIXME: for already-mapped accounts, update rather than add new - def populate_realms - client = connect - realms = client.realms - # FIXME: this should probably be in the same transaction as cloud_account.save - self.transaction do - realms.each do |realm| - #ignore if it exists - #FIXME: we need to handle keeping in sync forupdates as well as - # account permissions - unless Realm.find_by_external_key_and_provider_id(realm.id, - provider.id) - ar_realm = Realm.new(:external_key => realm.id, - :name => realm.name ? realm.name : realm.id, - :provider_id => provider.id) - ar_realm.save! - - frontend_realm = Realm.new(:external_key => ar_realm.external_key, - :name => ar_realm.name, - :provider_id => nil) - - available_realms = Realm.frontend.find(:all, :conditions => { - :external_key => frontend_realm.external_key }) - - if available_realms.empty? - frontend_realm.backend_realms << ar_realm - frontend_realm.save! - else - available_realms.each do |r| - r.backend_realms << ar_realm - end - end - end - end - end - end - - def valid_credentials? - DeltaCloud::valid_credentials?(username, password, provider.url) - end - - def build_credentials - xml = Nokogiri::XML <<EOT -<?xml version="1.0"?> -<provider_credentials> - <ec2_credentials> - <account_number></account_number> - <access_key></access_key> - <secret_access_key></secret_access_key> - <certificate></certificate> - <key></key> - </ec2_credentials> -</provider_credentials> -EOT - node = xml.at_xpath('/provider_credentials/ec2_credentials') - node.at_xpath('./account_number').content = account_number - node.at_xpath('./access_key').content = username - node.at_xpath('./secret_access_key').content = password - node.at_xpath('./certificate').content = x509_cert_pub - node.at_xpath('./key').content = x509_cert_priv - return xml.to_s - end - - def generate_auth_key - client = connect - return nil unless client && client.feature?(:instances, :authentication_key) - client.create_key(:name => "#{self.name}_#{Time.now.to_i}_key_#{self.object_id}") - end -end diff --git a/src/app/models/cloud_account_observer.rb b/src/app/models/cloud_account_observer.rb deleted file mode 100644 index a0826ea..0000000 --- a/src/app/models/cloud_account_observer.rb +++ /dev/null @@ -1,9 +0,0 @@ -class CloudAccountObserver < ActiveRecord::Observer - def after_create(account) - if key = account.generate_auth_key - account.update_attribute(:instance_key, InstanceKey.create!(:pem => key.pem, :name => key.id, :instance_key_owner => account)) - end - end -end - -CloudAccountObserver.instance diff --git a/src/app/models/image.rb b/src/app/models/image.rb index 8962bf1..42f9a69 100644 --- a/src/app/models/image.rb +++ b/src/app/models/image.rb @@ -52,7 +52,7 @@ class Image < ActiveRecord::Base INACTIVE_STATES = [STATE_COMPLETE, STATE_FAILED, STATE_CANCELED]
def self.available_targets - return YAML.load_file("#{RAILS_ROOT}/config/image_descriptor_targets.yml") + Provider::PROVIDER_TYPES.invert end
def generate_uuid @@ -129,7 +129,7 @@ class Image < ActiveRecord::Base image = Image.new( :name => raw_image.name, :status => 'complete', - :target => account.provider.cloud_type, + :target => account.provider.provider_type, :template_id => template.id ) image.save! @@ -155,7 +155,7 @@ class Image < ActiveRecord::Base raise "There is not provider with name '#{providername}'" end
- account = CloudAccount.new(:provider => provider, :username => username, :password => password) + account = ProviderAccount.new(:provider => provider, :username => username, :password => password)
unless account.valid_credentials? raise "Invalid credentials for provider '#{providername}'" diff --git a/src/app/models/instance.rb b/src/app/models/instance.rb index b84a596..3d24404 100644 --- a/src/app/models/instance.rb +++ b/src/app/models/instance.rb @@ -36,7 +36,7 @@ class Instance < ActiveRecord::Base @@per_page = 15
belongs_to :pool - belongs_to :cloud_account + belongs_to :provider_account
belongs_to :hardware_profile belongs_to :template diff --git a/src/app/models/instance_observer.rb b/src/app/models/instance_observer.rb index 80b39c5..e14e8d2 100644 --- a/src/app/models/instance_observer.rb +++ b/src/app/models/instance_observer.rb @@ -36,9 +36,9 @@ class InstanceObserver < ActiveRecord::Observer hwp = an_instance.hardware_profile pool = an_instance.pool user = an_instance.owner - cloud_account = an_instance.cloud_account + provider_account = an_instance.provider_account
- [cloud_account, pool, user].each do |parent| + [provider_account, pool, user].each do |parent| if parent quota = parent.quota if quota @@ -65,7 +65,7 @@ class InstanceObserver < ActiveRecord::Observer # we try to generate key only when instance is running # and instance_key is not generated yet return if instance.state != Instance::STATE_RUNNING or instance.instance_key - if key = instance.cloud_account.generate_auth_key + if key = instance.provider_account.generate_auth_key instance.instance_key = InstanceKey.create!(:pem => key.pem, :name => key.id, :instance_key_owner => instance) end end diff --git a/src/app/models/instance_task.rb b/src/app/models/instance_task.rb index be76a6e..42bed29 100644 --- a/src/app/models/instance_task.rb +++ b/src/app/models/instance_task.rb @@ -46,7 +46,7 @@ class InstanceTask < Task actions = [] # FIXME: cloud_account won't always be set here, but we're requiring # front end realm for now. - if cloud_account = instance.cloud_account and + if cloud_account = instance.provider_account and conn = cloud_account.connect and c_state = conn.instance_state(state) transitions = c_state.transitions transitions.each do |transition| diff --git a/src/app/models/permission.rb b/src/app/models/permission.rb index 22b228a..7cd02a1 100644 --- a/src/app/models/permission.rb +++ b/src/app/models/permission.rb @@ -37,7 +37,7 @@ class Permission < ActiveRecord::Base :foreign_key => "permission_object_id" belongs_to :provider, :class_name => "Provider", :foreign_key => "permission_object_id" - belongs_to :cloud_account, :class_name => "CloudAccount", + belongs_to :provider_account, :class_name => "ProviderAccount", :foreign_key => "permission_object_id" belongs_to :template, :class_name => "Template", :foreign_key => "permission_object_id" diff --git a/src/app/models/pool.rb b/src/app/models/pool.rb index 550ca79..0f9a4fb 100644 --- a/src/app/models/pool.rb +++ b/src/app/models/pool.rb @@ -47,8 +47,8 @@ class Pool < ActiveRecord::Base def cloud_accounts accounts = [] instances.each do |instance| - if instance.cloud_account and !accounts.include?(instance.cloud_account) - accounts << instance.cloud_account + if instance.provider_account and !accounts.include?(instance.provider_account) + accounts << instance.provider_account end end end diff --git a/src/app/models/pool_family.rb b/src/app/models/pool_family.rb index bc96fee..e083920 100644 --- a/src/app/models/pool_family.rb +++ b/src/app/models/pool_family.rb @@ -24,7 +24,7 @@ class PoolFamily < ActiveRecord::Base DEFAULT_POOL_FAMILY_KEY = "default_pool_family"
has_many :pools, :dependent => :destroy - has_and_belongs_to_many :cloud_accounts + has_and_belongs_to_many :provider_accounts
validates_presence_of :name validates_uniqueness_of :name diff --git a/src/app/models/privilege.rb b/src/app/models/privilege.rb index f7a61ef..1ef514c 100644 --- a/src/app/models/privilege.rb +++ b/src/app/models/privilege.rb @@ -33,7 +33,7 @@ class Privilege < ActiveRecord::Base # Deployable: choose this deployable to launch # Instance: may perform actions on this instance # Realm: may map this realm - # CloudAccount: May add this account to PoolFamily + # ProviderAccount: May add this account to PoolFamily
ACTIONS = [ CREATE, MODIFY, USE, VIEW, @@ -47,7 +47,7 @@ class Privilege < ActiveRecord::Base HardwareProfile => ACTIONS - [USE, VIEW], Realm => ACTIONS - [VIEW], Provider => ACTIONS - [USE], - CloudAccount => ACTIONS, + ProviderAccount => ACTIONS, User => [ CREATE, MODIFY, VIEW] }
belongs_to :role @@ -99,7 +99,7 @@ class Privilege < ActiveRecord::Base # view_perms Can view permissions # set_perms Can set permissions (or can set instance permissions on this pool) # - # Quota The Pool/CloudAccount/PoolFamily/User assigned the quota + # Quota The Pool/ProviderAccount/PoolFamily/User assigned the quota # view Can view quota on this obj # modify Can edit quota on this obj # @@ -123,7 +123,7 @@ class Privilege < ActiveRecord::Base # view_perms Can view permissions # set_perms Can set permissions # - # CloudAccount This CloudAccount + # ProviderAccount This ProviderAccount # view Can view # use Can map to PoolFamily # modify Can modify diff --git a/src/app/models/provider.rb b/src/app/models/provider.rb index 1e89958..7eb8a5d 100644 --- a/src/app/models/provider.rb +++ b/src/app/models/provider.rb @@ -29,7 +29,18 @@ class Provider < ActiveRecord::Base require 'util/deltacloud' include PermissionedObject
- has_many :cloud_accounts, :dependent => :destroy + MOCK = 0 + AWS = 1 + GOGRID = 2 + RACKSPACE = 3 + RHEVM = 4 + OPENNEBULA = 5 + + PROVIDER_TYPES = { MOCK => "mock", AWS => "AWS", + GOGRID => "GoGrid", RACKSPACE => "Rackspace", RHEVM => "RHEVM", + OPENNEBULA => "OpenNebula" } + + has_many :provider_accounts, :dependent => :destroy has_many :hardware_profiles, :dependent => :destroy has_many :replicated_images, :dependent => :destroy has_many :realms, :dependent => :destroy @@ -37,12 +48,13 @@ class Provider < ActiveRecord::Base validates_presence_of :name validates_uniqueness_of :name
- validates_presence_of :cloud_type validates_presence_of :url
validates_format_of :name, :with => /^[\w -]*$/n, :message => "must only contain: numbers, letters, spaces, '_' and '-'" validates_length_of :name, :maximum => 255
+ validates_inclusion_of :provider_type, :in => PROVIDER_TYPES + has_many :permissions, :as => :permission_object, :dependent => :destroy, :include => [:role], :order => "permissions.id ASC" @@ -53,8 +65,8 @@ class Provider < ActiveRecord::Base # but a cloud account is silently not destroyed when there is # an instance for the cloud account def destroyable? - unless self.cloud_accounts.empty? - self.cloud_accounts.each do |c| + unless self.provider_accounts.empty? + self.provider_accounts.each do |c| unless c.instances.empty? inst_list = c.instances.map {|i| i.name}.join(', ') self.errors.add_to_base "there are instances for cloud account '#{c.name}': #{inst_list}" @@ -64,10 +76,10 @@ class Provider < ActiveRecord::Base return self.errors.empty? end
- def set_cloud_type! - deltacloud = connect - self.cloud_type = deltacloud.driver_name unless deltacloud.nil? - end +# def set_provider_type! +# deltacloud = connect +# self.provider_type = deltacloud.driver_name unless deltacloud.nil? +# end
def connect begin @@ -117,16 +129,16 @@ class Provider < ActiveRecord::Base cloud_accounts.collect {|account| account.pools}.flatten.uniq end
- # returns first provider of cloud_type which has at least one cloud account - def self.find_by_target_with_account(cloud_type) - Provider.all(:conditions => {:cloud_type => cloud_type}).each do |p| - return p unless p.cloud_accounts.empty? + # returns first provider of provider_type which has at least one cloud account + def self.find_by_target_with_account(provider_type) + Provider.all(:conditions => {:provider_type => provider_type}).each do |p| + return p unless p.provider_accounts.empty? end nil end
# TODO: implement or remove - this is meant to contain a hash of - # supported cloud_types to use in populating form, though if we + # supported provider_types to use in populating form, though if we # infer that field, we don't need this. def supported_types end diff --git a/src/app/models/provider_account.rb b/src/app/models/provider_account.rb new file mode 100644 index 0000000..5ac9874 --- /dev/null +++ b/src/app/models/provider_account.rb @@ -0,0 +1,206 @@ + # +# Copyright (C) 2009 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. A copy of the GNU General Public License is +# also available at http://www.gnu.org/copyleft/gpl.html. + +# Filters added to this controller apply to all controllers in the application. +# Likewise, all the methods added will be available for all controllers. + +require 'nokogiri' +require 'sunspot_rails' + +class ProviderAccount < ActiveRecord::Base + include PermissionedObject + + searchable do + text :name, :as => :code_substring + text :username, :as => :code_substring + end + + # Relations + belongs_to :provider + belongs_to :quota, :autosave => true + has_many :instances + has_and_belongs_to_many :pool_families + has_many :permissions, :as => :permission_object, :dependent => :destroy, + :include => [:role], + :order => "permissions.id ASC" + + has_one :instance_key, :as => :instance_key_owner, :dependent => :destroy + + # Helpers + attr_accessor :x509_cert_priv_file, :x509_cert_pub_file + + # Validations + validates_presence_of :provider + validates_presence_of :label + validates_presence_of :username + validates_uniqueness_of :username, :scope => :provider_id + validates_presence_of :password + validates_presence_of :account_number,:if => Proc.new{ |account| account.provider.provider_type == Provider::AWS} + validate :validate_presence_of_x509_certs + validate :validate_credentials + + # We're using this instead of <tt>validates_presence_of</tt> helper because + # we want to show errors on different attributes ending with '_file'. + def validate_presence_of_x509_certs + if self.provider.provider_type == Provider::AWS + errors.add(:x509_cert_pub_file, "can't be blank") if x509_cert_pub.blank? + errors.add(:x509_cert_priv_file, "can't be blank") if x509_cert_priv.blank? + end + end + + def validate_credentials + unless valid_credentials? + errors.add(:base, "Login Credentials are Invalid for this Provider") + end + end + + # Hooks + before_destroy :destroyable? + before_validation :read_x509_files + + def object_list + super << provider + end + class << self + alias orig_list_for_user_include list_for_user_include + alias orig_list_for_user_conditions list_for_user_conditions + end + + def self.list_for_user_include + includes = orig_list_for_user_include + includes << { :provider => {:permissions => {:role => :privileges}}} + includes + end + + def self.list_for_user_conditions + "(#{orig_list_for_user_conditions}) or + (permissions_providers.user_id=:user and + privileges_roles.target_type=:target_type and + privileges_roles.action=:action)" + end + + def destroyable? + instances.empty? + end + + def read_x509_files + if x509_cert_pub_file.respond_to?(:read) + x509_cert_pub_file.rewind # Sometimes the file has to rewind, becuase something already read from it. + self.x509_cert_pub = x509_cert_pub_file.read + end + if x509_cert_priv_file.respond_to?(:read) + x509_cert_priv_file.rewind + self.x509_cert_priv = x509_cert_priv_file.read + end + end + + def connect + begin + return DeltaCloud.new(username, password, provider.url) + rescue Exception => e + logger.error("Error connecting to framework: #{e.message}") + logger.error("Backtrace: #{e.backtrace.join("\n")}") + return nil + end + end + + def self.find_or_create(account) + a = ProviderAccount.find_by_username_and_provider_id(account["username"], account["provider_id"]) + return a.nil? ? ProviderAccount.new(account) : a + end + + def pools + pools = [] + instances.each do |instance| + pools << instance.pool + end + end + + def name + label.blank? ? username : label + end + + # FIXME: for already-mapped accounts, update rather than add new + def populate_realms + client = connect + realms = client.realms + # FIXME: this should probably be in the same transaction as cloud_account.save + self.transaction do + realms.each do |realm| + #ignore if it exists + #FIXME: we need to handle keeping in sync forupdates as well as + # account permissions + unless Realm.find_by_external_key_and_provider_id(realm.id, + provider.id) + ar_realm = Realm.new(:external_key => realm.id, + :name => realm.name ? realm.name : realm.id, + :provider_id => provider.id) + ar_realm.save! + + frontend_realm = Realm.new(:external_key => ar_realm.external_key, + :name => ar_realm.name, + :provider_id => nil) + + available_realms = Realm.frontend.find(:all, :conditions => { + :external_key => frontend_realm.external_key }) + + if available_realms.empty? + frontend_realm.backend_realms << ar_realm + frontend_realm.save! + else + available_realms.each do |r| + r.backend_realms << ar_realm + end + end + end + end + end + end + + def valid_credentials? + DeltaCloud::valid_credentials?(username, password, provider.url) + end + + def build_credentials + xml = Nokogiri::XML <<EOT +<?xml version="1.0"?> +<provider_credentials> + <ec2_credentials> + <account_number></account_number> + <access_key></access_key> + <secret_access_key></secret_access_key> + <certificate></certificate> + <key></key> + </ec2_credentials> +</provider_credentials> +EOT + node = xml.at_xpath('/provider_credentials/ec2_credentials') + node.at_xpath('./account_number').content = account_number + node.at_xpath('./access_key').content = username + node.at_xpath('./secret_access_key').content = password + node.at_xpath('./certificate').content = x509_cert_pub + node.at_xpath('./key').content = x509_cert_priv + return xml.to_s + end + + def generate_auth_key + client = connect + return nil unless client && client.feature?(:instances, :authentication_key) + client.create_key(:name => "#{self.name}_#{Time.now.to_i}_key_#{self.object_id}") + end +end diff --git a/src/app/models/provider_account_observer.rb b/src/app/models/provider_account_observer.rb new file mode 100644 index 0000000..ddf19c6 --- /dev/null +++ b/src/app/models/provider_account_observer.rb @@ -0,0 +1,9 @@ +class ProviderAccountObserver < ActiveRecord::Observer + def after_create(account) + if key = account.generate_auth_key + account.update_attribute(:instance_key, InstanceKey.create!(:pem => key.pem, :name => key.id, :instance_key_owner => account)) + end + end +end + +ProviderAccountObserver.instance diff --git a/src/app/models/quota.rb b/src/app/models/quota.rb index 9f79e04..acb001a 100644 --- a/src/app/models/quota.rb +++ b/src/app/models/quota.rb @@ -22,7 +22,7 @@ class Quota < ActiveRecord::Base
has_one :pool - has_one :cloud_account + has_one :provider_account has_one :user
validates_numericality_of :maximum_total_instances, diff --git a/src/app/services/data_service_active_record.rb b/src/app/services/data_service_active_record.rb index 66da011..5833baa 100644 --- a/src/app/services/data_service_active_record.rb +++ b/src/app/services/data_service_active_record.rb @@ -65,7 +65,7 @@ class DataServiceActiveRecord data_points = [] free_instances = 0
- cloud_accounts = CloudAccount.find(:all, :conditions => {:provider_id => provider.id}) + cloud_accounts = ProviderAccount.find(:all, :conditions => {:provider_id => provider.id}) cloud_accounts.each do |cloud_account| quota = cloud_account.quota if quota @@ -175,11 +175,11 @@ class DataServiceActiveRecord instances = []
if parent.class == Provider - cloud_accounts = CloudAccount.find(:all, :conditions => {:provider_id => parent.id}) + cloud_accounts = ProviderAccount.find(:all, :conditions => {:provider_id => parent.id}) cloud_accounts.each do |cloud_account| instances.concat(cloud_account.instances) end - elsif parent.class == Pool || parent.class == CloudAccount + elsif parent.class == Pool || parent.class == ProviderAccount instances = parent.instances else return nil @@ -209,7 +209,7 @@ class DataServiceActiveRecord end end
- # returns the failure rate of instance starts for instances associated with the parent, (pool/cloudaccount) given the failure code + # returns the failure rate of instance starts for instances associated with the parent, (pool/ProviderAccount) given the failure code def self.failure_rate(parent, start_time, end_time, failure_code) instances = get_parent_instances(parent) tasks = Task.find(:all, :conditions => {:created_at => start_time...end_time, diff --git a/src/app/services/graph_service.rb b/src/app/services/graph_service.rb index 7266434..c5f3065 100644 --- a/src/app/services/graph_service.rb +++ b/src/app/services/graph_service.rb @@ -16,7 +16,7 @@ class GraphService cloud_account_graphs[Graph::QUOTA_INSTANCES_IN_USE] = qos_failure_rate_graph(parent, opts = {}) graphs[cloud_account] = cloud_account_graphs else - CloudAccount.all.each do |cloud_account| + ProviderAccount.all.each do |cloud_account| cloud_account_graphs = Hash.new cloud_account_graphs[Graph::QUOTA_INSTANCES_IN_USE] = quota_instances_in_use_graph(cloud_account,opts) graphs[cloud_account] = cloud_account_graphs @@ -126,7 +126,7 @@ class GraphService providers = Provider.all providers.each do |provider| running_instances = 0 - provider.cloud_accounts.each do |account| + provider.provider_accounts.each do |account| running_instances = running_instances + account.quota.running_instances if account.quota end if running_instances > 0 diff --git a/src/app/util/condormatic.rb b/src/app/util/condormatic.rb index 8b4e224..da265c0 100644 --- a/src/app/util/condormatic.rb +++ b/src/app/util/condormatic.rb @@ -216,7 +216,7 @@ def condormatic_classads_sync # to it. replicated_images = provider.replicated_images.find(:all, :conditions => ['provider_image_key IS NOT NULL']) - accounts = provider.cloud_accounts + accounts = provider.provider_accounts hardware_profiles = provider.hardware_profiles realms = provider.realms accounts.each { |account| diff --git a/src/app/views/admin/provider_accounts/_aws.haml b/src/app/views/admin/provider_accounts/_aws.haml new file mode 100644 index 0000000..0d4ffb4 --- /dev/null +++ b/src/app/views/admin/provider_accounts/_aws.haml @@ -0,0 +1,39 @@ +%fieldset.nomargin.clearfix + = label_tag "Account name:" + = text_field :provider_account, :label + = label_tag "Username" + = text_field :provider_account, :username + = label_tag "Password" + = password_field :provider_account, :password + = label_tag "Quota" + = text_field :quota, :maximum_running_instances, :title => t('cloud_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +%fieldset.nomargin.clearfix + .grid_3.prefix_10.alpha.omega + ( + %button.linkbutton.nospace{ :type => 'button', :onclick => "set_unlimited_quota("quota_instances");" }<> + = t('cloud_accounts.form.unlimited_quota') + ) + +%fieldset.clearfix.nomargin + %label.grid_4.la.alpha + = t('cloud_accounts.form.account_number') + %span.required * + = text_field_tag :account_number + %label.grid_3.la + = t('cloud_accounts.form.account_private_cert') + %span.required * + = file_field :x509_cert_priv_file, :title => t('cloud_accounts.form.account_private_cert') + %label.grid_3.la + = t('cloud_accounts.form.account_public_cert') + %span.required * + = file_field :x509_cert_pub_file, :title => t('cloud_accounts.form.account_public_cert') + .grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('cloud_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('cloud_accounts.form.test_account') + ) + +:javascript + function set_unlimited_quota(elem_id) { + $("#" + elem_id)[0].value = "unlimited"; + } diff --git a/src/app/views/admin/provider_accounts/_gogrid.haml b/src/app/views/admin/provider_accounts/_gogrid.haml new file mode 100644 index 0000000..65b5998 --- /dev/null +++ b/src/app/views/admin/provider_accounts/_gogrid.haml @@ -0,0 +1,16 @@ +%fieldset.clear + = label_tag "Account name:" + = text_field :provider_account, :label +%fieldset.clear + = label_tag :username, "API Key:" + = text_field :provider_account,:username +%fieldset.clear + = label_tag :password, "Secret:" + = password_field :provider_account,:password + = label_tag "Quota" + = text_field :quota, :maximum_running_instances, :title => t('cloud_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +.grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('cloud_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('cloud_accounts.form.test_account') + ) diff --git a/src/app/views/admin/provider_accounts/_mock.haml b/src/app/views/admin/provider_accounts/_mock.haml new file mode 100644 index 0000000..65b5998 --- /dev/null +++ b/src/app/views/admin/provider_accounts/_mock.haml @@ -0,0 +1,16 @@ +%fieldset.clear + = label_tag "Account name:" + = text_field :provider_account, :label +%fieldset.clear + = label_tag :username, "API Key:" + = text_field :provider_account,:username +%fieldset.clear + = label_tag :password, "Secret:" + = password_field :provider_account,:password + = label_tag "Quota" + = text_field :quota, :maximum_running_instances, :title => t('cloud_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +.grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('cloud_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('cloud_accounts.form.test_account') + ) diff --git a/src/app/views/admin/provider_accounts/_opennebula.haml b/src/app/views/admin/provider_accounts/_opennebula.haml new file mode 100644 index 0000000..e04902e --- /dev/null +++ b/src/app/views/admin/provider_accounts/_opennebula.haml @@ -0,0 +1,16 @@ +%fieldset.clear + = label_tag "Account name:" + = text_field :provider_account, :label +%fieldset.clear + = label_tag :username, "API Key:" + = text_field :provider_account, :username +%fieldset.clear + = label_tag :password, "Secret:" + = password_field :provider_account, :password + = label_tag "Quota" + = text_field :quota, :maximum_running_instances, :title => t('cloud_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +.grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('cloud_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('cloud_accounts.form.test_account') + ) diff --git a/src/app/views/admin/provider_accounts/_provider_selection.haml b/src/app/views/admin/provider_accounts/_provider_selection.haml new file mode 100644 index 0000000..a8f3d47 --- /dev/null +++ b/src/app/views/admin/provider_accounts/_provider_selection.haml @@ -0,0 +1,24 @@ +%fieldset#provider_type.clear + = select_tag("select_provider", options_for_select(@providers.map{ |p| [p.name, p.id] }, :selected => @selected_provider.id)) + = restful_submit_tag "Choose", 'set_selected_provider',set_selected_provider_admin_provider_accounts_path, 'GET', :class => 'button' + = label_tag "Cloud type: " + = t(Provider::PROVIDER_TYPES[@selected_provider.provider_type]) + = display_provider_account_login_form(@selected_provider.provider_type) + %fieldset.clearfix + .grid_13.alpha.omega + = submit_tag t(:add), :class => "ra nomargin dialogbutton" + +:javascript + $(document).ready(function(){ + var selected_provider; + $("#select_provider").change(function() + { + selected_provider = $("option:selected").attr('value'); + $.get("#{set_selected_provider_admin_provider_accounts_url}", {select_provider:selected_provider}, + function(result) { + $("#provider_type").html(result); + } + ); + + }); + }); diff --git a/src/app/views/admin/provider_accounts/_rackspace.haml b/src/app/views/admin/provider_accounts/_rackspace.haml new file mode 100644 index 0000000..c13672c --- /dev/null +++ b/src/app/views/admin/provider_accounts/_rackspace.haml @@ -0,0 +1,16 @@ +%fieldset.clear + = label_tag "Account name:" + = text_field :provider_account, :label +%fieldset.clear + = label_tag:username, "API Key:" + = text_field :provider_account, :username +%fieldset.clear + = label_tag :password, "Secret:" + = password_field :provider_account, :password + = label_tag "Quota" + = text_field :quota, :maximum_running_instances, :title => t('cloud_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +.grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('cloud_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('cloud_accounts.form.test_account') + ) diff --git a/src/app/views/admin/provider_accounts/_rhevm.haml b/src/app/views/admin/provider_accounts/_rhevm.haml new file mode 100644 index 0000000..dd86c72 --- /dev/null +++ b/src/app/views/admin/provider_accounts/_rhevm.haml @@ -0,0 +1,2 @@ +%fieldset.clear + Login form for RHEV-M (not implemented yet) diff --git a/src/app/views/admin/provider_accounts/new.haml b/src/app/views/admin/provider_accounts/new.haml index e567bce..8f82a0e 100644 --- a/src/app/views/admin/provider_accounts/new.haml +++ b/src/app/views/admin/provider_accounts/new.haml @@ -1,16 +1,15 @@ #details.grid_13 + = error_messages_for :provider_account %h2 = t('cloud_accounts.new.new_provider_account') - - form_for @cloud_account, :url => admin_provider_accounts_path, :html => { :multipart => true } do |f| %label{ :for => :provider_id } Provider - = select_tag :provider_id, options_for_select(@providers.map{ |p| [p.name, p.id] }) - = render :partial => 'form', :locals => { :f => f } - %fieldset.clearfix - .grid_13.alpha.omega - = submit_tag t(:add), :class => "ra nomargin dialogbutton" - %section - %p.requirement - %span.required * - - - = t('cloud_accounts.new.required_field') + %fieldset.clear + - unless @providers.empty? + - form_tag(admin_provider_accounts_path, :multipart => true) do + = render :partial => 'provider_selection' + %section + %p.requirement + %span.required * + - + = t('cloud_accounts.new.required_field') diff --git a/src/app/views/admin/providers/_form.haml b/src/app/views/admin/providers/_form.haml index fe8c9ca..b81c47f 100644 --- a/src/app/views/admin/providers/_form.haml +++ b/src/app/views/admin/providers/_form.haml @@ -1,5 +1,6 @@ = form.error_message_on :name, 'Name' = form.error_message_on :url, 'URL' += form.error_message_on :provider_type %fieldset.clear = form.label :name,'Provider name :' = form.text_field :name, :title => 'provider_name', :value => @provider.name, :class => "clear grid_4 alpha" @@ -10,5 +11,9 @@ %button.linkbutton.nospace{ :type => 'submit', :value => t('.test_connection'), :name => 'test_connection', :id => 'test_connection' } Test connection ) - %fieldset.clear - = form.submit "Save", :class => "submit formbutton" +%fieldset.clear + = form.label :provider_type + = form.select(:provider_type, Provider::PROVIDER_TYPES.collect {|id, provider_type| [t(provider_type),id] }, :prompt => "Select type of provider") + +%fieldset.clear + = form.submit "Save", :class => "submit formbutton" diff --git a/src/app/views/admin/providers/_list.haml b/src/app/views/admin/providers/_list.haml index 21ad381..7b660a3 100644 --- a/src/app/views/admin/providers/_list.haml +++ b/src/app/views/admin/providers/_list.haml @@ -17,3 +17,4 @@ %input{:name => "provider_selected[]", :type => "checkbox", :value => provider.id, :id => "provider_checkbox_#{provider.id}", :checked => selected } = link_to provider.name, admin_provider_path(provider) %td= provider.url + %td= t(Provider::PROVIDER_TYPES[provider.provider_type]) diff --git a/src/app/views/builds/new.haml b/src/app/views/builds/new.haml index 2cb159e..68f78ce 100644 --- a/src/app/views/builds/new.haml +++ b/src/app/views/builds/new.haml @@ -46,10 +46,10 @@ %label Choose Provider Format: %section.clearfix.gap %ul.block - - @all_targets.each do |target_id, target| + - @all_targets.each do |target, target_id| %li - = check_box_tag 'targets[]', target_id, false, :id => target_id - = label_tag target_id, target['name'] + = check_box_tag 'targets[]', target_id, false, :id => target + = label_tag target
= submit_tag "Submit to Build", :name => "build" = submit_tag "Cancel", :name => "cancel" diff --git a/src/app/views/cloud_accounts/_form.haml b/src/app/views/cloud_accounts/_form.haml deleted file mode 100644 index 2d35d47..0000000 --- a/src/app/views/cloud_accounts/_form.haml +++ /dev/null @@ -1,52 +0,0 @@ -= error_messages_for 'cloud_account' -%fieldset.clearfix.nomargin - %label.grid_4.la.alpha - = t('.account_name') - %span.required * - %label.grid_3.la - = t('.user_name') - %span.required * - %label.grid_3.la - = t('.password') - %span.required * - %label.grid_3.la.omega - = t('.quota_instances') - %span.required * -%fieldset.nomargin.clearfix - = f.text_field :label, :title => t('.account_name'), :class => "grid_4 alpha" - = f.text_field :username, :title => t('.user_name'), :class => "grid_3" - = f.password_field :password, :title => t('.password'), :class => "grid_3" - = text_field "quota", :maximum_running_instances, :title => t('.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" -%fieldset.nomargin.clearfix - .grid_3.prefix_10.alpha.omega - ( - %button.linkbutton.nospace{ :type => 'button', :onclick => "set_unlimited_quota("quota_instances");" }<> - = t('.unlimited_quota') - ) -%fieldset.clearfix.nomargin - %label.grid_4.la.alpha - = t('.account_number') - %span.required * - %label.grid_3.la - = t('.account_private_cert') - %span.required * - %label.grid_3.la - = t('.account_public_cert') - %span.required * - .grid_3.omega -%fieldset.clearfix.nomargin - = f.text_field :account_number, :title => t('.account_number'), :class => "grid_4 alpha" - .grid_3 - = f.file_field :x509_cert_priv_file, :title => t('.account_private_cert') - .grid_3 - = f.file_field :x509_cert_pub_file, :title => t('.account_public_cert') - .grid_3.omega - ( - %button.linkbutton.nospace{ :type => 'submit', :value => t('.test_account'), :name => 'test_account', :id => 'test_account' }<> - = t('.test_account') - ) - -:javascript - function set_unlimited_quota(elem_id) { - $("#" + elem_id)[0].value = "unlimited"; - } diff --git a/src/app/views/cloud_accounts/edit.haml b/src/app/views/cloud_accounts/edit.haml deleted file mode 100644 index dc24584..0000000 --- a/src/app/views/cloud_accounts/edit.haml +++ /dev/null @@ -1,17 +0,0 @@ -= render :partial => 'providers/providers' -#details.grid_13 - %nav.subsubnav - = render_navigation({:context => 'old', :level => 4}) - - %h2 - = t('.edit_provider_account') - - form_for @cloud_account, :url => provider_account_path(@provider, @cloud_account), :html => { :method => :put, :multipart => true } do |f| - = render :partial => 'form', :locals => { :f => f } - %fieldset.clearfix - .grid_13.alpha.omega - = submit_tag t(:edit), :class => "ra nomargin dialogbutton" - %section - %p.requirement - %span.required * - - - = t('.required_field') diff --git a/src/app/views/cloud_accounts/index.haml b/src/app/views/cloud_accounts/index.haml deleted file mode 100644 index e4d8670..0000000 --- a/src/app/views/cloud_accounts/index.haml +++ /dev/null @@ -1,25 +0,0 @@ -= render :partial => 'providers/providers' -#details.grid_13 - %nav.subsubnav - = render_navigation({:context => 'old', :level => 4}) - %h2 - = t('.provider_accounts') - - unless @provider.cloud_accounts.empty? - %table - %thead - %tr - %th{:scope => "col"} Label - %th{:scope => "col"} Username - %th{:scope => "col"} Account Number - %th{:scope => "col", :colspan => "2"} Actions - %tbody - - @provider.cloud_accounts.each do |cloud_account| - %tr - %td= cloud_account.label - %td= cloud_account.username - %td= cloud_account.account_number - %td= link_to 'Edit', edit_provider_account_path(@provider, cloud_account) - %td= link_to 'Delete', destroy_providers_account_path(@provider, cloud_account), :confirm => 'Are you sure?' - - - if @provider.cloud_accounts.empty? - = link_to 'Add', new_provider_account_path(@provider.id), :class => 'button' diff --git a/src/app/views/cloud_accounts/new.haml b/src/app/views/cloud_accounts/new.haml deleted file mode 100644 index b605714..0000000 --- a/src/app/views/cloud_accounts/new.haml +++ /dev/null @@ -1,17 +0,0 @@ -= render :partial => 'providers/providers' -#details.grid_13 - %nav.subsubnav - = render_navigation({:context => 'old', :level => 4}) - - %h2 - = t('.new_provider_account') - - form_for @cloud_account, :url => provider_accounts_path(@provider), :html => { :multipart => true } do |f| - = render :partial => 'form', :locals => { :f => f } - %fieldset.clearfix - .grid_13.alpha.omega - = submit_tag t(:add), :class => "ra nomargin dialogbutton" - %section - %p.requirement - %span.required * - - - = t('.required_field') diff --git a/src/app/views/instances/index.haml b/src/app/views/instances/index.haml index e33041e..8bbbb2a 100644 --- a/src/app/views/instances/index.haml +++ b/src/app/views/instances/index.haml @@ -123,5 +123,5 @@ %td= inst.hardware_profile.name %td= inst.template.name %td= inst.public_addresses - %td= inst.cloud_account ? inst.cloud_account.provider.name : '' + %td= inst.provider_account ? inst.provider_account.provider.name : '' %td= owner_name(inst) diff --git a/src/app/views/instances/show.haml b/src/app/views/instances/show.haml index 33b2897..7eab76e 100644 --- a/src/app/views/instances/show.haml +++ b/src/app/views/instances/show.haml @@ -18,7 +18,7 @@ %span= "#{@instance.template.xml.platform} #{@instance.template.xml.platform_version}" %li = label_tag :provider, 'Provider' - %span= @instance.cloud_account.provider.name if @instance.cloud_account + %span= @instance.provider_account.provider.name if @instance.provider_account %li = label_tag :base_template, 'Base Template' %span= @instance.template.name diff --git a/src/app/views/layouts/newui.haml b/src/app/views/layouts/newui.haml index 681f607..1f8c7d0 100644 --- a/src/app/views/layouts/newui.haml +++ b/src/app/views/layouts/newui.haml @@ -5,7 +5,6 @@ %title Red Hat Cloud Engine = yield :title - = stylesheet_link_tag 'facebox' = stylesheet_link_tag 'jquery.ui-1.8.1/jquery-ui-1.8.1.custom.css' = stylesheet_link_tag 'jquery.loadmask' diff --git a/src/app/views/provider_accounts/_form.haml b/src/app/views/provider_accounts/_form.haml new file mode 100644 index 0000000..2d35d47 --- /dev/null +++ b/src/app/views/provider_accounts/_form.haml @@ -0,0 +1,52 @@ += error_messages_for 'cloud_account' +%fieldset.clearfix.nomargin + %label.grid_4.la.alpha + = t('.account_name') + %span.required * + %label.grid_3.la + = t('.user_name') + %span.required * + %label.grid_3.la + = t('.password') + %span.required * + %label.grid_3.la.omega + = t('.quota_instances') + %span.required * +%fieldset.nomargin.clearfix + = f.text_field :label, :title => t('.account_name'), :class => "grid_4 alpha" + = f.text_field :username, :title => t('.user_name'), :class => "grid_3" + = f.password_field :password, :title => t('.password'), :class => "grid_3" + = text_field "quota", :maximum_running_instances, :title => t('.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +%fieldset.nomargin.clearfix + .grid_3.prefix_10.alpha.omega + ( + %button.linkbutton.nospace{ :type => 'button', :onclick => "set_unlimited_quota("quota_instances");" }<> + = t('.unlimited_quota') + ) +%fieldset.clearfix.nomargin + %label.grid_4.la.alpha + = t('.account_number') + %span.required * + %label.grid_3.la + = t('.account_private_cert') + %span.required * + %label.grid_3.la + = t('.account_public_cert') + %span.required * + .grid_3.omega +%fieldset.clearfix.nomargin + = f.text_field :account_number, :title => t('.account_number'), :class => "grid_4 alpha" + .grid_3 + = f.file_field :x509_cert_priv_file, :title => t('.account_private_cert') + .grid_3 + = f.file_field :x509_cert_pub_file, :title => t('.account_public_cert') + .grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('.test_account') + ) + +:javascript + function set_unlimited_quota(elem_id) { + $("#" + elem_id)[0].value = "unlimited"; + } diff --git a/src/app/views/provider_accounts/edit.haml b/src/app/views/provider_accounts/edit.haml new file mode 100644 index 0000000..dc24584 --- /dev/null +++ b/src/app/views/provider_accounts/edit.haml @@ -0,0 +1,17 @@ += render :partial => 'providers/providers' +#details.grid_13 + %nav.subsubnav + = render_navigation({:context => 'old', :level => 4}) + + %h2 + = t('.edit_provider_account') + - form_for @cloud_account, :url => provider_account_path(@provider, @cloud_account), :html => { :method => :put, :multipart => true } do |f| + = render :partial => 'form', :locals => { :f => f } + %fieldset.clearfix + .grid_13.alpha.omega + = submit_tag t(:edit), :class => "ra nomargin dialogbutton" + %section + %p.requirement + %span.required * + - + = t('.required_field') diff --git a/src/app/views/provider_accounts/index.haml b/src/app/views/provider_accounts/index.haml new file mode 100644 index 0000000..d1fdea4 --- /dev/null +++ b/src/app/views/provider_accounts/index.haml @@ -0,0 +1,25 @@ += render :partial => 'providers/providers' +#details.grid_13 + %nav.subsubnav + = render_navigation({:context => 'old', :level => 4}) + %h2 + = t('.provider_accounts') + - unless @provider.provider_accounts.empty? + %table + %thead + %tr + %th{:scope => "col"} Label + %th{:scope => "col"} Username + %th{:scope => "col"} Account Number + %th{:scope => "col", :colspan => "2"} Actions + %tbody + - @provider.provider_accounts.each do |cloud_account| + %tr + %td= cloud_account.label + %td= cloud_account.username + %td= cloud_account.account_number + %td= link_to 'Edit', edit_provider_account_path(@provider, cloud_account) + %td= link_to 'Delete', destroy_providers_account_path(@provider, cloud_account), :confirm => 'Are you sure?' + + - if @provider.provider_accounts.empty? + = link_to 'Add', new_provider_account_path(@provider.id), :class => 'button' diff --git a/src/app/views/provider_accounts/new.haml b/src/app/views/provider_accounts/new.haml new file mode 100644 index 0000000..b605714 --- /dev/null +++ b/src/app/views/provider_accounts/new.haml @@ -0,0 +1,17 @@ += render :partial => 'providers/providers' +#details.grid_13 + %nav.subsubnav + = render_navigation({:context => 'old', :level => 4}) + + %h2 + = t('.new_provider_account') + - form_for @cloud_account, :url => provider_accounts_path(@provider), :html => { :multipart => true } do |f| + = render :partial => 'form', :locals => { :f => f } + %fieldset.clearfix + .grid_13.alpha.omega + = submit_tag t(:add), :class => "ra nomargin dialogbutton" + %section + %p.requirement + %span.required * + - + = t('.required_field') diff --git a/src/app/views/providers/accounts.haml b/src/app/views/providers/accounts.haml index 984f257..63d42af 100644 --- a/src/app/views/providers/accounts.haml +++ b/src/app/views/providers/accounts.haml @@ -11,7 +11,7 @@ = t('.provider_accounts') - form_tag ({:controller => 'cloud_accounts', :action => 'update_accounts'}), :multipart => true do = hidden_field :provider, :id, :value => @provider.id - - @provider.cloud_accounts.each do |acct| + - @provider.provider_accounts.each do |acct| %fieldset.clearfix.nomargin %label.grid_4.la.alpha = t('.account_name') @@ -61,8 +61,8 @@ %a.button{ :href => remove_path, :name => "remove_acc_#{acct.id}", :class => "tiny #{'disabled' unless remove_path}" } = t(:remove) %fieldset.clearfix.gap - = link_to t(:reset), {:controller => 'provider', :action => 'accounts', :id => @provider.id}, :class => "button dialogbutton" unless @provider.cloud_accounts.empty? - = submit_tag t(:save), :name => 'update_cloud_accounts', :class => "dialogbutton" unless @provider.cloud_accounts.empty? + = link_to t(:reset), {:controller => 'provider', :action => 'accounts', :id => @provider.id}, :class => "button dialogbutton" unless @provider.provider_accounts.empty? + = submit_tag t(:save), :name => 'update_cloud_accounts', :class => "dialogbutton" unless @provider.provider_accounts.empty?
%h2 = t('.new_provider_account') diff --git a/src/app/views/resources/instances/_list.haml b/src/app/views/resources/instances/_list.haml index a83b565..b62d9e7 100644 --- a/src/app/views/resources/instances/_list.haml +++ b/src/app/views/resources/instances/_list.haml @@ -19,5 +19,5 @@ %td= inst.state %td= inst.template.name %td= inst.public_addresses - %td= inst.cloud_account ? inst.cloud_account.provider.name : '' + %td= inst.provider_account ? inst.provider_account.provider.name : '' %td= owner_name(inst) diff --git a/src/app/views/resources/instances/_properties.haml b/src/app/views/resources/instances/_properties.haml index 5283e20..d14843c 100644 --- a/src/app/views/resources/instances/_properties.haml +++ b/src/app/views/resources/instances/_properties.haml @@ -16,7 +16,7 @@ %span= "#{@instance.template.xml.platform} #{@instance.template.xml.platform_version}" %li = label_tag :provider, 'Provider' - %span= @instance.cloud_account.provider.name if @instance.cloud_account + %span= @instance.provider_account.provider.name if @instance.provider_account %li = label_tag :base_template, 'Base Template' %span= @instance.template.name diff --git a/src/classad_plugin/classad_plugin.rb b/src/classad_plugin/classad_plugin.rb index 2aabfb9..14b5878 100644 --- a/src/classad_plugin/classad_plugin.rb +++ b/src/classad_plugin/classad_plugin.rb @@ -60,7 +60,7 @@ def classad_plugin(logf, conf_path, instance_key, account_id) instance = Instance.find(:first, :conditions => [ "condor_job_id = ?", instance_key ]) logf.puts "getting cloud account from id #{account_id}" - cloud_account = CloudAccount.find(:first, + cloud_account = ProviderAccount.find(:first, :conditions => [ "id = ?", account_id ])
logf.puts "instance is: #{instance}, cloud account is #{cloud_account}" diff --git a/src/config/environment.rb b/src/config/environment.rb index a897feb..986cfe4 100644 --- a/src/config/environment.rb +++ b/src/config/environment.rb @@ -57,7 +57,7 @@ Rails::Initializer.run do |config|
config.middleware.swap Rack::MethodOverride, 'Rack::RestfulSubmit'
- config.active_record.observers = :instance_observer, :task_observer, :cloud_account_observer + config.active_record.observers = :instance_observer, :task_observer, :provider_account_observer # Only load the plugins named here, in the order given. By default, all plugins # in vendor/plugins are loaded in alphabetical order. # :all can be used as a placeholder for all plugins not explicitly named diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml index 715c0a0..dcb379b 100644 --- a/src/config/locales/en.yml +++ b/src/config/locales/en.yml @@ -85,6 +85,12 @@ en: pool_families: Pool Families setting: Settings name: Name + AWS: Amazon EC2 + RHEVM: RHEV-M + GoGrid: GoGrid + Rackspace: Rackspace + OpenNebula: OpenNebula + mock: Mock admin: settings: index: diff --git a/src/config/old_navigation.rb b/src/config/old_navigation.rb index 27b44cf..ef4b352 100644 --- a/src/config/old_navigation.rb +++ b/src/config/old_navigation.rb @@ -9,7 +9,7 @@ SimpleNavigation::Configuration.run do |navigation| second_level.item :system_settings, t(:system_settings), :controller => 'settings' do |third_level| third_level.item :manage_providers, t(:manage_providers), providers_path do |fourth_level| fourth_level.item :provider_summary, t(:provider_summary), { :controller => 'providers', :action => 'show', :id => (@provider.id if @provider) }, :highlights_on => //providers/\d+(/edit)?$/ - fourth_level.item :provider_accounts, t(:provider_accounts), { :controller => 'cloud_accounts', :action => 'index', :provider_id => (@provider.id if @provider) }, :highlights_on => //providers/\d+/accounts(/(\d+|new))?/ + fourth_level.item :provider_accounts, t(:provider_accounts), { :controller => 'provider_accounts', :action => 'index', :provider_id => (@provider.id if @provider) }, :highlights_on => //providers/\d+/accounts(/(\d+|new))?/ fourth_level.item :scheduling_policies, t(:scheduling_policies), '#' fourth_level.item :services_provided, t(:services_provided), '#' fourth_level.item :map_profiles, t(:map_profiles), '#' diff --git a/src/config/routes.rb b/src/config/routes.rb index 0aa281b..5db5a08 100644 --- a/src/config/routes.rb +++ b/src/config/routes.rb @@ -50,7 +50,8 @@ ActionController::Routing::Routes.draw do |map| r.resources :hardware_profiles, :collection => { :multi_destroy => :delete } r.resources :providers, :collection => { :multi_destroy => :delete } r.resources :users, :collection => { :multi_destroy => :delete } - r.resources :provider_accounts, :collection => { :multi_destroy => :delete } + r.resources :provider_accounts, :collection => { :multi_destroy => :delete, :set_selected_provider => :get} + r.resources :roles, :collection => { :multi_destroy => :delete } r.resources :settings, :collection => { :self_service => :get, :general_settings => :get } r.resources :pool_families, :collection => { :multi_destroy => :delete } @@ -76,9 +77,9 @@ ActionController::Routing::Routes.draw do |map| # Temporarily disable this route, provider stuff is not restful yet. # Will be re-enabled in upcoming patch map.resources :providers do |provider| - provider.resources :accounts, :controller => 'cloud_accounts' + provider.resources :accounts, :controller => 'provider_accounts' end - map.destroy_providers_account '/providers/:provider_id/accounts/:id/destroy', :controller => 'cloud_accounts', :action => 'destroy', :conditions => { :method => :get } + map.destroy_providers_account '/providers/:provider_id/accounts/:id/destroy', :controller => 'provider_accounts', :action => 'destroy', :conditions => { :method => :get }
map.resources :templates, :collection => { :destroy_multiple => :get }, :member => { diff --git a/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb new file mode 100644 index 0000000..beaabc5 --- /dev/null +++ b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb @@ -0,0 +1,11 @@ +class RenameCloudAccountToProviderAccount < ActiveRecord::Migration + def self.up + rename_table (:cloud_accounts,:provider_accounts) + change_column (:providers, :cloud_type, :integer, :null => false) + end + + def self.down + change_column (:providers, :cloud_type, :string, :null => false) + rename_table (:provider_accounts, :cloud_accounts) + end +end diff --git a/src/db/migrate/20110125123410_rename_cloud_account_id_for_instances.rb b/src/db/migrate/20110125123410_rename_cloud_account_id_for_instances.rb new file mode 100644 index 0000000..674fc2d --- /dev/null +++ b/src/db/migrate/20110125123410_rename_cloud_account_id_for_instances.rb @@ -0,0 +1,9 @@ +class RenameCloudAccountIdForInstances < ActiveRecord::Migration + def self.up + rename_column :instances, :cloud_account_id, :provider_account_id + end + + def self.down + rename_column :instances, :provider_account_id, :cloud_account_id + end +end diff --git a/src/db/migrate/20110125154113_rename_cloud_accounts_pool_families_to_provider_accounts_pool_families.rb b/src/db/migrate/20110125154113_rename_cloud_accounts_pool_families_to_provider_accounts_pool_families.rb new file mode 100644 index 0000000..d1ae154 --- /dev/null +++ b/src/db/migrate/20110125154113_rename_cloud_accounts_pool_families_to_provider_accounts_pool_families.rb @@ -0,0 +1,11 @@ +class RenameCloudAccountsPoolFamiliesToProviderAccountsPoolFamilies < ActiveRecord::Migration + def self.up + rename_table :cloud_accounts_pool_families, :pool_families_provider_accounts + rename_column :pool_families_provider_accounts, :cloud_account_id, :provider_account_id + end + + def self.down + rename_column :pool_families_provider_accounts, :provider_account_id, :cloud_account_id + rename_table :pool_families_provider_accounts, :cloud_accounts_pool_families + end +end diff --git a/src/db/migrate/20110126161751_change_null_properties_of_columns_in_provider_accounts.rb b/src/db/migrate/20110126161751_change_null_properties_of_columns_in_provider_accounts.rb new file mode 100644 index 0000000..7e6707e --- /dev/null +++ b/src/db/migrate/20110126161751_change_null_properties_of_columns_in_provider_accounts.rb @@ -0,0 +1,13 @@ +class ChangeNullPropertiesOfColumnsInProviderAccounts < ActiveRecord::Migration + def self.up + change_column :provider_accounts, :account_number, :string, :null => true + change_column :provider_accounts, :x509_cert_priv, :text, :null => true + change_column :provider_accounts, :x509_cert_pub, :text, :null => true + end + + def self.down + change_column :provider_accounts, :account_number, :string, :null => false + change_column :provider_accounts, :x509_cert_priv, :text, :null => false + change_column :provider_accounts, :x509_cert_pub, :text, :null => false + end +end diff --git a/src/db/migrate/20110131160540_rename_cloud_type_to_provider_type_in_providers.rb b/src/db/migrate/20110131160540_rename_cloud_type_to_provider_type_in_providers.rb new file mode 100644 index 0000000..12959eb --- /dev/null +++ b/src/db/migrate/20110131160540_rename_cloud_type_to_provider_type_in_providers.rb @@ -0,0 +1,9 @@ +class RenameCloudTypeToProviderTypeInProviders < ActiveRecord::Migration + def self.up + rename_column :providers, :cloud_type, :provider_type + end + + def self.down + rename_column :providers, :provider_type, :cloud_type + end +end diff --git a/src/db/seeds.rb b/src/db/seeds.rb index 9a6065c..1ed2329 100644 --- a/src/db/seeds.rb +++ b/src/db/seeds.rb @@ -30,17 +30,17 @@ roles = Quota => [VIEW]}}, Provider => {"Provider Owner" => {Provider => [VIEW, MOD, VPRM,GPRM], - CloudAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}}, - CloudAccount => - {"Provider Account User" => {CloudAccount => [VIEW,USE]}, - "Provider Account Owner" => {CloudAccount => [VIEW,USE,MOD, VPRM,GPRM]}}, + ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}}, + ProviderAccount => + {"Provider Account User" => {ProviderAccount => [VIEW,USE]}, + "Provider Account Owner" => {ProviderAccount => [VIEW,USE,MOD, VPRM,GPRM]}}, Template => {"Template User" => {Template => [VIEW,USE]}, "Template Owner" => {Template => [VIEW,USE,MOD, VPRM,GPRM]}}, BasePermissionObject => {"Provider Creator" => {Provider => [ CRE]}, "Provider Administrator" => {Provider => [VIEW, MOD,CRE,VPRM,GPRM], - CloudAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}, + ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}, "HWP Administrator" => {HardwareProfile => [ MOD,CRE,VPRM,GPRM]}, "Realm Administrator" => {Realm => [ USE,MOD,CRE,VPRM,GPRM]}, "Pool Creator" => {Pool => [ CRE]}, @@ -50,7 +50,7 @@ roles = PoolFamily => [VIEW, MOD,CRE,VPRM,GPRM]}, "Template Administrator" => {Template => [VIEW,USE,MOD,CRE,VPRM,GPRM]}, "Administrator" => {Provider => [VIEW, MOD,CRE,VPRM,GPRM], - CloudAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM], + ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM], HardwareProfile => [ MOD,CRE,VPRM,GPRM], Realm => [ USE,MOD,CRE,VPRM,GPRM], User => [VIEW, MOD,CRE], diff --git a/src/dbomatic/dbomatic b/src/dbomatic/dbomatic index 8a3e968..3ac7449 100755 --- a/src/dbomatic/dbomatic +++ b/src/dbomatic/dbomatic @@ -203,7 +203,7 @@ class CondorEventLog < Nokogiri::XML::SAX::Document return end
- cloud_account = CloudAccount.find(:first, :conditions => ['provider_id = ? AND username = ? AND password = ?', provider.id, username, password]) + cloud_account = ProviderAccount.find(:first, :conditions => ['provider_id = ? AND username = ? AND password = ?', provider.id, username, password]) if cloud_account.nil? @logger.error "Could not find the cloud account corresponding to #{link}, skipping cloud id update" return diff --git a/src/features/instance.feature b/src/features/instance.feature index ad22025..4e4e59c 100644 --- a/src/features/instance.feature +++ b/src/features/instance.feature @@ -109,4 +109,4 @@ Feature: Mange Instances And I press "Search" Then I should not see "mock" And I should see "test" - And I should not see "other" \ No newline at end of file + And I should not see "other" diff --git a/src/features/provider.feature b/src/features/provider.feature index 08704dd..af636cd 100644 --- a/src/features/provider.feature +++ b/src/features/provider.feature @@ -35,6 +35,7 @@ Feature: Manage Providers Then I should be on the new admin provider page When I fill in "provider[name]" with "testprovider" And I fill in "provider[url]" with "http://localhost:3001/api" + And I select "Amazon EC2" from "Provider type" And I press "Save" Then I should be on the admin providers page And I should see "Provider added" @@ -64,34 +65,34 @@ Feature: Manage Providers And this provider has 5 replicated images And this provider has 5 hardware profiles And this provider has a realm - And this provider has a cloud account + And this provider has a provider account When I go to the admin providers page And I check "provider1" provider And I press "Delete" And there should not exist a provider named "provider1" And there should not be any replicated images And there should not be any hardware profiles - And there should not be a cloud account + And there should not be a provider account And there should not be a realm
Scenario: Search for hardware profiles Given there are these providers: | name | url | | Test | http://testprovider.com/api | - | Mock | http://mockprovider.com/api | + | Kenny | http://mockprovider.com/api | | Other | http://sometesturl.com/api | And I am on the admin providers page Then I should see the following: | Test | http://testprovider.com/api | - | Mock | http://mockprovider.com/ap | + | Kenny | http://mockprovider.com/ap | | Other | http://sometesturl.com/api | When I fill in "q" with "test" And I press "Search" Then I should see "Test" And I should see "Other" - And I should not see "Mock" - When I fill in "q" with "Mock" + And I should not see "Kenny" + When I fill in "q" with "Kenny" And I press "Search" - Then I should see "Mock" + Then I should see "Kenny" And I should not see "Test" - And I should not see "Other" \ No newline at end of file + And I should not see "Other" diff --git a/src/features/provider_account.feature b/src/features/provider_account.feature index 964aba2..d4ebd34 100644 --- a/src/features/provider_account.feature +++ b/src/features/provider_account.feature @@ -22,21 +22,17 @@ Feature: Manage Provider Accounts When I follow "New Account" Then I should be on the new admin provider account page And I should see "New Account" - When I select "testprovider" from "provider_id" - And I fill in "cloud_account[label]" with "testaccount" - And I fill in "cloud_account[username]" with "mockuser" - And I fill in "cloud_account[password]" with "mockpassword" + When I select "testprovider" from "select_provider" + And I fill in "provider_account[label]" with "testaccount" + And I fill in "provider_account[username]" with "mockuser" + And I fill in "provider_account[password]" with "mockpassword" And I fill in "quota[maximum_running_instances]" with "13" - And I fill in "cloud_account[account_number]" with "222222" - And I attach the "private.key" file to "cloud_account[x509_cert_priv_file]" - And I attach the "public.key" file to "cloud_account[x509_cert_pub_file]" And I press "Add" Then I should be on testaccount's provider account page And I should see "Provider account added" And I should have a provider account named "testaccount" And I should see "Properties for testaccount" And I should see "Running instances quota: 13" - And I should see "Account ID: 222222"
Scenario: Test Provider Account Connection Successful Given there is a provider named "testprovider" @@ -44,8 +40,8 @@ Feature: Manage Provider Accounts And I am on the admin provider accounts page When I follow "New Account" Then I should be on the new admin provider account page - When I fill in "cloud_account[username]" with "mockuser" - And I fill in "cloud_account[password]" with "mockpassword" + When I fill in "provider_account[username]" with "mockuser" + And I fill in "provider_account[password]" with "mockpassword" And I press "Test Account" Then I should see "Test Connection Success"
@@ -55,8 +51,8 @@ Feature: Manage Provider Accounts And I am on the admin provider accounts page When I follow "New Account" Then I should be on the new admin provider account page - When I fill in "cloud_account[username]" with "mockuser" - And I fill in "cloud_account[password]" with "wrong password" + When I fill in "provider_account[username]" with "mockuser" + And I fill in "provider_account[password]" with "wrong password" And I press "Test Account" Then I should see "Test Connection Failed"
diff --git a/src/features/step_definitions/provider_account_steps.rb b/src/features/step_definitions/provider_account_steps.rb index 5d68b88..86a6d31 100644 --- a/src/features/step_definitions/provider_account_steps.rb +++ b/src/features/step_definitions/provider_account_steps.rb @@ -1,9 +1,9 @@ Then /^there should be no provider accounts$/ do - CloudAccount.all.should be_empty + ProviderAccount.all.should be_empty end
Given /^there are no provider accounts$/ do - CloudAccount.all.should be_empty + ProviderAccount.all.should be_empty end
When /^I attach the "([^"\s]+)" file to "([^"\s]+)"$/ do |file, field| @@ -12,27 +12,27 @@ When /^I attach the "([^"\s]+)" file to "([^"\s]+)"$/ do |file, field| end
Then /^I should have a provider account named "([^"]*)"$/ do |label| - CloudAccount.find_by_label(label).should_not be_nil + ProviderAccount.find_by_label(label).should_not be_nil end
Given /^there is a provider account named "([^"]*)"$/ do |label| @provider = Provider.find_by_name('testprovider') - @cloud_account = Factory(:mock_cloud_account, :provider => @provider, :label => label) + @provider_account = Factory(:mock_provider_account, :provider => @provider, :label => label) end
Given /^there is a second provider account named "([^"]*)"$/ do |label| @provider = Factory(:mock_provider, :name => 'secondprovider') - @cloud_account = Factory(:mock_cloud_account, :provider => @provider, :label => label) + @provider_account = Factory(:mock_provider_account, :provider => @provider, :label => label) end
When /^I check the "([^"]*)" account$/ do |label| - account = CloudAccount.find_by_label(label) + account = ProviderAccount.find_by_label(label) check("account_checkbox_#{account.id}") end
Given /^that there are these provider accounts:$/ do |table| table.hashes.each do |hash| - Factory.create(:cloud_account, :name => hash['name'], :username => hash['username']) + Factory.create(:provider_account, :name => hash['name'], :username => hash['username']) end end diff --git a/src/features/step_definitions/provider_steps.rb b/src/features/step_definitions/provider_steps.rb index bc56276..4d57030 100644 --- a/src/features/step_definitions/provider_steps.rb +++ b/src/features/step_definitions/provider_steps.rb @@ -49,8 +49,8 @@ Given /^this provider has a realm$/ do Factory(:realm, :provider => @provider) end
-Given /^this provider has a cloud account$/ do - Factory(:mock_cloud_account, :provider => @provider) +Given /^this provider has a provider account$/ do + Factory(:mock_provider_account, :provider => @provider) end
Then /^there should not be any replicated images$/ do @@ -61,8 +61,8 @@ Then /^there should not be any hardware profiles$/ do HardwareProfile.find(:all, :conditions => { :provider_id => @provider.id} ).size.should == 0 end
-Then /^there should not be a cloud account$/ do - CloudAccount.find(:all, :conditions => { :provider_id => @provider.id} ).size.should == 0 +Then /^there should not be a provider account$/ do + ProviderAccount.find(:all, :conditions => { :provider_id => @provider.id} ).size.should == 0 end
Then /^there should not be a realm$/ do diff --git a/src/features/step_definitions/template_steps.rb b/src/features/step_definitions/template_steps.rb index e0ab543..c4f986c 100644 --- a/src/features/step_definitions/template_steps.rb +++ b/src/features/step_definitions/template_steps.rb @@ -92,13 +92,13 @@ When /^I choose this template$/ do choose("ids__#{@template.id}") end
-Given /^there is ec2 cloud account$/ do - account = Factory.build(:ec2_cloud_account) +Given /^there is Amazon AWS provider account$/ do + account = Factory.build(:ec2_provider_account) account.save! end
-Given /^there is ec2 build for this template$/ do - Image.build(@template, 'ec2') +Given /^there is Amazon AWS build for this template$/ do + Image.build(@template, Provider::AWS) end
Given /^there is an imported template$/ do diff --git a/src/features/support/custom.rb b/src/features/support/custom.rb index c2c4987..8d44f9c 100644 --- a/src/features/support/custom.rb +++ b/src/features/support/custom.rb @@ -8,8 +8,8 @@ Provider.class_eval do true end
- def set_cloud_type - self.cloud_type = Factory(:mock_provider).cloud_type + def set_provider_type + self.provider_type = Factory(:mock_provider).provider_type end
def populate_hardware_profiles @@ -23,7 +23,7 @@ Provider.class_eval do
end
-CloudAccount.class_eval do +ProviderAccount.class_eval do
alias :generate_auth_key_original :generate_auth_key
diff --git a/src/features/support/paths.rb b/src/features/support/paths.rb index 4bc7ba4..193d374 100644 --- a/src/features/support/paths.rb +++ b/src/features/support/paths.rb @@ -105,7 +105,7 @@ module NavigationHelpers url_for :action => 'edit', :controller => 'hardware_profiles', :only_path => true
when /^(.*)'s provider account page$/ - admin_provider_account_path(CloudAccount.find_by_label($1)) + admin_provider_account_path(ProviderAccount.find_by_label($1))
when /^(.*)'s image factory deployable page$/ image_factory_deployable_path(Deployable.find_by_name($1)) diff --git a/src/features/template.feature b/src/features/template.feature index b7d75a8..74ab316 100644 --- a/src/features/template.feature +++ b/src/features/template.feature @@ -91,31 +91,31 @@ Feature: Manage Templates
Scenario: Build template Given there is a "mock1" template - And there is ec2 cloud account + And there is Amazon AWS provider account And I am on the templates page When I choose this template And I press "Build" Then I should be on the new template build page And I should see "Build Request" - When I check "ec2" + When I check "Aws" And I press "Submit to Build" Then I should be on the template builds page And I should see "mock1"
Scenario: Build template which is already built Given there is a "mock1" template - And there is ec2 cloud account + And there is Amazon AWS provider account And I am on the templates page - And there is ec2 build for this template + And there is Amazon AWS build for this template When I choose this template And I press "Build" Then I should be on the new template build page And I should see "Build Request" - When I check "ec2" + When I check "Aws" And I press "Submit to Build" Then I should be on the template builds page And I should see "mock1" - And I should see "An attempted build of this template for the target 'ec2' already exists" + And I should see "An attempted build of this template for the target '1' already exists"
Scenario: Build imported template Given there is an imported template @@ -166,4 +166,4 @@ Feature: Manage Templates And I press "Search" Then I should not see "Test1" And I should see "Other" - And I should not see "Mock" \ No newline at end of file + And I should not see "Mock" diff --git a/src/image_builder_service/image_builder_service b/src/image_builder_service/image_builder_service index 0ffb74d..35099b0 100755 --- a/src/image_builder_service/image_builder_service +++ b/src/image_builder_service/image_builder_service @@ -121,7 +121,7 @@ class ImageBuilderService # FIXME: this should be contained elsewhere (probably Image model) so we # can keep logic out of here. Also, this currently only handles one # account, we will need to be able to specify at some point. - creds = image.replicated_images.first.provider.cloud_accounts.first.build_credentials + creds = image.replicated_images.first.provider.provider_accounts.first.build_credentials #TODO: switch this back to uri once ActiveBuild retrieves it properly ab = @console.build_image(image.template.xml.to_xml, image.target, image.uuid, creds) if ab diff --git a/src/lib/tasks/dc_tasks.rake b/src/lib/tasks/dc_tasks.rake index f1d0c7d..cf713a5 100644 --- a/src/lib/tasks/dc_tasks.rake +++ b/src/lib/tasks/dc_tasks.rake @@ -105,7 +105,7 @@ namespace :dc do unless provider = Provider.find_by_name(provider_name) raise "There is no provider with '#{provider_name}' name" end - unless account = provider.cloud_accounts.find_by_label(account_name) + unless account = provider.provider_accounts.find_by_label(account_name) raise "There is no account with '#{account_name}' label" end account diff --git a/src/lib/tasks/demo_data.rake b/src/lib/tasks/demo_data.rake index f38ebbd..f3326fd 100644 --- a/src/lib/tasks/demo_data.rake +++ b/src/lib/tasks/demo_data.rake @@ -32,7 +32,7 @@ namespace :db do
puts @number_of_tasks
- cloud_account = CloudAccount.find(args[:cloud_account_id]) + cloud_account = ProviderAccount.find(args[:cloud_account_id]) user = User.find(args[:user_id])
instance = create_instance(cloud_account) @@ -116,4 +116,4 @@ namespace :db do return time_started end
-end \ No newline at end of file +end diff --git a/src/script/use-existing-ec2-templates b/src/script/use-existing-ec2-templates index 7396380..b52de56 100755 --- a/src/script/use-existing-ec2-templates +++ b/src/script/use-existing-ec2-templates @@ -13,11 +13,11 @@ require 'optparse' def add_ec2_template(xml_info, summary, ec2_ami)
provider = Provider.find(:first) - if provider == nil || provider.cloud_type != "ec2" + if provider == nil || provider.provider_type != Provider::AWS puts "You need to set up an EC2 provider before you can run this script." exit end - + template = Template.new
# Incredibly, all the info actually comes from the xml.. @@ -46,7 +46,7 @@ def add_ec2_template(xml_info, summary, ec2_ami)
puts "Saved image #{summary} for use." end - + add_ec2_template(" <?xml version=\"1.0\"?> <image> diff --git a/src/spec/controllers/builds_controller_spec.rb b/src/spec/controllers/builds_controller_spec.rb index ef4f3d4..3432bef 100644 --- a/src/spec/controllers/builds_controller_spec.rb +++ b/src/spec/controllers/builds_controller_spec.rb @@ -18,19 +18,19 @@ describe BuildsController do hydra = Typhoeus::Hydra.hydra hydra.stub(:put, %r{http://localhost:9090/templates/.*%7D).and_return( Typhoeus::Response.new(:code => 200)) - Factory.create(:mock_cloud_account) + Factory.create(:mock_provider_account) Factory.create(:mock_provider) end
it "should create a new Image" do lambda do - post :create, :template_id => @template.id, :targets => ["mock"] + post :create, :template_id => @template.id, :targets => ["0"] end.should change(Image, :count).by(1) end
it "should create a new ReplicatedImage" do lambda do - post :create, :template_id => @template.id, :targets => ["mock"] + post :create, :template_id => @template.id, :targets => ["0"] end.should change(ReplicatedImage, :count).by(1) end end diff --git a/src/spec/controllers/cloud_accounts_controller_spec.rb b/src/spec/controllers/cloud_accounts_controller_spec.rb deleted file mode 100644 index d61ad34..0000000 --- a/src/spec/controllers/cloud_accounts_controller_spec.rb +++ /dev/null @@ -1,92 +0,0 @@ -require 'spec_helper' - -describe CloudAccountsController do - - fixtures :all - before(:each) do - @cloud_account = Factory :mock_cloud_account - @provider = @cloud_account.provider - - @admin_permission = Permission.create :role => Role.find(:first, :conditions => ['name = ?', 'Provider Administrator']), - :permission_object => @provider, - :user => Factory(:provider_admin_user) - @admin = @admin_permission.user - activate_authlogic - end - - it "shows provider accounts as list" do - UserSession.create(@admin) - get :index, :provider_id => @provider.id - response.should be_success - response.should render_template("index") - end - - it "allows test account validity on create when passing test_account param" do - UserSession.create(@admin) - post :create, :provider_id => @provider.id, :cloud_account => {}, :test_account => true - response.should be_success - response.should render_template("new") - response.flash[:error].should == "Test Connection Failed: Invalid Account Details" - end - - it "doesn't allow to save provider's account if not valid credentials" do - UserSession.create(@admin) - post :create, :provider_id => @provider.id, :cloud_account => {} - response.should be_success - response.should render_template("new") - response.flash[:error].should == "The entered credential information is incorrect" - end - - it "should permit users with account modify permission to access edit cloud account interface" do - UserSession.create(@admin) - get :edit, :id => @cloud_account.id - response.should be_success - response.should render_template("edit") - end - - it "should allow users with account modify password to update a cloud account" do - UserSession.create(@admin) - - @cloud_account.password = "foobar" - @cloud_account.stub!(:valid_credentials?).and_return(true) - @cloud_account.quota = Quota.new - @cloud_account.save.should be_true - - post :update, :id => @cloud_account.id, :cloud_account => { :password => 'mockpassword' } - response.should redirect_to provider_accounts_path(@provider) - CloudAccount.find(@cloud_account.id).password.should == "mockpassword" - end - - it "should allow users with account modify permission to delete a cloud account" do - UserSession.create(@admin) - lambda do - get :destroy, :id => @cloud_account.id - end.should change(CloudAccount, :count).by(-1) - response.should redirect_to provider_accounts_path(@provider) - CloudAccount.find_by_id(@cloud_account.id).should be_nil - end - - it "should deny access to users without account modify permission" do - get :edit, :id => @cloud_account.id - response.should_not be_success - - post :update, :id => @cloud_account.id, :cloud_account => { :password => 'foobar' } - response.should_not be_success - - post :destroy, :id => @cloud_account.id - response.should_not be_success - end - - it "should provide ui to create new account" do - UserSession.create(@admin) - get :new, :provider_id => @provider.id - response.should be_success - response.should render_template("new") - end - - it "should fail to grant access to account UIs for unauthenticated user" do - get :new - response.should_not be_success - end - -end diff --git a/src/spec/controllers/provider_accounts_controller_spec.rb b/src/spec/controllers/provider_accounts_controller_spec.rb new file mode 100644 index 0000000..6369eab --- /dev/null +++ b/src/spec/controllers/provider_accounts_controller_spec.rb @@ -0,0 +1,92 @@ +require 'spec_helper' + +describe ProviderAccountsController do + + fixtures :all + before(:each) do + @provider_account = Factory :mock_provider_account + @provider = @provider_account.provider + + @admin_permission = Permission.create :role => Role.find(:first, :conditions => ['name = ?', 'Provider Administrator']), + :permission_object => @provider, + :user => Factory(:provider_admin_user) + @admin = @admin_permission.user + activate_authlogic + end + + it "shows provider accounts as list" do + UserSession.create(@admin) + get :index, :provider_id => @provider.id + response.should be_success + response.should render_template("index") + end + + it "allows test account validity on create when passing test_account param" do + UserSession.create(@admin) + post :create, :provider_id => @provider.id, :provider_account => {}, :test_account => true + response.should be_success + response.should render_template("new") + response.flash[:error].should == "Test Connection Failed: Invalid Account Details" + end + + it "doesn't allow to save provider's account if not valid credentials" do + UserSession.create(@admin) + post :create, :provider_id => @provider.id, :provider_account => {} + response.should be_success + response.should render_template("new") + response.flash[:error].should == "The entered credential information is incorrect" + end + + it "should permit users with account modify permission to access edit cloud account interface" do + UserSession.create(@admin) + get :edit, :id => @provider_account.id + response.should be_success + response.should render_template("edit") + end + + it "should allow users with account modify password to update a cloud account" do + UserSession.create(@admin) + + @provider_account.password = "foobar" + @provider_account.stub!(:valid_credentials?).and_return(true) + @provider_account.quota = Quota.new + @provider_account.save.should be_true + + post :update, :id => @provider_account.id, :provider_account => { :password => 'mockpassword' } + response.should redirect_to provider_accounts_path(@provider) + ProviderAccount.find(@provider_account.id).password.should == "mockpassword" + end + + it "should allow users with account modify permission to delete a cloud account" do + UserSession.create(@admin) + lambda do + get :destroy, :id => @provider_account.id + end.should change(ProviderAccount, :count).by(-1) + response.should redirect_to provider_accounts_path(@provider) + ProviderAccount.find_by_id(@provider_account.id).should be_nil + end + + it "should deny access to users without account modify permission" do + get :edit, :id => @provider_account.id + response.should_not be_success + + post :update, :id => @provider_account.id, :provider_account => { :password => 'foobar' } + response.should_not be_success + + post :destroy, :id => @provider_account.id + response.should_not be_success + end + + it "should provide ui to create new account" do + UserSession.create(@admin) + get :new, :provider_id => @provider.id + response.should be_success + response.should render_template("new") + end + + it "should fail to grant access to account UIs for unauthenticated user" do + get :new + response.should_not be_success + end + +end diff --git a/src/spec/factories/cloud_account.rb b/src/spec/factories/cloud_account.rb deleted file mode 100644 index 0b9c0a7..0000000 --- a/src/spec/factories/cloud_account.rb +++ /dev/null @@ -1,21 +0,0 @@ -Factory.define :cloud_account do |f| - f.sequence(:username) { |n| "testUser#{n}" } - f.password "testPassword" - f.sequence(:label) { |n| "test label#{n}" } - f.account_number "3141" - f.x509_cert_priv "x509 private key" - f.x509_cert_pub "x509 public key" - f.association :provider -end - -Factory.define :mock_cloud_account, :parent => :cloud_account do |f| - f.username "mockuser" - f.password "mockpassword" - f.provider { |p| p.association(:mock_provider) } -end - -Factory.define :ec2_cloud_account, :parent => :cloud_account do |f| - f.username "mockuser" - f.password "mockpassword" - f.provider { |p| p.association(:ec2_provider) } -end diff --git a/src/spec/factories/instance.rb b/src/spec/factories/instance.rb index 7533ba9..87938bd 100644 --- a/src/spec/factories/instance.rb +++ b/src/spec/factories/instance.rb @@ -2,7 +2,7 @@ Factory.define :instance do |i| i.sequence(:name) { |n| "instance#{n}" } i.sequence(:external_key) { |n| "key#{n}" } i.association :hardware_profile, :factory => :mock_hwp1 - i.association :cloud_account, :factory => :mock_cloud_account + i.association :provider_account, :factory => :mock_provider_account i.association :template, :factory => :template i.association :pool, :factory => :pool i.association :owner, :factory => :user @@ -23,6 +23,6 @@ end
Factory.define :ec2_instance, :parent => :instance do |i| i.association :hardware_profile, :factory => :ec2_hwp1 - i.association :cloud_account, :factory => :ec2_cloud_account + i.association :provider_account, :factory => :ec2_provider_account i.association :instance_key, :factory => :ec2_instance_key1 end diff --git a/src/spec/factories/provider.rb b/src/spec/factories/provider.rb index 76fb4af..f6288dc 100644 --- a/src/spec/factories/provider.rb +++ b/src/spec/factories/provider.rb @@ -1,11 +1,11 @@ Factory.define :provider do |p| p.sequence(:name) { |n| "provider#{n}" } - p.cloud_type 'mock' + p.provider_type '0' p.url { |p| "http://www." + p.name + ".com/api" } end
Factory.define :mock_provider, :parent => :provider do |p| - p.cloud_type 'mock' + p.provider_type '0' p.url 'http://localhost:3001/api' p.hardware_profiles { |hp| [hp.association(:mock_hwp1), hp.association(:mock_hwp2)] } p.after_create { |p| p.realms << Factory(:realm1, :provider => p) << Factory(:realm2, :provider => p) } @@ -13,14 +13,14 @@ end
Factory.define :mock_provider2, :parent => :provider do |p| p.name 'mock2' - p.cloud_type 'mock' + p.provider_type '0' p.url 'http://localhost:3001/api' p.after_create { |p| p.realms << Factory(:realm3, :provider => p) } end
Factory.define :ec2_provider, :parent => :provider do |p| p.name 'amazon-ec2' - p.cloud_type 'ec2' + p.provider_type '1' p.url 'http://localhost:3001/api' p.hardware_profiles { |hp| [hp.association(:ec2_hwp1)] } p.after_create { |p| p.realms << Factory(:realm4, :provider => p) } diff --git a/src/spec/factories/provider_account.rb b/src/spec/factories/provider_account.rb new file mode 100644 index 0000000..dae7047 --- /dev/null +++ b/src/spec/factories/provider_account.rb @@ -0,0 +1,21 @@ +Factory.define :provider_account do |f| + f.sequence(:username) { |n| "testUser#{n}" } + f.password "testPassword" + f.sequence(:label) { |n| "test label#{n}" } + f.account_number "3141" + f.x509_cert_priv "x509 private key" + f.x509_cert_pub "x509 public key" + f.association :provider +end + +Factory.define :mock_provider_account, :parent => :provider_account do |f| + f.username "mockuser" + f.password "mockpassword" + f.provider { |p| p.association(:mock_provider) } +end + +Factory.define :ec2_provider_account, :parent => :provider_account do |f| + f.username "mockuser" + f.password "mockpassword" + f.provider { |p| p.association(:ec2_provider) } +end diff --git a/src/spec/models/cloud_account_observer_spec.rb b/src/spec/models/cloud_account_observer_spec.rb deleted file mode 100644 index 48491c0..0000000 --- a/src/spec/models/cloud_account_observer_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'spec_helper' - -describe CloudAccountObserver do - fixtures :all - - it "should create an instance_key if provider is EC2" do - @client = mock('DeltaCloud', :null_object => true) - @provider = Factory.build :ec2_provider - @key = mock('Key', :null_object => true) - @key.stub!(:pem).and_return("PEM") - @key.stub!(:id).and_return("1_user") - @client.stub!(:"feature?").and_return(true) - @client.stub!(:"create_key").and_return(@key) - - cloud_account = Factory.build :ec2_cloud_account - cloud_account.stub!(:connect).and_return(@client) - cloud_account.save - cloud_account.instance_key.should_not == nil - cloud_account.instance_key.pem == "PEM" - cloud_account.instance_key.id == "1_user" - end -end diff --git a/src/spec/models/cloud_account_spec.rb b/src/spec/models/cloud_account_spec.rb deleted file mode 100644 index fb04e40..0000000 --- a/src/spec/models/cloud_account_spec.rb +++ /dev/null @@ -1,80 +0,0 @@ -require 'spec_helper' - -describe CloudAccount do - fixtures :all - before(:each) do - @cloud_account = Factory :mock_cloud_account - end - - it "should not be destroyable if it has instances" do - @cloud_account.instances << Instance.new - @cloud_account.destroyable?.should be_false - @cloud_account.destroy.should be_false - - @cloud_account.instances.clear - @cloud_account.destroyable?.should be_true - @cloud_account.destroy.equal?(@cloud_account).should be_true - @cloud_account.should be_frozen - end - - it "should check the validitiy of the cloud account login credentials" do - mock_provider = Factory :mock_provider - - invalid_cloud_account = Factory.build(:cloud_account, :username => "wrong_username", :password => "wrong_password", :provider => mock_provider) - invalid_cloud_account.should_not be_valid - - valid_cloud_account = Factory.build(:mock_cloud_account, :provider => mock_provider) - valid_cloud_account.should be_valid - end - - it "should fail to create a cloud account if the provider credentials are invalid" do - cloud_account = Factory.build(:mock_cloud_account, :password => "wrong_password") - cloud_account.save.should == false - end - - it "should create an instance_key if provider is EC2" do - @client = mock('DeltaCloud', :null_object => true) - @provider = Factory.build :ec2_provider - @key = mock('Key', :null_object => true) - @key.stub!(:pem).and_return("PEM") - @key.stub!(:id).and_return("1_user") - @client.stub!(:"feature?").and_return(true) - @client.stub!(:"create_key").and_return(@key) - - cloud_account = Factory.build :ec2_cloud_account - cloud_account.stub!(:connect).and_return(@client) - cloud_account.save - cloud_account.instance_key.should_not == nil - cloud_account.instance_key.pem == "PEM" - cloud_account.instance_key.id == "1_user" - end - - it "when calling connect and it fails with exception it will return nil" do - DeltaCloud.should_receive(:new).and_raise(Exception.new) - - @cloud_account.connect.should be_nil - end - - it "should generate credentials xml" do - expected_xml = <<EOT -<?xml version="1.0"?> -<provider_credentials> - <ec2_credentials> - <account_number>1234</account_number> - <access_key>user</access_key> - <secret_access_key>pass</secret_access_key> - <certificate>cert</certificate> - <key>priv_key</key> - </ec2_credentials> -</provider_credentials> -EOT - cloud_account = Factory.build(:mock_cloud_account, - :username => 'user', - :password => 'pass', - :account_number => '1234', - :x509_cert_priv => 'priv_key', - :x509_cert_pub => 'cert' - ) - cloud_account.build_credentials.should eql(expected_xml) - end -end diff --git a/src/spec/models/image_spec.rb b/src/spec/models/image_spec.rb index dbd5ba8..e489fb6 100644 --- a/src/spec/models/image_spec.rb +++ b/src/spec/models/image_spec.rb @@ -42,12 +42,12 @@ describe Image do end
it "should build image if there is provider and cloud account for specified target" do - acc = Factory.build(:mock_cloud_account) + acc = Factory.build(:mock_provider_account) acc.stub!(:valid_credentials?).and_return(true) acc.save! tpl = Factory.build(:template) tpl.save! - img = Image.build(tpl, 'mock') + img = Image.build(tpl, '0') Image.find(img).should == img ReplicatedImage.find_by_image_id(img.id).should_not be_nil end @@ -55,7 +55,7 @@ describe Image do it "should import image" do image = OpenStruct.new(:id => 'mock', :name => 'mock', :description => 'imported mock', :architecture => 'i386') client = mock('DeltaCloud', :feature? => false, :image => image) - account = Factory.build(:ec2_cloud_account) + account = Factory.build(:ec2_provider_account) account.stub!(:connect).and_return(client) account.stub!(:valid_credentials?).and_return(true) account.save! diff --git a/src/spec/models/instance_observer_spec.rb b/src/spec/models/instance_observer_spec.rb index be2665e..4acb78c 100644 --- a/src/spec/models/instance_observer_spec.rb +++ b/src/spec/models/instance_observer_spec.rb @@ -3,10 +3,8 @@ require 'spec_helper' describe InstanceObserver do
before(:each) do - Timecop.travel(Time.local(2008, 9, 1, 10, 5, 0, 0, 0)) - - @cloud_account_quota = Factory :quota - @cloud_account = Factory(:mock_cloud_account, :quota_id => @cloud_account_quota.id) + @provider_account_quota = Factory :quota + @provider_account = Factory(:mock_provider_account, :quota_id => @provider_account_quota.id)
@pool_quota = Factory :quota @pool = Factory(:pool, :quota_id => @pool_quota.id) @@ -15,7 +13,9 @@ describe InstanceObserver do @user = Factory(:user, :quota_id => @user_quota.id)
@hwp = Factory :mock_hwp1 - @instance = Factory(:new_instance, :pool => @pool, :hardware_profile => @hwp, :cloud_account_id => @cloud_account.id, :owner => @user) + @instance = Factory(:new_instance, :pool => @pool, :hardware_profile => @hwp, :provider_account_id => @provider_account.id, :owner => @user) + + Timecop.travel(Time.local(2008, 9, 1, 10, 5, 0, 0, 0)) end
after(:each) do @@ -102,14 +102,14 @@ describe InstanceObserver do end
it "should not update quota on pool, user and cloud account when an instance is state new" do - [@cloud_account_quota, @pool_quota, @user_quota].each do |quota| + [@provider_account_quota, @pool_quota, @user_quota].each do |quota| quota = Quota.find(quota) quota.total_instances.should == 0 end end
it "should update quota on pool, user and cloud account when an instance goes to state pending" do - [@cloud_account_quota, @pool_quota, @user_quota].each do |quota| + [@provider_account_quota, @pool_quota, @user_quota].each do |quota| @instance.state = Instance::STATE_PENDING @instance.save!
@@ -122,7 +122,7 @@ describe InstanceObserver do @instance.state = Instance::STATE_CREATE_FAILED @instance.save!
- [@cloud_account_quota, @pool_quota, @user_quota].each do |quota| + [@provider_account_quota, @pool_quota, @user_quota].each do |quota| quota = Quota.find(quota) quota.total_instances.should == 0 end @@ -132,7 +132,7 @@ describe InstanceObserver do @instance.state = Instance::STATE_RUNNING @instance.save!
- [@cloud_account_quota, @pool_quota, @user_quota].each do |quota| + [@provider_account_quota, @pool_quota, @user_quota].each do |quota| quota = Quota.find(quota.id) quota.running_instances.should == 1 quota.total_instances.should == 1 @@ -146,7 +146,7 @@ describe InstanceObserver do @instance.state = Instance::STATE_SHUTTING_DOWN @instance.save!
- [@cloud_account_quota, @pool_quota, @user_quota].each do |quota| + [@provider_account_quota, @pool_quota, @user_quota].each do |quota| quota = Quota.find(quota.id)
quota.running_instances.should == 0 diff --git a/src/spec/models/instance_spec.rb b/src/spec/models/instance_spec.rb index 625718d..e4d3a9f 100644 --- a/src/spec/models/instance_spec.rb +++ b/src/spec/models/instance_spec.rb @@ -86,16 +86,9 @@ describe Instance do
describe "with time capsule" do
- before(:each) do - Timecop.travel(Time.local(2008, 9, 1, 10, 5, 0, 0, 0)) - end - - after(:each) do - Timecop.return - end - it "should properly calculate the total time that the instance has been in a monitored state" do instance = Factory :new_instance + Timecop.travel(Time.local(2008, 9, 1, 10, 5, 0, 0, 0))
[ Instance::STATE_PENDING, Instance::STATE_RUNNING, Instance::STATE_SHUTTING_DOWN, Instance::STATE_STOPPED ].each do |s|
@@ -121,18 +114,19 @@ describe Instance do instance.total_state_time(s).should >= 3 instance.total_state_time(s).should <= 4 end + Timecop.return end
end
it "should return empty list of instance actions when connect to provider fails" do provider = Factory.build(:mock_provider2) - cloud_account = Factory.build(:cloud_account, :provider => provider, + cloud_account = Factory.build(:provider_account, :provider => provider, :username => 'john doe', :password => 'asdf') cloud_account.stub!(:connect).and_return(nil) cloud_account.stub!(:valid_credentials?).and_return(true) - instance = Factory.create(:instance, :cloud_account => cloud_account) + instance = Factory.create(:instance, :provider_account => cloud_account) instance.get_action_list.should be_empty end
diff --git a/src/spec/models/pool_family_spec.rb b/src/spec/models/pool_family_spec.rb index 2b69eab..68dfb42 100644 --- a/src/spec/models/pool_family_spec.rb +++ b/src/spec/models/pool_family_spec.rb @@ -5,9 +5,9 @@ describe PoolFamily do before(:each) do @pool = Factory :pool @pool_family = @pool.pool_family - @cloud_account = Factory :mock_cloud_account - @cloud_account.pool_families << @pool_family - @cloud_account.save! + @provider_account = Factory :mock_provider_account + @provider_account.pool_families << @pool_family + @provider_account.save! end
it "should validate default pool family" do @@ -27,8 +27,8 @@ describe PoolFamily do end
it "should have account" do - @pool_family.cloud_accounts.size.should == 1 - @pool_family.cloud_accounts[0].id.should == @cloud_account.id + @pool_family.provider_accounts.size.should == 1 + @pool_family.provider_accounts[0].id.should == @provider_account.id end
end diff --git a/src/spec/models/provider_account_observer_spec.rb b/src/spec/models/provider_account_observer_spec.rb new file mode 100644 index 0000000..0c397db --- /dev/null +++ b/src/spec/models/provider_account_observer_spec.rb @@ -0,0 +1,22 @@ +require 'spec_helper' + +describe ProviderAccountObserver do + fixtures :all + + it "should create an instance_key if provider is EC2" do + @client = mock('DeltaCloud', :null_object => true) + @provider = Factory.build :ec2_provider + @key = mock('Key', :null_object => true) + @key.stub!(:pem).and_return("PEM") + @key.stub!(:id).and_return("1_user") + @client.stub!(:"feature?").and_return(true) + @client.stub!(:"create_key").and_return(@key) + + provider_account = Factory.build :ec2_provider_account + provider_account.stub!(:connect).and_return(@client) + provider_account.save + provider_account.instance_key.should_not == nil + provider_account.instance_key.pem == "PEM" + provider_account.instance_key.id == "1_user" + end +end diff --git a/src/spec/models/provider_account_spec.rb b/src/spec/models/provider_account_spec.rb new file mode 100644 index 0000000..48678e8 --- /dev/null +++ b/src/spec/models/provider_account_spec.rb @@ -0,0 +1,80 @@ +require 'spec_helper' + +describe ProviderAccount do + fixtures :all + before(:each) do + @provider_account = Factory :mock_provider_account + end + + it "should not be destroyable if it has instances" do + @provider_account.instances << Instance.new + @provider_account.destroyable?.should be_false + @provider_account.destroy.should be_false + + @provider_account.instances.clear + @provider_account.destroyable?.should be_true + @provider_account.destroy.equal?(@provider_account).should be_true + @provider_account.should be_frozen + end + + it "should check the validitiy of the cloud account login credentials" do + mock_provider = Factory :mock_provider + + invalid_provider_account = Factory.build(:provider_account, :username => "wrong_username", :password => "wrong_password", :provider => mock_provider) + invalid_provider_account.should_not be_valid + + valid_provider_account = Factory.build(:mock_provider_account, :provider => mock_provider) + valid_provider_account.should be_valid + end + + it "should fail to create a cloud account if the provider credentials are invalid" do + provider_account = Factory.build(:mock_provider_account, :password => "wrong_password") + provider_account.save.should == false + end + + it "should create an instance_key if provider is EC2" do + @client = mock('DeltaCloud', :null_object => true) + @provider = Factory.build :ec2_provider + @key = mock('Key', :null_object => true) + @key.stub!(:pem).and_return("PEM") + @key.stub!(:id).and_return("1_user") + @client.stub!(:"feature?").and_return(true) + @client.stub!(:"create_key").and_return(@key) + + provider_account = Factory.build :ec2_provider_account + provider_account.stub!(:connect).and_return(@client) + provider_account.save + provider_account.instance_key.should_not == nil + provider_account.instance_key.pem == "PEM" + provider_account.instance_key.id == "1_user" + end + + it "when calling connect and it fails with exception it will return nil" do + DeltaCloud.should_receive(:new).and_raise(Exception.new) + + @provider_account.connect.should be_nil + end + + it "should generate credentials xml" do + expected_xml = <<EOT +<?xml version="1.0"?> +<provider_credentials> + <ec2_credentials> + <account_number>1234</account_number> + <access_key>user</access_key> + <secret_access_key>pass</secret_access_key> + <certificate>cert</certificate> + <key>priv_key</key> + </ec2_credentials> +</provider_credentials> +EOT + provider_account = Factory.build(:mock_provider_account, + :username => 'user', + :password => 'pass', + :account_number => '1234', + :x509_cert_priv => 'priv_key', + :x509_cert_pub => 'cert' + ) + provider_account.build_credentials.should eql(expected_xml) + end +end diff --git a/src/spec/models/provider_spec.rb b/src/spec/models/provider_spec.rb index 1b86f92..c23227e 100644 --- a/src/spec/models/provider_spec.rb +++ b/src/spec/models/provider_spec.rb @@ -26,9 +26,9 @@ describe Provider do end end
- it "should require a valid cloud_type" do + it "should require a valid provider_type" do [nil, ""].each do |invalid_value| - @provider.cloud_type = invalid_value + @provider.provider_type = invalid_value @provider.should_not be_valid end end @@ -64,9 +64,9 @@ describe Provider do end
it "should set valid cloud type" do - @client.driver_name = @provider.cloud_type - @provider.cloud_type = nil - @provider.set_cloud_type! + @client.driver_name = @provider.provider_type + @provider.provider_type = nil + @provider.provider_type = 0 @provider.should be_valid end
@@ -79,7 +79,7 @@ describe Provider do HardwareProfile.destroy_all
instance = Factory(:instance) - provider = instance.cloud_account.provider + provider = instance.provider_account.provider provider.destroy provider.destroyed?.should be_false end diff --git a/src/spec/models/quota_spec.rb b/src/spec/models/quota_spec.rb index 9620e83..960b417 100644 --- a/src/spec/models/quota_spec.rb +++ b/src/spec/models/quota_spec.rb @@ -3,8 +3,8 @@ require 'spec_helper' describe Quota do
before(:each) do - @cloud_account_quota = Factory :quota - @cloud_account = Factory(:mock_cloud_account, :quota_id => @cloud_account_quota.id) + @provider_account_quota = Factory :quota + @provider_account = Factory(:mock_provider_account, :quota_id => @provider_account_quota.id)
@pool_quota = Factory :quota @pool = Factory(:pool, :quota_id => @pool_quota.id) @@ -13,12 +13,12 @@ describe Quota do @user = Factory(:user, :quota_id => @user_quota.id)
@hwp = Factory :mock_hwp1 - @instance = Factory(:new_instance, :pool => @pool, :hardware_profile => @hwp, :cloud_account_id => @cloud_account.id, :owner => @user) + @instance = Factory(:new_instance, :pool => @pool, :hardware_profile => @hwp, :provider_account_id => @provider_account.id, :owner => @user) end
it "should return true when asking if an instance can be created/started when there is sufficient quota space" do - Quota.can_create_instance?(@instance, @cloud_account).should == true - Quota.can_start_instance?(@instance, @cloud_account).should == true + Quota.can_create_instance?(@instance, @provider_account).should == true + Quota.can_start_instance?(@instance, @provider_account).should == true end
it "should return true when asking if an instance can be created/started when using unlimited Quotas" do @@ -28,11 +28,11 @@ describe Quota do @pool.quota = Factory :unlimited_quota @pool.save!
- @cloud_account.quota = Factory :unlimited_quota - @cloud_account.save! + @provider_account.quota = Factory :unlimited_quota + @provider_account.save!
- Quota.can_create_instance?(@instance, @cloud_account).should == true - Quota.can_start_instance?(@instance, @cloud_account).should == true + Quota.can_create_instance?(@instance, @provider_account).should == true + Quota.can_start_instance?(@instance, @provider_account).should == true end
it "should return false when asking if an instance can be created/started when the user quota is reached" do @@ -40,8 +40,8 @@ describe Quota do @user_quota.running_instances = @user_quota.maximum_running_instances @user_quota.save!
- Quota.can_create_instance?(@instance, @cloud_account).should == false - Quota.can_start_instance?(@instance, @cloud_account).should == false + Quota.can_create_instance?(@instance, @provider_account).should == false + Quota.can_start_instance?(@instance, @provider_account).should == false end
it "should return false when asking if an instance can be created/started when the pool quota is reached" do @@ -49,17 +49,17 @@ describe Quota do @pool_quota.running_instances = @pool_quota.maximum_running_instances @pool_quota.save!
- Quota.can_create_instance?(@instance, @cloud_account).should == false - Quota.can_start_instance?(@instance, @cloud_account).should == false + Quota.can_create_instance?(@instance, @provider_account).should == false + Quota.can_start_instance?(@instance, @provider_account).should == false end
it "should return false when asking if an instance can be created/started when the cloud account quota is reached" do - @cloud_account_quota.total_instances = @cloud_account_quota.maximum_total_instances - @cloud_account_quota.running_instances = @cloud_account_quota.maximum_running_instances - @cloud_account_quota.save! + @provider_account_quota.total_instances = @provider_account_quota.maximum_total_instances + @provider_account_quota.running_instances = @provider_account_quota.maximum_running_instances + @provider_account_quota.save!
- Quota.can_create_instance?(@instance, @cloud_account).should == false - Quota.can_start_instance?(@instance, @cloud_account).should == false + Quota.can_create_instance?(@instance, @provider_account).should == false + Quota.can_start_instance?(@instance, @provider_account).should == false end
it "should return false when asking if an instance can be created/started when the all quotas are reached" do @@ -71,12 +71,12 @@ describe Quota do @pool_quota.running_instances = @pool_quota.maximum_running_instances @pool_quota.save!
- @cloud_account_quota.total_instances = @cloud_account_quota.maximum_total_instances - @cloud_account_quota.running_instances = @cloud_account_quota.maximum_running_instances - @cloud_account_quota.save! + @provider_account_quota.total_instances = @provider_account_quota.maximum_total_instances + @provider_account_quota.running_instances = @provider_account_quota.maximum_running_instances + @provider_account_quota.save!
- Quota.can_create_instance?(@instance, @cloud_account).should == false - Quota.can_start_instance?(@instance, @cloud_account).should == false + Quota.can_create_instance?(@instance, @provider_account).should == false + Quota.can_start_instance?(@instance, @provider_account).should == false end
-end \ No newline at end of file +end diff --git a/src/spec/services/data_service_active_record_spec.rb b/src/spec/services/data_service_active_record_spec.rb index b443fa9..45b07bf 100644 --- a/src/spec/services/data_service_active_record_spec.rb +++ b/src/spec/services/data_service_active_record_spec.rb @@ -11,13 +11,13 @@ describe DataServiceActiveRecord do data = [[25, 10], [40, 20], [20, 20]] free = 0 for i in 0..2 - cloud_account = Factory.build(:cloud_account, :provider => provider, :username => "username" + i.to_s) - cloud_account.stub!(:valid_credentials?).and_return(true) - cloud_account.save! + provider_account = Factory.build(:provider_account, :provider => provider, :username => "username" + i.to_s) + provider_account.stub!(:valid_credentials?).and_return(true) + provider_account.save!
quota = Factory(:quota, :maximum_total_instances => data[i][0], :total_instances => data[i][1]) - cloud_account.quota_id = quota.id - cloud_account.save! + provider_account.quota_id = quota.id + provider_account.save!
free += (data[i][0] - data[i][1]) end @@ -36,24 +36,24 @@ describe DataServiceActiveRecord do provider.stub!(:connect).and_return(client) provider.save!
- cloud_account = Factory.build(:cloud_account, :provider => provider) - cloud_account.stub!(:valid_credentials?).and_return(true) - cloud_account.save! + provider_account = Factory.build(:provider_account, :provider => provider) + provider_account.stub!(:valid_credentials?).and_return(true) + provider_account.save!
quota = Factory(:quota, :maximum_running_instances => 40, :maximum_total_instances => 50, :running_instances => 20, :total_instances => 20) - cloud_account.quota_id = quota.id + provider_account.quota_id = quota.id
- data_point = DataServiceActiveRecord.quota_usage(cloud_account, Quota::RESOURCE_RUNNING_INSTANCES) + data_point = DataServiceActiveRecord.quota_usage(provider_account, Quota::RESOURCE_RUNNING_INSTANCES) data_point.should == DataServiceActiveRecord::QuotaUsagePoint.new(20, 40)
- data_point = DataServiceActiveRecord.quota_usage(cloud_account, Quota::RESOURCE_TOTAL_INSTANCES) + data_point = DataServiceActiveRecord.quota_usage(provider_account, Quota::RESOURCE_TOTAL_INSTANCES) data_point.should == DataServiceActiveRecord::QuotaUsagePoint.new(20, 50)
- data_point = DataServiceActiveRecord.quota_usage(cloud_account, Quota::RESOURCE_OVERALL) + data_point = DataServiceActiveRecord.quota_usage(provider_account, Quota::RESOURCE_OVERALL) data_point.should == DataServiceActiveRecord::QuotaUsagePoint.new(20, 40) end
@@ -127,13 +127,13 @@ describe DataServiceActiveRecord do provider.stub!(:connect).and_return(client) provider.save!
- cloud_accounts = [] + provider_accounts = [] expected_averages.each do |expected_average| - cloud_account = Factory.build(:cloud_account, :provider => provider, :username => "username" + expected_average[0].to_s) - cloud_account.stub!(:valid_credentials?).and_return(true) - cloud_account.save! + provider_account = Factory.build(:provider_account, :provider => provider, :username => "username" + expected_average[0].to_s) + provider_account.stub!(:valid_credentials?).and_return(true) + provider_account.save!
- instance = Factory(:instance, :cloud_account_id => cloud_account.id, :pool_id => pool.id) + instance = Factory(:instance, :provider_account_id => provider_account.id, :pool_id => pool.id) generate_tasks(start_time, interval_length, instance, expected_average) end
@@ -163,11 +163,11 @@ describe DataServiceActiveRecord do runtimes = [runtime1, runtime2, runtime3]
pool = Factory(:pool) - cloud_account = Factory :mock_cloud_account + provider_account = Factory :mock_provider_account
for i in 0..2 do runtimes[i].each do |runtime| - instance = Factory(:instance, :pool => pool, :cloud_account => cloud_account, :state => Instance::STATE_STOPPED) + instance = Factory(:instance, :pool => pool, :provider_account => provider_account, :state => Instance::STATE_STOPPED) instance.save!
instance.time_last_pending = start_times[i] + (interval_length / 2) @@ -177,7 +177,7 @@ describe DataServiceActiveRecord do end end
- stats = DataServiceActiveRecord.qos_instance_runtime_stats(cloud_account, start_time, end_time, interval_length) + stats = DataServiceActiveRecord.qos_instance_runtime_stats(provider_account, start_time, end_time, interval_length) stats[0].should == DataServiceActiveRecord::QoSDataPoint.new(start_times[0], 15, 25, 5) stats[1].should == DataServiceActiveRecord::QoSDataPoint.new(start_times[1], 30, 50, 10) stats[2].should == DataServiceActiveRecord::QoSDataPoint.new(start_times[2], 300, 500, 100) @@ -187,11 +187,11 @@ describe DataServiceActiveRecord do it "should generate the mean max and min instance runtimes of instances for a given cloud account or pool" do pool = Factory(:pool)
- cloud_account = Factory :mock_cloud_account + provider_account = Factory :mock_provider_account
start_time = Time.utc(2010,"jan",1,20,15,1) [50, 100, 150, 200, 250].each do |runtime| - instance = Factory(:new_instance, :pool => pool, :cloud_account => cloud_account) + instance = Factory(:new_instance, :pool => pool, :provider_account => provider_account) instance.time_last_pending = start_time instance.time_last_running = start_time instance.acc_running_time = runtime @@ -205,8 +205,8 @@ describe DataServiceActiveRecord do
it "should calculate the average time it takes a provider to complete a task between two times" do pool = Factory(:pool) - cloud_account = Factory(:mock_cloud_account) - instance = Factory(:instance, :pool => pool, :cloud_account => cloud_account) + provider_account = Factory(:mock_provider_account) + instance = Factory(:instance, :pool => pool, :provider_account => provider_account)
start_time = Time.utc(2010,"jan",1,20,15,1) task_completion_times = [10, 20, 30, 40, 50] @@ -230,7 +230,7 @@ describe DataServiceActiveRecord do end
expected_average_time = total_time / task_completion_times.length - average_time = DataServiceActiveRecord.qos_task_completion_mean_max_min(cloud_account.provider, start_time, Time.now, InstanceTask::ACTION_CREATE) + average_time = DataServiceActiveRecord.qos_task_completion_mean_max_min(provider_account.provider, start_time, Time.now, InstanceTask::ACTION_CREATE)
average_time[:average].should == expected_average_time average_time[:min].should == 10 @@ -243,8 +243,8 @@ describe DataServiceActiveRecord do end_time = create_time + 1
pool = Factory(:pool) - cloud_account = Factory :mock_cloud_account - instance = Factory(:instance, :pool => pool, :cloud_account => cloud_account) + provider_account = Factory :mock_provider_account + instance = Factory(:instance, :pool => pool, :provider_account => provider_account)
failures = 5 non_failures = 20 @@ -289,8 +289,8 @@ describe DataServiceActiveRecord do number_of_instances = 20
pool = Factory(:pool) - cloud_account = Factory :mock_cloud_account - instance = Factory(:instance, :pool => pool, :cloud_account => cloud_account) + provider_account = Factory :mock_provider_account + instance = Factory(:instance, :pool => pool, :provider_account => provider_account)
for i in 0..2 for j in 1..failures[i] diff --git a/src/test/fixtures/providers.yml b/src/test/fixtures/providers.yml index 1669919..7e8ee9f 100644 --- a/src/test/fixtures/providers.yml +++ b/src/test/fixtures/providers.yml @@ -2,5 +2,5 @@
mock_provider: name: mock - cloud_type: Mock + provider_type: Mock url: http://localhost:3001/api diff --git a/src/test/fixtures/roles.yml b/src/test/fixtures/roles.yml index 99df4b7..d12fc64 100644 --- a/src/test/fixtures/roles.yml +++ b/src/test/fixtures/roles.yml @@ -27,11 +27,11 @@ pool_administrator: privileges: provider_view, pool_modify, pool_view, quota_modify, quota_view, stats_view, set_perms, view_perms account_administrator: name: Account Administrator - scope: CloudAccount + scope: ProviderAccount privileges: account_modify, account_view, stats_view, set_perms, view_perms account_viewer: name: Account User - scope: CloudAccount + scope: ProviderAccount privileges: account_view provider_administrator: name: Provider Administrator diff --git a/src/test/unit/cloud_account_test.rb b/src/test/unit/cloud_account_test.rb deleted file mode 100644 index addf6af..0000000 --- a/src/test/unit/cloud_account_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class CloudAccountTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/src/test/unit/provider_account_test.rb b/src/test/unit/provider_account_test.rb new file mode 100644 index 0000000..cafbb76 --- /dev/null +++ b/src/test/unit/provider_account_test.rb @@ -0,0 +1,8 @@ +require 'test_helper' + +class ProviderAccountTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/src/test/unit/provider_test.rb b/src/test/unit/provider_test.rb index 877fd9c..2181ce6 100644 --- a/src/test/unit/provider_test.rb +++ b/src/test/unit/provider_test.rb @@ -5,7 +5,7 @@ class ProviderTest < ActiveSupport::TestCase
def setup @provider = Provider.new(:name => "my_ec2", - :cloud_type => "EC2") + :provider_type => "EC2") end # The following three tests assume you have the deltacloud-framework # running and configured on localhost:3000
On 01/31/2011 12:34 PM, jzigmund@redhat.com wrote:
From: Jozef Zigmundjzigmund@redhat.com
Inside this patch I rename model of CloudAccount to ProviderAccount. Also I refactor all codes where this model was called. All supported providers are included in constant hash, that is named PROVIDER_TYPES in Provider model. So now, attribute of class "cloud_type" is renamed to "provider_type" and it must be one of these PROVIDER_TYPES value. I fixed all Rspecs and Cucumbers for provider_account model.
When you'll test this patch won't forget to run "rake db:migrate", because some of the attributes were changed in DB.
diff --git a/src/app/controllers/admin/provider_accounts_controller.rb b/src/app/controllers/admin/provider_accounts_controller.rb index d422a53..40b700b 100644 --- a/src/app/controllers/admin/provider_accounts_controller.rb +++ b/src/app/controllers/admin/provider_accounts_controller.rb @@ -38,71 +38,77 @@ class Admin::ProviderAccountsController< ApplicationController end
def new
- @cloud_account = CloudAccount.new
- @provider_account = ProviderAccount.new @quota = Quota.new @providers = Provider.all
- if @providers.empty?
flash[:error] = "You don't have any provider yet. Please create one!"
- else
- @selected_provider = @providers.first unless @providers.blank?
- end end
Hmm. I think the provider needs to be selected before getting here -- we need to pull this from the 'new provider account' link (which should be an action off the provider). This may be an issue with the existing UI rather than part of this patch though.
def create
- @provider = Provider.find(params[:provider_id])
- require_privilege(Privilege::CREATE, CloudAccount, @provider)
- @selected_provider = @provider = Provider.find(params[:select_provider])
- require_privilege(Privilege::CREATE, ProviderAccount, @provider)
If we use provider_id instead of select_provider, the provider should be set without having to do this as a separate step.
@@ -112,13 +118,30 @@ class Admin::ProviderAccountsController< ApplicationController if (not params[:accounts_selected]) or (params[:accounts_selected].length == 0) flash[:notice] = "You must select some accounts first." else
CloudAccount.find(params[:accounts_selected]).each do |account|
ProviderAccount.find(params[:accounts_selected]).each do |account| account.destroy if check_privilege(Privilege::MODIFY, account) end end redirect_to admin_provider_accounts_url
end
def set_selected_provider
@quota = Quota.new
@provider_account = ProviderAccount.new
respond_to do |format|
format.js {
@providers = Provider.find(:all)
@selected_provider = Provider.find(params[:select_provider])
render :partial => 'provider_selection'
}
format.html {
@providers = Provider.find(:all)
@selected_provider = Provider.find(params[:select_provider])
render :action => 'new', :layout => true
}
end
end
protected
def test_account(account)
diff --git a/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb new file mode 100644 index 0000000..beaabc5 --- /dev/null +++ b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb @@ -0,0 +1,11 @@ +class RenameCloudAccountToProviderAccount< ActiveRecord::Migration
- def self.up
- rename_table (:cloud_accounts,:provider_accounts)
- change_column (:providers, :cloud_type, :integer, :null => false)
- end
- def self.down
- change_column (:providers, :cloud_type, :string, :null => false)
- rename_table (:provider_accounts, :cloud_accounts)
- end
+end diff --git a/src/db/seeds.rb b/src/db/seeds.rb index 9a6065c..1ed2329 100644 --- a/src/db/seeds.rb +++ b/src/db/seeds.rb @@ -30,17 +30,17 @@ roles = Quota => [VIEW]}}, Provider => {"Provider Owner" => {Provider => [VIEW, MOD, VPRM,GPRM],
CloudAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}},
- CloudAccount =>
{"Provider Account User" => {CloudAccount => [VIEW,USE]},
"Provider Account Owner" => {CloudAccount => [VIEW,USE,MOD, VPRM,GPRM]}},
ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}},
- ProviderAccount =>
{"Provider Account User" => {ProviderAccount => [VIEW,USE]},
Template => {"Template User" => {Template => [VIEW,USE]}, "Template Owner" => {Template => [VIEW,USE,MOD, VPRM,GPRM]}}, BasePermissionObject => {"Provider Creator" => {Provider => [ CRE]}, "Provider Administrator" => {Provider => [VIEW, MOD,CRE,VPRM,GPRM],"Provider Account Owner" => {ProviderAccount => [VIEW,USE,MOD, VPRM,GPRM]}},
CloudAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]},
ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}, "HWP Administrator" => {HardwareProfile => [ MOD,CRE,VPRM,GPRM]}, "Realm Administrator" => {Realm => [ USE,MOD,CRE,VPRM,GPRM]}, "Pool Creator" => {Pool => [ CRE]},
@@ -50,7 +50,7 @@ roles = PoolFamily => [VIEW, MOD,CRE,VPRM,GPRM]}, "Template Administrator" => {Template => [VIEW,USE,MOD,CRE,VPRM,GPRM]}, "Administrator" => {Provider => [VIEW, MOD,CRE,VPRM,GPRM],
CloudAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM],
ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM], HardwareProfile => [ MOD,CRE,VPRM,GPRM], Realm => [ USE,MOD,CRE,VPRM,GPRM], User => [VIEW, MOD,CRE],
You'll need to edit the existing Roles and Privileges objects in a migration to make the corresponding change. Without this, running 'rake db:migrate' won't work as the roles and privileges data (previously loaded via seeds.rb) will be wrong.
For new database, seeds.rb will load the proper data, but for migrating an existing detabase, you need to update all roles with a scope of "CloudAccount" to change scope to "ProviderAccount", and all Privileges with a target_type of "CloudAccount" to change target_type to "ProviderAccount"
To be really complete you should probably also look for Permissions with permission_object_type="CloudAccount" and change those records accordingly as well.
diff --git a/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb new file mode 100644 index 0000000..beaabc5 --- /dev/null +++ b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb @@ -0,0 +1,11 @@ +class RenameCloudAccountToProviderAccount< ActiveRecord::Migration
- def self.up
- rename_table (:cloud_accounts,:provider_accounts)
- change_column (:providers, :cloud_type, :integer, :null => false)
- end
- def self.down
- change_column (:providers, :cloud_type, :string, :null => false)
- rename_table (:provider_accounts, :cloud_accounts)
- end
This one's not working on postgres:
PGError: ERROR: column "cloud_type" cannot be cast to type integer : ALTER TABLE "providers" ALTER COLUMN "cloud_type" TYPE integer
This worked for me:
diff --git a/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb index beaabc5..ecd313a 100644 --- a/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb +++ b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb @@ -1,11 +1,13 @@ class RenameCloudAccountToProviderAccount < ActiveRecord::Migration def self.up rename_table (:cloud_accounts,:provider_accounts) - change_column (:providers, :cloud_type, :integer, :null => false) + remove_column (:providers, :cloud_type) + add_column (:providers, :cloud_type, :integer, :null => false) end
def self.down - change_column (:providers, :cloud_type, :string, :null => false) + remove_column (:providers, :cloud_type) + add_column (:providers, :cloud_type, :string, :null => false) rename_table (:provider_accounts, :cloud_accounts) end end
However -- this will definitely _not_ work if you already have providers defined -- in that case you'd need a temp column and to translate the column from the string value to the proper int value. If we're not doing this, we need to make clear that these migrations are only supported for databases which have not yet defined any providers.
Running cucumber and spec tests (on postgres) I hit the following errors: ]$ cucumber features/template.feature Using the default profile... /usr/lib/ruby/gems/1.8/gems/rest-client-1.6.1/lib/restclient/abstract_response.rb:50: warning: parenthesize argument(s) for future version ..................................................................................................................F---------..................................F------------
(::) failed steps (::)
PGError: ERROR: operator does not exist: character varying = integer LINE 1: SELECT * FROM "images" WHERE ("images"."target" = 1 AND "ima... ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. : SELECT * FROM "images" WHERE ("images"."target" = 1 AND "images"."template_id" = 37) LIMIT 1 (ActiveRecord::StatementInvalid) ./app/models/image.rb:65:in `build' ./features/step_definitions/template_steps.rb:101:in `/^there is Amazon AWS build for this template$/' features/template.feature:109:in `And there is Amazon AWS build for this template'
expected the following element's content to include "Test1":
Red Hat Cloud Engine Red Hat Cloud Engine Hello John Smith Log out Resource ManagementImage FactoryAdministrationDashboardTemplatesAssembliesDeployables Saved searches NAMEOSVERSIONBOOTABLEARCHNo Templates //<![CDATA[ $(document).ready(function () { $('#delete_button').click(function(e) { if ($("#templates_table input[@type=radio]:checked").length == 0) { alert('Please select any template to be deleted before clicking Delete button.'); e.preventDefault(); } else { if (!confirm("Are you sure you want to delete this template?")) { e.preventDefault(); } } }); }); //]]> Log out Copyright © 2010 Red Hat, Inc. (Spec::Expectations::ExpectationNotMetError) ./features/step_definitions/web_steps.rb:155:in `/^(?:|I )should see "([^"]*)"$/' features/template.feature:157:in `Then I should see "Test1"'
Failing Scenarios: cucumber features/template.feature:105 # Scenario: Build template which is already built cucumber features/template.feature:128 # Scenario: Search for templates
11 scenarios (2 failed, 9 passed) 167 steps (2 failed, 21 skipped, 144 passed) 0m21.606s
$ spec spec/models/instance_observer_spec.rb /usr/lib/ruby/gems/1.8/gems/rest-client-1.6.1/lib/restclient/abstract_response.rb:50: warning: parenthesize argument(s) for future version .............F
1) 'InstanceObserver should generate instance key when instance is running' FAILED expected not: == nil, got: nil ./spec/models/instance_observer_spec.rb:169:
Finished in 53.000692 seconds
14 examples, 1 failure
From: Jozef Zigmund jzigmund@redhat.com
Inside this patch I rename model of CloudAccount to ProviderAccount. Also I refactor all codes where this model was called. All supported providers are included in constant hash, that is named PROVIDER_TYPES in Provider model. So now, attribute of class "cloud_type" is renamed to "provider_type" and it must be one of these PROVIDER_TYPES value. I fixed all Rspecs and Cucumbers for provider_account model.
When you'll test this patch won't forget to run "rake db:migrate", because some of the attributes were changed in DB. --- .../admin/provider_accounts_controller.rb | 90 ++++++--- src/app/controllers/admin/providers_controller.rb | 11 +- src/app/controllers/cloud_accounts_controller.rb | 181 ----------------- src/app/controllers/dashboard_controller.rb | 6 +- src/app/controllers/permissions_controller.rb | 6 +- .../controllers/provider_accounts_controller.rb | 181 +++++++++++++++++ src/app/controllers/providers_controller.rb | 8 +- src/app/controllers/quotas_controller.rb | 2 +- src/app/helpers/admin/provider_accounts_helper.rb | 21 ++ src/app/models/cloud_account.rb | 205 ------------------- src/app/models/cloud_account_observer.rb | 9 - src/app/models/image.rb | 6 +- src/app/models/instance.rb | 2 +- src/app/models/instance_observer.rb | 6 +- src/app/models/instance_task.rb | 2 +- src/app/models/permission.rb | 2 +- src/app/models/pool.rb | 4 +- src/app/models/pool_family.rb | 2 +- src/app/models/privilege.rb | 8 +- src/app/models/provider.rb | 38 +++-- src/app/models/provider_account.rb | 206 ++++++++++++++++++++ src/app/models/provider_account_observer.rb | 9 + src/app/models/quota.rb | 2 +- src/app/services/data_service_active_record.rb | 8 +- src/app/services/graph_service.rb | 4 +- src/app/util/condormatic.rb | 2 +- src/app/views/admin/provider_accounts/_aws.haml | 39 ++++ src/app/views/admin/provider_accounts/_gogrid.haml | 16 ++ src/app/views/admin/provider_accounts/_mock.haml | 16 ++ .../views/admin/provider_accounts/_opennebula.haml | 16 ++ .../provider_accounts/_provider_selection.haml | 24 +++ .../views/admin/provider_accounts/_rackspace.haml | 16 ++ src/app/views/admin/provider_accounts/_rhevm.haml | 2 + src/app/views/admin/provider_accounts/new.haml | 21 +- src/app/views/admin/providers/_form.haml | 9 +- src/app/views/admin/providers/_list.haml | 1 + src/app/views/builds/new.haml | 6 +- src/app/views/cloud_accounts/_form.haml | 52 ----- src/app/views/cloud_accounts/edit.haml | 17 -- src/app/views/cloud_accounts/index.haml | 25 --- src/app/views/cloud_accounts/new.haml | 17 -- src/app/views/instances/index.haml | 2 +- src/app/views/instances/show.haml | 2 +- src/app/views/layouts/newui.haml | 1 - src/app/views/provider_accounts/_form.haml | 52 +++++ src/app/views/provider_accounts/edit.haml | 17 ++ src/app/views/provider_accounts/index.haml | 25 +++ src/app/views/provider_accounts/new.haml | 17 ++ src/app/views/providers/accounts.haml | 6 +- src/app/views/resources/instances/_list.haml | 2 +- src/app/views/resources/instances/_properties.haml | 2 +- src/classad_plugin/classad_plugin.rb | 2 +- src/config/environment.rb | 2 +- src/config/locales/en.yml | 6 + src/config/old_navigation.rb | 2 +- src/config/routes.rb | 7 +- ...824_rename_cloud_account_to_provider_account.rb | 13 ++ ...123410_rename_cloud_account_id_for_instances.rb | 9 + ..._families_to_provider_accounts_pool_families.rb | 11 + ...l_properties_of_columns_in_provider_accounts.rb | 13 ++ ...e_to_provideraccount_in_privileges_and_roles.rb | 11 + ...0110202165053_change_column_target_in_images.rb | 11 + src/db/seeds.rb | 12 +- src/dbomatic/dbomatic | 2 +- src/features/instance.feature | 2 +- src/features/provider.feature | 17 +- src/features/provider_account.feature | 20 +-- .../step_definitions/provider_account_steps.rb | 14 +- src/features/step_definitions/provider_steps.rb | 8 +- src/features/step_definitions/template_steps.rb | 8 +- src/features/support/custom.rb | 6 +- src/features/support/paths.rb | 2 +- src/features/template.feature | 14 +- src/image_builder_service/image_builder_service | 2 +- src/lib/tasks/dc_tasks.rake | 2 +- src/lib/tasks/demo_data.rake | 4 +- src/script/use-existing-ec2-templates | 6 +- src/spec/controllers/builds_controller_spec.rb | 6 +- .../controllers/cloud_accounts_controller_spec.rb | 92 --------- .../provider_accounts_controller_spec.rb | 92 +++++++++ src/spec/factories/cloud_account.rb | 21 -- src/spec/factories/instance.rb | 4 +- src/spec/factories/provider.rb | 8 +- src/spec/factories/provider_account.rb | 21 ++ src/spec/models/cloud_account_observer_spec.rb | 22 -- src/spec/models/cloud_account_spec.rb | 80 -------- src/spec/models/image_spec.rb | 6 +- src/spec/models/instance_observer_spec.rb | 20 +- src/spec/models/instance_spec.rb | 14 +- src/spec/models/pool_family_spec.rb | 10 +- src/spec/models/provider_account_observer_spec.rb | 22 ++ src/spec/models/provider_account_spec.rb | 80 ++++++++ src/spec/models/provider_spec.rb | 12 +- src/spec/models/quota_spec.rb | 48 +++--- .../services/data_service_active_record_spec.rb | 58 +++--- src/test/fixtures/providers.yml | 2 +- src/test/fixtures/roles.yml | 4 +- src/test/unit/cloud_account_test.rb | 8 - src/test/unit/provider_account_test.rb | 8 + src/test/unit/provider_test.rb | 2 +- 100 files changed, 1264 insertions(+), 1006 deletions(-) delete mode 100644 src/app/controllers/cloud_accounts_controller.rb create mode 100644 src/app/controllers/provider_accounts_controller.rb create mode 100644 src/app/helpers/admin/provider_accounts_helper.rb delete mode 100644 src/app/models/cloud_account.rb delete mode 100644 src/app/models/cloud_account_observer.rb create mode 100644 src/app/models/provider_account.rb create mode 100644 src/app/models/provider_account_observer.rb create mode 100644 src/app/views/admin/provider_accounts/_aws.haml create mode 100644 src/app/views/admin/provider_accounts/_gogrid.haml create mode 100644 src/app/views/admin/provider_accounts/_mock.haml create mode 100644 src/app/views/admin/provider_accounts/_opennebula.haml create mode 100644 src/app/views/admin/provider_accounts/_provider_selection.haml create mode 100644 src/app/views/admin/provider_accounts/_rackspace.haml create mode 100644 src/app/views/admin/provider_accounts/_rhevm.haml delete mode 100644 src/app/views/cloud_accounts/_form.haml delete mode 100644 src/app/views/cloud_accounts/edit.haml delete mode 100644 src/app/views/cloud_accounts/index.haml delete mode 100644 src/app/views/cloud_accounts/new.haml create mode 100644 src/app/views/provider_accounts/_form.haml create mode 100644 src/app/views/provider_accounts/edit.haml create mode 100644 src/app/views/provider_accounts/index.haml create mode 100644 src/app/views/provider_accounts/new.haml create mode 100644 src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb create mode 100644 src/db/migrate/20110125123410_rename_cloud_account_id_for_instances.rb create mode 100644 src/db/migrate/20110125154113_rename_cloud_accounts_pool_families_to_provider_accounts_pool_families.rb create mode 100644 src/db/migrate/20110126161751_change_null_properties_of_columns_in_provider_accounts.rb create mode 100644 src/db/migrate/20110202151950_change_cloudaccount_value_to_provideraccount_in_privileges_and_roles.rb create mode 100644 src/db/migrate/20110202165053_change_column_target_in_images.rb delete mode 100644 src/spec/controllers/cloud_accounts_controller_spec.rb create mode 100644 src/spec/controllers/provider_accounts_controller_spec.rb delete mode 100644 src/spec/factories/cloud_account.rb create mode 100644 src/spec/factories/provider_account.rb delete mode 100644 src/spec/models/cloud_account_observer_spec.rb delete mode 100644 src/spec/models/cloud_account_spec.rb create mode 100644 src/spec/models/provider_account_observer_spec.rb create mode 100644 src/spec/models/provider_account_spec.rb delete mode 100644 src/test/unit/cloud_account_test.rb create mode 100644 src/test/unit/provider_account_test.rb
diff --git a/src/app/controllers/admin/provider_accounts_controller.rb b/src/app/controllers/admin/provider_accounts_controller.rb index d422a53..d3c0335 100644 --- a/src/app/controllers/admin/provider_accounts_controller.rb +++ b/src/app/controllers/admin/provider_accounts_controller.rb @@ -8,7 +8,7 @@ class Admin::ProviderAccountsController < ApplicationController if @search_term.blank? load_accounts else - search = CloudAccount.search do + search = ProviderAccount.search do keywords(params[:q]) end @accounts = search.results @@ -17,7 +17,7 @@ class Admin::ProviderAccountsController < ApplicationController
def show @tab_captions = ['Properties', 'Credentials', 'History', 'Permissions'] - @account = CloudAccount.find(params[:id]) + @account = ProviderAccount.find(params[:id]) require_privilege(Privilege::VIEW, @account) @details_tab = params[:details_tab].blank? ? 'properties' : params[:details_tab]
@@ -38,71 +38,77 @@ class Admin::ProviderAccountsController < ApplicationController end
def new - @cloud_account = CloudAccount.new + @provider_account = ProviderAccount.new @quota = Quota.new @providers = Provider.all + if @providers.empty? + flash[:error] = "You don't have any provider yet. Please create one!" + else + @selected_provider = @providers.first unless @providers.blank? + end end
def create - @provider = Provider.find(params[:provider_id]) - require_privilege(Privilege::CREATE, CloudAccount, @provider) + @selected_provider = @provider = Provider.find(params[:provider_account][:provider_id]) + require_privilege(Privilege::CREATE, ProviderAccount, @provider)
@providers = Provider.all - @cloud_account = CloudAccount.new(params[:cloud_account]) - @cloud_account.provider = @provider - @cloud_account.quota = @quota = Quota.new + @provider_account = ProviderAccount.new(params[:provider_account]) + @provider_account.provider = @provider + @provider_account.quota = @quota = Quota.new
if params.delete :test_account - test_account(@cloud_account) + test_account(@provider_account) render :action => 'new' and return end
limit = params[:quota][:maximum_running_instances] if params[:quota] - @cloud_account.quota.set_maximum_running_instances(limit) + @provider_account.quota.set_maximum_running_instances(limit)
- if @cloud_account.invalid? - if not @cloud_account.valid_credentials? + if @provider_account.invalid? + if not @provider_account.valid_credentials? flash.now[:error] = "The entered credential information is incorrect" - elsif @cloud_account.errors.on(:username) - flash.now[:error] = "The access key '#{params[:cloud_account][:username]}' has already been taken." + elsif @provider_account.errors.on(:username) + flash.now[:error] = "The access key '#{params[:provider_account][:username]}' has already been taken." else flash.now[:error] = "You must fill in all the required fields" end render :action => 'new' and return end
- @cloud_account.pool_families << PoolFamily.default - @cloud_account.save! - if @cloud_account.populate_realms + @provider_account.pool_families << PoolFamily.default + @provider_account.save! + if @provider_account.populate_realms flash[:notice] = "Provider account added." end - redirect_to admin_provider_account_path(@cloud_account) + redirect_to admin_provider_account_path(@provider_account) kick_condor end
def edit - @cloud_account = CloudAccount.find(params[:id]) - @quota = @cloud_account.quota - @provider = @cloud_account.provider - require_privilege(Privilege::MODIFY,@cloud_account) + @provider_account = ProviderAccount.find(params[:id]) + @quota = @provider_account.quota + @provider = @provider_account.provider + require_privilege(Privilege::MODIFY,@provider_account) end
def update - @cloud_account = CloudAccount.find(params[:id]) - @provider = @cloud_account.provider - require_privilege(Privilege::MODIFY,@cloud_account) - @quota = @cloud_account.quota + @provider_account = ProviderAccount.find(params[:id]) + @provider = @provider_account.provider + require_privilege(Privilege::ACCOUNT_MODIFY, @provider) + require_privilege(Privilege::MODIFY,@provider_account) + @quota = @provider_account.quota
if params.delete :test_account - test_account(@cloud_account) + test_account(@provider_account) render :action => 'edit' and return end
limit = params[:quota][:maximum_running_instances] if params[:quota] - @cloud_account.quota.set_maximum_running_instances(limit) - if @cloud_account.update_attributes(params[:cloud_account]) - flash[:notice] = "Cloud Account updated!" - redirect_to admin_provider_account_path(@cloud_account) + @provider_account.quota.set_maximum_running_instances(limit) + if @provider_account.update_attributes(params[:provider_account]) + flash[:notice] = "Provider Account updated!" + redirect_to admin_provider_account_path(@provider_account) else render :action => :edit end @@ -112,13 +118,30 @@ class Admin::ProviderAccountsController < ApplicationController if (not params[:accounts_selected]) or (params[:accounts_selected].length == 0) flash[:notice] = "You must select some accounts first." else - CloudAccount.find(params[:accounts_selected]).each do |account| + ProviderAccount.find(params[:accounts_selected]).each do |account| account.destroy if check_privilege(Privilege::MODIFY, account) end end redirect_to admin_provider_accounts_url end
+ def set_selected_provider + @quota = Quota.new + @provider_account = ProviderAccount.new + respond_to do |format| + format.js { + @providers = Provider.find(:all) + @selected_provider = Provider.find(params[:provider_account][:provider_id]) + render :partial => 'provider_selection' + } + format.html { + @providers = Provider.find(:all) + @selected_provider = Provider.find(params[:provider_account][:provider_id]) + render :action => 'new', :layout => true + } + end + end + protected
def test_account(account) @@ -135,12 +158,13 @@ class Admin::ProviderAccountsController < ApplicationController @header = [ { :name => "Name", :sort_attr => :name }, { :name => "Username", :sort_attr => :username}, + { :name => "Provider Type", :sort_attr => :provider_type } ] @url_params = params end
def load_accounts - @accounts = CloudAccount.paginate(:all, + @accounts = ProviderAccount.paginate(:all, :page => params[:page] || 1, :order => (params[:order_field] || 'label') +' '+ (params[:order_dir] || 'asc') ) diff --git a/src/app/controllers/admin/providers_controller.rb b/src/app/controllers/admin/providers_controller.rb index a898d72..be799da 100644 --- a/src/app/controllers/admin/providers_controller.rb +++ b/src/app/controllers/admin/providers_controller.rb @@ -52,7 +52,7 @@ class Admin::ProvidersController < ApplicationController test_connection(@provider) render :action => 'new' else - @provider.set_cloud_type! + #@provider.set_provider_type! if @provider.save && @provider.populate_hardware_profiles flash[:notice] = "Provider added." redirect_to admin_providers_path @@ -67,14 +67,14 @@ class Admin::ProvidersController < ApplicationController def update @provider = Provider.find_by_id(params[:id]) require_privilege(Privilege::MODIFY, @provider) - previous_cloud_type = @provider.cloud_type + previous_provider_type = @provider.provider_type @provider.update_attributes(params[:provider]) if params[:test_connection] test_connection(@provider) render :action => 'edit' else - @provider.set_cloud_type! - if previous_cloud_type != @provider.cloud_type + @provider.set_provider_type! + if previous_provider_type != @provider.provider_type @provider.errors.add :url, "points to a different provider" end
@@ -116,7 +116,8 @@ class Admin::ProvidersController < ApplicationController
def load_providers @header = [{ :name => "Provider name", :sort_attr => :name }, - { :name => "Provider URL", :sort_attr => :name } + { :name => "Provider URL", :sort_attr => :name }, + { :name => "Provider Type", :sort_attr => :name } ] @providers = Provider.list_for_user(@current_user, Privilege::VIEW) @url_params = params.clone diff --git a/src/app/controllers/cloud_accounts_controller.rb b/src/app/controllers/cloud_accounts_controller.rb deleted file mode 100644 index d292f57..0000000 --- a/src/app/controllers/cloud_accounts_controller.rb +++ /dev/null @@ -1,181 +0,0 @@ -# -# Copyright (C) 2010 Red Hat, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; version 2 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -# MA 02110-1301, USA. A copy of the GNU General Public License is -# also available at http://www.gnu.org/copyleft/gpl.html. - -# Filters added to this controller apply to all controllers in the application. -# Likewise, all the methods added will be available for all controllers. - -class CloudAccountsController < ApplicationController - before_filter :require_user - before_filter :load_providers - - helper :providers - - def section_id - 'administration' - end - - def index - @provider = Provider.find(params[:provider_id]) - require_privilege(Privilege::VIEW, CloudAccount, @provider) - end - - def new - @provider = Provider.find(params[:provider_id]) - @cloud_account = CloudAccount.new - @quota = Quota.new - require_privilege(Privilege::CREATE, CloudAccount, @provider) - end - - def create - @provider = Provider.find(params[:provider_id]) - require_privilege(Privilege::CREATE, CloudAccount, @provider) - @cloud_account = CloudAccount.new(params[:cloud_account]) - @cloud_account.provider = @provider - @cloud_account.quota = @quota = Quota.new - - if params[:test_account] - test_account(@cloud_account) - render :action => 'new' and return - end - - limit = params[:quota][:maximum_running_instances] if params[:quota] - @cloud_account.quota.set_maximum_running_instances(limit) - - if @cloud_account.invalid? - if not @cloud_account.valid_credentials? - flash.now[:error] = "The entered credential information is incorrect" - elsif @cloud_account.errors.on(:username) - flash.now[:error] = "The access key '#{params[:cloud_account][:username]}' has already been taken." - else - flash.now[:error] = "You must fill in all the required fields" - end - render :action => 'new' and return - end - - @cloud_account.pool_families << PoolFamily.default - @cloud_account.save! - if @cloud_account.populate_realms - flash[:notice] = "Provider account added." - end - redirect_to provider_accounts_path(@provider) - kick_condor - end - - def edit - @cloud_account = CloudAccount.find(params[:id]) - @quota = @cloud_account.quota - @provider = @cloud_account.provider - require_privilege(Privilege::MODIFY, @cloud_account) - end - - def update_accounts - @provider = Provider.find(params[:provider][:id]) - require_privilege(Privilege::MODIFY, CloudAccount, @provider) - @providers = Provider.list_for_user(@current_user, Privilege::VIEW) - - success = true - @provider.cloud_accounts.each do |cloud_account| - attributes = params[:cloud_accounts][cloud_account.id.to_s] - - password = attributes[:password] - # blank password means the user didn't change it -- don't update it then - if password.blank? - attributes.delete :password - end - cloud_account.quota.maximum_running_instances = quota_from_string(params[:quota][cloud_account.id.to_s][:maximum_running_instances]) - - private_cert = attributes[:x509_cert_priv_file] - unless private_cert.blank? - attributes[:x509_cert_priv] = private_cert.read - end - attributes.delete :x509_cert_priv_file - - public_cert = attributes[:x509_cert_pub_file] - unless public_cert.blank? - attributes[:x509_cert_pub] = public_cert.read - end - attributes.delete :x509_cert_pub_file - - begin - cloud_account.update_attributes!(attributes) - cloud_account.quota.save! - rescue - success = false - end - end - if success - flash[:notice] = "Account updated." - redirect_to :controller => 'providers', :action => 'accounts', :id => @provider - else - flash.now[:notice] = "Error updating the cloud account." - render :template => 'provider/accounts' - end - end - - def update - @cloud_account = CloudAccount.find(params[:id]) - @provider = @cloud_account.provider - require_privilege(Privilege::MODIFY, @cloud_account) - @quota = @cloud_account.quota - - limit = params[:quota][:maximum_running_instances] if params[:quota] - @cloud_account.quota.set_maximum_running_instances(limit) - if @cloud_account.update_attributes(params[:cloud_account]) - flash[:notice] = "Cloud Account updated!" - redirect_to provider_accounts_path(@provider) - else - render :action => :edit - end - end - - def key - @cloud_account = CloudAccount.find(params[:id]) - require_privilege(Privilege::MODIFY,@cloud_account) - unless @cloud_account.instance_key.nil? - render :text => @cloud_account.instance_key.pem - end - end - - def destroy - account = CloudAccount.find(params[:id]) - provider = account.provider - require_privilege(Privilege::MODIFY, account) - if account.destroy - flash[:notice] = "Cloud Account destroyed" - else - flash[:error] = "Cloud Account could not be destroyed" - end - redirect_to provider_accounts_path(provider) - end - - def test_account(account) - if account.valid_credentials? - flash.now[:notice] = "Test Connection Success: Valid Account Details" - else - flash.now[:error] = "Test Connection Failed: Invalid Account Details" - end - rescue - flash.now[:error] = "Test Connection Failed: Could not connect to provider" - end - - private - - def load_providers - @providers = Provider.list_for_user(@current_user, Privilege::VIEW) - end -end diff --git a/src/app/controllers/dashboard_controller.rb b/src/app/controllers/dashboard_controller.rb index 5254dd7..17feedc 100644 --- a/src/app/controllers/dashboard_controller.rb +++ b/src/app/controllers/dashboard_controller.rb @@ -40,8 +40,8 @@ class DashboardController < ApplicationController end
def quota_usage_graph - if params[:cloud_account_id] - params[:parent] = CloudAccount.find(params[:cloud_account_id]) + if params[:provider_account_id] + params[:parent] = ProviderAccount.find(params[:provider_account_id]) elsif params[:pool_id] params[:parent] = Pool.find(params[:pool_id]) else @@ -67,7 +67,7 @@ class DashboardController < ApplicationController
def index # FIXME filter to just those that the user has access to - @cloud_accounts = CloudAccount.find(:all) + @cloud_accounts = ProviderAccount.find(:all)
render :action => 'monitor' diff --git a/src/app/controllers/permissions_controller.rb b/src/app/controllers/permissions_controller.rb index 622f776..380b97c 100644 --- a/src/app/controllers/permissions_controller.rb +++ b/src/app/controllers/permissions_controller.rb @@ -67,20 +67,20 @@ class PermissionsController < ApplicationController
def set_permission_object(action) if !params[:permission_object_type].nil? - @permission_object = + @permission_object = params[:permission_object_type].constantize.find(params[:permission_object_id]) elsif !params[:pool_id].nil? @permission_object = Pool.find params[:pool_id] elsif !params[:provider_id].nil? @permission_object = Provider.find params[:provider_id] elsif !params[:cloud_account_id].nil? - @permission_object = CloudAccount.find params[:cloud_account_id] + @permission_object = ProviderAccount.find params[:cloud_account_id] elsif !params[:base_permission_object_id].nil? @permission_object = BasePermissionObject.find params[:base_permission_object_id] else @permission_object = BasePermissionObject.general_permission_scope end - + raise ActiveRecord::RecordNotFound if @permission_object.nil?
require_privilege(action, @permission_object) diff --git a/src/app/controllers/provider_accounts_controller.rb b/src/app/controllers/provider_accounts_controller.rb new file mode 100644 index 0000000..962bca7 --- /dev/null +++ b/src/app/controllers/provider_accounts_controller.rb @@ -0,0 +1,181 @@ +# +# Copyright (C) 2010 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. A copy of the GNU General Public License is +# also available at http://www.gnu.org/copyleft/gpl.html. + +# Filters added to this controller apply to all controllers in the application. +# Likewise, all the methods added will be available for all controllers. + +class ProviderAccountsController < ApplicationController + before_filter :require_user + before_filter :load_providers + + helper :providers + + def section_id + 'administration' + end + + def index + @provider = Provider.find(params[:provider_id]) + require_privilege(Privilege::VIEW, ProviderAccount, @provider) + end + + def new + @provider = Provider.find(params[:provider_id]) + @provider_account = ProviderAccount.new + @quota = Quota.new + require_privilege(Privilege::CREATE, ProviderAccount, @provider) + end + + def create + @provider = Provider.find(params[:provider_id]) + require_privilege(Privilege::CREATE, ProviderAccount, @provider) + @provider_account = ProviderAccount.new(params[:provider_account]) + @provider_account.provider = @provider + @provider_account.quota = @quota = Quota.new + + if params[:test_account] + test_account(@provider_account) + render :action => 'new' and return + end + + limit = params[:quota][:maximum_running_instances] if params[:quota] + @provider_account.quota.set_maximum_running_instances(limit) + + if @provider_account.invalid? + if not @provider_account.valid_credentials? + flash.now[:error] = "The entered credential information is incorrect" + elsif @provider_account.errors.on(:username) + flash.now[:error] = "The access key '#{params[:provider_account][:username]}' has already been taken." + else + flash.now[:error] = "You must fill in all the required fields" + end + render :action => 'new' and return + end + + @provider_account.pool_families << PoolFamily.default + @provider_account.save! + if @provider_account.populate_realms + flash[:notice] = "Provider account added." + end + redirect_to provider_accounts_path(@provider) + kick_condor + end + + def edit + @provider_account = ProviderAccount.find(params[:id]) + @quota = @provider_account.quota + @provider = @provider_account.provider + require_privilege(Privilege::MODIFY, @provider_account) + end + + def update_accounts + @provider = Provider.find(params[:provider][:id]) + require_privilege(Privilege::MODIFY, ProviderAccount, @provider) + @providers = Provider.list_for_user(@current_user, Privilege::VIEW) + + success = true + @provider.provider_accounts.each do |provider_account| + attributes = params[:provider_accounts][provider_account.id.to_s] + + password = attributes[:password] + # blank password means the user didn't change it -- don't update it then + if password.blank? + attributes.delete :password + end + provider_account.quota.maximum_running_instances = quota_from_string(params[:quota][provider_account.id.to_s][:maximum_running_instances]) + + private_cert = attributes[:x509_cert_priv_file] + unless private_cert.blank? + attributes[:x509_cert_priv] = private_cert.read + end + attributes.delete :x509_cert_priv_file + + public_cert = attributes[:x509_cert_pub_file] + unless public_cert.blank? + attributes[:x509_cert_pub] = public_cert.read + end + attributes.delete :x509_cert_pub_file + + begin + provider_account.update_attributes!(attributes) + provider_account.quota.save! + rescue + success = false + end + end + if success + flash[:notice] = "Account updated." + redirect_to :controller => 'providers', :action => 'accounts', :id => @provider + else + flash.now[:notice] = "Error updating the cloud account." + render :template => 'provider/accounts' + end + end + + def update + @provider_account = ProviderAccount.find(params[:id]) + @provider = @provider_account.provider + require_privilege(Privilege::MODIFY, @provider_account) + @quota = @provider_account.quota + + limit = params[:quota][:maximum_running_instances] if params[:quota] + @provider_account.quota.set_maximum_running_instances(limit) + if @provider_account.update_attributes(params[:provider_account]) + flash[:notice] = "Cloud Account updated!" + redirect_to provider_accounts_path(@provider) + else + render :action => :edit + end + end + + def key + @provider_account = ProviderAccount.find(params[:id]) + require_privilege(Privilege::MODIFY,@provider_account) + unless @provider_account.instance_key.nil? + render :text => @provider_account.instance_key.pem + end + end + + def destroy + account = ProviderAccount.find(params[:id]) + provider = account.provider + require_privilege(Privilege::MODIFY, account) + if account.destroy + flash[:notice] = "Cloud Account destroyed" + else + flash[:error] = "Cloud Account could not be destroyed" + end + redirect_to provider_accounts_path(provider) + end + + def test_account(account) + if account.valid_credentials? + flash.now[:notice] = "Test Connection Success: Valid Account Details" + else + flash.now[:error] = "Test Connection Failed: Invalid Account Details" + end + rescue + flash.now[:error] = "Test Connection Failed: Could not connect to provider" + end + + private + + def load_providers + @providers = Provider.list_for_user(@current_user, Privilege::VIEW) + end +end diff --git a/src/app/controllers/providers_controller.rb b/src/app/controllers/providers_controller.rb index 57b4240..9167c25 100644 --- a/src/app/controllers/providers_controller.rb +++ b/src/app/controllers/providers_controller.rb @@ -57,7 +57,7 @@ class ProvidersController < ApplicationController test_connection(@provider) render :action => "new" else - @provider.set_cloud_type! + @provider.set_provider_type! if @provider.save && @provider.populate_hardware_profiles flash[:notice] = "Provider added." redirect_to :action => "show", :id => @provider @@ -73,15 +73,15 @@ class ProvidersController < ApplicationController @providers = Provider.list_for_user(@current_user, Privilege::MODIFY) @provider = Provider.find(:first, :conditions => {:id => params[:id]}) require_privilege(Privilege::MODIFY, @provider) - previous_cloud_type = @provider.cloud_type + previous_provider_type = @provider.provider_type
@provider.update_attributes(params[:provider]) if params[:test_connection] test_connection(@provider) render :action => "edit" else - @provider.set_cloud_type! - if previous_cloud_type != @provider.cloud_type + @provider.set_provider_type! + if previous_provider_type != @provider.provider_type @provider.errors.add :url, "points to a different provider" end
diff --git a/src/app/controllers/quotas_controller.rb b/src/app/controllers/quotas_controller.rb index cfa85fb..0beb386 100644 --- a/src/app/controllers/quotas_controller.rb +++ b/src/app/controllers/quotas_controller.rb @@ -77,7 +77,7 @@ class QuotasController < ApplicationController if params[:parent_type] == "pool" return Pool.find(params[:id]) elsif params[:parent_type] == "cloud_account" - return CloudAccount.find(params[:id]) + return ProviderAccount.find(params[:id]) end #TODO Throw no match to pool or cloud account exception end diff --git a/src/app/helpers/admin/provider_accounts_helper.rb b/src/app/helpers/admin/provider_accounts_helper.rb new file mode 100644 index 0000000..d4c234d --- /dev/null +++ b/src/app/helpers/admin/provider_accounts_helper.rb @@ -0,0 +1,21 @@ +module Admin::ProviderAccountsHelper + + def display_provider_account_login_form(provider_type) + case provider_type + when 0 + render :partial => "mock" + when 1 + render :partial => "aws" + when 2 + render :partial => "gogrid" + when 3 + render :partial => "rackspace" + when 4 + render :partial => "rhevm" + when 5 + render :partial => "opennebula" + else + flash.now[:warning] = "You don't have any provider yet" + end + end +end diff --git a/src/app/models/cloud_account.rb b/src/app/models/cloud_account.rb deleted file mode 100644 index 4eba087..0000000 --- a/src/app/models/cloud_account.rb +++ /dev/null @@ -1,205 +0,0 @@ - # -# Copyright (C) 2009 Red Hat, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; version 2 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -# MA 02110-1301, USA. A copy of the GNU General Public License is -# also available at http://www.gnu.org/copyleft/gpl.html. - -# Filters added to this controller apply to all controllers in the application. -# Likewise, all the methods added will be available for all controllers. - -require 'nokogiri' -require 'sunspot_rails' - -class CloudAccount < ActiveRecord::Base - - searchable do - text :name, :as => :code_substring - text :username, :as => :code_substring - end - - include PermissionedObject - - # Relations - belongs_to :provider - belongs_to :quota, :autosave => true - has_many :instances - has_and_belongs_to_many :pool_families - has_many :permissions, :as => :permission_object, :dependent => :destroy, - :include => [:role], - :order => "permissions.id ASC" - - has_one :instance_key, :as => :instance_key_owner, :dependent => :destroy - - # Helpers - attr_accessor :x509_cert_priv_file, :x509_cert_pub_file - - # Validations - validates_presence_of :provider - validates_presence_of :label - validates_presence_of :username - validates_uniqueness_of :username, :scope => :provider_id - validates_presence_of :password - validates_presence_of :account_number - validate :validate_presence_of_x509_certs - validate :validate_credentials - - # We're using this instead of <tt>validates_presence_of</tt> helper because - # we want to show errors on different attributes ending with '_file'. - def validate_presence_of_x509_certs - errors.add(:x509_cert_pub_file, "can't be blank") if x509_cert_pub.blank? - errors.add(:x509_cert_priv_file, "can't be blank") if x509_cert_priv.blank? - end - - def validate_credentials - unless valid_credentials? - errors.add(:base, "Login Credentials are Invalid for this Provider") - end - end - - # Hooks - before_destroy :destroyable? - before_validation :read_x509_files - - def object_list - super << provider - end - class << self - alias orig_list_for_user_include list_for_user_include - alias orig_list_for_user_conditions list_for_user_conditions - end - - def self.list_for_user_include - includes = orig_list_for_user_include - includes << { :provider => {:permissions => {:role => :privileges}}} - includes - end - - def self.list_for_user_conditions - "(#{orig_list_for_user_conditions}) or - (permissions_providers.user_id=:user and - privileges_roles.target_type=:target_type and - privileges_roles.action=:action)" - end - - def destroyable? - instances.empty? - end - - def read_x509_files - if x509_cert_pub_file.respond_to?(:read) - x509_cert_pub_file.rewind # Sometimes the file has to rewind, becuase something already read from it. - self.x509_cert_pub = x509_cert_pub_file.read - end - if x509_cert_priv_file.respond_to?(:read) - x509_cert_priv_file.rewind - self.x509_cert_priv = x509_cert_priv_file.read - end - end - - def connect - begin - return DeltaCloud.new(username, password, provider.url) - rescue Exception => e - logger.error("Error connecting to framework: #{e.message}") - logger.error("Backtrace: #{e.backtrace.join("\n")}") - return nil - end - end - - def self.find_or_create(account) - a = CloudAccount.find_by_username_and_provider_id(account["username"], account["provider_id"]) - return a.nil? ? CloudAccount.new(account) : a - end - - def pools - pools = [] - instances.each do |instance| - pools << instance.pool - end - end - - def name - label.blank? ? username : label - end - - # FIXME: for already-mapped accounts, update rather than add new - def populate_realms - client = connect - realms = client.realms - # FIXME: this should probably be in the same transaction as cloud_account.save - self.transaction do - realms.each do |realm| - #ignore if it exists - #FIXME: we need to handle keeping in sync forupdates as well as - # account permissions - unless Realm.find_by_external_key_and_provider_id(realm.id, - provider.id) - ar_realm = Realm.new(:external_key => realm.id, - :name => realm.name ? realm.name : realm.id, - :provider_id => provider.id) - ar_realm.save! - - frontend_realm = Realm.new(:external_key => ar_realm.external_key, - :name => ar_realm.name, - :provider_id => nil) - - available_realms = Realm.frontend.find(:all, :conditions => { - :external_key => frontend_realm.external_key }) - - if available_realms.empty? - frontend_realm.backend_realms << ar_realm - frontend_realm.save! - else - available_realms.each do |r| - r.backend_realms << ar_realm - end - end - end - end - end - end - - def valid_credentials? - DeltaCloud::valid_credentials?(username, password, provider.url) - end - - def build_credentials - xml = Nokogiri::XML <<EOT -<?xml version="1.0"?> -<provider_credentials> - <ec2_credentials> - <account_number></account_number> - <access_key></access_key> - <secret_access_key></secret_access_key> - <certificate></certificate> - <key></key> - </ec2_credentials> -</provider_credentials> -EOT - node = xml.at_xpath('/provider_credentials/ec2_credentials') - node.at_xpath('./account_number').content = account_number - node.at_xpath('./access_key').content = username - node.at_xpath('./secret_access_key').content = password - node.at_xpath('./certificate').content = x509_cert_pub - node.at_xpath('./key').content = x509_cert_priv - return xml.to_s - end - - def generate_auth_key - client = connect - return nil unless client && client.feature?(:instances, :authentication_key) - client.create_key(:name => "#{self.name}_#{Time.now.to_i}_key_#{self.object_id}") - end -end diff --git a/src/app/models/cloud_account_observer.rb b/src/app/models/cloud_account_observer.rb deleted file mode 100644 index a0826ea..0000000 --- a/src/app/models/cloud_account_observer.rb +++ /dev/null @@ -1,9 +0,0 @@ -class CloudAccountObserver < ActiveRecord::Observer - def after_create(account) - if key = account.generate_auth_key - account.update_attribute(:instance_key, InstanceKey.create!(:pem => key.pem, :name => key.id, :instance_key_owner => account)) - end - end -end - -CloudAccountObserver.instance diff --git a/src/app/models/image.rb b/src/app/models/image.rb index 8962bf1..42f9a69 100644 --- a/src/app/models/image.rb +++ b/src/app/models/image.rb @@ -52,7 +52,7 @@ class Image < ActiveRecord::Base INACTIVE_STATES = [STATE_COMPLETE, STATE_FAILED, STATE_CANCELED]
def self.available_targets - return YAML.load_file("#{RAILS_ROOT}/config/image_descriptor_targets.yml") + Provider::PROVIDER_TYPES.invert end
def generate_uuid @@ -129,7 +129,7 @@ class Image < ActiveRecord::Base image = Image.new( :name => raw_image.name, :status => 'complete', - :target => account.provider.cloud_type, + :target => account.provider.provider_type, :template_id => template.id ) image.save! @@ -155,7 +155,7 @@ class Image < ActiveRecord::Base raise "There is not provider with name '#{providername}'" end
- account = CloudAccount.new(:provider => provider, :username => username, :password => password) + account = ProviderAccount.new(:provider => provider, :username => username, :password => password)
unless account.valid_credentials? raise "Invalid credentials for provider '#{providername}'" diff --git a/src/app/models/instance.rb b/src/app/models/instance.rb index b84a596..3d24404 100644 --- a/src/app/models/instance.rb +++ b/src/app/models/instance.rb @@ -36,7 +36,7 @@ class Instance < ActiveRecord::Base @@per_page = 15
belongs_to :pool - belongs_to :cloud_account + belongs_to :provider_account
belongs_to :hardware_profile belongs_to :template diff --git a/src/app/models/instance_observer.rb b/src/app/models/instance_observer.rb index 80b39c5..e14e8d2 100644 --- a/src/app/models/instance_observer.rb +++ b/src/app/models/instance_observer.rb @@ -36,9 +36,9 @@ class InstanceObserver < ActiveRecord::Observer hwp = an_instance.hardware_profile pool = an_instance.pool user = an_instance.owner - cloud_account = an_instance.cloud_account + provider_account = an_instance.provider_account
- [cloud_account, pool, user].each do |parent| + [provider_account, pool, user].each do |parent| if parent quota = parent.quota if quota @@ -65,7 +65,7 @@ class InstanceObserver < ActiveRecord::Observer # we try to generate key only when instance is running # and instance_key is not generated yet return if instance.state != Instance::STATE_RUNNING or instance.instance_key - if key = instance.cloud_account.generate_auth_key + if key = instance.provider_account.generate_auth_key instance.instance_key = InstanceKey.create!(:pem => key.pem, :name => key.id, :instance_key_owner => instance) end end diff --git a/src/app/models/instance_task.rb b/src/app/models/instance_task.rb index be76a6e..42bed29 100644 --- a/src/app/models/instance_task.rb +++ b/src/app/models/instance_task.rb @@ -46,7 +46,7 @@ class InstanceTask < Task actions = [] # FIXME: cloud_account won't always be set here, but we're requiring # front end realm for now. - if cloud_account = instance.cloud_account and + if cloud_account = instance.provider_account and conn = cloud_account.connect and c_state = conn.instance_state(state) transitions = c_state.transitions transitions.each do |transition| diff --git a/src/app/models/permission.rb b/src/app/models/permission.rb index 22b228a..7cd02a1 100644 --- a/src/app/models/permission.rb +++ b/src/app/models/permission.rb @@ -37,7 +37,7 @@ class Permission < ActiveRecord::Base :foreign_key => "permission_object_id" belongs_to :provider, :class_name => "Provider", :foreign_key => "permission_object_id" - belongs_to :cloud_account, :class_name => "CloudAccount", + belongs_to :provider_account, :class_name => "ProviderAccount", :foreign_key => "permission_object_id" belongs_to :template, :class_name => "Template", :foreign_key => "permission_object_id" diff --git a/src/app/models/pool.rb b/src/app/models/pool.rb index 550ca79..0f9a4fb 100644 --- a/src/app/models/pool.rb +++ b/src/app/models/pool.rb @@ -47,8 +47,8 @@ class Pool < ActiveRecord::Base def cloud_accounts accounts = [] instances.each do |instance| - if instance.cloud_account and !accounts.include?(instance.cloud_account) - accounts << instance.cloud_account + if instance.provider_account and !accounts.include?(instance.provider_account) + accounts << instance.provider_account end end end diff --git a/src/app/models/pool_family.rb b/src/app/models/pool_family.rb index bc96fee..e083920 100644 --- a/src/app/models/pool_family.rb +++ b/src/app/models/pool_family.rb @@ -24,7 +24,7 @@ class PoolFamily < ActiveRecord::Base DEFAULT_POOL_FAMILY_KEY = "default_pool_family"
has_many :pools, :dependent => :destroy - has_and_belongs_to_many :cloud_accounts + has_and_belongs_to_many :provider_accounts
validates_presence_of :name validates_uniqueness_of :name diff --git a/src/app/models/privilege.rb b/src/app/models/privilege.rb index f7a61ef..1ef514c 100644 --- a/src/app/models/privilege.rb +++ b/src/app/models/privilege.rb @@ -33,7 +33,7 @@ class Privilege < ActiveRecord::Base # Deployable: choose this deployable to launch # Instance: may perform actions on this instance # Realm: may map this realm - # CloudAccount: May add this account to PoolFamily + # ProviderAccount: May add this account to PoolFamily
ACTIONS = [ CREATE, MODIFY, USE, VIEW, @@ -47,7 +47,7 @@ class Privilege < ActiveRecord::Base HardwareProfile => ACTIONS - [USE, VIEW], Realm => ACTIONS - [VIEW], Provider => ACTIONS - [USE], - CloudAccount => ACTIONS, + ProviderAccount => ACTIONS, User => [ CREATE, MODIFY, VIEW] }
belongs_to :role @@ -99,7 +99,7 @@ class Privilege < ActiveRecord::Base # view_perms Can view permissions # set_perms Can set permissions (or can set instance permissions on this pool) # - # Quota The Pool/CloudAccount/PoolFamily/User assigned the quota + # Quota The Pool/ProviderAccount/PoolFamily/User assigned the quota # view Can view quota on this obj # modify Can edit quota on this obj # @@ -123,7 +123,7 @@ class Privilege < ActiveRecord::Base # view_perms Can view permissions # set_perms Can set permissions # - # CloudAccount This CloudAccount + # ProviderAccount This ProviderAccount # view Can view # use Can map to PoolFamily # modify Can modify diff --git a/src/app/models/provider.rb b/src/app/models/provider.rb index 1e89958..7eb8a5d 100644 --- a/src/app/models/provider.rb +++ b/src/app/models/provider.rb @@ -29,7 +29,18 @@ class Provider < ActiveRecord::Base require 'util/deltacloud' include PermissionedObject
- has_many :cloud_accounts, :dependent => :destroy + MOCK = 0 + AWS = 1 + GOGRID = 2 + RACKSPACE = 3 + RHEVM = 4 + OPENNEBULA = 5 + + PROVIDER_TYPES = { MOCK => "mock", AWS => "AWS", + GOGRID => "GoGrid", RACKSPACE => "Rackspace", RHEVM => "RHEVM", + OPENNEBULA => "OpenNebula" } + + has_many :provider_accounts, :dependent => :destroy has_many :hardware_profiles, :dependent => :destroy has_many :replicated_images, :dependent => :destroy has_many :realms, :dependent => :destroy @@ -37,12 +48,13 @@ class Provider < ActiveRecord::Base validates_presence_of :name validates_uniqueness_of :name
- validates_presence_of :cloud_type validates_presence_of :url
validates_format_of :name, :with => /^[\w -]*$/n, :message => "must only contain: numbers, letters, spaces, '_' and '-'" validates_length_of :name, :maximum => 255
+ validates_inclusion_of :provider_type, :in => PROVIDER_TYPES + has_many :permissions, :as => :permission_object, :dependent => :destroy, :include => [:role], :order => "permissions.id ASC" @@ -53,8 +65,8 @@ class Provider < ActiveRecord::Base # but a cloud account is silently not destroyed when there is # an instance for the cloud account def destroyable? - unless self.cloud_accounts.empty? - self.cloud_accounts.each do |c| + unless self.provider_accounts.empty? + self.provider_accounts.each do |c| unless c.instances.empty? inst_list = c.instances.map {|i| i.name}.join(', ') self.errors.add_to_base "there are instances for cloud account '#{c.name}': #{inst_list}" @@ -64,10 +76,10 @@ class Provider < ActiveRecord::Base return self.errors.empty? end
- def set_cloud_type! - deltacloud = connect - self.cloud_type = deltacloud.driver_name unless deltacloud.nil? - end +# def set_provider_type! +# deltacloud = connect +# self.provider_type = deltacloud.driver_name unless deltacloud.nil? +# end
def connect begin @@ -117,16 +129,16 @@ class Provider < ActiveRecord::Base cloud_accounts.collect {|account| account.pools}.flatten.uniq end
- # returns first provider of cloud_type which has at least one cloud account - def self.find_by_target_with_account(cloud_type) - Provider.all(:conditions => {:cloud_type => cloud_type}).each do |p| - return p unless p.cloud_accounts.empty? + # returns first provider of provider_type which has at least one cloud account + def self.find_by_target_with_account(provider_type) + Provider.all(:conditions => {:provider_type => provider_type}).each do |p| + return p unless p.provider_accounts.empty? end nil end
# TODO: implement or remove - this is meant to contain a hash of - # supported cloud_types to use in populating form, though if we + # supported provider_types to use in populating form, though if we # infer that field, we don't need this. def supported_types end diff --git a/src/app/models/provider_account.rb b/src/app/models/provider_account.rb new file mode 100644 index 0000000..39dce11 --- /dev/null +++ b/src/app/models/provider_account.rb @@ -0,0 +1,206 @@ + # +# Copyright (C) 2009 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. A copy of the GNU General Public License is +# also available at http://www.gnu.org/copyleft/gpl.html. + +# Filters added to this controller apply to all controllers in the application. +# Likewise, all the methods added will be available for all controllers. + +require 'nokogiri' +require 'sunspot_rails' + +class ProviderAccount < ActiveRecord::Base + include PermissionedObject + + searchable do + text :name, :as => :code_substring + text :username, :as => :code_substring + end + + # Relations + belongs_to :provider + belongs_to :quota, :autosave => true + has_many :instances + has_and_belongs_to_many :pool_families + has_many :permissions, :as => :permission_object, :dependent => :destroy, + :include => [:role], + :order => "permissions.id ASC" + + has_one :instance_key, :as => :instance_key_owner, :dependent => :destroy + + # Helpers + attr_accessor :x509_cert_priv_file, :x509_cert_pub_file + + # Validations + validates_presence_of :provider + validates_presence_of :label + validates_presence_of :username + validates_uniqueness_of :username, :scope => :provider_id + validates_presence_of :password + validates_presence_of :account_number,:if => Proc.new{ |account| account.provider.provider_type == Provider::AWS} + validate :validate_presence_of_x509_certs + validate :validate_credentials + + # We're using this instead of <tt>validates_presence_of</tt> helper because + # we want to show errors on different attributes ending with '_file'. + def validate_presence_of_x509_certs + if self.provider.provider_type == Provider::AWS + errors.add(:x509_cert_pub_file, "can't be blank") if x509_cert_pub.blank? + errors.add(:x509_cert_priv_file, "can't be blank") if x509_cert_priv.blank? + end + end + + def validate_credentials + unless valid_credentials? + errors.add(:base, "Login Credentials are Invalid for this Provider") + end + end + + # Hooks + before_destroy :destroyable? + before_validation :read_x509_files + + def object_list + super << provider + end + class << self + alias orig_list_for_user_include list_for_user_include + alias orig_list_for_user_conditions list_for_user_conditions + end + + def self.list_for_user_include + includes = orig_list_for_user_include + includes << { :provider => {:permissions => {:role => :privileges}}} + includes + end + + def self.list_for_user_conditions + "(#{orig_list_for_user_conditions}) or + (permissions_providers.user_id=:user and + privileges_roles.target_type=:target_type and + privileges_roles.action=:action)" + end + + def destroyable? + instances.empty? + end + + def read_x509_files + if x509_cert_pub_file.respond_to?(:read) + x509_cert_pub_file.rewind # Sometimes the file has to rewind, becuase something already read from it. + self.x509_cert_pub = x509_cert_pub_file.read + end + if x509_cert_priv_file.respond_to?(:read) + x509_cert_priv_file.rewind + self.x509_cert_priv = x509_cert_priv_file.read + end + end + + def connect + begin + return DeltaCloud.new(username, password, provider.url) + rescue Exception => e + logger.error("Error connecting to framework: #{e.message}") + logger.error("Backtrace: #{e.backtrace.join("\n")}") + return nil + end + end + + def self.find_or_create(account) + a = ProviderAccount.find_by_username_and_provider_id(account["username"], account["provider_id"]) + return a.nil? ? ProviderAccount.new(account) : a + end + + def pools + pools = [] + instances.each do |instance| + pools << instance.pool + end + end + + def name + label.blank? ? username : label + end + + # FIXME: for already-mapped accounts, update rather than add new + def populate_realms + client = connect + realms = client.realms + # FIXME: this should probably be in the same transaction as cloud_account.save + self.transaction do + realms.each do |realm| + #ignore if it exists + #FIXME: we need to handle keeping in sync forupdates as well as + # account permissions + unless Realm.find_by_external_key_and_provider_id(realm.id, + provider.id) + ar_realm = Realm.new(:external_key => realm.id, + :name => realm.name ? realm.name : realm.id, + :provider_id => provider.id) + ar_realm.save! + + frontend_realm = Realm.new(:external_key => ar_realm.external_key, + :name => ar_realm.name, + :provider_id => nil) + + available_realms = Realm.frontend.find(:all, :conditions => { + :external_key => frontend_realm.external_key }) + + if available_realms.empty? + frontend_realm.backend_realms << ar_realm + frontend_realm.save! + else + available_realms.each do |r| + r.backend_realms << ar_realm + end + end + end + end + end + end + + def valid_credentials? + DeltaCloud::valid_credentials?(username, password, provider.url) + end + + def build_credentials + xml = Nokogiri::XML <<EOT +<?xml version="1.0"?> +<provider_credentials> + <ec2_credentials> + <account_number></account_number> + <access_key></access_key> + <secret_access_key></secret_access_key> + <certificate></certificate> + <key></key> + </ec2_credentials> +</provider_credentials> +EOT + node = xml.at_xpath('/provider_credentials/ec2_credentials') + node.at_xpath('./account_number').content = account_number + node.at_xpath('./access_key').content = username + node.at_xpath('./secret_access_key').content = password + node.at_xpath('./certificate').content = x509_cert_pub + node.at_xpath('./key').content = x509_cert_priv + return xml.to_s + end + + def generate_auth_key + client = connect + return nil unless client && client.feature?(:instances, :authentication_key) + client.create_key(:name => "#{self.name}_#{Time.now.to_i}_key_#{self.object_id}") + end +end diff --git a/src/app/models/provider_account_observer.rb b/src/app/models/provider_account_observer.rb new file mode 100644 index 0000000..ddf19c6 --- /dev/null +++ b/src/app/models/provider_account_observer.rb @@ -0,0 +1,9 @@ +class ProviderAccountObserver < ActiveRecord::Observer + def after_create(account) + if key = account.generate_auth_key + account.update_attribute(:instance_key, InstanceKey.create!(:pem => key.pem, :name => key.id, :instance_key_owner => account)) + end + end +end + +ProviderAccountObserver.instance diff --git a/src/app/models/quota.rb b/src/app/models/quota.rb index 9f79e04..acb001a 100644 --- a/src/app/models/quota.rb +++ b/src/app/models/quota.rb @@ -22,7 +22,7 @@ class Quota < ActiveRecord::Base
has_one :pool - has_one :cloud_account + has_one :provider_account has_one :user
validates_numericality_of :maximum_total_instances, diff --git a/src/app/services/data_service_active_record.rb b/src/app/services/data_service_active_record.rb index 66da011..5833baa 100644 --- a/src/app/services/data_service_active_record.rb +++ b/src/app/services/data_service_active_record.rb @@ -65,7 +65,7 @@ class DataServiceActiveRecord data_points = [] free_instances = 0
- cloud_accounts = CloudAccount.find(:all, :conditions => {:provider_id => provider.id}) + cloud_accounts = ProviderAccount.find(:all, :conditions => {:provider_id => provider.id}) cloud_accounts.each do |cloud_account| quota = cloud_account.quota if quota @@ -175,11 +175,11 @@ class DataServiceActiveRecord instances = []
if parent.class == Provider - cloud_accounts = CloudAccount.find(:all, :conditions => {:provider_id => parent.id}) + cloud_accounts = ProviderAccount.find(:all, :conditions => {:provider_id => parent.id}) cloud_accounts.each do |cloud_account| instances.concat(cloud_account.instances) end - elsif parent.class == Pool || parent.class == CloudAccount + elsif parent.class == Pool || parent.class == ProviderAccount instances = parent.instances else return nil @@ -209,7 +209,7 @@ class DataServiceActiveRecord end end
- # returns the failure rate of instance starts for instances associated with the parent, (pool/cloudaccount) given the failure code + # returns the failure rate of instance starts for instances associated with the parent, (pool/ProviderAccount) given the failure code def self.failure_rate(parent, start_time, end_time, failure_code) instances = get_parent_instances(parent) tasks = Task.find(:all, :conditions => {:created_at => start_time...end_time, diff --git a/src/app/services/graph_service.rb b/src/app/services/graph_service.rb index 7266434..c5f3065 100644 --- a/src/app/services/graph_service.rb +++ b/src/app/services/graph_service.rb @@ -16,7 +16,7 @@ class GraphService cloud_account_graphs[Graph::QUOTA_INSTANCES_IN_USE] = qos_failure_rate_graph(parent, opts = {}) graphs[cloud_account] = cloud_account_graphs else - CloudAccount.all.each do |cloud_account| + ProviderAccount.all.each do |cloud_account| cloud_account_graphs = Hash.new cloud_account_graphs[Graph::QUOTA_INSTANCES_IN_USE] = quota_instances_in_use_graph(cloud_account,opts) graphs[cloud_account] = cloud_account_graphs @@ -126,7 +126,7 @@ class GraphService providers = Provider.all providers.each do |provider| running_instances = 0 - provider.cloud_accounts.each do |account| + provider.provider_accounts.each do |account| running_instances = running_instances + account.quota.running_instances if account.quota end if running_instances > 0 diff --git a/src/app/util/condormatic.rb b/src/app/util/condormatic.rb index 8b4e224..da265c0 100644 --- a/src/app/util/condormatic.rb +++ b/src/app/util/condormatic.rb @@ -216,7 +216,7 @@ def condormatic_classads_sync # to it. replicated_images = provider.replicated_images.find(:all, :conditions => ['provider_image_key IS NOT NULL']) - accounts = provider.cloud_accounts + accounts = provider.provider_accounts hardware_profiles = provider.hardware_profiles realms = provider.realms accounts.each { |account| diff --git a/src/app/views/admin/provider_accounts/_aws.haml b/src/app/views/admin/provider_accounts/_aws.haml new file mode 100644 index 0000000..0d4ffb4 --- /dev/null +++ b/src/app/views/admin/provider_accounts/_aws.haml @@ -0,0 +1,39 @@ +%fieldset.nomargin.clearfix + = label_tag "Account name:" + = text_field :provider_account, :label + = label_tag "Username" + = text_field :provider_account, :username + = label_tag "Password" + = password_field :provider_account, :password + = label_tag "Quota" + = text_field :quota, :maximum_running_instances, :title => t('cloud_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +%fieldset.nomargin.clearfix + .grid_3.prefix_10.alpha.omega + ( + %button.linkbutton.nospace{ :type => 'button', :onclick => "set_unlimited_quota("quota_instances");" }<> + = t('cloud_accounts.form.unlimited_quota') + ) + +%fieldset.clearfix.nomargin + %label.grid_4.la.alpha + = t('cloud_accounts.form.account_number') + %span.required * + = text_field_tag :account_number + %label.grid_3.la + = t('cloud_accounts.form.account_private_cert') + %span.required * + = file_field :x509_cert_priv_file, :title => t('cloud_accounts.form.account_private_cert') + %label.grid_3.la + = t('cloud_accounts.form.account_public_cert') + %span.required * + = file_field :x509_cert_pub_file, :title => t('cloud_accounts.form.account_public_cert') + .grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('cloud_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('cloud_accounts.form.test_account') + ) + +:javascript + function set_unlimited_quota(elem_id) { + $("#" + elem_id)[0].value = "unlimited"; + } diff --git a/src/app/views/admin/provider_accounts/_gogrid.haml b/src/app/views/admin/provider_accounts/_gogrid.haml new file mode 100644 index 0000000..65b5998 --- /dev/null +++ b/src/app/views/admin/provider_accounts/_gogrid.haml @@ -0,0 +1,16 @@ +%fieldset.clear + = label_tag "Account name:" + = text_field :provider_account, :label +%fieldset.clear + = label_tag :username, "API Key:" + = text_field :provider_account,:username +%fieldset.clear + = label_tag :password, "Secret:" + = password_field :provider_account,:password + = label_tag "Quota" + = text_field :quota, :maximum_running_instances, :title => t('cloud_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +.grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('cloud_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('cloud_accounts.form.test_account') + ) diff --git a/src/app/views/admin/provider_accounts/_mock.haml b/src/app/views/admin/provider_accounts/_mock.haml new file mode 100644 index 0000000..65b5998 --- /dev/null +++ b/src/app/views/admin/provider_accounts/_mock.haml @@ -0,0 +1,16 @@ +%fieldset.clear + = label_tag "Account name:" + = text_field :provider_account, :label +%fieldset.clear + = label_tag :username, "API Key:" + = text_field :provider_account,:username +%fieldset.clear + = label_tag :password, "Secret:" + = password_field :provider_account,:password + = label_tag "Quota" + = text_field :quota, :maximum_running_instances, :title => t('cloud_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +.grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('cloud_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('cloud_accounts.form.test_account') + ) diff --git a/src/app/views/admin/provider_accounts/_opennebula.haml b/src/app/views/admin/provider_accounts/_opennebula.haml new file mode 100644 index 0000000..e04902e --- /dev/null +++ b/src/app/views/admin/provider_accounts/_opennebula.haml @@ -0,0 +1,16 @@ +%fieldset.clear + = label_tag "Account name:" + = text_field :provider_account, :label +%fieldset.clear + = label_tag :username, "API Key:" + = text_field :provider_account, :username +%fieldset.clear + = label_tag :password, "Secret:" + = password_field :provider_account, :password + = label_tag "Quota" + = text_field :quota, :maximum_running_instances, :title => t('cloud_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +.grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('cloud_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('cloud_accounts.form.test_account') + ) diff --git a/src/app/views/admin/provider_accounts/_provider_selection.haml b/src/app/views/admin/provider_accounts/_provider_selection.haml new file mode 100644 index 0000000..6d6b6ad --- /dev/null +++ b/src/app/views/admin/provider_accounts/_provider_selection.haml @@ -0,0 +1,24 @@ +%fieldset#provider_type.clear + = select(:provider_account ,:provider_id, options_for_select(@providers.map{ |p| [p.name, p.id] }, :selected => @selected_provider.id)) + = restful_submit_tag "Choose", 'set_selected_provider',set_selected_provider_admin_provider_accounts_path, 'GET', :class => 'button' + = label_tag "Cloud type: " + = t(Provider::PROVIDER_TYPES[@selected_provider.provider_type]) + = display_provider_account_login_form(@selected_provider.provider_type) + %fieldset.clearfix + .grid_13.alpha.omega + = submit_tag t(:add), :class => "ra nomargin dialogbutton" + +:javascript + $(document).ready(function(){ + var selected_provider; + $("#provider_account_provider_id").change(function() + { + selected_provider = $("option:selected").attr('value'); + $.get("#{set_selected_provider_admin_provider_accounts_url}", {'provider_account[provider_id]':selected_provider}, + function(result) { + $("#provider_type").html(result); + } + ); + + }); + }); diff --git a/src/app/views/admin/provider_accounts/_rackspace.haml b/src/app/views/admin/provider_accounts/_rackspace.haml new file mode 100644 index 0000000..c13672c --- /dev/null +++ b/src/app/views/admin/provider_accounts/_rackspace.haml @@ -0,0 +1,16 @@ +%fieldset.clear + = label_tag "Account name:" + = text_field :provider_account, :label +%fieldset.clear + = label_tag:username, "API Key:" + = text_field :provider_account, :username +%fieldset.clear + = label_tag :password, "Secret:" + = password_field :provider_account, :password + = label_tag "Quota" + = text_field :quota, :maximum_running_instances, :title => t('cloud_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +.grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('cloud_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('cloud_accounts.form.test_account') + ) diff --git a/src/app/views/admin/provider_accounts/_rhevm.haml b/src/app/views/admin/provider_accounts/_rhevm.haml new file mode 100644 index 0000000..dd86c72 --- /dev/null +++ b/src/app/views/admin/provider_accounts/_rhevm.haml @@ -0,0 +1,2 @@ +%fieldset.clear + Login form for RHEV-M (not implemented yet) diff --git a/src/app/views/admin/provider_accounts/new.haml b/src/app/views/admin/provider_accounts/new.haml index e567bce..8f82a0e 100644 --- a/src/app/views/admin/provider_accounts/new.haml +++ b/src/app/views/admin/provider_accounts/new.haml @@ -1,16 +1,15 @@ #details.grid_13 + = error_messages_for :provider_account %h2 = t('cloud_accounts.new.new_provider_account') - - form_for @cloud_account, :url => admin_provider_accounts_path, :html => { :multipart => true } do |f| %label{ :for => :provider_id } Provider - = select_tag :provider_id, options_for_select(@providers.map{ |p| [p.name, p.id] }) - = render :partial => 'form', :locals => { :f => f } - %fieldset.clearfix - .grid_13.alpha.omega - = submit_tag t(:add), :class => "ra nomargin dialogbutton" - %section - %p.requirement - %span.required * - - - = t('cloud_accounts.new.required_field') + %fieldset.clear + - unless @providers.empty? + - form_tag(admin_provider_accounts_path, :multipart => true) do + = render :partial => 'provider_selection' + %section + %p.requirement + %span.required * + - + = t('cloud_accounts.new.required_field') diff --git a/src/app/views/admin/providers/_form.haml b/src/app/views/admin/providers/_form.haml index fe8c9ca..b81c47f 100644 --- a/src/app/views/admin/providers/_form.haml +++ b/src/app/views/admin/providers/_form.haml @@ -1,5 +1,6 @@ = form.error_message_on :name, 'Name' = form.error_message_on :url, 'URL' += form.error_message_on :provider_type %fieldset.clear = form.label :name,'Provider name :' = form.text_field :name, :title => 'provider_name', :value => @provider.name, :class => "clear grid_4 alpha" @@ -10,5 +11,9 @@ %button.linkbutton.nospace{ :type => 'submit', :value => t('.test_connection'), :name => 'test_connection', :id => 'test_connection' } Test connection ) - %fieldset.clear - = form.submit "Save", :class => "submit formbutton" +%fieldset.clear + = form.label :provider_type + = form.select(:provider_type, Provider::PROVIDER_TYPES.collect {|id, provider_type| [t(provider_type),id] }, :prompt => "Select type of provider") + +%fieldset.clear + = form.submit "Save", :class => "submit formbutton" diff --git a/src/app/views/admin/providers/_list.haml b/src/app/views/admin/providers/_list.haml index 21ad381..7b660a3 100644 --- a/src/app/views/admin/providers/_list.haml +++ b/src/app/views/admin/providers/_list.haml @@ -17,3 +17,4 @@ %input{:name => "provider_selected[]", :type => "checkbox", :value => provider.id, :id => "provider_checkbox_#{provider.id}", :checked => selected } = link_to provider.name, admin_provider_path(provider) %td= provider.url + %td= t(Provider::PROVIDER_TYPES[provider.provider_type]) diff --git a/src/app/views/builds/new.haml b/src/app/views/builds/new.haml index 2cb159e..68f78ce 100644 --- a/src/app/views/builds/new.haml +++ b/src/app/views/builds/new.haml @@ -46,10 +46,10 @@ %label Choose Provider Format: %section.clearfix.gap %ul.block - - @all_targets.each do |target_id, target| + - @all_targets.each do |target, target_id| %li - = check_box_tag 'targets[]', target_id, false, :id => target_id - = label_tag target_id, target['name'] + = check_box_tag 'targets[]', target_id, false, :id => target + = label_tag target
= submit_tag "Submit to Build", :name => "build" = submit_tag "Cancel", :name => "cancel" diff --git a/src/app/views/cloud_accounts/_form.haml b/src/app/views/cloud_accounts/_form.haml deleted file mode 100644 index 2d35d47..0000000 --- a/src/app/views/cloud_accounts/_form.haml +++ /dev/null @@ -1,52 +0,0 @@ -= error_messages_for 'cloud_account' -%fieldset.clearfix.nomargin - %label.grid_4.la.alpha - = t('.account_name') - %span.required * - %label.grid_3.la - = t('.user_name') - %span.required * - %label.grid_3.la - = t('.password') - %span.required * - %label.grid_3.la.omega - = t('.quota_instances') - %span.required * -%fieldset.nomargin.clearfix - = f.text_field :label, :title => t('.account_name'), :class => "grid_4 alpha" - = f.text_field :username, :title => t('.user_name'), :class => "grid_3" - = f.password_field :password, :title => t('.password'), :class => "grid_3" - = text_field "quota", :maximum_running_instances, :title => t('.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" -%fieldset.nomargin.clearfix - .grid_3.prefix_10.alpha.omega - ( - %button.linkbutton.nospace{ :type => 'button', :onclick => "set_unlimited_quota("quota_instances");" }<> - = t('.unlimited_quota') - ) -%fieldset.clearfix.nomargin - %label.grid_4.la.alpha - = t('.account_number') - %span.required * - %label.grid_3.la - = t('.account_private_cert') - %span.required * - %label.grid_3.la - = t('.account_public_cert') - %span.required * - .grid_3.omega -%fieldset.clearfix.nomargin - = f.text_field :account_number, :title => t('.account_number'), :class => "grid_4 alpha" - .grid_3 - = f.file_field :x509_cert_priv_file, :title => t('.account_private_cert') - .grid_3 - = f.file_field :x509_cert_pub_file, :title => t('.account_public_cert') - .grid_3.omega - ( - %button.linkbutton.nospace{ :type => 'submit', :value => t('.test_account'), :name => 'test_account', :id => 'test_account' }<> - = t('.test_account') - ) - -:javascript - function set_unlimited_quota(elem_id) { - $("#" + elem_id)[0].value = "unlimited"; - } diff --git a/src/app/views/cloud_accounts/edit.haml b/src/app/views/cloud_accounts/edit.haml deleted file mode 100644 index dc24584..0000000 --- a/src/app/views/cloud_accounts/edit.haml +++ /dev/null @@ -1,17 +0,0 @@ -= render :partial => 'providers/providers' -#details.grid_13 - %nav.subsubnav - = render_navigation({:context => 'old', :level => 4}) - - %h2 - = t('.edit_provider_account') - - form_for @cloud_account, :url => provider_account_path(@provider, @cloud_account), :html => { :method => :put, :multipart => true } do |f| - = render :partial => 'form', :locals => { :f => f } - %fieldset.clearfix - .grid_13.alpha.omega - = submit_tag t(:edit), :class => "ra nomargin dialogbutton" - %section - %p.requirement - %span.required * - - - = t('.required_field') diff --git a/src/app/views/cloud_accounts/index.haml b/src/app/views/cloud_accounts/index.haml deleted file mode 100644 index e4d8670..0000000 --- a/src/app/views/cloud_accounts/index.haml +++ /dev/null @@ -1,25 +0,0 @@ -= render :partial => 'providers/providers' -#details.grid_13 - %nav.subsubnav - = render_navigation({:context => 'old', :level => 4}) - %h2 - = t('.provider_accounts') - - unless @provider.cloud_accounts.empty? - %table - %thead - %tr - %th{:scope => "col"} Label - %th{:scope => "col"} Username - %th{:scope => "col"} Account Number - %th{:scope => "col", :colspan => "2"} Actions - %tbody - - @provider.cloud_accounts.each do |cloud_account| - %tr - %td= cloud_account.label - %td= cloud_account.username - %td= cloud_account.account_number - %td= link_to 'Edit', edit_provider_account_path(@provider, cloud_account) - %td= link_to 'Delete', destroy_providers_account_path(@provider, cloud_account), :confirm => 'Are you sure?' - - - if @provider.cloud_accounts.empty? - = link_to 'Add', new_provider_account_path(@provider.id), :class => 'button' diff --git a/src/app/views/cloud_accounts/new.haml b/src/app/views/cloud_accounts/new.haml deleted file mode 100644 index b605714..0000000 --- a/src/app/views/cloud_accounts/new.haml +++ /dev/null @@ -1,17 +0,0 @@ -= render :partial => 'providers/providers' -#details.grid_13 - %nav.subsubnav - = render_navigation({:context => 'old', :level => 4}) - - %h2 - = t('.new_provider_account') - - form_for @cloud_account, :url => provider_accounts_path(@provider), :html => { :multipart => true } do |f| - = render :partial => 'form', :locals => { :f => f } - %fieldset.clearfix - .grid_13.alpha.omega - = submit_tag t(:add), :class => "ra nomargin dialogbutton" - %section - %p.requirement - %span.required * - - - = t('.required_field') diff --git a/src/app/views/instances/index.haml b/src/app/views/instances/index.haml index e33041e..8bbbb2a 100644 --- a/src/app/views/instances/index.haml +++ b/src/app/views/instances/index.haml @@ -123,5 +123,5 @@ %td= inst.hardware_profile.name %td= inst.template.name %td= inst.public_addresses - %td= inst.cloud_account ? inst.cloud_account.provider.name : '' + %td= inst.provider_account ? inst.provider_account.provider.name : '' %td= owner_name(inst) diff --git a/src/app/views/instances/show.haml b/src/app/views/instances/show.haml index 33b2897..7eab76e 100644 --- a/src/app/views/instances/show.haml +++ b/src/app/views/instances/show.haml @@ -18,7 +18,7 @@ %span= "#{@instance.template.xml.platform} #{@instance.template.xml.platform_version}" %li = label_tag :provider, 'Provider' - %span= @instance.cloud_account.provider.name if @instance.cloud_account + %span= @instance.provider_account.provider.name if @instance.provider_account %li = label_tag :base_template, 'Base Template' %span= @instance.template.name diff --git a/src/app/views/layouts/newui.haml b/src/app/views/layouts/newui.haml index 681f607..1f8c7d0 100644 --- a/src/app/views/layouts/newui.haml +++ b/src/app/views/layouts/newui.haml @@ -5,7 +5,6 @@ %title Red Hat Cloud Engine = yield :title - = stylesheet_link_tag 'facebox' = stylesheet_link_tag 'jquery.ui-1.8.1/jquery-ui-1.8.1.custom.css' = stylesheet_link_tag 'jquery.loadmask' diff --git a/src/app/views/provider_accounts/_form.haml b/src/app/views/provider_accounts/_form.haml new file mode 100644 index 0000000..2d35d47 --- /dev/null +++ b/src/app/views/provider_accounts/_form.haml @@ -0,0 +1,52 @@ += error_messages_for 'cloud_account' +%fieldset.clearfix.nomargin + %label.grid_4.la.alpha + = t('.account_name') + %span.required * + %label.grid_3.la + = t('.user_name') + %span.required * + %label.grid_3.la + = t('.password') + %span.required * + %label.grid_3.la.omega + = t('.quota_instances') + %span.required * +%fieldset.nomargin.clearfix + = f.text_field :label, :title => t('.account_name'), :class => "grid_4 alpha" + = f.text_field :username, :title => t('.user_name'), :class => "grid_3" + = f.password_field :password, :title => t('.password'), :class => "grid_3" + = text_field "quota", :maximum_running_instances, :title => t('.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +%fieldset.nomargin.clearfix + .grid_3.prefix_10.alpha.omega + ( + %button.linkbutton.nospace{ :type => 'button', :onclick => "set_unlimited_quota("quota_instances");" }<> + = t('.unlimited_quota') + ) +%fieldset.clearfix.nomargin + %label.grid_4.la.alpha + = t('.account_number') + %span.required * + %label.grid_3.la + = t('.account_private_cert') + %span.required * + %label.grid_3.la + = t('.account_public_cert') + %span.required * + .grid_3.omega +%fieldset.clearfix.nomargin + = f.text_field :account_number, :title => t('.account_number'), :class => "grid_4 alpha" + .grid_3 + = f.file_field :x509_cert_priv_file, :title => t('.account_private_cert') + .grid_3 + = f.file_field :x509_cert_pub_file, :title => t('.account_public_cert') + .grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('.test_account') + ) + +:javascript + function set_unlimited_quota(elem_id) { + $("#" + elem_id)[0].value = "unlimited"; + } diff --git a/src/app/views/provider_accounts/edit.haml b/src/app/views/provider_accounts/edit.haml new file mode 100644 index 0000000..dc24584 --- /dev/null +++ b/src/app/views/provider_accounts/edit.haml @@ -0,0 +1,17 @@ += render :partial => 'providers/providers' +#details.grid_13 + %nav.subsubnav + = render_navigation({:context => 'old', :level => 4}) + + %h2 + = t('.edit_provider_account') + - form_for @cloud_account, :url => provider_account_path(@provider, @cloud_account), :html => { :method => :put, :multipart => true } do |f| + = render :partial => 'form', :locals => { :f => f } + %fieldset.clearfix + .grid_13.alpha.omega + = submit_tag t(:edit), :class => "ra nomargin dialogbutton" + %section + %p.requirement + %span.required * + - + = t('.required_field') diff --git a/src/app/views/provider_accounts/index.haml b/src/app/views/provider_accounts/index.haml new file mode 100644 index 0000000..d1fdea4 --- /dev/null +++ b/src/app/views/provider_accounts/index.haml @@ -0,0 +1,25 @@ += render :partial => 'providers/providers' +#details.grid_13 + %nav.subsubnav + = render_navigation({:context => 'old', :level => 4}) + %h2 + = t('.provider_accounts') + - unless @provider.provider_accounts.empty? + %table + %thead + %tr + %th{:scope => "col"} Label + %th{:scope => "col"} Username + %th{:scope => "col"} Account Number + %th{:scope => "col", :colspan => "2"} Actions + %tbody + - @provider.provider_accounts.each do |cloud_account| + %tr + %td= cloud_account.label + %td= cloud_account.username + %td= cloud_account.account_number + %td= link_to 'Edit', edit_provider_account_path(@provider, cloud_account) + %td= link_to 'Delete', destroy_providers_account_path(@provider, cloud_account), :confirm => 'Are you sure?' + + - if @provider.provider_accounts.empty? + = link_to 'Add', new_provider_account_path(@provider.id), :class => 'button' diff --git a/src/app/views/provider_accounts/new.haml b/src/app/views/provider_accounts/new.haml new file mode 100644 index 0000000..b605714 --- /dev/null +++ b/src/app/views/provider_accounts/new.haml @@ -0,0 +1,17 @@ += render :partial => 'providers/providers' +#details.grid_13 + %nav.subsubnav + = render_navigation({:context => 'old', :level => 4}) + + %h2 + = t('.new_provider_account') + - form_for @cloud_account, :url => provider_accounts_path(@provider), :html => { :multipart => true } do |f| + = render :partial => 'form', :locals => { :f => f } + %fieldset.clearfix + .grid_13.alpha.omega + = submit_tag t(:add), :class => "ra nomargin dialogbutton" + %section + %p.requirement + %span.required * + - + = t('.required_field') diff --git a/src/app/views/providers/accounts.haml b/src/app/views/providers/accounts.haml index 984f257..63d42af 100644 --- a/src/app/views/providers/accounts.haml +++ b/src/app/views/providers/accounts.haml @@ -11,7 +11,7 @@ = t('.provider_accounts') - form_tag ({:controller => 'cloud_accounts', :action => 'update_accounts'}), :multipart => true do = hidden_field :provider, :id, :value => @provider.id - - @provider.cloud_accounts.each do |acct| + - @provider.provider_accounts.each do |acct| %fieldset.clearfix.nomargin %label.grid_4.la.alpha = t('.account_name') @@ -61,8 +61,8 @@ %a.button{ :href => remove_path, :name => "remove_acc_#{acct.id}", :class => "tiny #{'disabled' unless remove_path}" } = t(:remove) %fieldset.clearfix.gap - = link_to t(:reset), {:controller => 'provider', :action => 'accounts', :id => @provider.id}, :class => "button dialogbutton" unless @provider.cloud_accounts.empty? - = submit_tag t(:save), :name => 'update_cloud_accounts', :class => "dialogbutton" unless @provider.cloud_accounts.empty? + = link_to t(:reset), {:controller => 'provider', :action => 'accounts', :id => @provider.id}, :class => "button dialogbutton" unless @provider.provider_accounts.empty? + = submit_tag t(:save), :name => 'update_cloud_accounts', :class => "dialogbutton" unless @provider.provider_accounts.empty?
%h2 = t('.new_provider_account') diff --git a/src/app/views/resources/instances/_list.haml b/src/app/views/resources/instances/_list.haml index a83b565..b62d9e7 100644 --- a/src/app/views/resources/instances/_list.haml +++ b/src/app/views/resources/instances/_list.haml @@ -19,5 +19,5 @@ %td= inst.state %td= inst.template.name %td= inst.public_addresses - %td= inst.cloud_account ? inst.cloud_account.provider.name : '' + %td= inst.provider_account ? inst.provider_account.provider.name : '' %td= owner_name(inst) diff --git a/src/app/views/resources/instances/_properties.haml b/src/app/views/resources/instances/_properties.haml index 5283e20..d14843c 100644 --- a/src/app/views/resources/instances/_properties.haml +++ b/src/app/views/resources/instances/_properties.haml @@ -16,7 +16,7 @@ %span= "#{@instance.template.xml.platform} #{@instance.template.xml.platform_version}" %li = label_tag :provider, 'Provider' - %span= @instance.cloud_account.provider.name if @instance.cloud_account + %span= @instance.provider_account.provider.name if @instance.provider_account %li = label_tag :base_template, 'Base Template' %span= @instance.template.name diff --git a/src/classad_plugin/classad_plugin.rb b/src/classad_plugin/classad_plugin.rb index 2aabfb9..14b5878 100644 --- a/src/classad_plugin/classad_plugin.rb +++ b/src/classad_plugin/classad_plugin.rb @@ -60,7 +60,7 @@ def classad_plugin(logf, conf_path, instance_key, account_id) instance = Instance.find(:first, :conditions => [ "condor_job_id = ?", instance_key ]) logf.puts "getting cloud account from id #{account_id}" - cloud_account = CloudAccount.find(:first, + cloud_account = ProviderAccount.find(:first, :conditions => [ "id = ?", account_id ])
logf.puts "instance is: #{instance}, cloud account is #{cloud_account}" diff --git a/src/config/environment.rb b/src/config/environment.rb index a897feb..986cfe4 100644 --- a/src/config/environment.rb +++ b/src/config/environment.rb @@ -57,7 +57,7 @@ Rails::Initializer.run do |config|
config.middleware.swap Rack::MethodOverride, 'Rack::RestfulSubmit'
- config.active_record.observers = :instance_observer, :task_observer, :cloud_account_observer + config.active_record.observers = :instance_observer, :task_observer, :provider_account_observer # Only load the plugins named here, in the order given. By default, all plugins # in vendor/plugins are loaded in alphabetical order. # :all can be used as a placeholder for all plugins not explicitly named diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml index 715c0a0..dcb379b 100644 --- a/src/config/locales/en.yml +++ b/src/config/locales/en.yml @@ -85,6 +85,12 @@ en: pool_families: Pool Families setting: Settings name: Name + AWS: Amazon EC2 + RHEVM: RHEV-M + GoGrid: GoGrid + Rackspace: Rackspace + OpenNebula: OpenNebula + mock: Mock admin: settings: index: diff --git a/src/config/old_navigation.rb b/src/config/old_navigation.rb index 27b44cf..ef4b352 100644 --- a/src/config/old_navigation.rb +++ b/src/config/old_navigation.rb @@ -9,7 +9,7 @@ SimpleNavigation::Configuration.run do |navigation| second_level.item :system_settings, t(:system_settings), :controller => 'settings' do |third_level| third_level.item :manage_providers, t(:manage_providers), providers_path do |fourth_level| fourth_level.item :provider_summary, t(:provider_summary), { :controller => 'providers', :action => 'show', :id => (@provider.id if @provider) }, :highlights_on => //providers/\d+(/edit)?$/ - fourth_level.item :provider_accounts, t(:provider_accounts), { :controller => 'cloud_accounts', :action => 'index', :provider_id => (@provider.id if @provider) }, :highlights_on => //providers/\d+/accounts(/(\d+|new))?/ + fourth_level.item :provider_accounts, t(:provider_accounts), { :controller => 'provider_accounts', :action => 'index', :provider_id => (@provider.id if @provider) }, :highlights_on => //providers/\d+/accounts(/(\d+|new))?/ fourth_level.item :scheduling_policies, t(:scheduling_policies), '#' fourth_level.item :services_provided, t(:services_provided), '#' fourth_level.item :map_profiles, t(:map_profiles), '#' diff --git a/src/config/routes.rb b/src/config/routes.rb index 0aa281b..5db5a08 100644 --- a/src/config/routes.rb +++ b/src/config/routes.rb @@ -50,7 +50,8 @@ ActionController::Routing::Routes.draw do |map| r.resources :hardware_profiles, :collection => { :multi_destroy => :delete } r.resources :providers, :collection => { :multi_destroy => :delete } r.resources :users, :collection => { :multi_destroy => :delete } - r.resources :provider_accounts, :collection => { :multi_destroy => :delete } + r.resources :provider_accounts, :collection => { :multi_destroy => :delete, :set_selected_provider => :get} + r.resources :roles, :collection => { :multi_destroy => :delete } r.resources :settings, :collection => { :self_service => :get, :general_settings => :get } r.resources :pool_families, :collection => { :multi_destroy => :delete } @@ -76,9 +77,9 @@ ActionController::Routing::Routes.draw do |map| # Temporarily disable this route, provider stuff is not restful yet. # Will be re-enabled in upcoming patch map.resources :providers do |provider| - provider.resources :accounts, :controller => 'cloud_accounts' + provider.resources :accounts, :controller => 'provider_accounts' end - map.destroy_providers_account '/providers/:provider_id/accounts/:id/destroy', :controller => 'cloud_accounts', :action => 'destroy', :conditions => { :method => :get } + map.destroy_providers_account '/providers/:provider_id/accounts/:id/destroy', :controller => 'provider_accounts', :action => 'destroy', :conditions => { :method => :get }
map.resources :templates, :collection => { :destroy_multiple => :get }, :member => { diff --git a/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb new file mode 100644 index 0000000..7b1a1d5 --- /dev/null +++ b/src/db/migrate/20110117140824_rename_cloud_account_to_provider_account.rb @@ -0,0 +1,13 @@ +class RenameCloudAccountToProviderAccount < ActiveRecord::Migration + def self.up + rename_table (:cloud_accounts,:provider_accounts) + remove_column (:providers, :cloud_type) + add_column (:providers, :provider_type, :integer) + end + + def self.down + remove_column (:providers, :provider_type) + add_column (:providers, :cloud_type, :string, :null => false) + rename_table (:provider_accounts, :cloud_accounts) + end +end diff --git a/src/db/migrate/20110125123410_rename_cloud_account_id_for_instances.rb b/src/db/migrate/20110125123410_rename_cloud_account_id_for_instances.rb new file mode 100644 index 0000000..674fc2d --- /dev/null +++ b/src/db/migrate/20110125123410_rename_cloud_account_id_for_instances.rb @@ -0,0 +1,9 @@ +class RenameCloudAccountIdForInstances < ActiveRecord::Migration + def self.up + rename_column :instances, :cloud_account_id, :provider_account_id + end + + def self.down + rename_column :instances, :provider_account_id, :cloud_account_id + end +end diff --git a/src/db/migrate/20110125154113_rename_cloud_accounts_pool_families_to_provider_accounts_pool_families.rb b/src/db/migrate/20110125154113_rename_cloud_accounts_pool_families_to_provider_accounts_pool_families.rb new file mode 100644 index 0000000..d1ae154 --- /dev/null +++ b/src/db/migrate/20110125154113_rename_cloud_accounts_pool_families_to_provider_accounts_pool_families.rb @@ -0,0 +1,11 @@ +class RenameCloudAccountsPoolFamiliesToProviderAccountsPoolFamilies < ActiveRecord::Migration + def self.up + rename_table :cloud_accounts_pool_families, :pool_families_provider_accounts + rename_column :pool_families_provider_accounts, :cloud_account_id, :provider_account_id + end + + def self.down + rename_column :pool_families_provider_accounts, :provider_account_id, :cloud_account_id + rename_table :pool_families_provider_accounts, :cloud_accounts_pool_families + end +end diff --git a/src/db/migrate/20110126161751_change_null_properties_of_columns_in_provider_accounts.rb b/src/db/migrate/20110126161751_change_null_properties_of_columns_in_provider_accounts.rb new file mode 100644 index 0000000..7e6707e --- /dev/null +++ b/src/db/migrate/20110126161751_change_null_properties_of_columns_in_provider_accounts.rb @@ -0,0 +1,13 @@ +class ChangeNullPropertiesOfColumnsInProviderAccounts < ActiveRecord::Migration + def self.up + change_column :provider_accounts, :account_number, :string, :null => true + change_column :provider_accounts, :x509_cert_priv, :text, :null => true + change_column :provider_accounts, :x509_cert_pub, :text, :null => true + end + + def self.down + change_column :provider_accounts, :account_number, :string, :null => false + change_column :provider_accounts, :x509_cert_priv, :text, :null => false + change_column :provider_accounts, :x509_cert_pub, :text, :null => false + end +end diff --git a/src/db/migrate/20110202151950_change_cloudaccount_value_to_provideraccount_in_privileges_and_roles.rb b/src/db/migrate/20110202151950_change_cloudaccount_value_to_provideraccount_in_privileges_and_roles.rb new file mode 100644 index 0000000..2db783c --- /dev/null +++ b/src/db/migrate/20110202151950_change_cloudaccount_value_to_provideraccount_in_privileges_and_roles.rb @@ -0,0 +1,11 @@ +class ChangeCloudaccountValueToProvideraccountInPrivilegesAndRoles < ActiveRecord::Migration + def self.up + execute "UPDATE privileges SET target_type='ProviderAccount' WHERE target_type='CloudAccount';" + execute "UPDATE roles SET scope='ProviderAccount' WHERE scope='CloudAccount';" + end + + def self.down + execute "UPDATE privileges SET target_type='CloudAccount' WHERE target_type='ProviderAccount';" + execute "UPDATE roles SET scope='CloudAccount' WHERE scope='ProviderAccount';" + end +end diff --git a/src/db/migrate/20110202165053_change_column_target_in_images.rb b/src/db/migrate/20110202165053_change_column_target_in_images.rb new file mode 100644 index 0000000..135fddc --- /dev/null +++ b/src/db/migrate/20110202165053_change_column_target_in_images.rb @@ -0,0 +1,11 @@ +class ChangeColumnTargetInImages < ActiveRecord::Migration + def self.up + remove_column :images, :target + add_column :images, :target, :integer + end + + def self.down + remove_column :images, :target + add_column :images, :target, :string + end +end diff --git a/src/db/seeds.rb b/src/db/seeds.rb index 9a6065c..1ed2329 100644 --- a/src/db/seeds.rb +++ b/src/db/seeds.rb @@ -30,17 +30,17 @@ roles = Quota => [VIEW]}}, Provider => {"Provider Owner" => {Provider => [VIEW, MOD, VPRM,GPRM], - CloudAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}}, - CloudAccount => - {"Provider Account User" => {CloudAccount => [VIEW,USE]}, - "Provider Account Owner" => {CloudAccount => [VIEW,USE,MOD, VPRM,GPRM]}}, + ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}}, + ProviderAccount => + {"Provider Account User" => {ProviderAccount => [VIEW,USE]}, + "Provider Account Owner" => {ProviderAccount => [VIEW,USE,MOD, VPRM,GPRM]}}, Template => {"Template User" => {Template => [VIEW,USE]}, "Template Owner" => {Template => [VIEW,USE,MOD, VPRM,GPRM]}}, BasePermissionObject => {"Provider Creator" => {Provider => [ CRE]}, "Provider Administrator" => {Provider => [VIEW, MOD,CRE,VPRM,GPRM], - CloudAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}, + ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM]}, "HWP Administrator" => {HardwareProfile => [ MOD,CRE,VPRM,GPRM]}, "Realm Administrator" => {Realm => [ USE,MOD,CRE,VPRM,GPRM]}, "Pool Creator" => {Pool => [ CRE]}, @@ -50,7 +50,7 @@ roles = PoolFamily => [VIEW, MOD,CRE,VPRM,GPRM]}, "Template Administrator" => {Template => [VIEW,USE,MOD,CRE,VPRM,GPRM]}, "Administrator" => {Provider => [VIEW, MOD,CRE,VPRM,GPRM], - CloudAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM], + ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM], HardwareProfile => [ MOD,CRE,VPRM,GPRM], Realm => [ USE,MOD,CRE,VPRM,GPRM], User => [VIEW, MOD,CRE], diff --git a/src/dbomatic/dbomatic b/src/dbomatic/dbomatic index 8a3e968..3ac7449 100755 --- a/src/dbomatic/dbomatic +++ b/src/dbomatic/dbomatic @@ -203,7 +203,7 @@ class CondorEventLog < Nokogiri::XML::SAX::Document return end
- cloud_account = CloudAccount.find(:first, :conditions => ['provider_id = ? AND username = ? AND password = ?', provider.id, username, password]) + cloud_account = ProviderAccount.find(:first, :conditions => ['provider_id = ? AND username = ? AND password = ?', provider.id, username, password]) if cloud_account.nil? @logger.error "Could not find the cloud account corresponding to #{link}, skipping cloud id update" return diff --git a/src/features/instance.feature b/src/features/instance.feature index ad22025..4e4e59c 100644 --- a/src/features/instance.feature +++ b/src/features/instance.feature @@ -109,4 +109,4 @@ Feature: Mange Instances And I press "Search" Then I should not see "mock" And I should see "test" - And I should not see "other" \ No newline at end of file + And I should not see "other" diff --git a/src/features/provider.feature b/src/features/provider.feature index 08704dd..af636cd 100644 --- a/src/features/provider.feature +++ b/src/features/provider.feature @@ -35,6 +35,7 @@ Feature: Manage Providers Then I should be on the new admin provider page When I fill in "provider[name]" with "testprovider" And I fill in "provider[url]" with "http://localhost:3001/api" + And I select "Amazon EC2" from "Provider type" And I press "Save" Then I should be on the admin providers page And I should see "Provider added" @@ -64,34 +65,34 @@ Feature: Manage Providers And this provider has 5 replicated images And this provider has 5 hardware profiles And this provider has a realm - And this provider has a cloud account + And this provider has a provider account When I go to the admin providers page And I check "provider1" provider And I press "Delete" And there should not exist a provider named "provider1" And there should not be any replicated images And there should not be any hardware profiles - And there should not be a cloud account + And there should not be a provider account And there should not be a realm
Scenario: Search for hardware profiles Given there are these providers: | name | url | | Test | http://testprovider.com/api | - | Mock | http://mockprovider.com/api | + | Kenny | http://mockprovider.com/api | | Other | http://sometesturl.com/api | And I am on the admin providers page Then I should see the following: | Test | http://testprovider.com/api | - | Mock | http://mockprovider.com/ap | + | Kenny | http://mockprovider.com/ap | | Other | http://sometesturl.com/api | When I fill in "q" with "test" And I press "Search" Then I should see "Test" And I should see "Other" - And I should not see "Mock" - When I fill in "q" with "Mock" + And I should not see "Kenny" + When I fill in "q" with "Kenny" And I press "Search" - Then I should see "Mock" + Then I should see "Kenny" And I should not see "Test" - And I should not see "Other" \ No newline at end of file + And I should not see "Other" diff --git a/src/features/provider_account.feature b/src/features/provider_account.feature index 964aba2..0905139 100644 --- a/src/features/provider_account.feature +++ b/src/features/provider_account.feature @@ -22,21 +22,17 @@ Feature: Manage Provider Accounts When I follow "New Account" Then I should be on the new admin provider account page And I should see "New Account" - When I select "testprovider" from "provider_id" - And I fill in "cloud_account[label]" with "testaccount" - And I fill in "cloud_account[username]" with "mockuser" - And I fill in "cloud_account[password]" with "mockpassword" + When I select "testprovider" from "provider_account_provider_id" + And I fill in "provider_account[label]" with "testaccount" + And I fill in "provider_account[username]" with "mockuser" + And I fill in "provider_account[password]" with "mockpassword" And I fill in "quota[maximum_running_instances]" with "13" - And I fill in "cloud_account[account_number]" with "222222" - And I attach the "private.key" file to "cloud_account[x509_cert_priv_file]" - And I attach the "public.key" file to "cloud_account[x509_cert_pub_file]" And I press "Add" Then I should be on testaccount's provider account page And I should see "Provider account added" And I should have a provider account named "testaccount" And I should see "Properties for testaccount" And I should see "Running instances quota: 13" - And I should see "Account ID: 222222"
Scenario: Test Provider Account Connection Successful Given there is a provider named "testprovider" @@ -44,8 +40,8 @@ Feature: Manage Provider Accounts And I am on the admin provider accounts page When I follow "New Account" Then I should be on the new admin provider account page - When I fill in "cloud_account[username]" with "mockuser" - And I fill in "cloud_account[password]" with "mockpassword" + When I fill in "provider_account[username]" with "mockuser" + And I fill in "provider_account[password]" with "mockpassword" And I press "Test Account" Then I should see "Test Connection Success"
@@ -55,8 +51,8 @@ Feature: Manage Provider Accounts And I am on the admin provider accounts page When I follow "New Account" Then I should be on the new admin provider account page - When I fill in "cloud_account[username]" with "mockuser" - And I fill in "cloud_account[password]" with "wrong password" + When I fill in "provider_account[username]" with "mockuser" + And I fill in "provider_account[password]" with "wrong password" And I press "Test Account" Then I should see "Test Connection Failed"
diff --git a/src/features/step_definitions/provider_account_steps.rb b/src/features/step_definitions/provider_account_steps.rb index 5d68b88..86a6d31 100644 --- a/src/features/step_definitions/provider_account_steps.rb +++ b/src/features/step_definitions/provider_account_steps.rb @@ -1,9 +1,9 @@ Then /^there should be no provider accounts$/ do - CloudAccount.all.should be_empty + ProviderAccount.all.should be_empty end
Given /^there are no provider accounts$/ do - CloudAccount.all.should be_empty + ProviderAccount.all.should be_empty end
When /^I attach the "([^"\s]+)" file to "([^"\s]+)"$/ do |file, field| @@ -12,27 +12,27 @@ When /^I attach the "([^"\s]+)" file to "([^"\s]+)"$/ do |file, field| end
Then /^I should have a provider account named "([^"]*)"$/ do |label| - CloudAccount.find_by_label(label).should_not be_nil + ProviderAccount.find_by_label(label).should_not be_nil end
Given /^there is a provider account named "([^"]*)"$/ do |label| @provider = Provider.find_by_name('testprovider') - @cloud_account = Factory(:mock_cloud_account, :provider => @provider, :label => label) + @provider_account = Factory(:mock_provider_account, :provider => @provider, :label => label) end
Given /^there is a second provider account named "([^"]*)"$/ do |label| @provider = Factory(:mock_provider, :name => 'secondprovider') - @cloud_account = Factory(:mock_cloud_account, :provider => @provider, :label => label) + @provider_account = Factory(:mock_provider_account, :provider => @provider, :label => label) end
When /^I check the "([^"]*)" account$/ do |label| - account = CloudAccount.find_by_label(label) + account = ProviderAccount.find_by_label(label) check("account_checkbox_#{account.id}") end
Given /^that there are these provider accounts:$/ do |table| table.hashes.each do |hash| - Factory.create(:cloud_account, :name => hash['name'], :username => hash['username']) + Factory.create(:provider_account, :name => hash['name'], :username => hash['username']) end end diff --git a/src/features/step_definitions/provider_steps.rb b/src/features/step_definitions/provider_steps.rb index bc56276..4d57030 100644 --- a/src/features/step_definitions/provider_steps.rb +++ b/src/features/step_definitions/provider_steps.rb @@ -49,8 +49,8 @@ Given /^this provider has a realm$/ do Factory(:realm, :provider => @provider) end
-Given /^this provider has a cloud account$/ do - Factory(:mock_cloud_account, :provider => @provider) +Given /^this provider has a provider account$/ do + Factory(:mock_provider_account, :provider => @provider) end
Then /^there should not be any replicated images$/ do @@ -61,8 +61,8 @@ Then /^there should not be any hardware profiles$/ do HardwareProfile.find(:all, :conditions => { :provider_id => @provider.id} ).size.should == 0 end
-Then /^there should not be a cloud account$/ do - CloudAccount.find(:all, :conditions => { :provider_id => @provider.id} ).size.should == 0 +Then /^there should not be a provider account$/ do + ProviderAccount.find(:all, :conditions => { :provider_id => @provider.id} ).size.should == 0 end
Then /^there should not be a realm$/ do diff --git a/src/features/step_definitions/template_steps.rb b/src/features/step_definitions/template_steps.rb index e0ab543..c4f986c 100644 --- a/src/features/step_definitions/template_steps.rb +++ b/src/features/step_definitions/template_steps.rb @@ -92,13 +92,13 @@ When /^I choose this template$/ do choose("ids__#{@template.id}") end
-Given /^there is ec2 cloud account$/ do - account = Factory.build(:ec2_cloud_account) +Given /^there is Amazon AWS provider account$/ do + account = Factory.build(:ec2_provider_account) account.save! end
-Given /^there is ec2 build for this template$/ do - Image.build(@template, 'ec2') +Given /^there is Amazon AWS build for this template$/ do + Image.build(@template, Provider::AWS) end
Given /^there is an imported template$/ do diff --git a/src/features/support/custom.rb b/src/features/support/custom.rb index c2c4987..8d44f9c 100644 --- a/src/features/support/custom.rb +++ b/src/features/support/custom.rb @@ -8,8 +8,8 @@ Provider.class_eval do true end
- def set_cloud_type - self.cloud_type = Factory(:mock_provider).cloud_type + def set_provider_type + self.provider_type = Factory(:mock_provider).provider_type end
def populate_hardware_profiles @@ -23,7 +23,7 @@ Provider.class_eval do
end
-CloudAccount.class_eval do +ProviderAccount.class_eval do
alias :generate_auth_key_original :generate_auth_key
diff --git a/src/features/support/paths.rb b/src/features/support/paths.rb index 4bc7ba4..193d374 100644 --- a/src/features/support/paths.rb +++ b/src/features/support/paths.rb @@ -105,7 +105,7 @@ module NavigationHelpers url_for :action => 'edit', :controller => 'hardware_profiles', :only_path => true
when /^(.*)'s provider account page$/ - admin_provider_account_path(CloudAccount.find_by_label($1)) + admin_provider_account_path(ProviderAccount.find_by_label($1))
when /^(.*)'s image factory deployable page$/ image_factory_deployable_path(Deployable.find_by_name($1)) diff --git a/src/features/template.feature b/src/features/template.feature index b7d75a8..74ab316 100644 --- a/src/features/template.feature +++ b/src/features/template.feature @@ -91,31 +91,31 @@ Feature: Manage Templates
Scenario: Build template Given there is a "mock1" template - And there is ec2 cloud account + And there is Amazon AWS provider account And I am on the templates page When I choose this template And I press "Build" Then I should be on the new template build page And I should see "Build Request" - When I check "ec2" + When I check "Aws" And I press "Submit to Build" Then I should be on the template builds page And I should see "mock1"
Scenario: Build template which is already built Given there is a "mock1" template - And there is ec2 cloud account + And there is Amazon AWS provider account And I am on the templates page - And there is ec2 build for this template + And there is Amazon AWS build for this template When I choose this template And I press "Build" Then I should be on the new template build page And I should see "Build Request" - When I check "ec2" + When I check "Aws" And I press "Submit to Build" Then I should be on the template builds page And I should see "mock1" - And I should see "An attempted build of this template for the target 'ec2' already exists" + And I should see "An attempted build of this template for the target '1' already exists"
Scenario: Build imported template Given there is an imported template @@ -166,4 +166,4 @@ Feature: Manage Templates And I press "Search" Then I should not see "Test1" And I should see "Other" - And I should not see "Mock" \ No newline at end of file + And I should not see "Mock" diff --git a/src/image_builder_service/image_builder_service b/src/image_builder_service/image_builder_service index 0ffb74d..35099b0 100755 --- a/src/image_builder_service/image_builder_service +++ b/src/image_builder_service/image_builder_service @@ -121,7 +121,7 @@ class ImageBuilderService # FIXME: this should be contained elsewhere (probably Image model) so we # can keep logic out of here. Also, this currently only handles one # account, we will need to be able to specify at some point. - creds = image.replicated_images.first.provider.cloud_accounts.first.build_credentials + creds = image.replicated_images.first.provider.provider_accounts.first.build_credentials #TODO: switch this back to uri once ActiveBuild retrieves it properly ab = @console.build_image(image.template.xml.to_xml, image.target, image.uuid, creds) if ab diff --git a/src/lib/tasks/dc_tasks.rake b/src/lib/tasks/dc_tasks.rake index f1d0c7d..cf713a5 100644 --- a/src/lib/tasks/dc_tasks.rake +++ b/src/lib/tasks/dc_tasks.rake @@ -105,7 +105,7 @@ namespace :dc do unless provider = Provider.find_by_name(provider_name) raise "There is no provider with '#{provider_name}' name" end - unless account = provider.cloud_accounts.find_by_label(account_name) + unless account = provider.provider_accounts.find_by_label(account_name) raise "There is no account with '#{account_name}' label" end account diff --git a/src/lib/tasks/demo_data.rake b/src/lib/tasks/demo_data.rake index f38ebbd..f3326fd 100644 --- a/src/lib/tasks/demo_data.rake +++ b/src/lib/tasks/demo_data.rake @@ -32,7 +32,7 @@ namespace :db do
puts @number_of_tasks
- cloud_account = CloudAccount.find(args[:cloud_account_id]) + cloud_account = ProviderAccount.find(args[:cloud_account_id]) user = User.find(args[:user_id])
instance = create_instance(cloud_account) @@ -116,4 +116,4 @@ namespace :db do return time_started end
-end \ No newline at end of file +end diff --git a/src/script/use-existing-ec2-templates b/src/script/use-existing-ec2-templates index 7396380..b52de56 100755 --- a/src/script/use-existing-ec2-templates +++ b/src/script/use-existing-ec2-templates @@ -13,11 +13,11 @@ require 'optparse' def add_ec2_template(xml_info, summary, ec2_ami)
provider = Provider.find(:first) - if provider == nil || provider.cloud_type != "ec2" + if provider == nil || provider.provider_type != Provider::AWS puts "You need to set up an EC2 provider before you can run this script." exit end - + template = Template.new
# Incredibly, all the info actually comes from the xml.. @@ -46,7 +46,7 @@ def add_ec2_template(xml_info, summary, ec2_ami)
puts "Saved image #{summary} for use." end - + add_ec2_template(" <?xml version=\"1.0\"?> <image> diff --git a/src/spec/controllers/builds_controller_spec.rb b/src/spec/controllers/builds_controller_spec.rb index ef4f3d4..3432bef 100644 --- a/src/spec/controllers/builds_controller_spec.rb +++ b/src/spec/controllers/builds_controller_spec.rb @@ -18,19 +18,19 @@ describe BuildsController do hydra = Typhoeus::Hydra.hydra hydra.stub(:put, %r{http://localhost:9090/templates/.*%7D).and_return( Typhoeus::Response.new(:code => 200)) - Factory.create(:mock_cloud_account) + Factory.create(:mock_provider_account) Factory.create(:mock_provider) end
it "should create a new Image" do lambda do - post :create, :template_id => @template.id, :targets => ["mock"] + post :create, :template_id => @template.id, :targets => ["0"] end.should change(Image, :count).by(1) end
it "should create a new ReplicatedImage" do lambda do - post :create, :template_id => @template.id, :targets => ["mock"] + post :create, :template_id => @template.id, :targets => ["0"] end.should change(ReplicatedImage, :count).by(1) end end diff --git a/src/spec/controllers/cloud_accounts_controller_spec.rb b/src/spec/controllers/cloud_accounts_controller_spec.rb deleted file mode 100644 index d61ad34..0000000 --- a/src/spec/controllers/cloud_accounts_controller_spec.rb +++ /dev/null @@ -1,92 +0,0 @@ -require 'spec_helper' - -describe CloudAccountsController do - - fixtures :all - before(:each) do - @cloud_account = Factory :mock_cloud_account - @provider = @cloud_account.provider - - @admin_permission = Permission.create :role => Role.find(:first, :conditions => ['name = ?', 'Provider Administrator']), - :permission_object => @provider, - :user => Factory(:provider_admin_user) - @admin = @admin_permission.user - activate_authlogic - end - - it "shows provider accounts as list" do - UserSession.create(@admin) - get :index, :provider_id => @provider.id - response.should be_success - response.should render_template("index") - end - - it "allows test account validity on create when passing test_account param" do - UserSession.create(@admin) - post :create, :provider_id => @provider.id, :cloud_account => {}, :test_account => true - response.should be_success - response.should render_template("new") - response.flash[:error].should == "Test Connection Failed: Invalid Account Details" - end - - it "doesn't allow to save provider's account if not valid credentials" do - UserSession.create(@admin) - post :create, :provider_id => @provider.id, :cloud_account => {} - response.should be_success - response.should render_template("new") - response.flash[:error].should == "The entered credential information is incorrect" - end - - it "should permit users with account modify permission to access edit cloud account interface" do - UserSession.create(@admin) - get :edit, :id => @cloud_account.id - response.should be_success - response.should render_template("edit") - end - - it "should allow users with account modify password to update a cloud account" do - UserSession.create(@admin) - - @cloud_account.password = "foobar" - @cloud_account.stub!(:valid_credentials?).and_return(true) - @cloud_account.quota = Quota.new - @cloud_account.save.should be_true - - post :update, :id => @cloud_account.id, :cloud_account => { :password => 'mockpassword' } - response.should redirect_to provider_accounts_path(@provider) - CloudAccount.find(@cloud_account.id).password.should == "mockpassword" - end - - it "should allow users with account modify permission to delete a cloud account" do - UserSession.create(@admin) - lambda do - get :destroy, :id => @cloud_account.id - end.should change(CloudAccount, :count).by(-1) - response.should redirect_to provider_accounts_path(@provider) - CloudAccount.find_by_id(@cloud_account.id).should be_nil - end - - it "should deny access to users without account modify permission" do - get :edit, :id => @cloud_account.id - response.should_not be_success - - post :update, :id => @cloud_account.id, :cloud_account => { :password => 'foobar' } - response.should_not be_success - - post :destroy, :id => @cloud_account.id - response.should_not be_success - end - - it "should provide ui to create new account" do - UserSession.create(@admin) - get :new, :provider_id => @provider.id - response.should be_success - response.should render_template("new") - end - - it "should fail to grant access to account UIs for unauthenticated user" do - get :new - response.should_not be_success - end - -end diff --git a/src/spec/controllers/provider_accounts_controller_spec.rb b/src/spec/controllers/provider_accounts_controller_spec.rb new file mode 100644 index 0000000..6369eab --- /dev/null +++ b/src/spec/controllers/provider_accounts_controller_spec.rb @@ -0,0 +1,92 @@ +require 'spec_helper' + +describe ProviderAccountsController do + + fixtures :all + before(:each) do + @provider_account = Factory :mock_provider_account + @provider = @provider_account.provider + + @admin_permission = Permission.create :role => Role.find(:first, :conditions => ['name = ?', 'Provider Administrator']), + :permission_object => @provider, + :user => Factory(:provider_admin_user) + @admin = @admin_permission.user + activate_authlogic + end + + it "shows provider accounts as list" do + UserSession.create(@admin) + get :index, :provider_id => @provider.id + response.should be_success + response.should render_template("index") + end + + it "allows test account validity on create when passing test_account param" do + UserSession.create(@admin) + post :create, :provider_id => @provider.id, :provider_account => {}, :test_account => true + response.should be_success + response.should render_template("new") + response.flash[:error].should == "Test Connection Failed: Invalid Account Details" + end + + it "doesn't allow to save provider's account if not valid credentials" do + UserSession.create(@admin) + post :create, :provider_id => @provider.id, :provider_account => {} + response.should be_success + response.should render_template("new") + response.flash[:error].should == "The entered credential information is incorrect" + end + + it "should permit users with account modify permission to access edit cloud account interface" do + UserSession.create(@admin) + get :edit, :id => @provider_account.id + response.should be_success + response.should render_template("edit") + end + + it "should allow users with account modify password to update a cloud account" do + UserSession.create(@admin) + + @provider_account.password = "foobar" + @provider_account.stub!(:valid_credentials?).and_return(true) + @provider_account.quota = Quota.new + @provider_account.save.should be_true + + post :update, :id => @provider_account.id, :provider_account => { :password => 'mockpassword' } + response.should redirect_to provider_accounts_path(@provider) + ProviderAccount.find(@provider_account.id).password.should == "mockpassword" + end + + it "should allow users with account modify permission to delete a cloud account" do + UserSession.create(@admin) + lambda do + get :destroy, :id => @provider_account.id + end.should change(ProviderAccount, :count).by(-1) + response.should redirect_to provider_accounts_path(@provider) + ProviderAccount.find_by_id(@provider_account.id).should be_nil + end + + it "should deny access to users without account modify permission" do + get :edit, :id => @provider_account.id + response.should_not be_success + + post :update, :id => @provider_account.id, :provider_account => { :password => 'foobar' } + response.should_not be_success + + post :destroy, :id => @provider_account.id + response.should_not be_success + end + + it "should provide ui to create new account" do + UserSession.create(@admin) + get :new, :provider_id => @provider.id + response.should be_success + response.should render_template("new") + end + + it "should fail to grant access to account UIs for unauthenticated user" do + get :new + response.should_not be_success + end + +end diff --git a/src/spec/factories/cloud_account.rb b/src/spec/factories/cloud_account.rb deleted file mode 100644 index 0b9c0a7..0000000 --- a/src/spec/factories/cloud_account.rb +++ /dev/null @@ -1,21 +0,0 @@ -Factory.define :cloud_account do |f| - f.sequence(:username) { |n| "testUser#{n}" } - f.password "testPassword" - f.sequence(:label) { |n| "test label#{n}" } - f.account_number "3141" - f.x509_cert_priv "x509 private key" - f.x509_cert_pub "x509 public key" - f.association :provider -end - -Factory.define :mock_cloud_account, :parent => :cloud_account do |f| - f.username "mockuser" - f.password "mockpassword" - f.provider { |p| p.association(:mock_provider) } -end - -Factory.define :ec2_cloud_account, :parent => :cloud_account do |f| - f.username "mockuser" - f.password "mockpassword" - f.provider { |p| p.association(:ec2_provider) } -end diff --git a/src/spec/factories/instance.rb b/src/spec/factories/instance.rb index 7533ba9..87938bd 100644 --- a/src/spec/factories/instance.rb +++ b/src/spec/factories/instance.rb @@ -2,7 +2,7 @@ Factory.define :instance do |i| i.sequence(:name) { |n| "instance#{n}" } i.sequence(:external_key) { |n| "key#{n}" } i.association :hardware_profile, :factory => :mock_hwp1 - i.association :cloud_account, :factory => :mock_cloud_account + i.association :provider_account, :factory => :mock_provider_account i.association :template, :factory => :template i.association :pool, :factory => :pool i.association :owner, :factory => :user @@ -23,6 +23,6 @@ end
Factory.define :ec2_instance, :parent => :instance do |i| i.association :hardware_profile, :factory => :ec2_hwp1 - i.association :cloud_account, :factory => :ec2_cloud_account + i.association :provider_account, :factory => :ec2_provider_account i.association :instance_key, :factory => :ec2_instance_key1 end diff --git a/src/spec/factories/provider.rb b/src/spec/factories/provider.rb index 76fb4af..f6288dc 100644 --- a/src/spec/factories/provider.rb +++ b/src/spec/factories/provider.rb @@ -1,11 +1,11 @@ Factory.define :provider do |p| p.sequence(:name) { |n| "provider#{n}" } - p.cloud_type 'mock' + p.provider_type '0' p.url { |p| "http://www." + p.name + ".com/api" } end
Factory.define :mock_provider, :parent => :provider do |p| - p.cloud_type 'mock' + p.provider_type '0' p.url 'http://localhost:3001/api' p.hardware_profiles { |hp| [hp.association(:mock_hwp1), hp.association(:mock_hwp2)] } p.after_create { |p| p.realms << Factory(:realm1, :provider => p) << Factory(:realm2, :provider => p) } @@ -13,14 +13,14 @@ end
Factory.define :mock_provider2, :parent => :provider do |p| p.name 'mock2' - p.cloud_type 'mock' + p.provider_type '0' p.url 'http://localhost:3001/api' p.after_create { |p| p.realms << Factory(:realm3, :provider => p) } end
Factory.define :ec2_provider, :parent => :provider do |p| p.name 'amazon-ec2' - p.cloud_type 'ec2' + p.provider_type '1' p.url 'http://localhost:3001/api' p.hardware_profiles { |hp| [hp.association(:ec2_hwp1)] } p.after_create { |p| p.realms << Factory(:realm4, :provider => p) } diff --git a/src/spec/factories/provider_account.rb b/src/spec/factories/provider_account.rb new file mode 100644 index 0000000..dae7047 --- /dev/null +++ b/src/spec/factories/provider_account.rb @@ -0,0 +1,21 @@ +Factory.define :provider_account do |f| + f.sequence(:username) { |n| "testUser#{n}" } + f.password "testPassword" + f.sequence(:label) { |n| "test label#{n}" } + f.account_number "3141" + f.x509_cert_priv "x509 private key" + f.x509_cert_pub "x509 public key" + f.association :provider +end + +Factory.define :mock_provider_account, :parent => :provider_account do |f| + f.username "mockuser" + f.password "mockpassword" + f.provider { |p| p.association(:mock_provider) } +end + +Factory.define :ec2_provider_account, :parent => :provider_account do |f| + f.username "mockuser" + f.password "mockpassword" + f.provider { |p| p.association(:ec2_provider) } +end diff --git a/src/spec/models/cloud_account_observer_spec.rb b/src/spec/models/cloud_account_observer_spec.rb deleted file mode 100644 index 48491c0..0000000 --- a/src/spec/models/cloud_account_observer_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'spec_helper' - -describe CloudAccountObserver do - fixtures :all - - it "should create an instance_key if provider is EC2" do - @client = mock('DeltaCloud', :null_object => true) - @provider = Factory.build :ec2_provider - @key = mock('Key', :null_object => true) - @key.stub!(:pem).and_return("PEM") - @key.stub!(:id).and_return("1_user") - @client.stub!(:"feature?").and_return(true) - @client.stub!(:"create_key").and_return(@key) - - cloud_account = Factory.build :ec2_cloud_account - cloud_account.stub!(:connect).and_return(@client) - cloud_account.save - cloud_account.instance_key.should_not == nil - cloud_account.instance_key.pem == "PEM" - cloud_account.instance_key.id == "1_user" - end -end diff --git a/src/spec/models/cloud_account_spec.rb b/src/spec/models/cloud_account_spec.rb deleted file mode 100644 index fb04e40..0000000 --- a/src/spec/models/cloud_account_spec.rb +++ /dev/null @@ -1,80 +0,0 @@ -require 'spec_helper' - -describe CloudAccount do - fixtures :all - before(:each) do - @cloud_account = Factory :mock_cloud_account - end - - it "should not be destroyable if it has instances" do - @cloud_account.instances << Instance.new - @cloud_account.destroyable?.should be_false - @cloud_account.destroy.should be_false - - @cloud_account.instances.clear - @cloud_account.destroyable?.should be_true - @cloud_account.destroy.equal?(@cloud_account).should be_true - @cloud_account.should be_frozen - end - - it "should check the validitiy of the cloud account login credentials" do - mock_provider = Factory :mock_provider - - invalid_cloud_account = Factory.build(:cloud_account, :username => "wrong_username", :password => "wrong_password", :provider => mock_provider) - invalid_cloud_account.should_not be_valid - - valid_cloud_account = Factory.build(:mock_cloud_account, :provider => mock_provider) - valid_cloud_account.should be_valid - end - - it "should fail to create a cloud account if the provider credentials are invalid" do - cloud_account = Factory.build(:mock_cloud_account, :password => "wrong_password") - cloud_account.save.should == false - end - - it "should create an instance_key if provider is EC2" do - @client = mock('DeltaCloud', :null_object => true) - @provider = Factory.build :ec2_provider - @key = mock('Key', :null_object => true) - @key.stub!(:pem).and_return("PEM") - @key.stub!(:id).and_return("1_user") - @client.stub!(:"feature?").and_return(true) - @client.stub!(:"create_key").and_return(@key) - - cloud_account = Factory.build :ec2_cloud_account - cloud_account.stub!(:connect).and_return(@client) - cloud_account.save - cloud_account.instance_key.should_not == nil - cloud_account.instance_key.pem == "PEM" - cloud_account.instance_key.id == "1_user" - end - - it "when calling connect and it fails with exception it will return nil" do - DeltaCloud.should_receive(:new).and_raise(Exception.new) - - @cloud_account.connect.should be_nil - end - - it "should generate credentials xml" do - expected_xml = <<EOT -<?xml version="1.0"?> -<provider_credentials> - <ec2_credentials> - <account_number>1234</account_number> - <access_key>user</access_key> - <secret_access_key>pass</secret_access_key> - <certificate>cert</certificate> - <key>priv_key</key> - </ec2_credentials> -</provider_credentials> -EOT - cloud_account = Factory.build(:mock_cloud_account, - :username => 'user', - :password => 'pass', - :account_number => '1234', - :x509_cert_priv => 'priv_key', - :x509_cert_pub => 'cert' - ) - cloud_account.build_credentials.should eql(expected_xml) - end -end diff --git a/src/spec/models/image_spec.rb b/src/spec/models/image_spec.rb index dbd5ba8..e489fb6 100644 --- a/src/spec/models/image_spec.rb +++ b/src/spec/models/image_spec.rb @@ -42,12 +42,12 @@ describe Image do end
it "should build image if there is provider and cloud account for specified target" do - acc = Factory.build(:mock_cloud_account) + acc = Factory.build(:mock_provider_account) acc.stub!(:valid_credentials?).and_return(true) acc.save! tpl = Factory.build(:template) tpl.save! - img = Image.build(tpl, 'mock') + img = Image.build(tpl, '0') Image.find(img).should == img ReplicatedImage.find_by_image_id(img.id).should_not be_nil end @@ -55,7 +55,7 @@ describe Image do it "should import image" do image = OpenStruct.new(:id => 'mock', :name => 'mock', :description => 'imported mock', :architecture => 'i386') client = mock('DeltaCloud', :feature? => false, :image => image) - account = Factory.build(:ec2_cloud_account) + account = Factory.build(:ec2_provider_account) account.stub!(:connect).and_return(client) account.stub!(:valid_credentials?).and_return(true) account.save! diff --git a/src/spec/models/instance_observer_spec.rb b/src/spec/models/instance_observer_spec.rb index be2665e..4acb78c 100644 --- a/src/spec/models/instance_observer_spec.rb +++ b/src/spec/models/instance_observer_spec.rb @@ -3,10 +3,8 @@ require 'spec_helper' describe InstanceObserver do
before(:each) do - Timecop.travel(Time.local(2008, 9, 1, 10, 5, 0, 0, 0)) - - @cloud_account_quota = Factory :quota - @cloud_account = Factory(:mock_cloud_account, :quota_id => @cloud_account_quota.id) + @provider_account_quota = Factory :quota + @provider_account = Factory(:mock_provider_account, :quota_id => @provider_account_quota.id)
@pool_quota = Factory :quota @pool = Factory(:pool, :quota_id => @pool_quota.id) @@ -15,7 +13,9 @@ describe InstanceObserver do @user = Factory(:user, :quota_id => @user_quota.id)
@hwp = Factory :mock_hwp1 - @instance = Factory(:new_instance, :pool => @pool, :hardware_profile => @hwp, :cloud_account_id => @cloud_account.id, :owner => @user) + @instance = Factory(:new_instance, :pool => @pool, :hardware_profile => @hwp, :provider_account_id => @provider_account.id, :owner => @user) + + Timecop.travel(Time.local(2008, 9, 1, 10, 5, 0, 0, 0)) end
after(:each) do @@ -102,14 +102,14 @@ describe InstanceObserver do end
it "should not update quota on pool, user and cloud account when an instance is state new" do - [@cloud_account_quota, @pool_quota, @user_quota].each do |quota| + [@provider_account_quota, @pool_quota, @user_quota].each do |quota| quota = Quota.find(quota) quota.total_instances.should == 0 end end
it "should update quota on pool, user and cloud account when an instance goes to state pending" do - [@cloud_account_quota, @pool_quota, @user_quota].each do |quota| + [@provider_account_quota, @pool_quota, @user_quota].each do |quota| @instance.state = Instance::STATE_PENDING @instance.save!
@@ -122,7 +122,7 @@ describe InstanceObserver do @instance.state = Instance::STATE_CREATE_FAILED @instance.save!
- [@cloud_account_quota, @pool_quota, @user_quota].each do |quota| + [@provider_account_quota, @pool_quota, @user_quota].each do |quota| quota = Quota.find(quota) quota.total_instances.should == 0 end @@ -132,7 +132,7 @@ describe InstanceObserver do @instance.state = Instance::STATE_RUNNING @instance.save!
- [@cloud_account_quota, @pool_quota, @user_quota].each do |quota| + [@provider_account_quota, @pool_quota, @user_quota].each do |quota| quota = Quota.find(quota.id) quota.running_instances.should == 1 quota.total_instances.should == 1 @@ -146,7 +146,7 @@ describe InstanceObserver do @instance.state = Instance::STATE_SHUTTING_DOWN @instance.save!
- [@cloud_account_quota, @pool_quota, @user_quota].each do |quota| + [@provider_account_quota, @pool_quota, @user_quota].each do |quota| quota = Quota.find(quota.id)
quota.running_instances.should == 0 diff --git a/src/spec/models/instance_spec.rb b/src/spec/models/instance_spec.rb index 625718d..e4d3a9f 100644 --- a/src/spec/models/instance_spec.rb +++ b/src/spec/models/instance_spec.rb @@ -86,16 +86,9 @@ describe Instance do
describe "with time capsule" do
- before(:each) do - Timecop.travel(Time.local(2008, 9, 1, 10, 5, 0, 0, 0)) - end - - after(:each) do - Timecop.return - end - it "should properly calculate the total time that the instance has been in a monitored state" do instance = Factory :new_instance + Timecop.travel(Time.local(2008, 9, 1, 10, 5, 0, 0, 0))
[ Instance::STATE_PENDING, Instance::STATE_RUNNING, Instance::STATE_SHUTTING_DOWN, Instance::STATE_STOPPED ].each do |s|
@@ -121,18 +114,19 @@ describe Instance do instance.total_state_time(s).should >= 3 instance.total_state_time(s).should <= 4 end + Timecop.return end
end
it "should return empty list of instance actions when connect to provider fails" do provider = Factory.build(:mock_provider2) - cloud_account = Factory.build(:cloud_account, :provider => provider, + cloud_account = Factory.build(:provider_account, :provider => provider, :username => 'john doe', :password => 'asdf') cloud_account.stub!(:connect).and_return(nil) cloud_account.stub!(:valid_credentials?).and_return(true) - instance = Factory.create(:instance, :cloud_account => cloud_account) + instance = Factory.create(:instance, :provider_account => cloud_account) instance.get_action_list.should be_empty end
diff --git a/src/spec/models/pool_family_spec.rb b/src/spec/models/pool_family_spec.rb index 2b69eab..68dfb42 100644 --- a/src/spec/models/pool_family_spec.rb +++ b/src/spec/models/pool_family_spec.rb @@ -5,9 +5,9 @@ describe PoolFamily do before(:each) do @pool = Factory :pool @pool_family = @pool.pool_family - @cloud_account = Factory :mock_cloud_account - @cloud_account.pool_families << @pool_family - @cloud_account.save! + @provider_account = Factory :mock_provider_account + @provider_account.pool_families << @pool_family + @provider_account.save! end
it "should validate default pool family" do @@ -27,8 +27,8 @@ describe PoolFamily do end
it "should have account" do - @pool_family.cloud_accounts.size.should == 1 - @pool_family.cloud_accounts[0].id.should == @cloud_account.id + @pool_family.provider_accounts.size.should == 1 + @pool_family.provider_accounts[0].id.should == @provider_account.id end
end diff --git a/src/spec/models/provider_account_observer_spec.rb b/src/spec/models/provider_account_observer_spec.rb new file mode 100644 index 0000000..0c397db --- /dev/null +++ b/src/spec/models/provider_account_observer_spec.rb @@ -0,0 +1,22 @@ +require 'spec_helper' + +describe ProviderAccountObserver do + fixtures :all + + it "should create an instance_key if provider is EC2" do + @client = mock('DeltaCloud', :null_object => true) + @provider = Factory.build :ec2_provider + @key = mock('Key', :null_object => true) + @key.stub!(:pem).and_return("PEM") + @key.stub!(:id).and_return("1_user") + @client.stub!(:"feature?").and_return(true) + @client.stub!(:"create_key").and_return(@key) + + provider_account = Factory.build :ec2_provider_account + provider_account.stub!(:connect).and_return(@client) + provider_account.save + provider_account.instance_key.should_not == nil + provider_account.instance_key.pem == "PEM" + provider_account.instance_key.id == "1_user" + end +end diff --git a/src/spec/models/provider_account_spec.rb b/src/spec/models/provider_account_spec.rb new file mode 100644 index 0000000..48678e8 --- /dev/null +++ b/src/spec/models/provider_account_spec.rb @@ -0,0 +1,80 @@ +require 'spec_helper' + +describe ProviderAccount do + fixtures :all + before(:each) do + @provider_account = Factory :mock_provider_account + end + + it "should not be destroyable if it has instances" do + @provider_account.instances << Instance.new + @provider_account.destroyable?.should be_false + @provider_account.destroy.should be_false + + @provider_account.instances.clear + @provider_account.destroyable?.should be_true + @provider_account.destroy.equal?(@provider_account).should be_true + @provider_account.should be_frozen + end + + it "should check the validitiy of the cloud account login credentials" do + mock_provider = Factory :mock_provider + + invalid_provider_account = Factory.build(:provider_account, :username => "wrong_username", :password => "wrong_password", :provider => mock_provider) + invalid_provider_account.should_not be_valid + + valid_provider_account = Factory.build(:mock_provider_account, :provider => mock_provider) + valid_provider_account.should be_valid + end + + it "should fail to create a cloud account if the provider credentials are invalid" do + provider_account = Factory.build(:mock_provider_account, :password => "wrong_password") + provider_account.save.should == false + end + + it "should create an instance_key if provider is EC2" do + @client = mock('DeltaCloud', :null_object => true) + @provider = Factory.build :ec2_provider + @key = mock('Key', :null_object => true) + @key.stub!(:pem).and_return("PEM") + @key.stub!(:id).and_return("1_user") + @client.stub!(:"feature?").and_return(true) + @client.stub!(:"create_key").and_return(@key) + + provider_account = Factory.build :ec2_provider_account + provider_account.stub!(:connect).and_return(@client) + provider_account.save + provider_account.instance_key.should_not == nil + provider_account.instance_key.pem == "PEM" + provider_account.instance_key.id == "1_user" + end + + it "when calling connect and it fails with exception it will return nil" do + DeltaCloud.should_receive(:new).and_raise(Exception.new) + + @provider_account.connect.should be_nil + end + + it "should generate credentials xml" do + expected_xml = <<EOT +<?xml version="1.0"?> +<provider_credentials> + <ec2_credentials> + <account_number>1234</account_number> + <access_key>user</access_key> + <secret_access_key>pass</secret_access_key> + <certificate>cert</certificate> + <key>priv_key</key> + </ec2_credentials> +</provider_credentials> +EOT + provider_account = Factory.build(:mock_provider_account, + :username => 'user', + :password => 'pass', + :account_number => '1234', + :x509_cert_priv => 'priv_key', + :x509_cert_pub => 'cert' + ) + provider_account.build_credentials.should eql(expected_xml) + end +end diff --git a/src/spec/models/provider_spec.rb b/src/spec/models/provider_spec.rb index 1b86f92..c23227e 100644 --- a/src/spec/models/provider_spec.rb +++ b/src/spec/models/provider_spec.rb @@ -26,9 +26,9 @@ describe Provider do end end
- it "should require a valid cloud_type" do + it "should require a valid provider_type" do [nil, ""].each do |invalid_value| - @provider.cloud_type = invalid_value + @provider.provider_type = invalid_value @provider.should_not be_valid end end @@ -64,9 +64,9 @@ describe Provider do end
it "should set valid cloud type" do - @client.driver_name = @provider.cloud_type - @provider.cloud_type = nil - @provider.set_cloud_type! + @client.driver_name = @provider.provider_type + @provider.provider_type = nil + @provider.provider_type = 0 @provider.should be_valid end
@@ -79,7 +79,7 @@ describe Provider do HardwareProfile.destroy_all
instance = Factory(:instance) - provider = instance.cloud_account.provider + provider = instance.provider_account.provider provider.destroy provider.destroyed?.should be_false end diff --git a/src/spec/models/quota_spec.rb b/src/spec/models/quota_spec.rb index 9620e83..960b417 100644 --- a/src/spec/models/quota_spec.rb +++ b/src/spec/models/quota_spec.rb @@ -3,8 +3,8 @@ require 'spec_helper' describe Quota do
before(:each) do - @cloud_account_quota = Factory :quota - @cloud_account = Factory(:mock_cloud_account, :quota_id => @cloud_account_quota.id) + @provider_account_quota = Factory :quota + @provider_account = Factory(:mock_provider_account, :quota_id => @provider_account_quota.id)
@pool_quota = Factory :quota @pool = Factory(:pool, :quota_id => @pool_quota.id) @@ -13,12 +13,12 @@ describe Quota do @user = Factory(:user, :quota_id => @user_quota.id)
@hwp = Factory :mock_hwp1 - @instance = Factory(:new_instance, :pool => @pool, :hardware_profile => @hwp, :cloud_account_id => @cloud_account.id, :owner => @user) + @instance = Factory(:new_instance, :pool => @pool, :hardware_profile => @hwp, :provider_account_id => @provider_account.id, :owner => @user) end
it "should return true when asking if an instance can be created/started when there is sufficient quota space" do - Quota.can_create_instance?(@instance, @cloud_account).should == true - Quota.can_start_instance?(@instance, @cloud_account).should == true + Quota.can_create_instance?(@instance, @provider_account).should == true + Quota.can_start_instance?(@instance, @provider_account).should == true end
it "should return true when asking if an instance can be created/started when using unlimited Quotas" do @@ -28,11 +28,11 @@ describe Quota do @pool.quota = Factory :unlimited_quota @pool.save!
- @cloud_account.quota = Factory :unlimited_quota - @cloud_account.save! + @provider_account.quota = Factory :unlimited_quota + @provider_account.save!
- Quota.can_create_instance?(@instance, @cloud_account).should == true - Quota.can_start_instance?(@instance, @cloud_account).should == true + Quota.can_create_instance?(@instance, @provider_account).should == true + Quota.can_start_instance?(@instance, @provider_account).should == true end
it "should return false when asking if an instance can be created/started when the user quota is reached" do @@ -40,8 +40,8 @@ describe Quota do @user_quota.running_instances = @user_quota.maximum_running_instances @user_quota.save!
- Quota.can_create_instance?(@instance, @cloud_account).should == false - Quota.can_start_instance?(@instance, @cloud_account).should == false + Quota.can_create_instance?(@instance, @provider_account).should == false + Quota.can_start_instance?(@instance, @provider_account).should == false end
it "should return false when asking if an instance can be created/started when the pool quota is reached" do @@ -49,17 +49,17 @@ describe Quota do @pool_quota.running_instances = @pool_quota.maximum_running_instances @pool_quota.save!
- Quota.can_create_instance?(@instance, @cloud_account).should == false - Quota.can_start_instance?(@instance, @cloud_account).should == false + Quota.can_create_instance?(@instance, @provider_account).should == false + Quota.can_start_instance?(@instance, @provider_account).should == false end
it "should return false when asking if an instance can be created/started when the cloud account quota is reached" do - @cloud_account_quota.total_instances = @cloud_account_quota.maximum_total_instances - @cloud_account_quota.running_instances = @cloud_account_quota.maximum_running_instances - @cloud_account_quota.save! + @provider_account_quota.total_instances = @provider_account_quota.maximum_total_instances + @provider_account_quota.running_instances = @provider_account_quota.maximum_running_instances + @provider_account_quota.save!
- Quota.can_create_instance?(@instance, @cloud_account).should == false - Quota.can_start_instance?(@instance, @cloud_account).should == false + Quota.can_create_instance?(@instance, @provider_account).should == false + Quota.can_start_instance?(@instance, @provider_account).should == false end
it "should return false when asking if an instance can be created/started when the all quotas are reached" do @@ -71,12 +71,12 @@ describe Quota do @pool_quota.running_instances = @pool_quota.maximum_running_instances @pool_quota.save!
- @cloud_account_quota.total_instances = @cloud_account_quota.maximum_total_instances - @cloud_account_quota.running_instances = @cloud_account_quota.maximum_running_instances - @cloud_account_quota.save! + @provider_account_quota.total_instances = @provider_account_quota.maximum_total_instances + @provider_account_quota.running_instances = @provider_account_quota.maximum_running_instances + @provider_account_quota.save!
- Quota.can_create_instance?(@instance, @cloud_account).should == false - Quota.can_start_instance?(@instance, @cloud_account).should == false + Quota.can_create_instance?(@instance, @provider_account).should == false + Quota.can_start_instance?(@instance, @provider_account).should == false end
-end \ No newline at end of file +end diff --git a/src/spec/services/data_service_active_record_spec.rb b/src/spec/services/data_service_active_record_spec.rb index b443fa9..45b07bf 100644 --- a/src/spec/services/data_service_active_record_spec.rb +++ b/src/spec/services/data_service_active_record_spec.rb @@ -11,13 +11,13 @@ describe DataServiceActiveRecord do data = [[25, 10], [40, 20], [20, 20]] free = 0 for i in 0..2 - cloud_account = Factory.build(:cloud_account, :provider => provider, :username => "username" + i.to_s) - cloud_account.stub!(:valid_credentials?).and_return(true) - cloud_account.save! + provider_account = Factory.build(:provider_account, :provider => provider, :username => "username" + i.to_s) + provider_account.stub!(:valid_credentials?).and_return(true) + provider_account.save!
quota = Factory(:quota, :maximum_total_instances => data[i][0], :total_instances => data[i][1]) - cloud_account.quota_id = quota.id - cloud_account.save! + provider_account.quota_id = quota.id + provider_account.save!
free += (data[i][0] - data[i][1]) end @@ -36,24 +36,24 @@ describe DataServiceActiveRecord do provider.stub!(:connect).and_return(client) provider.save!
- cloud_account = Factory.build(:cloud_account, :provider => provider) - cloud_account.stub!(:valid_credentials?).and_return(true) - cloud_account.save! + provider_account = Factory.build(:provider_account, :provider => provider) + provider_account.stub!(:valid_credentials?).and_return(true) + provider_account.save!
quota = Factory(:quota, :maximum_running_instances => 40, :maximum_total_instances => 50, :running_instances => 20, :total_instances => 20) - cloud_account.quota_id = quota.id + provider_account.quota_id = quota.id
- data_point = DataServiceActiveRecord.quota_usage(cloud_account, Quota::RESOURCE_RUNNING_INSTANCES) + data_point = DataServiceActiveRecord.quota_usage(provider_account, Quota::RESOURCE_RUNNING_INSTANCES) data_point.should == DataServiceActiveRecord::QuotaUsagePoint.new(20, 40)
- data_point = DataServiceActiveRecord.quota_usage(cloud_account, Quota::RESOURCE_TOTAL_INSTANCES) + data_point = DataServiceActiveRecord.quota_usage(provider_account, Quota::RESOURCE_TOTAL_INSTANCES) data_point.should == DataServiceActiveRecord::QuotaUsagePoint.new(20, 50)
- data_point = DataServiceActiveRecord.quota_usage(cloud_account, Quota::RESOURCE_OVERALL) + data_point = DataServiceActiveRecord.quota_usage(provider_account, Quota::RESOURCE_OVERALL) data_point.should == DataServiceActiveRecord::QuotaUsagePoint.new(20, 40) end
@@ -127,13 +127,13 @@ describe DataServiceActiveRecord do provider.stub!(:connect).and_return(client) provider.save!
- cloud_accounts = [] + provider_accounts = [] expected_averages.each do |expected_average| - cloud_account = Factory.build(:cloud_account, :provider => provider, :username => "username" + expected_average[0].to_s) - cloud_account.stub!(:valid_credentials?).and_return(true) - cloud_account.save! + provider_account = Factory.build(:provider_account, :provider => provider, :username => "username" + expected_average[0].to_s) + provider_account.stub!(:valid_credentials?).and_return(true) + provider_account.save!
- instance = Factory(:instance, :cloud_account_id => cloud_account.id, :pool_id => pool.id) + instance = Factory(:instance, :provider_account_id => provider_account.id, :pool_id => pool.id) generate_tasks(start_time, interval_length, instance, expected_average) end
@@ -163,11 +163,11 @@ describe DataServiceActiveRecord do runtimes = [runtime1, runtime2, runtime3]
pool = Factory(:pool) - cloud_account = Factory :mock_cloud_account + provider_account = Factory :mock_provider_account
for i in 0..2 do runtimes[i].each do |runtime| - instance = Factory(:instance, :pool => pool, :cloud_account => cloud_account, :state => Instance::STATE_STOPPED) + instance = Factory(:instance, :pool => pool, :provider_account => provider_account, :state => Instance::STATE_STOPPED) instance.save!
instance.time_last_pending = start_times[i] + (interval_length / 2) @@ -177,7 +177,7 @@ describe DataServiceActiveRecord do end end
- stats = DataServiceActiveRecord.qos_instance_runtime_stats(cloud_account, start_time, end_time, interval_length) + stats = DataServiceActiveRecord.qos_instance_runtime_stats(provider_account, start_time, end_time, interval_length) stats[0].should == DataServiceActiveRecord::QoSDataPoint.new(start_times[0], 15, 25, 5) stats[1].should == DataServiceActiveRecord::QoSDataPoint.new(start_times[1], 30, 50, 10) stats[2].should == DataServiceActiveRecord::QoSDataPoint.new(start_times[2], 300, 500, 100) @@ -187,11 +187,11 @@ describe DataServiceActiveRecord do it "should generate the mean max and min instance runtimes of instances for a given cloud account or pool" do pool = Factory(:pool)
- cloud_account = Factory :mock_cloud_account + provider_account = Factory :mock_provider_account
start_time = Time.utc(2010,"jan",1,20,15,1) [50, 100, 150, 200, 250].each do |runtime| - instance = Factory(:new_instance, :pool => pool, :cloud_account => cloud_account) + instance = Factory(:new_instance, :pool => pool, :provider_account => provider_account) instance.time_last_pending = start_time instance.time_last_running = start_time instance.acc_running_time = runtime @@ -205,8 +205,8 @@ describe DataServiceActiveRecord do
it "should calculate the average time it takes a provider to complete a task between two times" do pool = Factory(:pool) - cloud_account = Factory(:mock_cloud_account) - instance = Factory(:instance, :pool => pool, :cloud_account => cloud_account) + provider_account = Factory(:mock_provider_account) + instance = Factory(:instance, :pool => pool, :provider_account => provider_account)
start_time = Time.utc(2010,"jan",1,20,15,1) task_completion_times = [10, 20, 30, 40, 50] @@ -230,7 +230,7 @@ describe DataServiceActiveRecord do end
expected_average_time = total_time / task_completion_times.length - average_time = DataServiceActiveRecord.qos_task_completion_mean_max_min(cloud_account.provider, start_time, Time.now, InstanceTask::ACTION_CREATE) + average_time = DataServiceActiveRecord.qos_task_completion_mean_max_min(provider_account.provider, start_time, Time.now, InstanceTask::ACTION_CREATE)
average_time[:average].should == expected_average_time average_time[:min].should == 10 @@ -243,8 +243,8 @@ describe DataServiceActiveRecord do end_time = create_time + 1
pool = Factory(:pool) - cloud_account = Factory :mock_cloud_account - instance = Factory(:instance, :pool => pool, :cloud_account => cloud_account) + provider_account = Factory :mock_provider_account + instance = Factory(:instance, :pool => pool, :provider_account => provider_account)
failures = 5 non_failures = 20 @@ -289,8 +289,8 @@ describe DataServiceActiveRecord do number_of_instances = 20
pool = Factory(:pool) - cloud_account = Factory :mock_cloud_account - instance = Factory(:instance, :pool => pool, :cloud_account => cloud_account) + provider_account = Factory :mock_provider_account + instance = Factory(:instance, :pool => pool, :provider_account => provider_account)
for i in 0..2 for j in 1..failures[i] diff --git a/src/test/fixtures/providers.yml b/src/test/fixtures/providers.yml index 1669919..7e8ee9f 100644 --- a/src/test/fixtures/providers.yml +++ b/src/test/fixtures/providers.yml @@ -2,5 +2,5 @@
mock_provider: name: mock - cloud_type: Mock + provider_type: Mock url: http://localhost:3001/api diff --git a/src/test/fixtures/roles.yml b/src/test/fixtures/roles.yml index 99df4b7..d12fc64 100644 --- a/src/test/fixtures/roles.yml +++ b/src/test/fixtures/roles.yml @@ -27,11 +27,11 @@ pool_administrator: privileges: provider_view, pool_modify, pool_view, quota_modify, quota_view, stats_view, set_perms, view_perms account_administrator: name: Account Administrator - scope: CloudAccount + scope: ProviderAccount privileges: account_modify, account_view, stats_view, set_perms, view_perms account_viewer: name: Account User - scope: CloudAccount + scope: ProviderAccount privileges: account_view provider_administrator: name: Provider Administrator diff --git a/src/test/unit/cloud_account_test.rb b/src/test/unit/cloud_account_test.rb deleted file mode 100644 index addf6af..0000000 --- a/src/test/unit/cloud_account_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class CloudAccountTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/src/test/unit/provider_account_test.rb b/src/test/unit/provider_account_test.rb new file mode 100644 index 0000000..cafbb76 --- /dev/null +++ b/src/test/unit/provider_account_test.rb @@ -0,0 +1,8 @@ +require 'test_helper' + +class ProviderAccountTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/src/test/unit/provider_test.rb b/src/test/unit/provider_test.rb index 877fd9c..2181ce6 100644 --- a/src/test/unit/provider_test.rb +++ b/src/test/unit/provider_test.rb @@ -5,7 +5,7 @@ class ProviderTest < ActiveSupport::TestCase
def setup @provider = Provider.new(:name => "my_ec2", - :cloud_type => "EC2") + :provider_type => "EC2") end # The following three tests assume you have the deltacloud-framework # running and configured on localhost:3000
aeolus-devel@lists.fedorahosted.org