Even with html_safe provider account xml output was wrong - there were whitespaces in x509 certificate and imagefactory failed with error:
Traceback (most recent call last): File "/usr/bin/euca-bundle-vol", line 492, in <module> main() File "/usr/bin/euca-bundle-vol", line 467, in main ancestor_ami_ids, File "/usr/lib/python2.7/site-packages/euca2ools/__init__.py", line 994, in generate_manifest user_pub_key = X509.load_cert(cert_path).get_pubkey().get_rsa() File "/usr/lib64/python2.7/site-packages/M2Crypto/X509.py", line 611, in load_cert return load_cert_bio(bio) File "/usr/lib64/python2.7/site-packages/M2Crypto/X509.py", line 639, in load_cert_bio raise X509Error(Err.get_error())
This patch is quite dirty, I'm sure there is a nice way how to tweak rails' 'to_xml' method or use xml builder template but I didn't find a way how to use it properly.
From: Jan Provaznik jprovazn@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
On Tue, 16 Aug 2011 17:15:59 +0200 jprovazn@redhat.com wrote:
From: Jan Provaznik jprovazn@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.
On 08/23/2011 03:00 PM, Tomas Hrcka wrote:
On Tue, 16 Aug 2011 17:15:59 +0200 jprovazn@redhat.com wrote:
From: Jan Provaznikjprovazn@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
aeolus-devel@lists.fedorahosted.org