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

Reply via email to