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. 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!
+ #(a)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((a)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((a)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((a)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((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/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= "#{(a)instance.template.xml.platform}
#{(a)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((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/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= "#{(a)instance.template.xml.platform}
#{(a)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__#{(a)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/.*}).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((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..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((a)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((a)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?((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/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?((a)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
--
1.7.3.5