From: Jozef Zigmund <jzigmund(a)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((a)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((a)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((a)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((a)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((a)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((a)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?((a)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?((a)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
--
1.7.3.5