From b11dd2268de1ea6cb8f8713daab918b6966b7c57 Mon Sep 17 00:00:00 2001 From: Daniel Molina Date: Wed, 22 Oct 2014 17:42:20 +0200 Subject: [PATCH] feature #3242: Implement client token for econe server, to support idempotent calls --- src/cloud/ec2/etc/templates/m1.small.erb | 2 +- src/cloud/ec2/lib/instance.rb | 52 ++++++++++++++----- .../ec2/lib/views/describe_instances.erb | 5 +- src/cloud/ec2/lib/views/run_instances.erb | 13 +++-- 4 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/cloud/ec2/etc/templates/m1.small.erb b/src/cloud/ec2/etc/templates/m1.small.erb index f651f1752b..cbd2622364 100644 --- a/src/cloud/ec2/etc/templates/m1.small.erb +++ b/src/cloud/ec2/etc/templates/m1.small.erb @@ -26,4 +26,4 @@ CONTEXT = [ EC2_USER_DATA="<%= erb_vm_info[:user_data] %>" ] <% elsif erb_vm_info[:public_key] %> CONTEXT = [ EC2_PUBLIC_KEY="<%= erb_vm_info[:public_key] %>", EC2_KEYNAME ="<%= erb_vm_info[:key_name] %>" ] <% end %> - + diff --git a/src/cloud/ec2/lib/instance.rb b/src/cloud/ec2/lib/instance.rb index 34203df714..bdc63b25af 100644 --- a/src/cloud/ec2/lib/instance.rb +++ b/src/cloud/ec2/lib/instance.rb @@ -61,6 +61,33 @@ module Instance TERMINATED_INSTANCES_EXPIRATION_TIME = 900 def run_instances(params) + erb_user_name = params['AWSAccessKeyId'] + erb_version = params['Version'] + erb_vms = Array.new + + if params['ClientToken'] + user_flag = OpenNebula::Pool::INFO_ALL + vm_pool = VirtualMachinePool.new(@client, user_flag) + rc = vm_pool.info + if OpenNebula::is_error?(rc) + return rc + end + + vm_id = vm_pool["VM/USER_TEMPLATE[EC2_CLIENT_TOKEN=\'#{params['ClientToken']}\']/../ID"] + if vm_id + instance = VirtualMachine.new(VirtualMachine.build_xml(vm_id), @client) + rc = instance.info + if OpenNebula::is_error?(rc) + return rc + end + + erb_vms << instance + + response = ERB.new(File.read(@config[:views]+"/run_instances.erb")) + return response.result(binding), 200 + end + end + # Get the image img = nil if params['ImageId'] =~ /ami\-(.+)/ @@ -82,11 +109,13 @@ module Instance # Get the instance type and path if params['InstanceType'] != nil instance_type_name = params['InstanceType'] - instance_type = @config[:instance_types][instance_type_name.to_sym] + else + instance_type_name = "m1.small" + end - if instance_type != nil - path = @config[:template_location] + "/#{instance_type[:template]}" - end + instance_type = @config[:instance_types][instance_type_name.to_sym] + if instance_type != nil + path = @config[:template_location] + "/#{instance_type[:template]}" end # Build the VM @@ -102,8 +131,9 @@ module Instance template = ERB.new(File.read(erb_vm_info[:template])) template_text = template.result(binding) - - erb_vms = Array.new + if params["ClientToken"] + template_text += "\nEC2_CLIENT_TOKEN=\"#{params['ClientToken']}\"" + end min_count = params['MinCount'] || 1 max_count = params['MaxCount'] || min_count @@ -174,10 +204,11 @@ module Instance merge_info.delete("CONTEXT") end - template_str = template_to_str(merge_info) - vm_id = + if params['ClientToken'] + merge_info['EC2_CLIENT_TOKEN'] = params['ClientToken'] + end - erb_vms = Array.new + template_str = template_to_str(merge_info) min_count = params['MinCount'] || 1 max_count = params['MaxCount'] || min_count @@ -202,9 +233,6 @@ module Instance } end - erb_user_name = params['AWSAccessKeyId'] - erb_version = params['Version'] - response = ERB.new(File.read(@config[:views]+"/run_instances.erb")) return response.result(binding), 200 end diff --git a/src/cloud/ec2/lib/views/describe_instances.erb b/src/cloud/ec2/lib/views/describe_instances.erb index ef5d59cc20..c4a5ebe63d 100644 --- a/src/cloud/ec2/lib/views/describe_instances.erb +++ b/src/cloud/ec2/lib/views/describe_instances.erb @@ -37,13 +37,12 @@ default <%= vm.id %> - eki-EA801065 eri-1FEE1144 - false + disabled - + <%= vm['USER_TEMPLATE/EC2_CLIENT_TOKEN'] %> <% end %> <% end %> diff --git a/src/cloud/ec2/lib/views/run_instances.erb b/src/cloud/ec2/lib/views/run_instances.erb index e80e5a108a..0b4875415d 100644 --- a/src/cloud/ec2/lib/views/run_instances.erb +++ b/src/cloud/ec2/lib/views/run_instances.erb @@ -1,6 +1,6 @@ <%= @request_id %> - + default <%= erb_user_name %> @@ -11,7 +11,7 @@ <% erb_vms.each { |vm| %> <%= render_instance_id(vm) %> - <%= params['ImageId'] %> + <%= vm['USER_TEMPLATE/IMAGE_ID'] %> <%= render_state(vm) %> <% if vm.has_elements?("TEMPLATE/NIC/IP") %> <% ips_str = vm.retrieve_elements("TEMPLATE/NIC/IP").join(', ') %> @@ -24,15 +24,18 @@ <% else %> <%= vm['TEMPLATE/CONTEXT/EC2_KEYNAME'] %> <% end %> - <%= vm.id %> - <%= params['InstanceType'] %> + <%= vm['USER_TEMPLATE/INSTANCE_TYPE'] %> <%= render_launch_time(vm) %> default + <%= vm.id %> + eki-EA801065 + eri-1FEE1144 - true + disabled + <%= vm['USER_TEMPLATE/EC2_CLIENT_TOKEN'] %> <% } %>