From: Jan Provaznik <jprovazn(a)redhat.com>
---
src/app/models/instance.rb | 35 ++++++++---------------------
src/app/models/instance_key.rb | 26 ----------------------
src/app/models/instance_observer.rb | 8 ------
src/app/models/provider_account.rb | 6 -----
src/app/util/condormatic.rb | 5 +--
src/features/support/custom.rb | 10 --------
src/spec/factories/provider_account.rb | 3 --
src/spec/models/provider_account_spec.rb | 2 -
8 files changed, 12 insertions(+), 83 deletions(-)
diff --git a/src/app/models/instance.rb b/src/app/models/instance.rb
index f16b79d..b62197a 100644
--- a/src/app/models/instance.rb
+++ b/src/app/models/instance.rb
@@ -228,31 +228,6 @@ class Instance < ActiveRecord::Base
end
end
- def create_unique_key
- return unless self.provider_account and self.provider_account.instance_key
- # deltacloud/ec2 api's create_key method returns only private part of
- # key -> we don't know public part, so we generate new ssh key
- # and replace whole authorized_keys file
- key_name = "#{self.name}_rsa_#{Time.now.to_f}"
- self.instance_key =
InstanceKey.new(self.provider_account.instance_key.attributes.merge({
- :instance_key_owner => self,
- :name => key_name
- }))
- begin
- self.instance_key.replace_key(self.public_addresses,
self.provider_account.instance_key.pem)
- self.events.create!(:summary => "successfully updated ssh key",
:event_time => Time.now)
- rescue
- msg = "failed to upload ssh key: #{$!}"
- self.last_error = msg
- self.events.create!(:summary => msg, :event_time => Time.now)
- ensure
- # if replace_key fails, we still save instance_key - should be copy of
- # provider_account key which was used when launching instance
- self.instance_key.save!
- self.save!
- end
- end
-
def self.get_user_instances_stats(user)
stats = {
:running_instances => 0,
@@ -340,6 +315,16 @@ class Instance < ActiveRecord::Base
[possibles, errors]
end
+ def create_auth_key
+ raise "instance provider_account is not set" unless self.provider_account
+ client = self.provider_account.connect
+ return nil unless client && client.feature?(:instances, :authentication_key)
+ kname =
"#{self.name}_#{Time.now.to_i}_key_#{self.object_id}".gsub(/[^a-zA-Z0-9\.\-]/,
'_')
+ if key = client.create_key(:name => kname)
+ self.update_attribute(:instance_key, InstanceKey.create!(:pem => key.pem.first,
:name => key.id, :instance_key_owner => self))
+ end
+ end
+
named_scope :with_hardware_profile, lambda {
{:include => :hardware_profile}
}
diff --git a/src/app/models/instance_key.rb b/src/app/models/instance_key.rb
index 0246c9e..d19c422 100644
--- a/src/app/models/instance_key.rb
+++ b/src/app/models/instance_key.rb
@@ -40,30 +40,4 @@ require 'base64'
class InstanceKey < ActiveRecord::Base
belongs_to :instance_key_owner, :polymorphic => true
-
- def replace_key(addr, old_pem)
- key = generate_ssh_key
- replace_on_server(addr, old_pem, key[:public])
- self.pem = key[:private]
- end
-
- private
-
- def replace_on_server(addr, old_pem, new_pub)
- provider_type = self.instance_key_owner.provider_account.provider.provider_type
- Net::SCP::start(addr, provider_type.ssh_user, :key_data => [old_pem], :keys =>
[]) do |scp|
- scp.upload! StringIO.new(new_pub), File.join(provider_type.home_dir,
'/.ssh/authorized_keys')
- end
- end
-
- def generate_ssh_key
- key = OpenSSL::PKey::RSA.generate(1024)
- writer = Net::SSH::Buffer.new
- writer.write_key key
- ssh_key = Base64.encode64( writer.to_s ).strip.gsub( /[\n\r\t ]/, "" )
- {
- :private => key.export,
- :public => "#{key.ssh_type} #{ssh_key}
#{ENV['USER']}@#{ENV['HOSTNAME']}"
- }
- end
end
diff --git a/src/app/models/instance_observer.rb b/src/app/models/instance_observer.rb
index 4366b4e..19b4aac 100644
--- a/src/app/models/instance_observer.rb
+++ b/src/app/models/instance_observer.rb
@@ -68,14 +68,6 @@ class InstanceObserver < ActiveRecord::Observer
end
def after_update(instance)
- # we try to generate unique key only when instance is running
- # and provider_account for this instance has instance_key (provider account
- # instance_key is used as default ssh key when instance is launched)
- if instance.state_changed? and instance.state == Instance::STATE_RUNNING and
- not instance.instance_key and instance.provider_account and
instance.provider_account.instance_key
- instance.delay.create_unique_key
- end
-
if instance.state_changed?
event = Event.new(:source => instance, :event_time => DateTime.now,
:summary => "state changed to #{instance.state}")
diff --git a/src/app/models/provider_account.rb b/src/app/models/provider_account.rb
index 812d5a1..8c709cb 100644
--- a/src/app/models/provider_account.rb
+++ b/src/app/models/provider_account.rb
@@ -201,12 +201,6 @@ class ProviderAccount < ActiveRecord::Base
label_value_pairs.sort { |a, b| a[:label] <=> b[:label] }
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
-
def credentials_hash
@credentials_hash = {}
# Credential.all(:conditions => {:provider_account_id => id}, :include =>
:credential_definition).each do |cred|
diff --git a/src/app/util/condormatic.rb b/src/app/util/condormatic.rb
index b52ff46..b071bb6 100644
--- a/src/app/util/condormatic.rb
+++ b/src/app/util/condormatic.rb
@@ -75,12 +75,12 @@ def condormatic_instance_create(task)
overrides =
HardwareProfile.generate_override_property_values(instance.hardware_profile,
found.hwp)
- keyname = found.account.instance_key ? found.account.instance_key.name : ''
-
pwfilename = write_pw_file(job_name,
found.account.credentials_hash['password'])
instance.provider_account = found.account
+ instance.create_auth_key unless instance.instance_key
+ keyname = instance.instance_key ? instance.instance_key.name : ''
# I use the 2>&1 to get stderr and stdout together because popen3 does not
# support the ability to get the exit value of the command in ruby 1.8.
@@ -118,7 +118,6 @@ def condormatic_instance_create(task)
Rails.logger.error "$? (return value?) is #{$?}"
raise ("Error calling condor_submit: #{out}") if $? != 0
-
task.state = Task::STATE_PENDING
instance.state = Instance::STATE_PENDING
rescue Exception => ex
diff --git a/src/features/support/custom.rb b/src/features/support/custom.rb
index 2f6c459..27e5ed1 100644
--- a/src/features/support/custom.rb
+++ b/src/features/support/custom.rb
@@ -11,20 +11,10 @@ end
ProviderAccount.class_eval do
- alias :generate_auth_key_original :generate_auth_key
-
def valid_credentials?
credentials_hash['username'].to_s == 'mockuser' &&
credentials_hash['password'].to_s == 'mockpassword'
end
- def generate_auth_key
- key = OpenStruct.new(:pem => 'PEM')
- def key.id
- "mock_#{Time.now.to_i}_key_#{self.object_id}"
- end
- key
- end
-
# def instance_key
# @key = mock('Key', :null_object => true)
# @key.stub!(:pem).and_return("PEM")
diff --git a/src/spec/factories/provider_account.rb
b/src/spec/factories/provider_account.rb
index d3944bd..28006e9 100644
--- a/src/spec/factories/provider_account.rb
+++ b/src/spec/factories/provider_account.rb
@@ -2,9 +2,6 @@ Factory.define :provider_account do |f|
f.sequence(:label) { |n| "test label#{n}" }
f.association :provider
f.association :quota
- f.after_build do |acc|
- acc.stub!(:generate_auth_key).and_return(nil) if acc.respond_to?(:stub!)
- end
end
Factory.define :mock_provider_account, :parent => :provider_account do |f|
diff --git a/src/spec/models/provider_account_spec.rb
b/src/spec/models/provider_account_spec.rb
index 370a132..c7647e1 100644
--- a/src/spec/models/provider_account_spec.rb
+++ b/src/spec/models/provider_account_spec.rb
@@ -52,9 +52,7 @@ describe ProviderAccount do
provider_account = Factory.build :ec2_provider_account
provider_account.stub!(:connect).and_return(@client)
- provider_account.stub!(:generate_auth_key).and_return(@key)
provider_account.save
- provider_account.instance_key.should_not == nil
provider_account.instance_key.pem == "PEM"
provider_account.instance_key.id == "1_user"
end
--
1.7.4.4