Return-Path: X-Original-To: apmail-deltacloud-dev-archive@www.apache.org Delivered-To: apmail-deltacloud-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 6A4EFC1B2 for ; Tue, 15 May 2012 12:49:48 +0000 (UTC) Received: (qmail 84393 invoked by uid 500); 15 May 2012 12:49:48 -0000 Delivered-To: apmail-deltacloud-dev-archive@deltacloud.apache.org Received: (qmail 84376 invoked by uid 500); 15 May 2012 12:49:48 -0000 Mailing-List: contact dev-help@deltacloud.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@deltacloud.apache.org Delivered-To: mailing list dev@deltacloud.apache.org Received: (qmail 84368 invoked by uid 99); 15 May 2012 12:49:48 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 15 May 2012 12:49:48 +0000 X-ASF-Spam-Status: No, hits=-5.0 required=5.0 tests=RCVD_IN_DNSWL_HI,SPF_HELO_PASS,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of mfojtik@redhat.com designates 209.132.183.28 as permitted sender) Received: from [209.132.183.28] (HELO mx1.redhat.com) (209.132.183.28) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 15 May 2012 12:49:44 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q4FCnNsD012512 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 15 May 2012 08:49:23 -0400 Received: from dhcp-29-121.brq.redhat.com (dhcp-29-121.brq.redhat.com [10.34.29.121]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q4FCnGrZ000426 for ; Tue, 15 May 2012 08:49:22 -0400 From: mfojtik@redhat.com To: dev@deltacloud.apache.org Subject: [PATCH core 5/5] EC2 Frontend: Replaced Nokogiri with HAML views, added more actions Date: Tue, 15 May 2012 14:50:06 +0200 Message-Id: <1337086206-25734-5-git-send-email-mfojtik@redhat.com> In-Reply-To: <1337086206-25734-1-git-send-email-mfojtik@redhat.com> References: <1337086206-25734-1-git-send-email-mfojtik@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Virus-Checked: Checked by ClamAV on apache.org From: Michal Fojtik Signed-off-by: Michal fojtik --- server/lib/ec2/helpers.rb | 3 +- server/lib/ec2/helpers/converter.rb | 140 -------------------- server/lib/ec2/helpers/result.rb | 31 +++++ server/lib/ec2/query_parser.rb | 51 ++++--- server/lib/ec2/server.rb | 4 +- server/lib/ec2/views/create_key_pair.haml | 3 + server/lib/ec2/views/delete_key_pair.haml | 1 + .../lib/ec2/views/describe_availability_zones.haml | 6 + server/lib/ec2/views/describe_images.haml | 10 ++ server/lib/ec2/views/describe_instance_set.haml | 20 +++ server/lib/ec2/views/describe_instances.haml | 9 ++ server/lib/ec2/views/describe_key_pairs.haml | 5 + server/lib/ec2/views/instance_action.haml | 9 ++ server/lib/ec2/views/reboot_instances.haml | 1 + server/lib/ec2/views/run_instances.haml | 7 + server/lib/ec2/views/start_instances.haml | 1 + server/lib/ec2/views/stop_instances.haml | 1 + server/lib/ec2/views/terminate_instances.haml | 9 ++ 18 files changed, 152 insertions(+), 159 deletions(-) delete mode 100644 server/lib/ec2/helpers/converter.rb create mode 100644 server/lib/ec2/helpers/result.rb create mode 100644 server/lib/ec2/views/create_key_pair.haml create mode 100644 server/lib/ec2/views/delete_key_pair.haml create mode 100644 server/lib/ec2/views/describe_availability_zones.haml create mode 100644 server/lib/ec2/views/describe_images.haml create mode 100644 server/lib/ec2/views/describe_instance_set.haml create mode 100644 server/lib/ec2/views/describe_instances.haml create mode 100644 server/lib/ec2/views/describe_key_pairs.haml create mode 100644 server/lib/ec2/views/instance_action.haml create mode 100644 server/lib/ec2/views/reboot_instances.haml create mode 100644 server/lib/ec2/views/run_instances.haml create mode 100644 server/lib/ec2/views/start_instances.haml create mode 100644 server/lib/ec2/views/stop_instances.haml create mode 100644 server/lib/ec2/views/terminate_instances.haml diff --git a/server/lib/ec2/helpers.rb b/server/lib/ec2/helpers.rb index d73ea47..cded974 100644 --- a/server/lib/ec2/helpers.rb +++ b/server/lib/ec2/helpers.rb @@ -18,7 +18,6 @@ module Deltacloud end require_relative './helpers/errors' -require_relative './helpers/converter' +require_relative './helpers/result' require_relative '../deltacloud/helpers/driver_helper' require_relative '../deltacloud/helpers/auth_helper' - diff --git a/server/lib/ec2/helpers/converter.rb b/server/lib/ec2/helpers/converter.rb deleted file mode 100644 index 8a70fe1..0000000 --- a/server/lib/ec2/helpers/converter.rb +++ /dev/null @@ -1,140 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. The -# ASF licenses this file to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance with the -# License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -module Deltacloud::EC2 - - class Converter - - def self.convert(builder, action, result) - klass_name = ActionHandler::MAPPINGS[action][:method].to_s.camelize - klass = Converter.const_get(klass_name) - klass.new(builder, result).to_xml - end - - class Base - - attr_reader :xml - attr_reader :obj - - def initialize(builder, object) - @xml = builder - @obj = object - end - - end - - class Realms < Base - - def to_xml - xml.availabilityZoneInfo { - obj.each do |item| - xml.item { - xml.zoneName item.id - xml.zoneState item.state - xml.regionName item.name - } - end - } - end - - end - - class Images < Base - - def to_xml - xml.imagesSet { - obj.each do |item| - xml.item { - xml.imageId item.id - xml.imageState item.state.downcase - xml.imageOwnerId item.owner_id - xml.architecture item.architecture - xml.imageType 'machine' - xml.name item.name - xml.description item.description - } - end - } - end - - end - - class CreateInstance < Base - - def to_xml - xml.reservationId 'r-11111111' - xml.ownerId @obj.owner_id - xml.groupSet { - xml.item { - xml.groupId 'sg-11111111' - xml.groupName 'default' - } - } - Instances.new(@xml, [@obj]).instance_set - end - - end - - class Instances < Base - - def instance_set - xml.instancesSet { - obj.each do |item| - xml.item { - xml.instanceId item.id - xml.imageId item.image_id - xml.instanceType item.instance_profile.name - xml.launchTime item.launch_time - xml.ipAddress item.public_addresses.first.address - xml.privateIpAddress item.public_addresses.first.address - xml.dnsName item.public_addresses.first.address - xml.privateDnsName item.private_addresses.first.address - xml.architecture item.instance_profile.architecture - xml.keyName item.keyname - xml.instanceState { - xml.code '16' - xml.name item.state.downcase - } - xml.placement { - xml.availabilityZone item.realm_id - xml.groupName - xml.tenancy 'default' - } - } - end - } - end - - def to_xml - xml.reservationSet { - xml.item { - xml.reservationId 'r-11111111' - xml.ownerId 'deltacloud' - xml.groupSet { - xml.item { - xml.groupId 'sg-11111111' - xml.groupName 'default' - } - } - self.instance_set - } - } - end - - end - - end - -end diff --git a/server/lib/ec2/helpers/result.rb b/server/lib/ec2/helpers/result.rb new file mode 100644 index 0000000..0fea9c2 --- /dev/null +++ b/server/lib/ec2/helpers/result.rb @@ -0,0 +1,31 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +module Deltacloud::EC2 + module ResultHelper + + def instance_state_code(state) + case state + when 'running' then '16' + when 'pending' then '0' + when 'stopping' then '64' + when 'stopped' then '80' + when 'shutting-down' then '32' + else '-1' + end + end + + end +end diff --git a/server/lib/ec2/query_parser.rb b/server/lib/ec2/query_parser.rb index 7eebc9a..8d2abc9 100644 --- a/server/lib/ec2/query_parser.rb +++ b/server/lib/ec2/query_parser.rb @@ -21,7 +21,14 @@ module Deltacloud::EC2 :describe_availability_zones => { :method => :realms, :params => { 'ZoneName.1' => :id } }, :describe_images => { :method => :images, :params => { 'ImageId.1' => :id }}, :describe_instances => { :method => :instances, :params => {} }, - :run_instances => { :method => :create_instance, :params => { 'ImageId' => :image_id, 'InstanceType' => :hwp_id, 'Placement.AvailabilityZone' => :realm_id }} + :describe_key_pairs => { :method => :keys, :params => {} }, + :create_key_pair => { :method => :create_key, :params => { 'KeyName' => :key_name }}, + :delete_key_pair => { :method => :destroy_key, :params => { 'KeyName' => :id }}, + :run_instances => { :method => :create_instance, :params => { 'ImageId' => :image_id, 'InstanceType' => :hwp_id, 'Placement.AvailabilityZone' => :realm_id }}, + :stop_instances => { :method => :stop_instance, :params => { 'InstanceId.1' => :id }}, + :start_instances => { :method => :start_instance, :params => { 'InstanceId.1' => :id }}, + :reboot_instances => { :method => :reboot_instance, :params => { 'InstanceId.1' => :id }}, + :terminate_instances => { :method => :destroy_instance, :params => { 'InstanceId.1' => :id }}, } attr_reader :action @@ -44,35 +51,49 @@ module Deltacloud::EC2 def perform!(credentials, driver) @result = case deltacloud_method when :create_instance then driver.send(deltacloud_method, credentials, deltacloud_method_params.delete(:image_id), deltacloud_method_params) + when :stop_instance then driver.send(deltacloud_method, credentials, deltacloud_method_params.delete(:id)) + when :start_instance then driver.send(deltacloud_method, credentials, deltacloud_method_params.delete(:id)) + when :destroy_instance then driver.send(deltacloud_method, credentials, deltacloud_method_params.delete(:id)) + when :reboot_instance then driver.send(deltacloud_method, credentials, deltacloud_method_params.delete(:id)) else driver.send(deltacloud_method, credentials, deltacloud_method_params) end end - def to_xml - ResultParser.parse(action, @result).to_xml + def to_xml(context) + ResultParser.parse(action, @result, context) end end class ResultParser - def self.parse(parser, result) - Nokogiri::XML::Builder.new do |xml| - xml.send(:"#{parser.action.to_s.camelize}Response", :xmlns => 'http://ec2.amazonaws.com/doc/2012-04-01/') { - xml.requestId parser.request_id - new(xml, parser, result).build_xml - } - end + include ResultHelper + + attr_reader :query + attr_reader :object + attr_reader :context + + def self.parse(query, result, context) + parser = new(query, result, context) + layout = "%#{query.action.to_s.camelize}Response{:xmlns => 'http://ec2.amazonaws.com/doc/2012-04-01/'}\n"+ + "\t%requestId #{query.request_id}\n" + + "\t=render(:#{query.action}, object)\n" + Haml::Engine.new(layout, :filename => 'layout').render(parser) end - def initialize(xml, parser, result) - @builder = xml - @parser = parser - @result = result + def initialize(query, object, context) + @context = context + @query = query + @object = object end def build_xml - Converter.convert(@builder, @parser.action, @result) + Converter.convert(query.action, object) + end + + def render(template, obj) + template_filename = File.join(File.dirname(__FILE__), 'views', '%s.haml' % template.to_s) + Haml::Engine.new(File.read(template_filename), :filename => template_filename).render(self, :object => obj) end end diff --git a/server/lib/ec2/server.rb b/server/lib/ec2/server.rb index 6586f16..12f1809 100644 --- a/server/lib/ec2/server.rb +++ b/server/lib/ec2/server.rb @@ -14,8 +14,8 @@ # under the License. require 'rubygems' -require 'nokogiri' require 'sinatra/base' +require 'haml' require_relative '../sinatra' require_relative './helpers' @@ -52,7 +52,7 @@ module Deltacloud::EC2 get '/', :provides => :xml do ec2_action = QueryParser.parse(params, request_id) ec2_action.perform!(credentials, driver) - ec2_action.to_xml + ec2_action.to_xml(self) end end diff --git a/server/lib/ec2/views/create_key_pair.haml b/server/lib/ec2/views/create_key_pair.haml new file mode 100644 index 0000000..ed00492 --- /dev/null +++ b/server/lib/ec2/views/create_key_pair.haml @@ -0,0 +1,3 @@ +%keyName=object.name +%keyFingerprint=object.fingerprint +%keyMaterial=object.pem_rsa_key diff --git a/server/lib/ec2/views/delete_key_pair.haml b/server/lib/ec2/views/delete_key_pair.haml new file mode 100644 index 0000000..d809ea8 --- /dev/null +++ b/server/lib/ec2/views/delete_key_pair.haml @@ -0,0 +1 @@ +%return true diff --git a/server/lib/ec2/views/describe_availability_zones.haml b/server/lib/ec2/views/describe_availability_zones.haml new file mode 100644 index 0000000..1d96617 --- /dev/null +++ b/server/lib/ec2/views/describe_availability_zones.haml @@ -0,0 +1,6 @@ +%availabilityZoneInfo + - object.each do |item| + %item + %zoneName=item.id + %zoneState=item.state + %regionName=item.name diff --git a/server/lib/ec2/views/describe_images.haml b/server/lib/ec2/views/describe_images.haml new file mode 100644 index 0000000..a49a5ee --- /dev/null +++ b/server/lib/ec2/views/describe_images.haml @@ -0,0 +1,10 @@ +%imagesSet + - object.each do |item| + %item + %imageId=item.id + %imageState=item.state.downcase + %imageOwnerId=item.owner_id + %architecture item.architecture + %imageType machine + %name=item.name + %description=item.description diff --git a/server/lib/ec2/views/describe_instance_set.haml b/server/lib/ec2/views/describe_instance_set.haml new file mode 100644 index 0000000..b8c7c1c --- /dev/null +++ b/server/lib/ec2/views/describe_instance_set.haml @@ -0,0 +1,20 @@ +%instanceSet + - object.each do |item| + %item + %instanceId=item.id + %imageId=item.image_id + %instanceType=item.instance_profile.name + %launchTime=item.launch_time + %ipAddress=item.public_addresses.first.address + %privateIpAddress=item.public_addresses.first.address + %dnsName=item.public_addresses.first.address + %privateDnsName=item.private_addresses.first.address + %architecture=item.instance_profile.architecture + %keyName=item.keyname + %instanceState + %code=instance_state_code(item.state.downcase) + %name=item.state.downcase + %placement + %availabilityZone=item.realm_id + %groupName + %tenancy default diff --git a/server/lib/ec2/views/describe_instances.haml b/server/lib/ec2/views/describe_instances.haml new file mode 100644 index 0000000..75bcf7c --- /dev/null +++ b/server/lib/ec2/views/describe_instances.haml @@ -0,0 +1,9 @@ +%reservationSet + %item + %reservationId r-11111111 + %ownerId deltacloud + %groupSet + %item + %groupId sg-11111111 + %groupName default + =render(:describe_instance_set, object) diff --git a/server/lib/ec2/views/describe_key_pairs.haml b/server/lib/ec2/views/describe_key_pairs.haml new file mode 100644 index 0000000..9b97bca --- /dev/null +++ b/server/lib/ec2/views/describe_key_pairs.haml @@ -0,0 +1,5 @@ +%keySet + - object.each do |item| + %item + %keyName=item.name + %keyFingerprint=item.fingerprint diff --git a/server/lib/ec2/views/instance_action.haml b/server/lib/ec2/views/instance_action.haml new file mode 100644 index 0000000..7cafefa --- /dev/null +++ b/server/lib/ec2/views/instance_action.haml @@ -0,0 +1,9 @@ +%instancesSet + %item + %instanceId=object.id + %currentState + %code=instance_state_code(object.state.downcase) + %name=object.state.downcase + %previousState + %code -1 + %name unknown diff --git a/server/lib/ec2/views/reboot_instances.haml b/server/lib/ec2/views/reboot_instances.haml new file mode 100644 index 0000000..cc966ed --- /dev/null +++ b/server/lib/ec2/views/reboot_instances.haml @@ -0,0 +1 @@ +=render :instance_action, object diff --git a/server/lib/ec2/views/run_instances.haml b/server/lib/ec2/views/run_instances.haml new file mode 100644 index 0000000..ef306a7 --- /dev/null +++ b/server/lib/ec2/views/run_instances.haml @@ -0,0 +1,7 @@ +%reservationId r-11111111 +%ownerId deltacloud +%groupSet + %item + %groupId sg-11111111 + %groupName default +=render :describe_instance_set, [object] diff --git a/server/lib/ec2/views/start_instances.haml b/server/lib/ec2/views/start_instances.haml new file mode 100644 index 0000000..cc966ed --- /dev/null +++ b/server/lib/ec2/views/start_instances.haml @@ -0,0 +1 @@ +=render :instance_action, object diff --git a/server/lib/ec2/views/stop_instances.haml b/server/lib/ec2/views/stop_instances.haml new file mode 100644 index 0000000..cc966ed --- /dev/null +++ b/server/lib/ec2/views/stop_instances.haml @@ -0,0 +1 @@ +=render :instance_action, object diff --git a/server/lib/ec2/views/terminate_instances.haml b/server/lib/ec2/views/terminate_instances.haml new file mode 100644 index 0000000..ee7cba1 --- /dev/null +++ b/server/lib/ec2/views/terminate_instances.haml @@ -0,0 +1,9 @@ +%instancesSet + %item + %instanceId=context.params['InstanceId.1'] + %currentState + %code=32 + %name shutting-down + %previousState + %code -1 + %name unknown -- 1.7.10.1