awscli 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- metadata +5 -53
- data/README.rdoc +0 -5
- data/Rakefile +0 -44
- data/bin/awscli +0 -32
- data/features/awscli.feature +0 -8
- data/features/step_definitions/awscli_steps.rb +0 -6
- data/features/support/env.rb +0 -15
- data/lib/awscli.rb +0 -44
- data/lib/awscli/cli.rb +0 -21
- data/lib/awscli/cli/ec2.rb +0 -23
- data/lib/awscli/cli/ec2/ami.rb +0 -46
- data/lib/awscli/cli/ec2/ebs.rb +0 -85
- data/lib/awscli/cli/ec2/eip.rb +0 -56
- data/lib/awscli/cli/ec2/instances.rb +0 -195
- data/lib/awscli/cli/ec2/keypairs.rb +0 -60
- data/lib/awscli/cli/ec2/monitoring.rb +0 -35
- data/lib/awscli/cli/ec2/placement.rb +0 -42
- data/lib/awscli/cli/ec2/reservedinstmng.rb +0 -45
- data/lib/awscli/cli/ec2/secgroups.rb +0 -66
- data/lib/awscli/cli/ec2/spot.rb +0 -81
- data/lib/awscli/cli/ec2/subnet.rb +0 -43
- data/lib/awscli/cli/ec2/tags.rb +0 -45
- data/lib/awscli/cli/ec2/vmmng.rb +0 -17
- data/lib/awscli/cli/ec2/vpc.rb +0 -42
- data/lib/awscli/cli/ec2/vpc/connections.rb +0 -0
- data/lib/awscli/cli/ec2/vpc/cust_gateways.rb +0 -0
- data/lib/awscli/cli/ec2/vpc/dhcp.rb +0 -51
- data/lib/awscli/cli/ec2/vpc/internet_gateways.rb +0 -58
- data/lib/awscli/cli/ec2/vpc/net_interfaces.rb +0 -75
- data/lib/awscli/cli/ec2/vpc/network_acls.rb +0 -29
- data/lib/awscli/cli/ec2/vpc/priv_gatewats.rb +0 -0
- data/lib/awscli/cli/ec2/vpc/route_tables.rb +0 -0
- data/lib/awscli/cli/s3.rb +0 -12
- data/lib/awscli/cli/s3/directories.rb +0 -82
- data/lib/awscli/cli/s3/files.rb +0 -77
- data/lib/awscli/connection.rb +0 -55
- data/lib/awscli/ec2.rb +0 -790
- data/lib/awscli/errors.rb +0 -64
- data/lib/awscli/helper.rb +0 -8
- data/lib/awscli/s3.rb +0 -108
- data/lib/awscli/version.rb +0 -3
- data/test/default_test.rb +0 -14
- data/test/test_helper.rb +0 -9
File without changes
|
File without changes
|
data/lib/awscli/cli/s3.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
module AwsCli
|
2
|
-
module CLI
|
3
|
-
require 'awscli/cli'
|
4
|
-
require 'awscli/connection'
|
5
|
-
require 'awscli/s3'
|
6
|
-
class S3 < Thor
|
7
|
-
class_option :region, :type => :string, :desc => "region to connect to"
|
8
|
-
|
9
|
-
AwsCli::Cli.register AwsCli::CLI::S3, :s3, 's3 [COMMAND]', 'Simple Storage Service Interface'
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
@@ -1,82 +0,0 @@
|
|
1
|
-
module AwsCli
|
2
|
-
module CLI
|
3
|
-
module Sss
|
4
|
-
require 'awscli/cli/s3'
|
5
|
-
class Directories < Thor
|
6
|
-
|
7
|
-
desc "list", "List S3 buckets"
|
8
|
-
def list
|
9
|
-
create_s3_object
|
10
|
-
@s3.list
|
11
|
-
end
|
12
|
-
|
13
|
-
desc "create", "Create an new S3 bucket"
|
14
|
-
method_option :key, :aliases => "-k", :type => :string, :required => true, :desc => "name of the bucket to create(name should be globally unique)"
|
15
|
-
method_option :public, :aliases => "-p", :type => :boolean, :default => false, :desc => "makes the bucket publicly availble"
|
16
|
-
# method_option :x_amz_acl, :aliases => "-x", :type => :string, :desc => "Permissions, must be in ['private', 'public-read', 'public-read-write', 'authenticated-read']"
|
17
|
-
def create
|
18
|
-
create_s3_object
|
19
|
-
@s3.create options
|
20
|
-
end
|
21
|
-
|
22
|
-
desc "delete", "Delete existing S3 bucket"
|
23
|
-
method_option :key, :aliases => "-k", :type => :string, :required => true, :desc => "name of the bucket to delete"
|
24
|
-
def delete
|
25
|
-
create_s3_object
|
26
|
-
@s3.delete options[:key]
|
27
|
-
end
|
28
|
-
|
29
|
-
desc "set_acl", "Change access control list for an S3 bucket"
|
30
|
-
method_option :key, :aliases => "-k", :type => :string, :required => true, :desc => "name of the bucket to change acl"
|
31
|
-
method_option :acl, :aliases => "-a", :type => :string, :required => true, :desc => "Permissions, must be in ['private', 'public-read', 'public-read-write', 'authenticated-read']"
|
32
|
-
def set_acl
|
33
|
-
create_s3_object
|
34
|
-
@s3.set_acl options[:key], options[:acl]
|
35
|
-
end
|
36
|
-
|
37
|
-
desc "get_acl", "Get access control list for an S3 bucket"
|
38
|
-
method_option :key, :aliases => "-k", :type => :string, :required => true, :desc => "name of the bucket to get acl"
|
39
|
-
def get_acl
|
40
|
-
create_s3_object
|
41
|
-
@s3.get_acl options[:key]
|
42
|
-
end
|
43
|
-
|
44
|
-
desc "get_logging_status", "Get logging status for an S3 bucket"
|
45
|
-
method_option :key, :aliases => "-k", :type => :string, :required => true, :desc => "name of the bucket"
|
46
|
-
def get_logging_status
|
47
|
-
create_s3_object
|
48
|
-
@s3.get_logging_status options[:key]
|
49
|
-
end
|
50
|
-
|
51
|
-
# desc "set_logging_status", "Change logging status for an S3 bucket"
|
52
|
-
# method_option :key, :aliases => "-k", :type => :string, :required => true, :desc => "name of the bucket"
|
53
|
-
# method_option :owner, :aliases => "-o", :type => :hash, :banner => "ID:NAME", :desc => "set id and displayname of the owner"
|
54
|
-
# method_option :grantee, :aliases => "-g", :type => :hash, :banner => "NAME:ID|EMAIL|URI", :desc => "Grantee hash containing, <Display name of the grantee>: <ID of the grantee (or) Email of the grantee (or) Uri of the group to grant access>"
|
55
|
-
# method_option :permission, :aliases => "-p", :type => :string, :desc => "Permission, in [FULL_CONTROL, WRITE, WRITE_ACP, READ, READ_ACP]"
|
56
|
-
# def set_logging_status
|
57
|
-
# create_s3_object
|
58
|
-
# (acl ||= []) << options[:grantee] if options[:grantee]
|
59
|
-
# acl << options[:permission] if options[:permission]
|
60
|
-
# logging_status = Hash.new
|
61
|
-
# logging_status['Owner'] = options[:owner] if options[:owner]
|
62
|
-
# logging_status['AccessControlList'] = acl if acl
|
63
|
-
# puts "Empty logging_status will disable logging" if logging_status.nil?
|
64
|
-
# puts "#{logging_status}"
|
65
|
-
# @s3.set_logging_status options[:key], logging_status
|
66
|
-
# end
|
67
|
-
|
68
|
-
private
|
69
|
-
|
70
|
-
def create_s3_object
|
71
|
-
puts "S3 Establishing Connetion..."
|
72
|
-
$s3_conn = Awscli::Connection.new.request_s3
|
73
|
-
puts "S3 Establishing Connetion... OK"
|
74
|
-
@s3 = Awscli::S3::Directories.new($s3_conn)
|
75
|
-
end
|
76
|
-
|
77
|
-
AwsCli::CLI::S3.register AwsCli::CLI::Sss::Directories, :dirs, 'dirs [COMMAND]', 'S3 Directories Management'
|
78
|
-
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
data/lib/awscli/cli/s3/files.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
module AwsCli
|
2
|
-
module CLI
|
3
|
-
module Sss
|
4
|
-
require 'awscli/cli/s3'
|
5
|
-
class Files < Thor
|
6
|
-
|
7
|
-
desc "list", "list objects(files) in a bucket"
|
8
|
-
method_option :bucket_name, :aliases => "-b", :required => true, :desc => "bucket name to print the contents from"
|
9
|
-
def list
|
10
|
-
create_s3_object
|
11
|
-
@s3.list options[:bucket_name]
|
12
|
-
end
|
13
|
-
|
14
|
-
desc "put", "put a file into a bucket"
|
15
|
-
method_option :bucket_name, :aliases => "-b", :required => true, :desc => "name of the bucket to upload the file to"
|
16
|
-
method_option :file_path, :aliases => "-p", :required => true, :desc => "local file path"
|
17
|
-
def put
|
18
|
-
create_s3_object
|
19
|
-
@s3.upload_file options[:bucket_name], options[:file_path]
|
20
|
-
end
|
21
|
-
|
22
|
-
desc "get", "get a file from a bucket"
|
23
|
-
method_option :bucket_name, :aliases => "-b", :required => true, :desc => "name of the bucket to download the file from"
|
24
|
-
method_option :file_name, :aliases => "-f", :required => true, :desc => "name of file to download"
|
25
|
-
method_option :local_path, :aliases => "-p", :required => true, :desc => "local fs path, where to download the file to"
|
26
|
-
def get
|
27
|
-
create_s3_object
|
28
|
-
@s3.download_file options[:bucket_name], options[:file_name], options[:local_path]
|
29
|
-
end
|
30
|
-
|
31
|
-
desc "delete", "delete a file from a bucket"
|
32
|
-
method_option :bucket_name, :aliases => "-b", :required => true, :desc => "name of the bucket to download the file from"
|
33
|
-
method_option :file_name, :aliases => "-f", :required => true, :desc => "name of file to download"
|
34
|
-
def delete
|
35
|
-
create_s3_object
|
36
|
-
@s3.delete_file options[:bucket_name], options[:file_name]
|
37
|
-
end
|
38
|
-
|
39
|
-
# s3.directories.get('arun123').files.get('block_9091299035346850259').copy('ashrithtst', 'testfile')
|
40
|
-
desc "copy", "copy object from one bucket to another"
|
41
|
-
method_option :source_bucket, :aliases => "-s", :required => true, :desc => "source bucket name from where to copy the file"
|
42
|
-
method_option :source_file, :aliases => "-f", :required => true, :desc => "source file name to copy"
|
43
|
-
method_option :dest_bucket, :aliases => "-d", :required => true, :desc => "destination bucket name to copy the file to"
|
44
|
-
method_option :dest_file, :alises => "-r", :required => true, :desc => "destination file name"
|
45
|
-
def copy
|
46
|
-
create_s3_object
|
47
|
-
@s3.copy_file options[:source_bucket], options[:source_file], options[:dest_bucket], options[:dest_file]
|
48
|
-
end
|
49
|
-
|
50
|
-
desc "public_url", "show the public url of a file"
|
51
|
-
method_option :bucket_name, :aliases => "-b", :required => true, :desc => "name of the bucket to download the file from"
|
52
|
-
method_option :file_name, :aliases => "-f", :required => true, :desc => "name of file to download"
|
53
|
-
def public_url
|
54
|
-
create_s3_object
|
55
|
-
@s3.get_public_url options[:bucket_name], options[:file_name]
|
56
|
-
end
|
57
|
-
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
def create_s3_object
|
62
|
-
puts "S3 Establishing Connetion..."
|
63
|
-
$s3_conn = if parent_options[:region]
|
64
|
-
Awscli::Connection.new.request_s3(parent_options[:region])
|
65
|
-
else
|
66
|
-
Awscli::Connection.new.request_s3
|
67
|
-
end
|
68
|
-
puts "S3 Establishing Connetion... OK"
|
69
|
-
@s3 = Awscli::S3::Files.new($s3_conn)
|
70
|
-
end
|
71
|
-
|
72
|
-
AwsCli::CLI::S3.register AwsCli::CLI::Sss::Files, :files, 'files [COMMAND]', 'S3 Files Management'
|
73
|
-
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
data/lib/awscli/connection.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
module Awscli
|
2
|
-
class Connection
|
3
|
-
require 'awscli/errors'
|
4
|
-
require 'awscli/helper'
|
5
|
-
|
6
|
-
def initialize
|
7
|
-
#load env variable AWSCLI_CONFIG_FILE
|
8
|
-
@@aws_config_file = ENV['AWSCLI_CONFIG_FILE']
|
9
|
-
unless !@@aws_config_file.nil?
|
10
|
-
puts "Cannot find config file environment variable"
|
11
|
-
Awscli::Errors.missing_environment_variable
|
12
|
-
end
|
13
|
-
@@aws_config_file_path = File.expand_path(@@aws_config_file)
|
14
|
-
unless File.exist?(@@aws_config_file_path)
|
15
|
-
puts "Cannot locate file #{@@aws_config_file}"
|
16
|
-
Awscli::Errors.missing_config_file
|
17
|
-
end
|
18
|
-
@@config = YAML.load(File.read(@@aws_config_file_path))
|
19
|
-
unless @@config.kind_of?(Hash)
|
20
|
-
puts "Parse Error"
|
21
|
-
Awscli::Errors.missing_credentials
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def request_ec2
|
26
|
-
# => returns AWS Compute connection object
|
27
|
-
@@config.merge!(:provider => 'AWS')
|
28
|
-
if @@config['region']
|
29
|
-
Awscli::Errors.invalid_region unless Awscli::Instances::REGIONS.include?(@@config['region'])
|
30
|
-
end
|
31
|
-
Fog::Compute.new(@@config)
|
32
|
-
end
|
33
|
-
|
34
|
-
def request_s3 region=nil
|
35
|
-
# => returns S3 connection object
|
36
|
-
@@config.merge!(:provider => 'AWS')
|
37
|
-
if @@config['region']
|
38
|
-
#remove region
|
39
|
-
@@config.reject!{ |k| k == "region" }
|
40
|
-
end
|
41
|
-
#parse optionally passing region
|
42
|
-
if region
|
43
|
-
Awscli::Errors.invalid_region unless Awscli::Instances::REGIONS.include?(region)
|
44
|
-
@@config.merge!(:region => region)
|
45
|
-
end
|
46
|
-
Fog::Storage.new(@@config)
|
47
|
-
end
|
48
|
-
|
49
|
-
def request_as
|
50
|
-
# => returns AWS Auto Scaling connection object
|
51
|
-
Fog::AWS::AutoScaling.new(@@config)
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
end
|
data/lib/awscli/ec2.rb
DELETED
@@ -1,790 +0,0 @@
|
|
1
|
-
module Awscli
|
2
|
-
module EC2
|
3
|
-
|
4
|
-
class EC2
|
5
|
-
|
6
|
-
# initialize ec2 class object
|
7
|
-
# params:
|
8
|
-
# connection: Awscli::Connection.new.request_ec2
|
9
|
-
# extra options hash
|
10
|
-
def initialize connection, options = {}
|
11
|
-
@@conn = connection
|
12
|
-
end
|
13
|
-
|
14
|
-
# list instances from a specified region in a tabular format
|
15
|
-
def list_instances
|
16
|
-
@@conn.servers.table([:id, :dns_name, :flavor_id, :groups, :image_id, :key_name, :private_ip_address,
|
17
|
-
:public_ip_address, :root_device_type, :security_group_ids, :state, :tags])
|
18
|
-
end
|
19
|
-
|
20
|
-
# list available instance types
|
21
|
-
def list_flavors
|
22
|
-
@@conn.flavors.table
|
23
|
-
end
|
24
|
-
|
25
|
-
# describe instance attributes - returns information about an attribute of an instance. You can get information
|
26
|
-
# only one attribute per call.
|
27
|
-
# Avaliable attributes to request: instanceType, kernel, ramdisk, userData, disableApiTermination, instanceInitiatedShutdownBehavior,
|
28
|
-
# rootDeviceName, blockDeviceMapping, sourceDestCheck, groupSet
|
29
|
-
def describe_instance_attribute instance_id, request
|
30
|
-
valid_requests = %w(architecture ami_launch_index availability_zone block_device_mapping network_interfaces client_token
|
31
|
-
dns_name ebs_optimized groups flavor_id iam_instance_profile image_id instance_initiated_shutdown_behavior
|
32
|
-
kernel_id key_name created_at monitoring placement_group platform private_dns_name private_ip_address
|
33
|
-
public_ip_address ramdisk_id root_device_name root_device_type security_group_ids state state_reason subnet_id
|
34
|
-
tenancy tags user_data vpc_id volumes username)
|
35
|
-
#more options
|
36
|
-
#:monitor=, :username=, :private_key=, :private_key_path=, :public_key=, :public_key_path=, :username, :private_key_path, :private_key, :public_key_path, :public_key, :scp, :scp_upload, :scp_download, :ssh, :ssh_port, :sshable?
|
37
|
-
response = @@conn.servers.get(instance_id)
|
38
|
-
abort "Invalid Attribute, available attributes to request: #{valid_requests}" unless valid_requests.include?(request)
|
39
|
-
abort "InstanceId Not found :#{instance_id}, Available instnaces #{@@conn.servers.map { |x| x.id }}" unless response
|
40
|
-
puts "#{request}: #{response.send(request)}"
|
41
|
-
end
|
42
|
-
|
43
|
-
# modifies an attribute of an instance
|
44
|
-
def modify_instance_attribute instance_id, attributename, attributevalue
|
45
|
-
attrs_lookup = {
|
46
|
-
'isize' => 'InstanceType',
|
47
|
-
'kernel' => 'Kernel',
|
48
|
-
'ramdisk' => 'Ramdisk',
|
49
|
-
'userdata' => 'UserData',
|
50
|
-
'disable_api_term' => 'DisableApiTermination',
|
51
|
-
'inst_shutdown_beh' => 'InstanceInitiatedShutdownBehavior',
|
52
|
-
'source_dest_check' => 'SourceDestCheck',
|
53
|
-
'group_id' => 'GroupId'
|
54
|
-
}
|
55
|
-
valid_attributes = %w(InstanceType Kernel Ramdisk UserData DisableApiTermination InstanceInitiatedShutdownBehavior SourceDestCheck GroupId)
|
56
|
-
response = @@conn.servers.get(instance_id)
|
57
|
-
abort "InstanceId Not found :#{instance_id}, Available instnaces #{@@conn.servers.map { |x| x.id }}" unless response
|
58
|
-
abort "Instance should be in stopped state to modify its attributes" if response.state != 'stopped'
|
59
|
-
puts "#{instance_id}, #{attributename}, #{attributevalue}"
|
60
|
-
if attrs_lookup[attributename] == 'GroupId' #handle groupid which is array
|
61
|
-
puts "#{instance_id}, #{attrs_lookup[attributename]} => #{attributevalue}"
|
62
|
-
@@conn.modify_instance_attribute(instance_id, attrs_lookup[attributename] => attributevalue)
|
63
|
-
else
|
64
|
-
puts "#{instance_id}, #{attrs_lookup[attributename]}.Value => #{attributevalue}"
|
65
|
-
@@conn.modify_instance_attribute(instance_id, "#{attrs_lookup[attributename]}.Value" => attributevalue)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
# reset instance attribute
|
70
|
-
def reset_instance_attribute instance_id, attribute
|
71
|
-
end
|
72
|
-
|
73
|
-
#create a single instance with options passed
|
74
|
-
def create_instance options
|
75
|
-
#validate required options
|
76
|
-
puts "Validating Options ..."
|
77
|
-
abort "Invalid Key: #{options[:key_name]}" unless @@conn.key_pairs.get(options[:key_name])
|
78
|
-
options[:groups].each do |sg|
|
79
|
-
abort "Invalid Group: #{sg}" unless @@conn.security_groups.get(sg)
|
80
|
-
end
|
81
|
-
abort "Invalid AMI: #{options[:image_id]}" unless @@conn.images.get(options[:image_id])
|
82
|
-
abort "Invalid Instance Flavor: #{options[:flavor_id]}" unless @@conn.flavors.get(options[:flavor_id])
|
83
|
-
#validate optional options
|
84
|
-
if options[:availability_zone]
|
85
|
-
available_zones = @@conn.describe_availability_zones.body['availabilityZoneInfo'].map { |az| az['zoneName'] }
|
86
|
-
abort "Invalid AvailabilityZone: #{options[:availability_zone]}" unless available_zones.include?(options[:availability_zone])
|
87
|
-
end
|
88
|
-
opts = Marshal.load(Marshal.dump(options))
|
89
|
-
wait_for_server = options[:wait_for] && opts.reject! { |k| k == 'wait_for' }
|
90
|
-
puts "Validating Options ... OK"
|
91
|
-
puts "Creating Server"
|
92
|
-
server = @@conn.servers.create(opts)
|
93
|
-
#wait for server to get created and return public_dns
|
94
|
-
if wait_for_server
|
95
|
-
print "Waiting for server to get created "
|
96
|
-
server.wait_for { print "."; ready? }
|
97
|
-
puts
|
98
|
-
puts "Server dns_name: #{server.dns_name}"
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
# create a new instnace(s)
|
103
|
-
def run_instances options
|
104
|
-
end
|
105
|
-
|
106
|
-
# describe instnace status
|
107
|
-
def describe_instance_status instnace_id
|
108
|
-
response = @@conn.servers.get(instance_id)
|
109
|
-
abort "InstanceId Not found :#{instance_id}" unless response
|
110
|
-
puts "Instance #{instance_id} State: #{response.state}"
|
111
|
-
end
|
112
|
-
|
113
|
-
# import instance as vm
|
114
|
-
def import_instance
|
115
|
-
end
|
116
|
-
|
117
|
-
#@@conn.server.get(instanceid).(:reboot, :save, :setup, :start, :stop)
|
118
|
-
# reboot an instance
|
119
|
-
def reboot_instance instance_id
|
120
|
-
response = @@conn.servers.get(instance_id)
|
121
|
-
abort "InstanceId Not found :#{instance_id}" unless response
|
122
|
-
response.reboot
|
123
|
-
puts "Rebooting Instance: #{instance_id}"
|
124
|
-
end
|
125
|
-
|
126
|
-
# start a stopped instance
|
127
|
-
def stop_instance instance_id
|
128
|
-
response = @@conn.servers.get(instance_id)
|
129
|
-
abort "InstanceId Not found :#{instance_id}" unless response
|
130
|
-
abort "Instance should be in running to stop it" if response.state != 'running'
|
131
|
-
response.stop
|
132
|
-
puts "Stopped Instance: #{instance_id}"
|
133
|
-
end
|
134
|
-
|
135
|
-
# stop a running isntance
|
136
|
-
def start_instance instance_id
|
137
|
-
response = @@conn.servers.get(instance_id)
|
138
|
-
abort "InstanceId Not found :#{instance_id}" unless response
|
139
|
-
abort "Instance should be stopped to start it" if response.state != 'stopped'
|
140
|
-
response.start
|
141
|
-
puts "Starting Instance: #{instance_id}"
|
142
|
-
end
|
143
|
-
|
144
|
-
# terminates an instance
|
145
|
-
def terminate_instance instance_id
|
146
|
-
response = @@conn.servers.get(instance_id)
|
147
|
-
abort "InstanceId Not found :#{instance_id}" unless response
|
148
|
-
response.destroy
|
149
|
-
puts "Terminsted Instance: #{instance_id}"
|
150
|
-
end
|
151
|
-
|
152
|
-
def get_console_output instance_id
|
153
|
-
response = @@conn.get_console_output(instance_id)
|
154
|
-
puts response
|
155
|
-
end
|
156
|
-
|
157
|
-
end # => EC2
|
158
|
-
|
159
|
-
class KeyPairs
|
160
|
-
def initialize connection, options = {}
|
161
|
-
@@conn = connection
|
162
|
-
end
|
163
|
-
|
164
|
-
def list_keypairs
|
165
|
-
@@conn.key_pairs.table
|
166
|
-
end
|
167
|
-
|
168
|
-
def create_keypair options
|
169
|
-
#validate keypair
|
170
|
-
Fog.credential = 'awscli'
|
171
|
-
abort "KeyPair '#{options[:name]}' already exists" if @@conn.key_pairs.get(options[:name])
|
172
|
-
kp = @@conn.key_pairs.create(options)
|
173
|
-
puts "Created keypair: #{options[:name]}"
|
174
|
-
p kp.write #save the key to disk
|
175
|
-
end
|
176
|
-
|
177
|
-
def delete_keypair keypair
|
178
|
-
abort "KeyPair '#{keypair}' does not exist" unless @@conn.key_pairs.get(keypair)
|
179
|
-
@@conn.key_pairs.get(keypair).destroy
|
180
|
-
puts "Deleted Keypair: #{keypair}"
|
181
|
-
end
|
182
|
-
|
183
|
-
def fingerprint keypair
|
184
|
-
response = @@conn.key_pairs.get(keypair)
|
185
|
-
abort "Cannot find key pair: #{keypair}" unless response
|
186
|
-
puts "Fingerprint for the key (#{keypair}): #{response.fingerprint}"
|
187
|
-
end
|
188
|
-
|
189
|
-
def import_keypair options
|
190
|
-
#validate if the file exists
|
191
|
-
private_key_path = if options[:private_key_path]
|
192
|
-
File.expand_path(options[:private_key_path])
|
193
|
-
else
|
194
|
-
File.expand_path("~/.ssh/#{options[:name]}")
|
195
|
-
end
|
196
|
-
public_key_path = if options[:public_key_path]
|
197
|
-
File.expand_path(options[:public_key_path])
|
198
|
-
else
|
199
|
-
File.expand_path("~/.ssh/#{options[:name]}.pub")
|
200
|
-
end
|
201
|
-
abort "Cannot find private_key_path: #{private_key_path}" unless File.exist?(private_key_path)
|
202
|
-
abort "Cannot find public_key_path: #{public_key_path}" unless File.exist?(public_key_path)
|
203
|
-
#validate if the key pair name exists
|
204
|
-
Fog.credentials = Fog.credentials.merge({ :private_key_path => private_key_path, :public_key_path => public_key_path })
|
205
|
-
@@conn.import_key_pair(options[:name], IO.read(public_key_path)) if @@conn.key_pairs.get(options[:name]).nil?
|
206
|
-
puts "Imported KeyPair with name: #{options[:name]} sucessfully, using public_key: #{public_key_path} and private_key: #{private_key_path}"
|
207
|
-
end
|
208
|
-
end # => KP
|
209
|
-
|
210
|
-
class SecGroups
|
211
|
-
|
212
|
-
#Limitations: Ec2-Classic: user can have upto 500 groups
|
213
|
-
# Ec2-VPC: user can have 50 group per VPC
|
214
|
-
|
215
|
-
def initialize connection, options = {}
|
216
|
-
@@conn = connection
|
217
|
-
end
|
218
|
-
|
219
|
-
def list_secgroups options
|
220
|
-
if options[:show_ip_permissions]
|
221
|
-
# @@conn.security_groups.table([:name, :group_id, :ip_permissions])
|
222
|
-
@@conn.security_groups.each do |sg|
|
223
|
-
id = sg.group_id
|
224
|
-
ip_permissions = sg.ip_permissions.to_yaml
|
225
|
-
Formatador.display_line("[green]#{id}[/]")
|
226
|
-
puts "#{ip_permissions}"
|
227
|
-
puts "================="
|
228
|
-
end
|
229
|
-
else
|
230
|
-
@@conn.security_groups.table([:name, :group_id, :description])
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
def authorize_securitygroup options
|
235
|
-
# => Ingress regular traffic -> this action applies to both EC2 and VPC Security Groups
|
236
|
-
# Each rule consists of the protocol, plus cidr range or a source group,
|
237
|
-
#for TCP/UDP protocols you must also specify the dest port or port range
|
238
|
-
#for ICMP, you must specify the icmp type and code (-1 means all types/codes)
|
239
|
-
abort "Expecting Security group id(s) of the form: 'sg-xxxxxx'" unless options[:group_id] =~ /sg-\S{8}/
|
240
|
-
abort "Invalid CIDR format" unless options[:cidr] =~ /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(\d|[1-2]\d|3[0-2]))$/
|
241
|
-
sg = @@conn.security_groups.get_by_id(options[:group_id])
|
242
|
-
abort "Cannot find Security Group with Id: #{sg}" unless sg
|
243
|
-
begin
|
244
|
-
@@conn.authorize_security_group_ingress(
|
245
|
-
"GroupId" => options[:group_id],
|
246
|
-
"IpProtocol" => options[:protocol_type],
|
247
|
-
"FromPort" => options[:start_port],
|
248
|
-
"ToPort" => options[:end_port],
|
249
|
-
"CidrIp" => options[:cidr]
|
250
|
-
)
|
251
|
-
puts "Authorized rule"
|
252
|
-
rescue Fog::Compute::AWS::Error #=> e
|
253
|
-
abort "Error: #{$!}"
|
254
|
-
#puts $@ #backtrace
|
255
|
-
end
|
256
|
-
end
|
257
|
-
|
258
|
-
def revoke_securitygroup options
|
259
|
-
abort "Expecting Security group id(s) of the form: 'sg-xxxxxx'" unless options[:group_id] =~ /sg-\S{8}/
|
260
|
-
sg = @@conn.security_groups.get_by_id(options[:group_id])
|
261
|
-
abort "Cannot find Security Group with Id: #{sg}" unless sg
|
262
|
-
begin
|
263
|
-
response = @@conn.revoke_security_group_ingress(
|
264
|
-
"GroupId" => options[:group_id],
|
265
|
-
"IpProtocol" => options[:protocol_type],
|
266
|
-
"FromPort" => options[:start_port],
|
267
|
-
"ToPort" => options[:end_port],
|
268
|
-
"CidrIp" => options[:cidr]
|
269
|
-
)
|
270
|
-
puts "Revoked rule: #{response.body['return']}"
|
271
|
-
rescue Fog::Compute::AWS::Error #=> e
|
272
|
-
abort "Error: #{$!}"
|
273
|
-
end
|
274
|
-
end
|
275
|
-
|
276
|
-
def create_securitygroup options
|
277
|
-
abort "Error: Security Group => #{options[:name]} already exists" if @@conn.security_groups.get(options[:name])
|
278
|
-
@@conn.security_groups.create(options)
|
279
|
-
puts "Created Security Group: #{options[:name]}"
|
280
|
-
end
|
281
|
-
|
282
|
-
def delete_securitygroup options
|
283
|
-
sg = @@conn.security_groups.get_by_id(options[:group_id])
|
284
|
-
abort "Error: Cannot find Security Group with Id: #{sg}" unless sg
|
285
|
-
begin
|
286
|
-
sg.destroy
|
287
|
-
puts "Deleted Security Group with id: #{options[:group_id]}"
|
288
|
-
rescue Fog::Compute::AWS::Error #=> e
|
289
|
-
abort "Error: #{$!}"
|
290
|
-
end
|
291
|
-
end
|
292
|
-
|
293
|
-
end # => SG
|
294
|
-
|
295
|
-
class Eip
|
296
|
-
def initialize connection, options = {}
|
297
|
-
@@conn = connection
|
298
|
-
end
|
299
|
-
|
300
|
-
def list
|
301
|
-
@@conn.addresses.table
|
302
|
-
end
|
303
|
-
|
304
|
-
def create
|
305
|
-
eip = @@conn.addresses.create
|
306
|
-
puts "Created EIP: #{eip.public_ip}"
|
307
|
-
end
|
308
|
-
|
309
|
-
def delete options
|
310
|
-
abort "Invalid IP Format" unless options[:eip] =~ /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/
|
311
|
-
eip = @@conn.addresses.get(options[:eip])
|
312
|
-
abort "Cannot find IP: #{options[:eip]}" unless eip
|
313
|
-
eip.destroy
|
314
|
-
puts "Deleted EIP: #{eip.public_ip}"
|
315
|
-
end
|
316
|
-
|
317
|
-
def associate options
|
318
|
-
abort "Invalid IP Format" unless options[:eip] =~ /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/
|
319
|
-
eip = @@conn.addresses.get(options[:eip])
|
320
|
-
abort "Cannot find eip: #{options[:eip]}" unless eip
|
321
|
-
server = @@conn.servers.get(options[:instance_id])
|
322
|
-
abort "Cannot find server with id: #{options[:instance_id]}" unless server
|
323
|
-
begin
|
324
|
-
eip.server = server
|
325
|
-
puts "Associated EIP: #{options[:eip]} with Instance: #{options[:instance_id]}"
|
326
|
-
rescue Fog::Compute::AWS::Error
|
327
|
-
abort "Error: #{$!}"
|
328
|
-
end
|
329
|
-
end
|
330
|
-
|
331
|
-
def disassociate options
|
332
|
-
abort "Invalid IP Format" unless options[:eip] =~ /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/
|
333
|
-
abort "Cannot find EIP: #{options[:eip]}" unless @@conn.addresses.get(options[:eip])
|
334
|
-
@@conn.disassociate_address(options[:eip])
|
335
|
-
puts "Disassociated EIP: #{options[:eip]}"
|
336
|
-
end
|
337
|
-
end # => Eip
|
338
|
-
|
339
|
-
class Ami
|
340
|
-
def initialize connection, options = {}
|
341
|
-
@@conn = connection
|
342
|
-
end
|
343
|
-
|
344
|
-
def list filter
|
345
|
-
puts filter
|
346
|
-
if filter.nil?
|
347
|
-
@@conn.images.all.table([:architecture, :id, :is_public, :platform, :root_device_type, :state])
|
348
|
-
else
|
349
|
-
@@conn.images.all(filter).table([:architecture, :id, :is_public, :platform, :root_device_type, :state])
|
350
|
-
end
|
351
|
-
end
|
352
|
-
|
353
|
-
def show_filters
|
354
|
-
filters =
|
355
|
-
[
|
356
|
-
{:filter_name => "architecture", :desc => "Image Architecture"},
|
357
|
-
{:filter_name => "block-device-mapping.delete-on-termination", :desc => "Whether the Amazon EBS volume is deleted on instance termination"},
|
358
|
-
{:filter_name => "block-device-mapping.device-name", :desc => "Device name (e.g., /dev/sdh) for an Amazon EBS volume mapped to the image"},
|
359
|
-
{:filter_name => "block-device-mapping.snapshot-id", :desc => "Snapshot ID for an Amazon EBS volume mapped to the image"},
|
360
|
-
{:filter_name => "block-device-mapping.volume-size", :desc => "Volume size for an Amazon EBS volume mapped to the image"},
|
361
|
-
{:filter_name => "description", :desc => "Description of the AMI (provided during image creation)"},
|
362
|
-
{:filter_name => "image-id", :desc => "ID of the image" },
|
363
|
-
{:filter_name => "imgae-type", :desc => "Type of image" },
|
364
|
-
{:filter_name => "is-public", :desc => "Whether the image is public" },
|
365
|
-
{:filter_name => "kernel-id", :desc => "Kernel ID" },
|
366
|
-
{:filter_name => "manifest-location", :desc => "Location of the image manifest" },
|
367
|
-
{:filter_name => "name", :desc => "Name of the AMI (provided during image creation)" },
|
368
|
-
{:filter_name => "owner-alias", :desc => "AWS account alias (e.g., amazon or self) or AWS account ID that owns the AMI" },
|
369
|
-
{:filter_name => "owner-id", :desc => "AWS account ID of the image owner" },
|
370
|
-
{:filter_name => "platform", :desc => "Use windows if you have Windows based AMIs; otherwise leave blank" },
|
371
|
-
{:filter_name => "product-code", :desc => "Product code associated with the AMI" },
|
372
|
-
{:filter_name => "ramdisk-id", :desc => "RAM disk ID" },
|
373
|
-
{:filter_name => "root-device-name", :desc => "Root device name of the AMI (e.g., /dev/sda1)" },
|
374
|
-
{:filter_name => "root-device-type", :desc => "Root device type the AMI uses" },
|
375
|
-
{:filter_name => "state", :desc => "State of the image" },
|
376
|
-
{:filter_name => "state-reason-code", :desc => "Reason code for the state change" },
|
377
|
-
{:filter_name => "state-reason-message", :desc => "Message for the state change" },
|
378
|
-
{:filter_name => "tag-key", :desc => "Key of a tag assigned to the resource. This filter is independent of the tag-value filter" },
|
379
|
-
{:filter_name => "tag-value", :desc => "Value of a tag assigned to the resource. This filter is independent of the tag-key filter." },
|
380
|
-
{:filter_name => "virtualization-type", :desc => "Virtualization type of the image" },
|
381
|
-
{:filter_name => "hypervisor", :desc => "Hypervisor type of the image" }
|
382
|
-
]
|
383
|
-
Formatador.display_table(filters, [:filter_name, :desc])
|
384
|
-
end
|
385
|
-
|
386
|
-
def list_amazon
|
387
|
-
@@conn.images.all('owner-alias' => 'amazon').table([:architecture, :id, :is_public, :platform, :root_device_type, :state])
|
388
|
-
end
|
389
|
-
|
390
|
-
def create_image_from_instance options
|
391
|
-
abort "Invalid Instace: #{options[:instance_id]}" unless @@conn.servers.get(options[:instance_id])
|
392
|
-
@@conn.create_image(
|
393
|
-
options[:instance_id],
|
394
|
-
options[:name],
|
395
|
-
options[:desc],
|
396
|
-
options[:no_reboot]
|
397
|
-
)
|
398
|
-
puts "Created image from instance: #{options[:instance_id]}"
|
399
|
-
end
|
400
|
-
|
401
|
-
end # => AMI
|
402
|
-
|
403
|
-
class Ebs
|
404
|
-
def initialize connection, options = {}
|
405
|
-
@@conn = connection
|
406
|
-
end
|
407
|
-
|
408
|
-
def list options
|
409
|
-
unless options[:snapshots]
|
410
|
-
@@conn.volumes.table([:availability_zone, :delete_on_termination, :device, :id, :server_id, :size, :snapshot_id, :state, :tags, :type])
|
411
|
-
else
|
412
|
-
@@conn.snapshots.table([:id, :owner_id, :volume_id, :state, :progress, :tags, :description])
|
413
|
-
end
|
414
|
-
end
|
415
|
-
|
416
|
-
def create options
|
417
|
-
@@conn.volumes.create(options)
|
418
|
-
end
|
419
|
-
|
420
|
-
def attach_volume options
|
421
|
-
#The volume and instance must be in the same Availability Zone.
|
422
|
-
volume = @@conn.volumes.get(options[:volume_id])
|
423
|
-
volume.merge_attributes(:device => options[:device])
|
424
|
-
server = @@conn.servers.get(options[:instance_id])
|
425
|
-
abort "Cannot find volume: #{options[:volume_id]}" unless volume
|
426
|
-
abort "Cannot find instance: #{options[:instance_id]}" unless server
|
427
|
-
volume.server = server
|
428
|
-
puts "Attached volume: #{options[:volume_id]} to instance: #{options[:instance_id]}"
|
429
|
-
end
|
430
|
-
|
431
|
-
def detach_volume options
|
432
|
-
#Check if the volume is mounted and show warning regarding data loss
|
433
|
-
volume = @@conn.volumes.get(options[:volume_id])
|
434
|
-
abort "Cannot find volume: #{options[:volume_id]}" unless volume
|
435
|
-
if options[:force]
|
436
|
-
volume.force_detach
|
437
|
-
else
|
438
|
-
@@conn.detach_volume(options[:volume_id])
|
439
|
-
end
|
440
|
-
puts "Detached volume: #{options[:volume_id]}"
|
441
|
-
end
|
442
|
-
|
443
|
-
def delete_volume options
|
444
|
-
vol = @@conn.volumes.get(options[:volume_id])
|
445
|
-
abort "Cannot find volume #{options[:volume_id]}" unless vol
|
446
|
-
vol.destroy
|
447
|
-
puts "Deleted volume: #{options[:volume_id]}"
|
448
|
-
end
|
449
|
-
|
450
|
-
def create_snapshot options
|
451
|
-
abort "Cannot find volume: #{options[:volume_id]}" unless @@conn.volumes.get(options[:volume_id])
|
452
|
-
@@conn.snapshots.create(options)
|
453
|
-
puts "Created snapshot"
|
454
|
-
end
|
455
|
-
|
456
|
-
def copy_snapshot options
|
457
|
-
abort "Cannot find snapshot: #{options[:snapshot_id]}" unless @@conn.snapshots.get(options[:snapshot_id])
|
458
|
-
@@conn.copy_snapshot(options[:snapshot_id], options[:source_region])
|
459
|
-
puts "Copied snapshot"
|
460
|
-
end
|
461
|
-
|
462
|
-
def delete_snapshot options
|
463
|
-
snap = @@conn.snapshots.get(options[:snapshot_id])
|
464
|
-
abort "Cannot find snapshot: #{options[:snapshot_id]}" unless snap
|
465
|
-
snap.destroy
|
466
|
-
puts "Destroyed snapshot"
|
467
|
-
end
|
468
|
-
end # => EBS
|
469
|
-
|
470
|
-
class Monitor
|
471
|
-
def initialize connection, options = {}
|
472
|
-
@@conn = connection
|
473
|
-
end
|
474
|
-
|
475
|
-
def monitor options
|
476
|
-
options[:instance_ids].each do |instance|
|
477
|
-
abort "Invalid InstanceId: #{instance}" unless @@conn.servers.get(instance)
|
478
|
-
end
|
479
|
-
@@conn.monitor_instances(options[:instance_ids])
|
480
|
-
puts "Enabled monitoring for instnaces: #{options[:instance_ids].join(",")}"
|
481
|
-
end
|
482
|
-
|
483
|
-
def unmonitor options
|
484
|
-
options[:instance_ids].each do |instance|
|
485
|
-
abort "Invalid InstanceId: #{instance}" unless @@conn.servers.get(instance)
|
486
|
-
end
|
487
|
-
@@conn.unmonitor_instances(options[:instance_ids])
|
488
|
-
puts "Disabled monitoring for instnaces: #{options[:instance_ids].join(",")}"
|
489
|
-
end
|
490
|
-
end # => Monitor
|
491
|
-
|
492
|
-
class Tags
|
493
|
-
def initialize connection, options = {}
|
494
|
-
@@conn = connection
|
495
|
-
end
|
496
|
-
|
497
|
-
def list
|
498
|
-
@@conn.tags.table
|
499
|
-
end
|
500
|
-
|
501
|
-
def create options
|
502
|
-
@@conn.tags.create(options)
|
503
|
-
puts "Created Tag"
|
504
|
-
end
|
505
|
-
|
506
|
-
def delete options
|
507
|
-
@@conn.tags.destroy(options)
|
508
|
-
puts "Deleted Tag"
|
509
|
-
end
|
510
|
-
end # => Tags
|
511
|
-
|
512
|
-
class Placement
|
513
|
-
def initialize connection, options = {}
|
514
|
-
@@conn = connection
|
515
|
-
end
|
516
|
-
|
517
|
-
def list
|
518
|
-
@@conn.describe_placement_groups
|
519
|
-
end
|
520
|
-
|
521
|
-
def create options
|
522
|
-
@@conn.create_placement_group(options[:name], options[:strategy])
|
523
|
-
puts "Created a new placement group: #{options[:name]}"
|
524
|
-
end
|
525
|
-
|
526
|
-
def delete options
|
527
|
-
@@conn.delete_placement_group(options[:name])
|
528
|
-
puts "Deleted placement group: #{options[:name]}"
|
529
|
-
end
|
530
|
-
end # => Placement
|
531
|
-
|
532
|
-
class ReservedInstances
|
533
|
-
def initialize connection, options = {}
|
534
|
-
@@conn = connection
|
535
|
-
end
|
536
|
-
|
537
|
-
def list filters
|
538
|
-
puts filters
|
539
|
-
if filters.nil?
|
540
|
-
@@conn.describe_reserved_instances.body['reservedInstancesSet']
|
541
|
-
else
|
542
|
-
@@conn.describe_reserved_instances(filters).body['reservedInstancesSet']
|
543
|
-
end
|
544
|
-
end
|
545
|
-
|
546
|
-
def list_offerings filters
|
547
|
-
puts filters
|
548
|
-
response = if filters.nil?
|
549
|
-
@@conn.describe_reserved_instances_offerings.body['reservedInstancesOfferingsSet']
|
550
|
-
else
|
551
|
-
@@conn.describe_reserved_instances_offerings(filters).body['reservedInstancesOfferingsSet']
|
552
|
-
end
|
553
|
-
Formatador.display_table(response)
|
554
|
-
end
|
555
|
-
|
556
|
-
def list_filters
|
557
|
-
filters = [
|
558
|
-
{:filter_name => "availability-zone", :desc => "Availability Zone where the Reserved Instance can be used", :availability => "Both"},
|
559
|
-
{:filter_name => "duration", :desc => "Duration of the Reserved Instance (e.g., one year or three years), in seconds", :availability => "Both"},
|
560
|
-
{:filter_name => "fixed-price", :desc => "Purchase price of the Reserved Instance", :availability => "Both"},
|
561
|
-
{:filter_name => "instance-type", :desc => "Instance type on which the Reserved Instance can be used", :availability => "Both"},
|
562
|
-
{:filter_name => "product-description", :desc => "Reserved Instance description", :availability => "Both"},
|
563
|
-
{:filter_name => "reserved-instances-id", :desc => "Reserved Instance's ID", :availability => "Only ReservedInstances"},
|
564
|
-
{:filter_name => "reserved-instances-offering-id", :desc => "Reserved Instances offering ID", :availability => "Only reservedInstancesOfferingsSet"},
|
565
|
-
{:filter_name => "start", :desc => "Time the Reserved Instance purchase request was placed", :availability => "Only ReservedInstances"},
|
566
|
-
{:filter_name => "state", :desc => "State of the Reserved Instance", :availability => "Only ReservedInstances"},
|
567
|
-
{:filter_name => "tag-key", :desc => "Key of a tag assigned to the resource", :availability => "Only ReservedInstances"}, #This filter is independent of the tag-value filter. For example, if you use both the filter tag-key=Purpose and the filter tag-value=X, you get any resources assigned both the tag key Purpose and the tag value X
|
568
|
-
{:filter_name => "tag-value", :desc => "Value of a tag assigned to the resource", :availability => "Only ReservedInstances"}, #This filter is independent of the tag-key filter.
|
569
|
-
{:filter_name => "usage-price", :desc => "Usage price of the Reserved Instance, per hour", :availability => "Both"},
|
570
|
-
]
|
571
|
-
Formatador.display_table(filters, [:filter_name, :desc, :availability])
|
572
|
-
end
|
573
|
-
|
574
|
-
def purchase options
|
575
|
-
@@conn.purchase_reserved_instances_offering(options[:reserved_instances_offering_id], options[:instance_count])
|
576
|
-
end
|
577
|
-
end # => ReservedInstances
|
578
|
-
|
579
|
-
class Spot
|
580
|
-
def initialize connection, options = {}
|
581
|
-
@@conn = connection
|
582
|
-
end
|
583
|
-
|
584
|
-
def describe_spot_requests
|
585
|
-
@@conn.spot_requests.table
|
586
|
-
end
|
587
|
-
|
588
|
-
def describe_spot_datafeed_subscription
|
589
|
-
@@conn.describe_spot_datafeed_subscription
|
590
|
-
end
|
591
|
-
|
592
|
-
def describe_spot_price_history filters
|
593
|
-
puts filters
|
594
|
-
response = if filters.nil?
|
595
|
-
@@conn.describe_spot_price_history.body['spotPriceHistorySet']
|
596
|
-
else
|
597
|
-
@@conn.describe_spot_price_history(filters).body['spotPriceHistorySet']
|
598
|
-
end
|
599
|
-
Formatador.display_table(response)
|
600
|
-
end
|
601
|
-
|
602
|
-
def list_filters
|
603
|
-
filters = [
|
604
|
-
{:filter_name => "instance-type", :desc => "Type of instance"},
|
605
|
-
{:filter_name => "product-description", :desc => "Product description for the Spot Price"},
|
606
|
-
{:filter_name => "spot-price", :desc => "Spot Price. The value must match exactly (or use wildcards; greater than or less than comparison is not supported)"},
|
607
|
-
{:filter_name => "timestamp", :desc => "Timestamp of the Spot Price history, e.g., 2010-08-16T05:06:11.000Z. You can use wildcards (* and ?)"},
|
608
|
-
]
|
609
|
-
Formatador.display_table(filters, [:filter_name, :desc])
|
610
|
-
end
|
611
|
-
|
612
|
-
def create_spot_datafeed_subsription bucket, prefix
|
613
|
-
@@conn.create_spot_datafeed_subscription(bucket, prefix)
|
614
|
-
end
|
615
|
-
|
616
|
-
def delete_spot_datafeed_subsription
|
617
|
-
@@conn.delete_spot_datafeed_subscription
|
618
|
-
end
|
619
|
-
|
620
|
-
def request_spot_instances options
|
621
|
-
sr = @@conn.spot_requests.create(options)
|
622
|
-
puts "Created spot request: #{sr.id}"
|
623
|
-
end
|
624
|
-
|
625
|
-
def cancel_spot_instance_requests sid
|
626
|
-
sr = @@conn.spot_requests.get(sid)
|
627
|
-
abort "Cannot find spot request with id: #{sid}" unless sr
|
628
|
-
sr.destroy
|
629
|
-
puts "Deleted spot request: #{sid}"
|
630
|
-
end
|
631
|
-
end # => Spot
|
632
|
-
|
633
|
-
class Vpc
|
634
|
-
def initialize connection, options = {}
|
635
|
-
@@conn = connection
|
636
|
-
end
|
637
|
-
|
638
|
-
def list
|
639
|
-
@@conn.vpcs.table
|
640
|
-
end
|
641
|
-
|
642
|
-
def create options
|
643
|
-
vpc = @@conn.vpcs.create(options)
|
644
|
-
puts "Created VPC: #{vpc.id}"
|
645
|
-
end
|
646
|
-
|
647
|
-
def delete vpc_id
|
648
|
-
vpc = @@conn.vpcs.get(vpc_id)
|
649
|
-
abort "cannot find vpc: #{vpc_id}" unless vpc
|
650
|
-
vpc.destroy
|
651
|
-
puts "Deleted VPC : #{vpc_id}"
|
652
|
-
end
|
653
|
-
end # => Vpc
|
654
|
-
|
655
|
-
class Subnet
|
656
|
-
def initialize connection, options = {}
|
657
|
-
@@conn = connection
|
658
|
-
end
|
659
|
-
|
660
|
-
def list
|
661
|
-
@@conn.subnets.table
|
662
|
-
end
|
663
|
-
|
664
|
-
def create options
|
665
|
-
subnet = @@conn.subnets.create(options)
|
666
|
-
puts "Created Subnet: #{subnet.id}"
|
667
|
-
end
|
668
|
-
|
669
|
-
def delete subnet_id
|
670
|
-
subnet = @@conn.subnets.get(subnet_id)
|
671
|
-
abort "Cannot find subnet: #{subnet_id}" unless subnet
|
672
|
-
subnet.destroy
|
673
|
-
puts "Deleted subnet: #{subnet_id}"
|
674
|
-
end
|
675
|
-
end # => Subnet
|
676
|
-
|
677
|
-
class NetworkAcl
|
678
|
-
def initialize connection, options = {}
|
679
|
-
@@conn = connection
|
680
|
-
end
|
681
|
-
|
682
|
-
def list
|
683
|
-
puts "Listing Network Acls"
|
684
|
-
end
|
685
|
-
|
686
|
-
end # => NetworkAcl
|
687
|
-
|
688
|
-
class NetworkInterfaces
|
689
|
-
def initialize connection, options = {}
|
690
|
-
@@conn = connection
|
691
|
-
end
|
692
|
-
|
693
|
-
def list
|
694
|
-
@@conn.network_interfaces.table
|
695
|
-
end
|
696
|
-
|
697
|
-
def create options
|
698
|
-
nic = @@conn.network_interfaces.create(options)
|
699
|
-
puts "Create network interface #{nic.network_interface_id}"
|
700
|
-
end
|
701
|
-
|
702
|
-
def delete nic_id
|
703
|
-
nic = @@conn.network_interfaces.get(nic_id)
|
704
|
-
abort "Cannot find nic with id: #{nic_id}" unless nic
|
705
|
-
nic.destroy
|
706
|
-
puts "Deleted network interface #{nic_id}"
|
707
|
-
end
|
708
|
-
|
709
|
-
def attach nic_id, instance_id, device_index
|
710
|
-
@@conn.attach_network_interface(nic_id, instance_id, device_index)
|
711
|
-
puts "Attached Network Interface: #{nic_id} to instance: #{instance_id}"
|
712
|
-
end
|
713
|
-
|
714
|
-
def deattach attachement_id, force
|
715
|
-
@@conn.detach_network_interface attachement_id, force
|
716
|
-
puts "Deattached Network Interface with attachement_id: #{attachement_id}"
|
717
|
-
end
|
718
|
-
|
719
|
-
def modify_attribute options
|
720
|
-
case options[:attribute]
|
721
|
-
when 'description'
|
722
|
-
@@conn.modify_network_interface_attribute(options[:network_interface_id], 'description', options[:description])
|
723
|
-
when 'groupSet'
|
724
|
-
@@conn.modify_network_interface_attribute(options[:network_interface_id], 'groupSet', options[:group_set])
|
725
|
-
when 'sourceDestCheck'
|
726
|
-
@@conn.modify_network_interface_attribute(options[:network_interface_id], 'sourceDestCheck', options[:source_dest_check])
|
727
|
-
when 'attachment'
|
728
|
-
@@conn.modify_network_interface_attribute(options[:network_interface_id], 'attachment', options[:attachment])
|
729
|
-
else
|
730
|
-
abort "Invalid attribute: #{options[:attribute]}"
|
731
|
-
end
|
732
|
-
end
|
733
|
-
end # => NetworkInterfaces
|
734
|
-
|
735
|
-
class InternetGateways
|
736
|
-
def initialize connection, options = {}
|
737
|
-
@@conn = connection
|
738
|
-
end
|
739
|
-
|
740
|
-
def list
|
741
|
-
@@conn.internet_gateways.table
|
742
|
-
end
|
743
|
-
|
744
|
-
def create
|
745
|
-
gw = @@conn.internet_gateways.create
|
746
|
-
puts "Created Internet Gateway: #{gw.id}"
|
747
|
-
end
|
748
|
-
|
749
|
-
def delete gwid
|
750
|
-
gw = @@conn.internet_gateways.get(gwid)
|
751
|
-
gw.destroy
|
752
|
-
puts "Deleted Internet Gateway: #{gwid}"
|
753
|
-
end
|
754
|
-
|
755
|
-
def attach gwid, vpcid
|
756
|
-
@@conn.internet_gateways.attach(gwid, vpcid)
|
757
|
-
puts "Attached InternetGateway: #{gwid} to VPC: #{vpcid}"
|
758
|
-
end
|
759
|
-
|
760
|
-
def deattach gwid, vpcid
|
761
|
-
@@conn.internet_gateways.deattach(gwid, vpcid)
|
762
|
-
puts "Deattached InternetGateway: #{gwid} from VPC: #{vpcid}"
|
763
|
-
end
|
764
|
-
end # => InternetGateways
|
765
|
-
|
766
|
-
class Dhcp
|
767
|
-
def initialize connection, options = {}
|
768
|
-
@@conn = connection
|
769
|
-
end
|
770
|
-
|
771
|
-
def list
|
772
|
-
@@conn.dhcp_options.table
|
773
|
-
end
|
774
|
-
|
775
|
-
def create options
|
776
|
-
@@conn.dhcp_options.create(options)
|
777
|
-
end
|
778
|
-
|
779
|
-
def delete dhcp_id
|
780
|
-
dhcp = @@conn.dhcp_options(dhcp_id)
|
781
|
-
dhcp.destroy
|
782
|
-
end
|
783
|
-
|
784
|
-
def associate dhcp_ic, vpc_id
|
785
|
-
@@conn.dhcp_options.attach(dhcp_id, vpc_id)
|
786
|
-
end
|
787
|
-
end # => Dhcp
|
788
|
-
|
789
|
-
end
|
790
|
-
end
|