On Tue, 16 Aug 2011 17:15:59 +0200
jprovazn(a)redhat.com wrote:
From: Jan Provaznik <jprovazn(a)redhat.com>
With rails 3 output of build_credentials method included in haml
was somehow wrong formatted, then image factory failed to push an
image because x509 certifacte parse failed.
Now we generate xml output in 'xml_export' method. Default rails way
how to generate custom xml output is to tweak 'to_xml' method or use
xml.builder template but I wasn't able to successfully use any of
these ways, feel free to refactor this xml output if you know how.
---
.../controllers/provider_accounts_controller.rb | 2 +-
src/app/models/provider_account.rb | 56
++++++++++++++------
src/app/views/provider_accounts/_list.xml.haml | 8 ---
src/spec/models/provider_account_spec.rb | 30 ++++++-----
4 files changed, 56 insertions(+), 40 deletions(-) delete mode 100644
src/app/views/provider_accounts/_list.xml.haml
diff --git a/src/app/controllers/provider_accounts_controller.rb
b/src/app/controllers/provider_accounts_controller.rb index
bf5716c..055ec3e 100644 ---
a/src/app/controllers/provider_accounts_controller.rb +++
b/src/app/controllers/provider_accounts_controller.rb @@ -14,7 +14,7
@@ class ProviderAccountsController < ApplicationController
respond_to do |format|
format.html
- format.xml { render :partial => 'list.xml' }
+ format.xml { render :text =>
ProviderAccount.xml_export(@accounts) } end
end
diff --git a/src/app/models/provider_account.rb
b/src/app/models/provider_account.rb index 7fd508f..8112c62 100644
--- a/src/app/models/provider_account.rb
+++ b/src/app/models/provider_account.rb
@@ -172,23 +172,6 @@ class ProviderAccount < ActiveRecord::Base
DeltaCloud::valid_credentials?(credentials_hash['username'].to_s,
credentials_hash['password'].to_s, provider.url) end
- def build_credentials
- doc = Nokogiri::XML('')
- doc.root = Nokogiri::XML::Node.new('provider_credentials', doc)
- root = doc.root.at_xpath('/provider_credentials')
-
- credential_node_name = provider.provider_type.codename +
'_credentials'
- credential_node = Nokogiri::XML::Node.new(credential_node_name,
doc)
- root << credential_node
-
- creds_label_hash.each do |h|
- element = Nokogiri::XML::Node.new(h[:label], doc)
- element.content = h[:value]
- credential_node << element
- end
- doc
- end
-
def creds_label_hash
label_value_pairs = credentials.map do |c|
{ :label =>
c.credential_definition.label.downcase.split.join('_'), @@ -249,4
+232,43 @@ class ProviderAccount < ActiveRecord::Base end
end
+ def to_xml
+ doc = Nokogiri::XML('')
+ doc.root = Nokogiri::XML::Node.new('provider_account', doc)
+ root = doc.root.at_xpath('/provider_account')
+
+ node = Nokogiri::XML::Node.new('name', doc)
+ node.content = self.name
+ root << node
+
+ node = Nokogiri::XML::Node.new('provider', doc)
+ node.content = self.provider.name
+ root << node
+
+ node = Nokogiri::XML::Node.new('provider_type', doc)
+ node.content = self.provider.provider_type.codename
+ root << node
+
+ credential_node_name = provider.provider_type.codename +
'_credentials'
+ credential_node = Nokogiri::XML::Node.new(credential_node_name,
doc)
+ node = Nokogiri::XML::Node.new('provider_credentials', doc)
+ root << node << credential_node
+
+ creds_label_hash.each do |h|
+ element = Nokogiri::XML::Node.new(h[:label], doc)
+ element.content = h[:value]
+ credential_node << element
+ end
+ doc.root.to_xml
+ end
+
+ def self.xml_export(accounts)
+ doc = Nokogiri::XML('')
+ doc.root = Nokogiri::XML::Node.new('provider_accounts', doc)
+ root = doc.root.at_xpath('/provider_accounts')
+ accounts.each do |account|
+ root << account.to_xml
+ end
+ doc.to_xml
+ end
end
diff --git a/src/app/views/provider_accounts/_list.xml.haml
b/src/app/views/provider_accounts/_list.xml.haml deleted file mode
100644 index f271154..0000000
--- a/src/app/views/provider_accounts/_list.xml.haml
+++ /dev/null
@@ -1,8 +0,0 @@
-!!! XML
-%provider_accounts
- - @accounts.each do |account|
- %provider_account
- %name= account.name
- %provider= account.provider.name
- %provider_type= account.provider.provider_type.codename
- =
account.build_credentials.root.xpath('/provider_credentials').to_s.html_safe
diff --git a/src/spec/models/provider_account_spec.rb
b/src/spec/models/provider_account_spec.rb index 4e3566c..103ee3d
100644 --- a/src/spec/models/provider_account_spec.rb +++
b/src/spec/models/provider_account_spec.rb @@ -47,19 +47,7 @@
describe ProviderAccount do @provider_account.connect.should be_nil
end
- it "should generate credentials xml" do
- expected_xml = <<EOT
-<?xml version="1.0"?>
-<provider_credentials>
- <ec2_credentials>
- <access_key>user</access_key>
- <account_number>1234</account_number>
- <certificate>cert</certificate>
- <key>priv_key</key>
- <secret_access_key>pass</secret_access_key>
- </ec2_credentials>
-</provider_credentials>
-EOT
+ it "should generate xml for a provider account" do
provider_account = Factory.build(:ec2_provider_account)
provider_account.credentials_hash = {
'username' => 'user',
@@ -68,7 +56,21 @@ EOT
'x509private' => 'priv_key',
'x509public' => 'cert'
}
- provider_account.build_credentials.to_s.should eql(expected_xml)
+ expected_xml = %Q{<provider_account>
+ <name>#{provider_account.label}</name>
+ <provider>#{provider_account.provider.name}</provider>
+ <provider_type>ec2</provider_type>
+ <provider_credentials>
+ <ec2_credentials>
+ <access_key>user</access_key>
+ <account_number>1234</account_number>
+ <certificate>cert</certificate>
+ <key>priv_key</key>
+ <secret_access_key>pass</secret_access_key>
+ </ec2_credentials>
+ </provider_credentials>
+</provider_account>}
+ provider_account.to_xml.should eql(expected_xml)
end
it "should create provider account with same username for
different provider" do
ACK. but failing spec need to be fixed before pushing.