On 08/23/2011 03:00 PM, Tomas Hrcka wrote:
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.
Thanks for the review. Interesting - tests passed for me, probably
different behaviour caused by different gem versions, I pushed this with
minor update with which tests pass both for me and you.
Jan