From: Jan Provaznik jprovazn@redhat.com
This fixes problem with MAC address in public address attribute, if MAC address is set, we try fetch actual public_address directly through deltacloud api. To fetch instance directly I had to add provider_instance_id where provider side instance id is kept. --- src/app/models/instance.rb | 15 +++++++++++++++ .../20110726072809_add_provider_instance_id.rb | 9 +++++++++ src/dbomatic/dbomatic | 14 +++++++++++++- 3 files changed, 37 insertions(+), 1 deletions(-) create mode 100644 src/db/migrate/20110726072809_add_provider_instance_id.rb
diff --git a/src/app/models/instance.rb b/src/app/models/instance.rb index f16b79d..4700660 100644 --- a/src/app/models/instance.rb +++ b/src/app/models/instance.rb @@ -340,6 +340,21 @@ class Instance < ActiveRecord::Base [possibles, errors] end
+ def public_addresses + # FIXME: detect MAC format properly + addr = read_attribute(:public_addresses) + if addr and addr =~ /\w\w:\w\w:\w\w:\w\w:\w\w:\w\w/ + begin + client = provider_account.connect + self.public_addresses = client.instance(provider_instance_id).public_addresses.first + save! + rescue + logger.error "failed to fetch public address for #{self.name}: #{$!.message}" + end + end + read_attribute(:public_addresses) + end + named_scope :with_hardware_profile, lambda { {:include => :hardware_profile} } diff --git a/src/db/migrate/20110726072809_add_provider_instance_id.rb b/src/db/migrate/20110726072809_add_provider_instance_id.rb new file mode 100644 index 0000000..7b68cba --- /dev/null +++ b/src/db/migrate/20110726072809_add_provider_instance_id.rb @@ -0,0 +1,9 @@ +class AddProviderInstanceId < ActiveRecord::Migration + def self.up + add_column :instances, :provider_instance_id, :string + end + + def self.down + remove_column :instances, :provider_instance_id + end +end diff --git a/src/dbomatic/dbomatic b/src/dbomatic/dbomatic index 1c1a206..013be84 100755 --- a/src/dbomatic/dbomatic +++ b/src/dbomatic/dbomatic @@ -131,6 +131,8 @@ class CondorEventLog < Nokogiri::XML::SAX::Document @public_addresses = string elsif @tag == "DeltacloudPrivateNetworkAddresses" @private_addresses = string + elsif @tag == "DeltacloudProviderId" + @provider_instance_id = string end end end @@ -199,6 +201,15 @@ class CondorEventLog < Nokogiri::XML::SAX::Document @logger.info "update_instance_addresses completed for #{inst}" end
+ def update_provider_instance_id(inst) + @logger.info "update_provider_instance_id for #{inst}, \ + setting id: #{@provider_instance_id}" + + inst.provider_instance_id = @provider_instance_id + inst.save! + @logger.info "update_provider_instance_id completed for #{inst}" + end + # Create a new entry for events which we have all the necessary data for def end_element(element) begin @@ -211,9 +222,10 @@ class CondorEventLog < Nokogiri::XML::SAX::Document @logger.info "Instance #{inst} found, running update events" update_instance_state_event(inst) update_instance_addresses(inst) + update_provider_instance_id(inst) @logger.info "Instance #{inst} update events completed" end - @tag = @event_type = @event_cmd = @event_time = @trigger_type = @grid_resource = @execute_host = @hold_reason = @public_addresses = @private_addresses = nil + @tag = @event_type = @event_cmd = @event_time = @trigger_type = @grid_resource = @execute_host = @hold_reason = @public_addresses = @private_addresses = @provider_instance_id = nil end rescue Exception => e @logger.error "#{e.backtrace.shift}: #{e.message}"