---
src/app/models/instance.rb | 4 ++++
src/app/util/condormatic.rb | 33 +++++++++++++++++++++++++++++++++
2 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/src/app/models/instance.rb b/src/app/models/instance.rb
index 9c212d1..d32e820 100644
--- a/src/app/models/instance.rb
+++ b/src/app/models/instance.rb
@@ -130,6 +130,10 @@ class Instance < ActiveRecord::Base
before_destroy :destroyable?
+ def after_find
+ condormatic_instance_update(self)
+ end
+
# A user should only be able to update certain attributes, but the API may permit other
attributes to be
# changed if called from another Aeolus component, so attr_protected isn't quite
what we want:
USER_MUTABLE_ATTRS = ['name']
diff --git a/src/app/util/condormatic.rb b/src/app/util/condormatic.rb
index 107ad6e..abe6614 100644
--- a/src/app/util/condormatic.rb
+++ b/src/app/util/condormatic.rb
@@ -19,6 +19,7 @@
require 'fileutils'
require 'tempfile'
+require 'nokogiri'
class Possible
attr_reader :pool_family, :account, :hwp, :provider_image, :realm
@@ -207,3 +208,35 @@ def condormatic_instance_destroy(task)
Rails.logger.info("condor_rm return status is #{$?}")
Rails.logger.error("Error calling condor_rm (exit code #{$?}) on job:
#{out}") if $? != 0
end
+
+def condormatic_instance_update(instance)
+ cmd = "condor_q -constraint 'Cmd ==
\"#{instance.condor_job_id}\"' \
+ -xml -attributes
GridJobStatus,GridResource,ExecuteHost,DeltacloudUsername,DeltacloudPublicNetworkAddresses,DeltacloudPrivateNetworkAddresses
2>&1"
+ Rails.logger.info("calling #{cmd}")
+ pipe = IO.popen(cmd)
+ out = pipe.read
+ pipe.close
+
+ doc = Nokogiri::XML(out)
+ state = doc.xpath("/classads/c/a[(a)n='GridJobStatus']/s").text
+ state = Instance::STATE_RUNNING if state == "RUNNING"
+ public_addresses =
doc.xpath("/classads/c/a[(a)n='DeltacloudPublicNetworkAddresses']/s").text
+ private_addresses =
doc.xpath("/classads/c/a[(a)n='DeltacloudPrivateNetworkAddresses']/s").text
+
+ provider = doc.xpath("/classads/c/a[(a)n='GridResource']/s").text
+ provider = doc.xpath("/classads/c/a[(a)n='ExecuteHost']/s").text if
provider.nil? || provider == ""
+ provider = provider.split[1]
+ provider = Provider.find(:first, :conditions => ['url = ?', provider])
+
+ username =
doc.xpath("/classads/c/a[(a)n='DeltacloudUsername']/s").text
+ provider_account = provider.provider_accounts.detect {|a|
a.credentials_hash['username'] == username}
+
+ instance.state = state
+ instance.public_addresses = public_addresses
+ instance.private_addresses = private_addresses
+ instance.provider_account_id = provider_account.id
+ instance.save!
+
+ Rails.logger.info("condor_q return status is #{$?}")
+ Rails.logger.error("Error calling condor_q (exit code #{$?}) on job:
#{instance.condor_job_id}") if $? != 0
+end
--
1.7.5.4