27: def run_instances( options = {} )
28: options = { :image_id => "",
29: :min_count => 1,
30: :max_count => 1,
31: :base64_encoded => false }.merge(options)
32:
33: raise ArgumentError, ":addressing_type has been deprecated." if options[:addressing_type]
34: raise ArgumentError, ":group_id has been deprecated." if options[:group_id]
35:
36: raise ArgumentError, ":image_id must be provided" if options[:image_id].nil? || options[:image_id].empty?
37: raise ArgumentError, ":min_count is not valid" unless options[:min_count].to_i > 0
38: raise ArgumentError, ":max_count is not valid or must be >= :min_count" unless options[:max_count].to_i > 0 && options[:max_count].to_i >= options[:min_count].to_i
39: raise ArgumentError, ":instance_type must specify a valid instance type" unless options[:instance_type].nil? || ["m1.small", "m1.large", "m1.xlarge", "m2.xlarge", "c1.medium", "c1.xlarge", "m2.2xlarge", "m2.4xlarge"].include?(options[:instance_type])
40: raise ArgumentError, ":monitoring_enabled must be 'true' or 'false'" unless options[:monitoring_enabled].nil? || [true, false].include?(options[:monitoring_enabled])
41: raise ArgumentError, ":disable_api_termination must be 'true' or 'false'" unless options[:disable_api_termination].nil? || [true, false].include?(options[:disable_api_termination])
42: raise ArgumentError, ":instance_initiated_shutdown_behavior must be 'stop' or 'terminate'" unless options[:instance_initiated_shutdown_behavior].nil? || ["stop", "terminate"].include?(options[:instance_initiated_shutdown_behavior])
43: raise ArgumentError, ":base64_encoded must be 'true' or 'false'" unless [true, false].include?(options[:base64_encoded])
44:
45: user_data = extract_user_data(options)
46:
47: params = {}
48:
49: if options[:security_group]
50: params.merge!(pathlist("SecurityGroup", options[:security_group]))
51: end
52:
53: if options[:block_device_mapping]
54: params.merge!(pathhashlist('BlockDeviceMapping', options[:block_device_mapping].flatten, {:device_name => 'DeviceName', :virtual_name => 'VirtualName', :ebs_snapshot_id => 'Ebs.SnapshotId', :ebs_volume_size => 'Ebs.VolumeSize', :ebs_delete_on_termination => 'Ebs.DeleteOnTermination' }))
55: end
56:
57: params["ImageId"] = options[:image_id]
58: params["MinCount"] = options[:min_count].to_s
59: params["MaxCount"] = options[:max_count].to_s
60: params["KeyName"] = options[:key_name] unless options[:key_name].nil?
61: params["AdditionalInfo"] = options[:additional_info] unless options[:additional_info].nil?
62: params["UserData"] = user_data unless user_data.nil?
63: params["InstanceType"] = options[:instance_type] unless options[:instance_type].nil?
64: params["Placement.AvailabilityZone"] = options[:availability_zone] unless options[:availability_zone].nil?
65: params["KernelId"] = options[:kernel_id] unless options[:kernel_id].nil?
66: params["RamdiskId"] = options[:ramdisk_id] unless options[:ramdisk_id].nil?
67: params["Monitoring.Enabled"] = options[:monitoring_enabled].to_s unless options[:monitoring_enabled].nil?
68: params["SubnetId"] = options[:subnet_id] unless options[:subnet_id].nil?
69: params["DisableApiTermination"] = options[:disable_api_termination].to_s unless options[:disable_api_termination].nil?
70: params["InstanceInitiatedShutdownBehavior"] = options[:instance_initiated_shutdown_behavior] unless options[:instance_initiated_shutdown_behavior].nil?
71:
72: return response_generator(:action => "RunInstances", :params => params)
73: end