From: Michal Fojtik <[email protected]>
---
src/app/controllers/cloud_accounts_controller.rb | 8 +++
src/app/models/cloud_account.rb | 13 ++++
src/app/models/instance_key.rb | 27 +++++++++
src/app/views/provider/accounts.haml | 2 +
src/db/migrate/20090804142049_create_instances.rb | 1 +
.../migrate/20100902081651_create_instance_keys.rb | 14 +++++
src/spec/factories/cloud_account.rb | 6 ++
src/spec/factories/hardware_profile.rb | 18 ++++++
src/spec/factories/hardware_profile_property.rb | 61 ++++++++++++++++++++
src/spec/factories/instance_key.rb | 33 +++++++++++
src/spec/factories/provider.rb | 8 +++
src/spec/factories/realm.rb | 3 +
src/spec/models/cloud_account_spec.rb | 17 ++++++
13 files changed, 211 insertions(+), 0 deletions(-)
create mode 100644 src/app/models/instance_key.rb
create mode 100644 src/db/migrate/20100902081651_create_instance_keys.rb
create mode 100644 src/spec/factories/instance_key.rb
diff --git a/src/app/controllers/cloud_accounts_controller.rb
b/src/app/controllers/cloud_accounts_controller.rb
index e0c612b..6fb2398 100644
--- a/src/app/controllers/cloud_accounts_controller.rb
+++ b/src/app/controllers/cloud_accounts_controller.rb
@@ -68,6 +68,14 @@ class CloudAccountsController < ApplicationController
end
end
+ def key
+ @cloud_account = CloudAccount.find(params[:id])
+ require_privilege(Privilege::ACCOUNT_MODIFY,@cloud_account.provider)
+ unless @cloud_account.instance_key.nil?
+ render :text => @cloud_account.instance_key.pem
+ end
+ end
+
def destroy
acct = CloudAccount.find(params[:id])
provider = acct.provider
diff --git a/src/app/models/cloud_account.rb b/src/app/models/cloud_account.rb
index e5978a1..7762039 100644
--- a/src/app/models/cloud_account.rb
+++ b/src/app/models/cloud_account.rb
@@ -38,6 +38,8 @@ class CloudAccount < ActiveRecord::Base
:include => [:role],
:order => "permissions.id ASC"
+ has_one :instance_key, :dependent => :destroy
+ after_create :generate_clound_account_key
before_destroy {|entry| entry.destroyable? }
@@ -137,4 +139,15 @@ class CloudAccount < ActiveRecord::Base
errors.add_to_base("Login Credentials are Invalid for this Provider")
unless valid_credentials?
end
+ private
+
+ def generate_clound_account_key
+ client = connect
+ if client.feature?(:instances, :authentication_key)
+ key = client.create_key(:name => "#{self.id}_#{self.name}")
+ InstanceKey.create(:cloud_account => self, :pem => key.pem, :name =>
key.id) if key
+ end
+ end
+
+
end
diff --git a/src/app/models/instance_key.rb b/src/app/models/instance_key.rb
new file mode 100644
index 0000000..b3b7513
--- /dev/null
+++ b/src/app/models/instance_key.rb
@@ -0,0 +1,27 @@
+ #
+# 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.
+#
+class InstanceKey < ActiveRecord::Base
+
+ belongs_to :cloud_account
+ has_many :instances
+
+end
diff --git a/src/app/views/provider/accounts.haml
b/src/app/views/provider/accounts.haml
index 647f44a..67d811a 100644
--- a/src/app/views/provider/accounts.haml
+++ b/src/app/views/provider/accounts.haml
@@ -6,6 +6,7 @@
%tr
%th{:scope => "col"} Label
%th{:scope => "col"} Username
+ %th{:scope => "col"} Key
%th{:scope => "col"}
%th{:scope => "col"}
%tbody
@@ -13,6 +14,7 @@
%tr
%td= acct.label
%td= acct.username
+ %td= (acct.instance_key.nil?) ? 'N/A' :
link_to(acct.instance_key.name, :controller => :cloud_accounts, :action =>
:key, :id => acct.id)
%td= link_to "Edit", {:controller => 'cloud_accounts', :action =>
'edit', :id => acct.id} if has_account_modify?(@provider)
%td= link_to "Delete", {:controller => 'cloud_accounts', :action =>
'destroy', :id => acct.id} if has_account_modify?(@provider) &&
acct.destroyable?
%td= link_to "Quota", {:controller => 'quota', :action => 'show', :id
=> acct.id, :parent_type => "cloud_account"}
diff --git a/src/db/migrate/20090804142049_create_instances.rb
b/src/db/migrate/20090804142049_create_instances.rb
index 42706e1..4222782 100644
--- a/src/db/migrate/20090804142049_create_instances.rb
+++ b/src/db/migrate/20090804142049_create_instances.rb
@@ -33,6 +33,7 @@ class CreateInstances < ActiveRecord::Migration
t.string :private_address
t.string :state
t.string :condor_job_id
+ t.integer :instance_key_id
t.integer :lock_version, :default => 0
t.integer :acc_pending_time, :default => 0
t.integer :acc_running_time, :default => 0
diff --git a/src/db/migrate/20100902081651_create_instance_keys.rb
b/src/db/migrate/20100902081651_create_instance_keys.rb
new file mode 100644
index 0000000..841d7ff
--- /dev/null
+++ b/src/db/migrate/20100902081651_create_instance_keys.rb
@@ -0,0 +1,14 @@
+class CreateInstanceKeys < ActiveRecord::Migration
+ def self.up
+ create_table :instance_keys do |t|
+ t.integer :cloud_account_id, :null => false
+ t.string :name, :null => false
+ t.text :pem
+ t.timestamps
+ end
+ end
+
+ def self.down
+ drop_table :instance_keys
+ end
+end
diff --git a/src/spec/factories/cloud_account.rb
b/src/spec/factories/cloud_account.rb
index b623b43..27d0a1e 100644
--- a/src/spec/factories/cloud_account.rb
+++ b/src/spec/factories/cloud_account.rb
@@ -9,3 +9,9 @@ Factory.define :mock_cloud_account, :parent => :cloud_account
do |f|
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/hardware_profile.rb
b/src/spec/factories/hardware_profile.rb
index 4e6a85f..c4956df 100644
--- a/src/spec/factories/hardware_profile.rb
+++ b/src/spec/factories/hardware_profile.rb
@@ -35,3 +35,21 @@ Factory.define :agg_hwp2, :parent => :hardware_profile do |p|
p.provider_hardware_profiles { |hp| [hp.association(:mock_hwp2)] }
p.external_key 'agg_hwp2_key'
end
+
+
+Factory.define :ec2_hwp1, :parent => :hardware_profile do |p|
+ p.memory { |p| p.association(:ec2_hwp1_memory) }
+ p.storage { |p| p.association(:ec2_hwp1_storage) }
+ p.cpu { |p| p.association(:ec2_hwp1_cpu) }
+ p.architecture { |p| p.association(:ec2_hwp1_arch) }
+ p.sequence(:external_key) { |n| "ec2_hwp1_key#{n}" }
+end
+
+Factory.define :agg_hwp3, :parent => :hardware_profile do |p|
+ p.memory { |p| p.association(:agg_hwp3_memory) }
+ p.storage { |p| p.association(:agg_hwp3_storage) }
+ p.cpu { |p| p.association(:agg_hwp3_cpu) }
+ p.architecture { |p| p.association(:agg_hwp3_arch) }
+ p.provider_hardware_profiles { |hp| [hp.association(:ec2_hwp1)] }
+ p.external_key 'agg_hwp3_key'
+end
diff --git a/src/spec/factories/hardware_profile_property.rb
b/src/spec/factories/hardware_profile_property.rb
index 91c40a1..9ec541a 100644
--- a/src/spec/factories/hardware_profile_property.rb
+++ b/src/spec/factories/hardware_profile_property.rb
@@ -120,3 +120,64 @@ Factory.define :agg_hwp2_arch, :parent =>
:hardware_profile_property do |p|
p.unit 'label'
p.value 'x86_64'
end
+
+
+# EC2 Profiles:
+
+
+Factory.define :ec2_hwp1_memory, :parent => :hardware_profile_property do |p|
+ p.name 'memory'
+ p.kind 'fixed'
+ p.unit 'MB'
+ p.value 1740.8
+end
+
+Factory.define :ec2_hwp1_storage, :parent => :hardware_profile_property do |p|
+ p.name 'storage'
+ p.kind 'fixed'
+ p.unit 'GB'
+ p.value 160
+end
+
+Factory.define :ec2_hwp1_cpu, :parent => :hardware_profile_property do |p|
+ p.name 'cpu'
+ p.kind 'fixed'
+ p.unit 'count'
+ p.value 1.0
+end
+
+Factory.define :ec2_hwp1_arch, :parent => :hardware_profile_property do |p|
+ p.name 'architecture'
+ p.kind 'fixed'
+ p.unit 'label'
+ p.value 'i386'
+end
+
+Factory.define :agg_hwp3_memory, :parent => :hardware_profile_property do |p|
+ p.name 'memory'
+ p.kind 'fixed'
+ p.unit 'MB'
+ p.value 1740.8
+end
+
+Factory.define :agg_hwp3_storage, :parent => :hardware_profile_property do |p|
+ p.name 'storage'
+ p.kind 'fixed'
+ p.unit 'GB'
+ p.value 160
+end
+
+Factory.define :agg_hwp3_cpu, :parent => :hardware_profile_property do |p|
+ p.name 'cpu'
+ p.kind 'fixed'
+ p.unit 'count'
+ p.value 1
+end
+
+Factory.define :agg_hwp3_arch, :parent => :hardware_profile_property do |p|
+ p.name 'architecture'
+ p.kind 'fixed'
+ p.unit 'label'
+ p.value 'i386'
+end
+
diff --git a/src/spec/factories/instance_key.rb
b/src/spec/factories/instance_key.rb
new file mode 100644
index 0000000..f4bcaed
--- /dev/null
+++ b/src/spec/factories/instance_key.rb
@@ -0,0 +1,33 @@
+Factory.define :instance_key do |p|
+ p.sequence(:name) { |n| "instance_key#{n}" }
+end
+
+Factory.define :ec2_instance_key1, :parent => :instance_key do |p|
+ p.cloud_account { |p| p.association(:ec2_cloud_account) }
+ p.name "1_user"
+ p.text "
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAm+Ri7uZz7iVTLLxtPiV2gLD37OOvovZ0VpWR3T7HK5NgxjlJssIjc8uKqPqY
+EdXssF+ZKKypiQzFkMhowthkw1sGN5R3NBrIiRKR1mcVuE7iiRBFikBoF/CaaXP2LSNtMv4xkUXO
+IdYfi+JFXIxjPHKpei3yuilZhoTdv8EH/oTsow7BZuK9R0XMc3a+U1btvoZ6CwRc0tTWmJyOkuh2
+wVeQOTeaNbWzpuTWgJ5oda3CY7v+hbu1CT0AZ5vhSFWzDuvEEd4r15SQhH8X9Y7DnRhqDYDbBUdI
+slQOFYi5KU5dJSzcjfSsA2u8UbcV24QsXOA3C9UofFNmJHG9hgQOgwIDAQABAoIBADdN9NMwKpyn
+3TQXvOG5RKsvHSWLOPolWOyGr3LAHMSWylRIap7iRNWFtjFwhZZ+QDPqFlnZt2OJhmVw08mcH1M2
+7aO2Jfv0LISEc/yOIaR7R968SQ9c/hDQKNeUbhdhZBIdH9Sb4R8b6aEkqtrEa0g8nWdc+amVlc8l
+P84RWxat3wdZUH8c9inAD3UYrRFFA1ETZGt0fOr207qOfBSf0ytBgovlhmN2bfFjzKdpNluTXh62
+vbgHkQMqf7pRU7ZjuuZiG/czV3a0aN4gg/SW7zFA+6+6R/0vmF1+vnsZ5YYUtDC4Fckc6wpms5oy
+cpdBFuSYvs83Mph/SFXNai2aTTECgYEA3dvn4JVgTbOQgCc/hQwUlzGkmvXOlifdp/tfsh/3Hxj7
+QOzZLuKPDiu8IYzqQtHC4of2N8vY9h/fHkLuQL6Tsfdu2S11SAk4vqfDjGDy8/BxZw1U5kcV+5MF
+4dy5mHKKwQCuMybYSXZQcFUGSWsaVEDk9kzuD7j1P5JC4Z6M7CUCgYEAs+G6YUPfh1o1JD/4ZQN/
+geM+K0o6VJSYMhmzcJ6XJQSwdMNwNaAhDzr4Gtqqrio6yzkzSNIYYPAREAFM0frBnZ6Oh+nEwZsu
+nUTbaNGCpJ7MhqjQEDtNJDG/RoRtQeDpJ1MnwmJNbNe9h3qydqsrnBqqBamV+LmoWp4wARv7O4cC
+gYEAwKM2JqptcWpuGOh7XgIMSu/e9nJiy7yX2UkKYbchs03UtB4zwmMURgCxnQwnSJesOVhG8VG9
+9I/eAv+osm0H/2pSRJ8VC9R+AgXXZKe1rRxky08nHcAxlTymyeQG/xjN5CG8IEwlVzw1QiSBjfRC
+a0/hvv8zYlF+GZHdItyxjkUCgYAoegOxfU9gKqlIlehz+nyHorXLkfFcNO+mXmglUFpcZxi5vXyT
+ZIvr3G4VxNyhQjlmn2Ft4nC/52U/f7tkiJNmv1X9OVof4qZzlxn0FSjbmCwXpQbkkCOEoHkVChl3
+uH9ebPTGZc5cTpOEV9SupUez4cAedBGeHVDHy06sATrgIwKBgQCdqFhrse+uhRacK1LAymvBsou5
+5jj99IUCqIdgLelQ1yfI3Boj3qm8eZCBa8u7kbLx8F6zLCi6ry/k+JOwo3oa1pL9dfhXAnu/wwwt
+1FGvv2zb+xR/fB/6+a4RMFsp9jO6lzTn/K1wsaZ6FNcdxB4V8ouveF0exhH/MEc0vWI47A==
+-----END RSA PRIVATE KEY-----
+"
+end
diff --git a/src/spec/factories/provider.rb b/src/spec/factories/provider.rb
index d53fc67..76fb4af 100644
--- a/src/spec/factories/provider.rb
+++ b/src/spec/factories/provider.rb
@@ -17,3 +17,11 @@ Factory.define :mock_provider2, :parent => :provider do |p|
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.url 'http://localhost:3001/api'
+ p.hardware_profiles { |hp| [hp.association(:ec2_hwp1)] }
+ p.after_create { |p| p.realms << Factory(:realm4, :provider => p) }
+end
diff --git a/src/spec/factories/realm.rb b/src/spec/factories/realm.rb
index f4df03b..5da284f 100644
--- a/src/spec/factories/realm.rb
+++ b/src/spec/factories/realm.rb
@@ -12,3 +12,6 @@ end
Factory.define :realm3, :parent => :realm do |r|
end
+
+Factory.define :realm4, :parent => :realm do |r|
+end
diff --git a/src/spec/models/cloud_account_spec.rb
b/src/spec/models/cloud_account_spec.rb
index 89fdf27..8784f2b 100644
--- a/src/spec/models/cloud_account_spec.rb
+++ b/src/spec/models/cloud_account_spec.rb
@@ -34,4 +34,21 @@ describe CloudAccount do
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
+
end
--
1.7.2.2
_______________________________________________
deltacloud-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel