awscli 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/bin/awscli +7 -7
- data/lib/awscli.rb +3 -1
- data/lib/awscli/as.rb +56 -56
- data/lib/awscli/cli.rb +1 -1
- data/lib/awscli/cli/UsageExamples/emr +49 -0
- data/lib/awscli/cli/emr.rb +157 -0
- data/lib/awscli/cli/iam/user.rb +18 -7
- data/lib/awscli/cli/s3/files.rb +43 -37
- data/lib/awscli/connection.rb +34 -31
- data/lib/awscli/ec2.rb +234 -234
- data/lib/awscli/emr.rb +472 -0
- data/lib/awscli/errors.rb +1 -1
- data/lib/awscli/helper.rb +17 -0
- data/lib/awscli/iam.rb +281 -218
- data/lib/awscli/s3.rb +51 -39
- data/lib/awscli/version.rb +1 -1
- metadata +5 -2
data/lib/awscli/cli/iam/user.rb
CHANGED
@@ -18,22 +18,29 @@ module AwsCli
|
|
18
18
|
|
19
19
|
desc 'create', 'create a user'
|
20
20
|
long_desc <<-DESC
|
21
|
-
Creates a new user in your AWS account. Optionally adds the user to
|
21
|
+
Creates a new user in your AWS account. Optionally adds the user to a group, creates an access key for the user and puts default policy in place.
|
22
22
|
DESC
|
23
23
|
method_option :user_name, :aliases => '-u', :required => true, :desc => 'name of the user to create (do not include path)'
|
24
|
-
method_option :path, :aliases => '-p', :
|
24
|
+
method_option :path, :aliases => '-p', :default => '/', :desc => 'optional path to group, defaults to "/"'
|
25
25
|
method_option :group, :aliases => '-g', :desc => 'name of a group you want to add the user to'
|
26
|
-
method_option :access_key, :
|
26
|
+
method_option :access_key, :aliases => '-k', :type => :boolean, :default => false, :desc => 'if passed, optionally creates an access key for the user'
|
27
|
+
method_option :policy, :aliases => '-l', :type => :boolean, :default => false, :desc => 'if set will not create basic set of access rules for the user, should pass --policy-doc if set'
|
28
|
+
method_option :policy_doc, :aliases => '-d', :desc => 'path to the json policy document'
|
29
|
+
method_option :password, :aliases => '-a', :type => :boolean, :default => false, :desc => 'assign a generated password for the user'
|
27
30
|
def create
|
31
|
+
if options[:policy]
|
32
|
+
abort 'Required --policy-doc, if --policy is passed' unless options[:policy_doc]
|
33
|
+
end
|
28
34
|
create_iam_object
|
29
|
-
@iam.create options
|
35
|
+
@iam.create options
|
30
36
|
end
|
31
37
|
|
32
38
|
desc 'delete', 'delete existing user'
|
33
39
|
method_option :user_name, :aliases => '-u', :required => true, :desc => 'name of the user to delete (dont include path)'
|
40
|
+
method_option :force, :aliases => '-f', :type => :boolean, :default => false, :decs => 'force deletes users login_profile, access_keys, policies if any'
|
34
41
|
def delete
|
35
42
|
create_iam_object
|
36
|
-
@iam.delete options
|
43
|
+
@iam.delete options
|
37
44
|
end
|
38
45
|
|
39
46
|
desc 'cak', 'create access key for user'
|
@@ -100,14 +107,18 @@ module AwsCli
|
|
100
107
|
desc 'passwd [OPTIONS]', 'add/change user password'
|
101
108
|
method_option :user_name, :aliases => '-u', :required => true, :desc => 'name of the user to change password for'
|
102
109
|
method_option :password, :alases => '-p', :desc => 'password for the user'
|
103
|
-
method_option :
|
110
|
+
method_option :generate, :aliases => '-g', :type => :boolean, :default => false, :desc => 'generates the password'
|
104
111
|
method_option :remove, :aliases => '-r', :type => :boolean, :default => false, :desc => 'remove password for the user'
|
105
112
|
def passwd
|
106
113
|
create_iam_object
|
107
114
|
if options[:remove]
|
108
115
|
@iam.remove_password options[:user_name]
|
109
116
|
else
|
110
|
-
|
117
|
+
if options[:generate]
|
118
|
+
@iam.assign_password options[:user_name], options[:password]
|
119
|
+
else
|
120
|
+
@iam.generate_password options[:user_name]
|
121
|
+
end
|
111
122
|
end
|
112
123
|
end
|
113
124
|
|
data/lib/awscli/cli/s3/files.rb
CHANGED
@@ -4,76 +4,82 @@ module AwsCli
|
|
4
4
|
require 'awscli/cli/s3'
|
5
5
|
class Files < Thor
|
6
6
|
|
7
|
-
desc
|
8
|
-
method_option :bucket_name, :aliases =>
|
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
|
+
method_option :prefix, :aliases => '-p', :desc => 'Optionally specify a dir_name to narrow down results'
|
9
10
|
def list
|
10
11
|
create_s3_object
|
11
|
-
@s3.list options[:bucket_name]
|
12
|
+
@s3.list options[:bucket_name], options[:prefix]
|
12
13
|
end
|
13
14
|
|
14
|
-
desc
|
15
|
-
method_option :bucket_name, :aliases =>
|
16
|
-
method_option :file_path, :aliases =>
|
15
|
+
desc 'put', 'put a file into a bucket'
|
16
|
+
method_option :bucket_name, :aliases => '-b', :required => true, :desc => 'name of the bucket to upload the file to'
|
17
|
+
method_option :file_path, :aliases => '-p', :required => true, :desc => 'local file path'
|
18
|
+
method_option :dest_path, :aliases => '-d', :desc => 'optionally specify destination directory path to create'
|
17
19
|
def put
|
18
20
|
create_s3_object
|
19
|
-
|
21
|
+
if options[:dest_path]
|
22
|
+
@s3.upload_file options[:bucket_name], options[:file_path], options[:dest_path]
|
23
|
+
else
|
24
|
+
@s3.upload_file options[:bucket_name], options[:file_path]
|
25
|
+
end
|
20
26
|
end
|
21
27
|
|
22
|
-
desc
|
23
|
-
method_option :bucket_name, :aliases =>
|
24
|
-
method_option :dir_path, :aliases =>
|
25
|
-
method_option :dest_path, :aliases =>
|
26
|
-
method_option :thread_count, :aliases =>
|
27
|
-
method_option :public, :type => :boolean, :default => false, :desc =>
|
28
|
+
desc 'put_rec', 'put a directory recursively into a specified bucket using multiple threads'
|
29
|
+
method_option :bucket_name, :aliases => '-b', :required => true, :desc => 'name of the bucket to upload the dir to'
|
30
|
+
method_option :dir_path, :aliases => '-p', :required => true, :desc => 'path of the dir to upload'
|
31
|
+
method_option :dest_path, :aliases => '-d', :desc => 'optionally specify destination directory path to create'
|
32
|
+
method_option :thread_count, :aliases => '-t', :type => :numeric, :default => 5, :desc => 'number of threads to use to upload files'
|
33
|
+
method_option :public, :type => :boolean, :default => false, :desc => 'set ACL of files to public'
|
28
34
|
def put_rec
|
29
35
|
create_s3_object
|
30
36
|
@s3.upload_file_rec options
|
31
37
|
end
|
32
38
|
|
33
|
-
desc
|
39
|
+
desc 'put_big', 'uploads a file using multipart uploads'
|
34
40
|
long_desc <<-DESC
|
35
|
-
Takes in a larger file, split the file into chunks and uploads the parts using amazon multipart uploads and the parts are aggregated at the amazons end.
|
41
|
+
Takes in a larger file (> 100MB), split the file into chunks and uploads the parts using amazon multipart uploads and the parts are aggregated at the amazons end.
|
36
42
|
DESC
|
37
|
-
method_option :bucket_name, :aliases =>
|
38
|
-
method_option :file_path, :aliases =>
|
39
|
-
method_option :tmp_dir, :aliases =>
|
40
|
-
method_option :acl, :aliases =>
|
41
|
-
method_option :dest_path, :aliases =>
|
43
|
+
method_option :bucket_name, :aliases => '-b', :required => true, :banner => 'NAME', :desc => 'name of the bucket to upload the parts to'
|
44
|
+
method_option :file_path, :aliases => '-p', :required => true, :banner => 'PATH', :desc => 'path of the file to upload'
|
45
|
+
method_option :tmp_dir, :aliases => '-t', :default => '/tmp', :desc => 'path to a temporary location where file will be split into chunks'
|
46
|
+
method_option :acl, :aliases => '-a', :default => 'private', :desc => 'ACL to apply, to the object that is created after completing multipart upload, valid options in private | public-read | public-read-write | authenticated-read | bucket-owner-read | bucket-owner-full-control'
|
47
|
+
method_option :dest_path, :aliases => '-d', :desc => 'optionally specify destination directory path to create'
|
42
48
|
def put_big
|
43
49
|
create_s3_object
|
44
50
|
@s3.multipart_upload options
|
45
51
|
end
|
46
52
|
|
47
|
-
desc
|
48
|
-
method_option :bucket_name, :aliases =>
|
49
|
-
method_option :file_name, :aliases =>
|
50
|
-
method_option :local_path, :aliases =>
|
53
|
+
desc 'get', 'get a file from a bucket'
|
54
|
+
method_option :bucket_name, :aliases => '-b', :required => true, :banner => 'NAME', :desc => 'name of the bucket to download the file from'
|
55
|
+
method_option :file_name, :aliases => '-f', :required => true, :banner => 'NAME', :desc => 'name of file to download'
|
56
|
+
method_option :local_path, :aliases => '-p', :required => true, :banner => 'PATH', :desc => 'local fs path, where to download the file to'
|
51
57
|
def get
|
52
58
|
create_s3_object
|
53
59
|
@s3.download_file options[:bucket_name], options[:file_name], options[:local_path]
|
54
60
|
end
|
55
61
|
|
56
|
-
desc
|
57
|
-
method_option :bucket_name, :aliases =>
|
58
|
-
method_option :file_name, :aliases =>
|
62
|
+
desc 'delete', 'delete a file from a bucket'
|
63
|
+
method_option :bucket_name, :aliases => '-b', :required => true, :desc => 'name of the bucket to download the file from'
|
64
|
+
method_option :file_name, :aliases => '-f', :required => true, :desc => 'name of file to download'
|
59
65
|
def delete
|
60
66
|
create_s3_object
|
61
67
|
@s3.delete_file options[:bucket_name], options[:file_name]
|
62
68
|
end
|
63
69
|
|
64
|
-
desc
|
65
|
-
method_option :source_bucket, :aliases =>
|
66
|
-
method_option :source_file, :aliases =>
|
67
|
-
method_option :dest_bucket, :aliases =>
|
68
|
-
method_option :dest_file, :
|
70
|
+
desc 'copy', 'copy object from one bucket to another'
|
71
|
+
method_option :source_bucket, :aliases => '-s', :required => true, :banner => 'NAME', :desc => 'source bucket name from where to copy the file'
|
72
|
+
method_option :source_file, :aliases => '-f', :required => true, :banner => 'PATH', :desc => 'source file name to copy'
|
73
|
+
method_option :dest_bucket, :aliases => '-d', :required => true, :banner => 'NAME', :desc => 'destination bucket name to copy the file to'
|
74
|
+
method_option :dest_file, :aliases => '-r', :required => true, :banner => 'PATH', :desc => 'destination file name'
|
69
75
|
def copy
|
70
76
|
create_s3_object
|
71
77
|
@s3.copy_file options[:source_bucket], options[:source_file], options[:dest_bucket], options[:dest_file]
|
72
78
|
end
|
73
79
|
|
74
|
-
desc
|
75
|
-
method_option :bucket_name, :aliases =>
|
76
|
-
method_option :file_name, :aliases =>
|
80
|
+
desc 'public_url', 'show the public url of a file'
|
81
|
+
method_option :bucket_name, :aliases => '-b', :required => true, :desc => 'name of the bucket to download the file from'
|
82
|
+
method_option :file_name, :aliases => '-f', :required => true, :desc => 'name of file to download'
|
77
83
|
def public_url
|
78
84
|
create_s3_object
|
79
85
|
@s3.get_public_url options[:bucket_name], options[:file_name]
|
@@ -83,13 +89,13 @@ module AwsCli
|
|
83
89
|
private
|
84
90
|
|
85
91
|
def create_s3_object
|
86
|
-
puts
|
92
|
+
puts 'S3 Establishing Connection...'
|
87
93
|
$s3_conn = if parent_options[:region]
|
88
94
|
Awscli::Connection.new.request_s3(parent_options[:region])
|
89
95
|
else
|
90
96
|
Awscli::Connection.new.request_s3
|
91
97
|
end
|
92
|
-
puts
|
98
|
+
puts 'S3 Establishing Connection... OK'
|
93
99
|
@s3 = Awscli::S3::Files.new($s3_conn)
|
94
100
|
end
|
95
101
|
|
data/lib/awscli/connection.rb
CHANGED
@@ -5,67 +5,70 @@ module Awscli
|
|
5
5
|
|
6
6
|
def initialize
|
7
7
|
#load env variable AWSCLI_CONFIG_FILE
|
8
|
-
|
9
|
-
|
10
|
-
puts
|
8
|
+
@aws_config_file = ENV['AWSCLI_CONFIG_FILE']
|
9
|
+
if @aws_config_file.nil?
|
10
|
+
puts 'Cannot find config file environment variable'
|
11
11
|
Awscli::Errors.missing_environment_variable
|
12
12
|
end
|
13
|
-
|
14
|
-
unless File.exist?(
|
15
|
-
puts "Cannot locate file #{
|
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
16
|
Awscli::Errors.missing_config_file
|
17
17
|
end
|
18
|
-
|
19
|
-
unless
|
20
|
-
puts
|
18
|
+
@config = YAML.load(File.read(@aws_config_file_path))
|
19
|
+
unless @config.kind_of?(Hash)
|
20
|
+
puts 'Parse Error'
|
21
21
|
Awscli::Errors.missing_credentials
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
def request_ec2
|
25
|
+
def request_ec2(region=nil)
|
26
26
|
# => returns AWS Compute connection object
|
27
|
-
|
27
|
+
@config.merge!(:provider => 'AWS')
|
28
28
|
if region
|
29
29
|
#if user passes a region optionally
|
30
30
|
Awscli::Errors.invalid_region unless Awscli::Instances::REGIONS.include?(region)
|
31
|
-
|
32
|
-
|
31
|
+
@config.reject!{ |key| key == 'region' } if @config['region']
|
32
|
+
@config.merge!(:region => region)
|
33
33
|
else
|
34
|
-
if
|
35
|
-
Awscli::Errors.invalid_region unless Awscli::Instances::REGIONS.include?(@@config['region'])
|
36
|
-
end
|
34
|
+
Awscli::Errors.invalid_region unless Awscli::Instances::REGIONS.include?(@config['region']) if @config['region']
|
37
35
|
end
|
38
|
-
Fog::Compute.new(
|
36
|
+
Fog::Compute.new(@config)
|
39
37
|
end
|
40
38
|
|
41
|
-
def request_s3
|
39
|
+
def request_s3(region=nil)
|
42
40
|
# => returns S3 connection object
|
43
|
-
|
44
|
-
if
|
45
|
-
#remove region
|
46
|
-
@@config.reject!{ |k| k == "region" }
|
47
|
-
end
|
41
|
+
@config.merge!(:provider => 'AWS')
|
42
|
+
@config.reject!{ |key| key == 'region' } if @config['region']
|
48
43
|
#parse optionally passing region
|
49
44
|
if region
|
50
45
|
Awscli::Errors.invalid_region unless Awscli::Instances::REGIONS.include?(region)
|
51
|
-
|
46
|
+
@config.merge!(:region => region)
|
52
47
|
end
|
53
|
-
Fog::Storage.new(
|
48
|
+
Fog::Storage.new(@config)
|
54
49
|
end
|
55
50
|
|
56
51
|
def request_as
|
57
52
|
# => returns AWS Auto Scaling connection object
|
58
|
-
|
59
|
-
Fog::AWS::AutoScaling.new(@@config)
|
53
|
+
Fog::AWS::AutoScaling.new(@config)
|
60
54
|
end
|
61
55
|
|
62
56
|
def request_iam
|
63
57
|
# => returns AWS IAM object
|
64
|
-
if
|
65
|
-
|
66
|
-
|
58
|
+
@config.reject!{ |key| key == 'region' } if @config['region']
|
59
|
+
Fog::AWS::IAM.new(@config)
|
60
|
+
end
|
61
|
+
|
62
|
+
def request_emr(region=nil)
|
63
|
+
# => returns AWS EMR object
|
64
|
+
if region
|
65
|
+
Awscli::Errors.invalid_region unless Awscli::Instances::REGIONS.include?(region)
|
66
|
+
@config.reject!{ |key| key == 'region' } if @config['region']
|
67
|
+
@config.merge!(:region => region)
|
68
|
+
else
|
69
|
+
Awscli::Errors.invalid_region unless Awscli::Instances::REGIONS.include?(@config['region']) if @config['region']
|
67
70
|
end
|
68
|
-
Fog::AWS::
|
71
|
+
Fog::AWS::EMR.new(@config)
|
69
72
|
end
|
70
73
|
|
71
74
|
end
|
data/lib/awscli/ec2.rb
CHANGED
@@ -7,26 +7,26 @@ module Awscli
|
|
7
7
|
# params:
|
8
8
|
# connection: Awscli::Connection.new.request_ec2
|
9
9
|
# extra options hash
|
10
|
-
def initialize
|
11
|
-
|
10
|
+
def initialize(connection)
|
11
|
+
@conn = connection
|
12
12
|
end
|
13
13
|
|
14
14
|
# list instances from a specified region in a tabular format
|
15
15
|
def list_instances
|
16
|
-
|
16
|
+
@conn.servers.table([:id, :dns_name, :flavor_id, :groups, :image_id, :key_name, :private_ip_address,
|
17
17
|
:public_ip_address, :root_device_type, :security_group_ids, :state, :tags])
|
18
18
|
end
|
19
19
|
|
20
20
|
# list available instance types
|
21
21
|
def list_flavors
|
22
|
-
|
22
|
+
@conn.flavors.table
|
23
23
|
end
|
24
24
|
|
25
25
|
# describe instance attributes - returns information about an attribute of an instance. You can get information
|
26
26
|
# only one attribute per call.
|
27
|
-
#
|
27
|
+
# Available attributes to request: instanceType, kernel, ramdisk, userData, disableApiTermination, instanceInitiatedShutdownBehavior,
|
28
28
|
# rootDeviceName, blockDeviceMapping, sourceDestCheck, groupSet
|
29
|
-
def describe_instance_attribute
|
29
|
+
def describe_instance_attribute(instance_id, request)
|
30
30
|
valid_requests = %w(architecture ami_launch_index availability_zone block_device_mapping network_interfaces client_token
|
31
31
|
dns_name ebs_optimized groups flavor_id iam_instance_profile image_id instance_initiated_shutdown_behavior
|
32
32
|
kernel_id key_name created_at monitoring placement_group platform private_dns_name private_ip_address
|
@@ -34,14 +34,14 @@ module Awscli
|
|
34
34
|
tenancy tags user_data vpc_id volumes username)
|
35
35
|
#more options
|
36
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 =
|
37
|
+
response = @conn.servers.get(instance_id)
|
38
38
|
abort "Invalid Attribute, available attributes to request: #{valid_requests}" unless valid_requests.include?(request)
|
39
|
-
abort "InstanceId Not found :#{instance_id}, Available instnaces #{
|
39
|
+
abort "InstanceId Not found :#{instance_id}, Available instnaces #{@conn.servers.map { |x| x.id }}" unless response
|
40
40
|
puts "#{request}: #{response.send(request)}"
|
41
41
|
end
|
42
42
|
|
43
43
|
# modifies an attribute of an instance
|
44
|
-
def modify_instance_attribute
|
44
|
+
def modify_instance_attribute(instance_id, attributename, attributevalue)
|
45
45
|
attrs_lookup = {
|
46
46
|
'isize' => 'InstanceType',
|
47
47
|
'kernel' => 'Kernel',
|
@@ -53,36 +53,36 @@ module Awscli
|
|
53
53
|
'group_id' => 'GroupId'
|
54
54
|
}
|
55
55
|
valid_attributes = %w(InstanceType Kernel Ramdisk UserData DisableApiTermination InstanceInitiatedShutdownBehavior SourceDestCheck GroupId)
|
56
|
-
response =
|
57
|
-
abort "InstanceId Not found :#{instance_id}, Available instnaces #{
|
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
58
|
abort "Instance should be in stopped state to modify its attributes" if response.state != 'stopped'
|
59
59
|
puts "#{instance_id}, #{attributename}, #{attributevalue}"
|
60
60
|
if attrs_lookup[attributename] == 'GroupId' #handle groupid which is array
|
61
61
|
puts "#{instance_id}, #{attrs_lookup[attributename]} => #{attributevalue}"
|
62
|
-
|
62
|
+
@conn.modify_instance_attribute(instance_id, attrs_lookup[attributename] => attributevalue)
|
63
63
|
else
|
64
64
|
puts "#{instance_id}, #{attrs_lookup[attributename]}.Value => #{attributevalue}"
|
65
|
-
|
65
|
+
@conn.modify_instance_attribute(instance_id, "#{attrs_lookup[attributename]}.Value" => attributevalue)
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
69
|
# reset instance attribute
|
70
|
-
def reset_instance_attribute
|
71
|
-
end
|
70
|
+
#def reset_instance_attribute(instance_id, attribute)
|
71
|
+
#end
|
72
72
|
|
73
73
|
#create a single instance with options passed
|
74
|
-
def create_instance
|
74
|
+
def create_instance(options)
|
75
75
|
#validate required options
|
76
|
-
puts
|
77
|
-
abort "Invalid Key: #{options[:key_name]}" unless
|
76
|
+
puts 'Validating Options ...'
|
77
|
+
abort "Invalid Key: #{options[:key_name]}" unless @conn.key_pairs.get(options[:key_name])
|
78
78
|
options[:groups].each do |sg|
|
79
|
-
abort "Invalid Group: #{sg}" unless
|
79
|
+
abort "Invalid Group: #{sg}" unless @conn.security_groups.get(sg)
|
80
80
|
end
|
81
|
-
abort "Invalid AMI: #{options[:image_id]}" unless
|
82
|
-
abort "Invalid Instance Flavor: #{options[:flavor_id]}" unless
|
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
83
|
#validate optional options
|
84
84
|
if options[:availability_zone]
|
85
|
-
available_zones =
|
85
|
+
available_zones = @conn.describe_availability_zones.body['availabilityZoneInfo'].map { |az| az['zoneName'] }
|
86
86
|
abort "Invalid AvailabilityZone: #{options[:availability_zone]}" unless available_zones.include?(options[:availability_zone])
|
87
87
|
end
|
88
88
|
opts = Marshal.load(Marshal.dump(options))
|
@@ -109,7 +109,7 @@ module Awscli
|
|
109
109
|
mapping['Ebs.VolumeSize'] = volume_size if !volume_size.nil? && !volume_size.empty?
|
110
110
|
mapping['Ebs.DeleteOnTermination'] = delete_on_termination if !delete_on_termination.nil? && !delete_on_termination.empty?
|
111
111
|
else
|
112
|
-
abort
|
112
|
+
abort 'Cannot validate block_device'
|
113
113
|
end
|
114
114
|
block_device_mapping << mapping
|
115
115
|
end
|
@@ -118,110 +118,110 @@ module Awscli
|
|
118
118
|
opts.merge!(:block_device_mapping => block_device_mapping)
|
119
119
|
end
|
120
120
|
wait_for_server = options[:wait_for] && opts.reject! { |k| k == 'wait_for' }
|
121
|
-
puts
|
122
|
-
puts
|
123
|
-
server =
|
121
|
+
puts 'Validating Options ... OK'
|
122
|
+
puts 'Creating Server'
|
123
|
+
server = @conn.servers.create(opts)
|
124
124
|
#wait for server to get created and return public_dns
|
125
125
|
if wait_for_server
|
126
|
-
print
|
126
|
+
print 'Waiting for server to get created'
|
127
127
|
server.wait_for { print "."; ready? }
|
128
128
|
puts
|
129
129
|
puts "Server dns_name: #{server.dns_name}"
|
130
130
|
end
|
131
131
|
end
|
132
132
|
|
133
|
-
|
134
|
-
def run_instances options
|
135
|
-
end
|
133
|
+
## create a new instance(s)
|
134
|
+
#def run_instances options
|
135
|
+
#end
|
136
136
|
|
137
|
-
# describe
|
138
|
-
def describe_instance_status
|
139
|
-
response =
|
137
|
+
# describe instance status
|
138
|
+
def describe_instance_status(instnace_id)
|
139
|
+
response = @conn.servers.get(instance_id)
|
140
140
|
abort "InstanceId Not found :#{instance_id}" unless response
|
141
141
|
puts "Instance #{instance_id} State: #{response.state}"
|
142
142
|
end
|
143
143
|
|
144
|
-
|
145
|
-
def import_instance
|
146
|
-
end
|
144
|
+
## import instance as vm
|
145
|
+
#def import_instance
|
146
|
+
#end
|
147
147
|
|
148
|
-
|
148
|
+
#@conn.server.get(instanceid).(:reboot, :save, :setup, :start, :stop)
|
149
149
|
# reboot an instance
|
150
|
-
def reboot_instance
|
151
|
-
response =
|
150
|
+
def reboot_instance(instance_id)
|
151
|
+
response = @conn.servers.get(instance_id)
|
152
152
|
abort "InstanceId Not found :#{instance_id}" unless response
|
153
153
|
response.reboot
|
154
154
|
puts "Rebooting Instance: #{instance_id}"
|
155
155
|
end
|
156
156
|
|
157
157
|
# start a stopped instance
|
158
|
-
def stop_instance
|
159
|
-
response =
|
158
|
+
def stop_instance(instance_id)
|
159
|
+
response = @conn.servers.get(instance_id)
|
160
160
|
abort "InstanceId Not found :#{instance_id}" unless response
|
161
|
-
abort
|
161
|
+
abort 'Instance should be in running to stop it' if response.state != 'running'
|
162
162
|
response.stop
|
163
163
|
puts "Stopped Instance: #{instance_id}"
|
164
164
|
end
|
165
165
|
|
166
166
|
# stop a running isntance
|
167
|
-
def start_instance
|
168
|
-
response =
|
167
|
+
def start_instance(instance_id)
|
168
|
+
response = @conn.servers.get(instance_id)
|
169
169
|
abort "InstanceId Not found :#{instance_id}" unless response
|
170
|
-
abort
|
170
|
+
abort 'Instance should be stopped to start it' if response.state != 'stopped'
|
171
171
|
response.start
|
172
172
|
puts "Starting Instance: #{instance_id}"
|
173
173
|
end
|
174
174
|
|
175
175
|
# terminates an instance
|
176
|
-
def terminate_instance
|
177
|
-
response =
|
176
|
+
def terminate_instance(instance_id)
|
177
|
+
response = @conn.servers.get(instance_id)
|
178
178
|
abort "InstanceId Not found :#{instance_id}" unless response
|
179
179
|
unless response.state == 'terminated'
|
180
180
|
response.destroy
|
181
181
|
puts "Terminated Instance: #{instance_id}"
|
182
182
|
else
|
183
|
-
puts
|
183
|
+
puts 'Instance is already in terminated state'
|
184
184
|
end
|
185
185
|
end
|
186
186
|
|
187
|
-
def get_console_output
|
188
|
-
response =
|
187
|
+
def get_console_output(instance_id)
|
188
|
+
response = @conn.get_console_output(instance_id)
|
189
189
|
puts response
|
190
190
|
end
|
191
191
|
|
192
192
|
end # => EC2
|
193
193
|
|
194
194
|
class KeyPairs
|
195
|
-
def initialize
|
196
|
-
|
195
|
+
def initialize(connection)
|
196
|
+
@conn = connection
|
197
197
|
end
|
198
198
|
|
199
199
|
def list_keypairs
|
200
|
-
|
200
|
+
@conn.key_pairs.table
|
201
201
|
end
|
202
202
|
|
203
|
-
def create_keypair
|
203
|
+
def create_keypair(options)
|
204
204
|
#validate keypair
|
205
205
|
Fog.credential = 'awscli'
|
206
|
-
abort "KeyPair '#{options[:name]}' already exists" if
|
207
|
-
kp =
|
206
|
+
abort "KeyPair '#{options[:name]}' already exists" if @conn.key_pairs.get(options[:name])
|
207
|
+
kp = @conn.key_pairs.create(options)
|
208
208
|
puts "Created keypair: #{options[:name]}"
|
209
209
|
p kp.write #save the key to disk
|
210
210
|
end
|
211
211
|
|
212
|
-
def delete_keypair
|
213
|
-
abort "KeyPair '#{keypair}' does not exist" unless
|
214
|
-
|
212
|
+
def delete_keypair(keypair)
|
213
|
+
abort "KeyPair '#{keypair}' does not exist" unless @conn.key_pairs.get(keypair)
|
214
|
+
@conn.key_pairs.get(keypair).destroy
|
215
215
|
puts "Deleted Keypair: #{keypair}"
|
216
216
|
end
|
217
217
|
|
218
|
-
def fingerprint
|
219
|
-
response =
|
218
|
+
def fingerprint(keypair)
|
219
|
+
response = @conn.key_pairs.get(keypair)
|
220
220
|
abort "Cannot find key pair: #{keypair}" unless response
|
221
221
|
puts "Fingerprint for the key (#{keypair}): #{response.fingerprint}"
|
222
222
|
end
|
223
223
|
|
224
|
-
def import_keypair
|
224
|
+
def import_keypair(options)
|
225
225
|
#validate if the file exists
|
226
226
|
private_key_path = if options[:private_key_path]
|
227
227
|
File.expand_path(options[:private_key_path])
|
@@ -237,7 +237,7 @@ module Awscli
|
|
237
237
|
abort "Cannot find public_key_path: #{public_key_path}" unless File.exist?(public_key_path)
|
238
238
|
#validate if the key pair name exists
|
239
239
|
Fog.credentials = Fog.credentials.merge({ :private_key_path => private_key_path, :public_key_path => public_key_path })
|
240
|
-
|
240
|
+
@conn.import_key_pair(options[:name], IO.read(public_key_path)) if @conn.key_pairs.get(options[:name]).nil?
|
241
241
|
puts "Imported KeyPair with name: #{options[:name]} sucessfully, using public_key: #{public_key_path} and private_key: #{private_key_path}"
|
242
242
|
end
|
243
243
|
end # => KP
|
@@ -247,36 +247,36 @@ module Awscli
|
|
247
247
|
#Limitations: Ec2-Classic: user can have upto 500 groups
|
248
248
|
# Ec2-VPC: user can have 50 group per VPC
|
249
249
|
|
250
|
-
def initialize
|
251
|
-
|
250
|
+
def initialize(connection)
|
251
|
+
@conn = connection
|
252
252
|
end
|
253
253
|
|
254
|
-
def list_secgroups
|
254
|
+
def list_secgroups(options)
|
255
255
|
if options[:show_ip_permissions]
|
256
|
-
#
|
257
|
-
|
256
|
+
# @conn.security_groups.table([:name, :group_id, :ip_permissions])
|
257
|
+
@conn.security_groups.each do |sg|
|
258
258
|
id = sg.group_id
|
259
259
|
ip_permissions = sg.ip_permissions.to_yaml
|
260
260
|
Formatador.display_line("[green]#{id}[/]")
|
261
261
|
puts "#{ip_permissions}"
|
262
|
-
puts
|
262
|
+
puts '================='
|
263
263
|
end
|
264
264
|
else
|
265
|
-
|
265
|
+
@conn.security_groups.table([:name, :group_id, :description])
|
266
266
|
end
|
267
267
|
end
|
268
268
|
|
269
|
-
def authorize_securitygroup
|
269
|
+
def authorize_securitygroup(options)
|
270
270
|
# => Ingress regular traffic -> this action applies to both EC2 and VPC Security Groups
|
271
271
|
# Each rule consists of the protocol, plus cidr range or a source group,
|
272
272
|
#for TCP/UDP protocols you must also specify the dest port or port range
|
273
273
|
#for ICMP, you must specify the icmp type and code (-1 means all types/codes)
|
274
274
|
abort "Expecting Security group id(s) of the form: 'sg-xxxxxx'" unless options[:group_id] =~ /sg-\S{8}/
|
275
275
|
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]))$/
|
276
|
-
sg =
|
276
|
+
sg = @conn.security_groups.get_by_id(options[:group_id])
|
277
277
|
abort "Cannot find Security Group with Id: #{sg}" unless sg
|
278
278
|
begin
|
279
|
-
|
279
|
+
@conn.authorize_security_group_ingress(
|
280
280
|
"GroupId" => options[:group_id],
|
281
281
|
"IpProtocol" => options[:protocol_type],
|
282
282
|
"FromPort" => options[:start_port],
|
@@ -290,12 +290,12 @@ module Awscli
|
|
290
290
|
end
|
291
291
|
end
|
292
292
|
|
293
|
-
def revoke_securitygroup
|
293
|
+
def revoke_securitygroup(options)
|
294
294
|
abort "Expecting Security group id(s) of the form: 'sg-xxxxxx'" unless options[:group_id] =~ /sg-\S{8}/
|
295
|
-
sg =
|
295
|
+
sg = @conn.security_groups.get_by_id(options[:group_id])
|
296
296
|
abort "Cannot find Security Group with Id: #{sg}" unless sg
|
297
297
|
begin
|
298
|
-
response =
|
298
|
+
response = @conn.revoke_security_group_ingress(
|
299
299
|
"GroupId" => options[:group_id],
|
300
300
|
"IpProtocol" => options[:protocol_type],
|
301
301
|
"FromPort" => options[:start_port],
|
@@ -308,14 +308,14 @@ module Awscli
|
|
308
308
|
end
|
309
309
|
end
|
310
310
|
|
311
|
-
def create_securitygroup
|
312
|
-
abort "Error: Security Group => #{options[:name]} already exists" if
|
313
|
-
|
311
|
+
def create_securitygroup(options)
|
312
|
+
abort "Error: Security Group => #{options[:name]} already exists" if @conn.security_groups.get(options[:name])
|
313
|
+
@conn.security_groups.create(options)
|
314
314
|
puts "Created Security Group: #{options[:name]}"
|
315
315
|
end
|
316
316
|
|
317
|
-
def delete_securitygroup
|
318
|
-
sg =
|
317
|
+
def delete_securitygroup(options)
|
318
|
+
sg = @conn.security_groups.get_by_id(options[:group_id])
|
319
319
|
abort "Error: Cannot find Security Group with Id: #{sg}" unless sg
|
320
320
|
begin
|
321
321
|
sg.destroy
|
@@ -328,32 +328,32 @@ module Awscli
|
|
328
328
|
end # => SG
|
329
329
|
|
330
330
|
class Eip
|
331
|
-
def initialize
|
332
|
-
|
331
|
+
def initialize(connection)
|
332
|
+
@conn = connection
|
333
333
|
end
|
334
334
|
|
335
335
|
def list
|
336
|
-
|
336
|
+
@conn.addresses.table
|
337
337
|
end
|
338
338
|
|
339
339
|
def create
|
340
|
-
eip =
|
340
|
+
eip = @conn.addresses.create
|
341
341
|
puts "Created EIP: #{eip.public_ip}"
|
342
342
|
end
|
343
343
|
|
344
|
-
def delete
|
344
|
+
def delete(options)
|
345
345
|
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])$/
|
346
|
-
eip =
|
346
|
+
eip = @conn.addresses.get(options[:eip])
|
347
347
|
abort "Cannot find IP: #{options[:eip]}" unless eip
|
348
348
|
eip.destroy
|
349
349
|
puts "Deleted EIP: #{eip.public_ip}"
|
350
350
|
end
|
351
351
|
|
352
|
-
def associate
|
352
|
+
def associate(options)
|
353
353
|
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])$/
|
354
|
-
eip =
|
354
|
+
eip = @conn.addresses.get(options[:eip])
|
355
355
|
abort "Cannot find eip: #{options[:eip]}" unless eip
|
356
|
-
server =
|
356
|
+
server = @conn.servers.get(options[:instance_id])
|
357
357
|
abort "Cannot find server with id: #{options[:instance_id]}" unless server
|
358
358
|
begin
|
359
359
|
eip.server = server
|
@@ -363,25 +363,25 @@ module Awscli
|
|
363
363
|
end
|
364
364
|
end
|
365
365
|
|
366
|
-
def disassociate
|
366
|
+
def disassociate(options)
|
367
367
|
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])$/
|
368
|
-
abort "Cannot find EIP: #{options[:eip]}" unless
|
369
|
-
|
368
|
+
abort "Cannot find EIP: #{options[:eip]}" unless @conn.addresses.get(options[:eip])
|
369
|
+
@conn.disassociate_address(options[:eip])
|
370
370
|
puts "Disassociated EIP: #{options[:eip]}"
|
371
371
|
end
|
372
372
|
end # => Eip
|
373
373
|
|
374
374
|
class Ami
|
375
|
-
def initialize
|
376
|
-
|
375
|
+
def initialize(connection)
|
376
|
+
@conn = connection
|
377
377
|
end
|
378
378
|
|
379
|
-
def list
|
379
|
+
def list(filter)
|
380
380
|
puts filter
|
381
381
|
if filter.nil?
|
382
|
-
|
382
|
+
@conn.images.all.table([:architecture, :id, :is_public, :platform, :root_device_type, :state])
|
383
383
|
else
|
384
|
-
data =
|
384
|
+
data = @conn.images.all(filter)
|
385
385
|
data.empty? ? puts("No AMI's found for provided filters") : data.table([:architecture, :id, :is_public, :platform, :root_device_type, :state])
|
386
386
|
end
|
387
387
|
end
|
@@ -420,17 +420,17 @@ module Awscli
|
|
420
420
|
end
|
421
421
|
|
422
422
|
def list_amazon
|
423
|
-
|
423
|
+
@conn.images.all('owner-alias' => 'amazon').table([:architecture, :id, :is_public, :platform, :root_device_type, :state])
|
424
424
|
end
|
425
425
|
|
426
426
|
def list_self
|
427
|
-
response =
|
427
|
+
response = @conn.describe_images({'Owner' => 'self'}).body['imagesSet']
|
428
428
|
Formatador.display_table(response, ['architecture', 'imageId', 'isPublic', 'name', 'imageState', 'rootDeviceType', 'imageType'])
|
429
429
|
end
|
430
430
|
|
431
|
-
def create_image_from_instance
|
432
|
-
abort "Invalid Instace: #{options[:instance_id]}" unless
|
433
|
-
|
431
|
+
def create_image_from_instance(options)
|
432
|
+
abort "Invalid Instace: #{options[:instance_id]}" unless @conn.servers.get(options[:instance_id])
|
433
|
+
@conn.create_image(
|
434
434
|
options[:instance_id],
|
435
435
|
options[:name],
|
436
436
|
options[:desc],
|
@@ -439,67 +439,67 @@ module Awscli
|
|
439
439
|
puts "Created image from instance: #{options[:instance_id]}"
|
440
440
|
end
|
441
441
|
|
442
|
-
def deregister
|
443
|
-
image =
|
442
|
+
def deregister(image_id)
|
443
|
+
image = @conn.images.get(image_id)
|
444
444
|
abort "Cannot find image with id: #{image_id}" unless image
|
445
|
-
|
445
|
+
@conn.deregister_image(image_id)
|
446
446
|
say "De-registerd image: <%= color('#{image_id}', :green) %>"
|
447
447
|
end
|
448
448
|
|
449
449
|
end # => AMI
|
450
450
|
|
451
451
|
class Ebs
|
452
|
-
def initialize
|
453
|
-
|
452
|
+
def initialize(connection)
|
453
|
+
@conn = connection
|
454
454
|
end
|
455
455
|
|
456
|
-
def list
|
456
|
+
def list(options)
|
457
457
|
unless options[:snapshots]
|
458
|
-
|
458
|
+
@conn.volumes.table([:availability_zone, :delete_on_termination, :device, :id, :server_id, :size, :snapshot_id, :state, :tags, :type])
|
459
459
|
else
|
460
|
-
|
460
|
+
@conn.snapshots.table([:id, :owner_id, :volume_id, :state, :progress, :tags, :description])
|
461
461
|
end
|
462
462
|
end
|
463
463
|
|
464
|
-
def create
|
465
|
-
|
464
|
+
def create(options)
|
465
|
+
@conn.volumes.create(options)
|
466
466
|
end
|
467
467
|
|
468
|
-
def attach_volume
|
468
|
+
def attach_volume(options)
|
469
469
|
#The volume and instance must be in the same Availability Zone.
|
470
|
-
volume =
|
470
|
+
volume = @conn.volumes.get(options[:volume_id])
|
471
471
|
volume.merge_attributes(:device => options[:device])
|
472
|
-
server =
|
472
|
+
server = @conn.servers.get(options[:instance_id])
|
473
473
|
abort "Cannot find volume: #{options[:volume_id]}" unless volume
|
474
474
|
abort "Cannot find instance: #{options[:instance_id]}" unless server
|
475
475
|
volume.server = server
|
476
476
|
puts "Attached volume: #{options[:volume_id]} to instance: #{options[:instance_id]}"
|
477
477
|
end
|
478
478
|
|
479
|
-
def detach_volume
|
479
|
+
def detach_volume(options)
|
480
480
|
#Check if the volume is mounted and show warning regarding data loss
|
481
|
-
volume =
|
481
|
+
volume = @conn.volumes.get(options[:volume_id])
|
482
482
|
abort "Cannot find volume: #{options[:volume_id]}" unless volume
|
483
483
|
if options[:force]
|
484
484
|
volume.force_detach
|
485
485
|
else
|
486
|
-
|
486
|
+
@conn.detach_volume(options[:volume_id])
|
487
487
|
end
|
488
488
|
puts "Detached volume: #{options[:volume_id]}"
|
489
489
|
end
|
490
490
|
|
491
|
-
def delete_volume
|
492
|
-
vol =
|
491
|
+
def delete_volume(options)
|
492
|
+
vol = @conn.volumes.get(options[:volume_id])
|
493
493
|
abort "Cannot find volume #{options[:volume_id]}" unless vol
|
494
494
|
vol.destroy
|
495
495
|
puts "Deleted volume: #{options[:volume_id]}"
|
496
496
|
end
|
497
497
|
|
498
498
|
def delete_detached
|
499
|
-
vols =
|
499
|
+
vols = @conn.volumes.all('status' => 'available')
|
500
500
|
unless vols.empty?
|
501
|
-
if agree(
|
502
|
-
puts
|
501
|
+
if agree('Are you sure want to delete all the all volumes that are not in use ? ')
|
502
|
+
puts 'Deleting all volumes which are not in use ...'
|
503
503
|
vols.each do |vol|
|
504
504
|
vol.destroy
|
505
505
|
end
|
@@ -509,20 +509,20 @@ module Awscli
|
|
509
509
|
end
|
510
510
|
end
|
511
511
|
|
512
|
-
def create_snapshot
|
513
|
-
abort "Cannot find volume: #{options[:volume_id]}" unless
|
514
|
-
|
512
|
+
def create_snapshot(options)
|
513
|
+
abort "Cannot find volume: #{options[:volume_id]}" unless @conn.volumes.get(options[:volume_id])
|
514
|
+
@conn.snapshots.create(options)
|
515
515
|
puts "Created snapshot"
|
516
516
|
end
|
517
517
|
|
518
|
-
def copy_snapshot
|
519
|
-
# abort "Cannot find snapshot: #{options[:snapshot_id]}" unless
|
520
|
-
|
518
|
+
def copy_snapshot(options)
|
519
|
+
# abort "Cannot find snapshot: #{options[:snapshot_id]}" unless @conn.snapshots.get(options[:snapshot_id])
|
520
|
+
@conn.copy_snapshot(options[:snapshot_id], options[:source_region])
|
521
521
|
puts "Copied snapshot"
|
522
522
|
end
|
523
523
|
|
524
|
-
def delete_snapshot
|
525
|
-
snap =
|
524
|
+
def delete_snapshot(options)
|
525
|
+
snap = @conn.snapshots.get(options[:snapshot_id])
|
526
526
|
abort "Cannot find snapshot: #{options[:snapshot_id]}" unless snap
|
527
527
|
snap.destroy
|
528
528
|
puts "Deleted snapshot"
|
@@ -530,87 +530,87 @@ module Awscli
|
|
530
530
|
end # => EBS
|
531
531
|
|
532
532
|
class Monitor
|
533
|
-
def initialize
|
534
|
-
|
533
|
+
def initialize(connection)
|
534
|
+
@conn = connection
|
535
535
|
end
|
536
536
|
|
537
|
-
def monitor
|
537
|
+
def monitor(options)
|
538
538
|
options[:instance_ids].each do |instance|
|
539
|
-
abort "Invalid InstanceId: #{instance}" unless
|
539
|
+
abort "Invalid InstanceId: #{instance}" unless @conn.servers.get(instance)
|
540
540
|
end
|
541
|
-
|
541
|
+
@conn.monitor_instances(options[:instance_ids])
|
542
542
|
puts "Enabled monitoring for instnaces: #{options[:instance_ids].join(",")}"
|
543
543
|
end
|
544
544
|
|
545
|
-
def unmonitor
|
545
|
+
def unmonitor(options)
|
546
546
|
options[:instance_ids].each do |instance|
|
547
|
-
abort "Invalid InstanceId: #{instance}" unless
|
547
|
+
abort "Invalid InstanceId: #{instance}" unless @conn.servers.get(instance)
|
548
548
|
end
|
549
|
-
|
549
|
+
@conn.unmonitor_instances(options[:instance_ids])
|
550
550
|
puts "Disabled monitoring for instnaces: #{options[:instance_ids].join(",")}"
|
551
551
|
end
|
552
552
|
end # => Monitor
|
553
553
|
|
554
554
|
class Tags
|
555
|
-
def initialize
|
556
|
-
|
555
|
+
def initialize(connection)
|
556
|
+
@conn = connection
|
557
557
|
end
|
558
558
|
|
559
559
|
def list
|
560
|
-
|
560
|
+
@conn.tags.table
|
561
561
|
end
|
562
562
|
|
563
|
-
def create
|
564
|
-
|
565
|
-
puts
|
563
|
+
def create(options)
|
564
|
+
@conn.tags.create(options)
|
565
|
+
puts 'Created Tag'
|
566
566
|
end
|
567
567
|
|
568
|
-
def delete
|
569
|
-
|
570
|
-
puts
|
568
|
+
def delete(options)
|
569
|
+
@conn.tags.destroy(options)
|
570
|
+
puts 'Deleted Tag'
|
571
571
|
end
|
572
572
|
end # => Tags
|
573
573
|
|
574
574
|
class Placement
|
575
|
-
def initialize
|
576
|
-
|
575
|
+
def initialize(connection)
|
576
|
+
@conn = connection
|
577
577
|
end
|
578
578
|
|
579
579
|
def list
|
580
|
-
|
580
|
+
@conn.describe_placement_groups
|
581
581
|
end
|
582
582
|
|
583
|
-
def create
|
584
|
-
|
583
|
+
def create(options)
|
584
|
+
@conn.create_placement_group(options[:name], options[:strategy])
|
585
585
|
puts "Created a new placement group: #{options[:name]}"
|
586
586
|
end
|
587
587
|
|
588
|
-
def delete
|
589
|
-
|
588
|
+
def delete(options)
|
589
|
+
@conn.delete_placement_group(options[:name])
|
590
590
|
puts "Deleted placement group: #{options[:name]}"
|
591
591
|
end
|
592
592
|
end # => Placement
|
593
593
|
|
594
594
|
class ReservedInstances
|
595
|
-
def initialize
|
596
|
-
|
595
|
+
def initialize(connection)
|
596
|
+
@conn = connection
|
597
597
|
end
|
598
598
|
|
599
|
-
def list
|
599
|
+
def list(filters)
|
600
600
|
puts filters
|
601
601
|
if filters.nil?
|
602
|
-
|
602
|
+
@conn.describe_reserved_instances.body['reservedInstancesSet']
|
603
603
|
else
|
604
|
-
|
604
|
+
@conn.describe_reserved_instances(filters).body['reservedInstancesSet']
|
605
605
|
end
|
606
606
|
end
|
607
607
|
|
608
|
-
def list_offerings
|
608
|
+
def list_offerings(filters)
|
609
609
|
puts filters
|
610
610
|
response = if filters.nil?
|
611
|
-
|
611
|
+
@conn.describe_reserved_instances_offerings.body['reservedInstancesOfferingsSet']
|
612
612
|
else
|
613
|
-
|
613
|
+
@conn.describe_reserved_instances_offerings(filters).body['reservedInstancesOfferingsSet']
|
614
614
|
end
|
615
615
|
Formatador.display_table(response)
|
616
616
|
end
|
@@ -633,30 +633,30 @@ module Awscli
|
|
633
633
|
Formatador.display_table(filters, [:filter_name, :desc, :availability])
|
634
634
|
end
|
635
635
|
|
636
|
-
def purchase
|
637
|
-
|
636
|
+
def purchase(options)
|
637
|
+
@conn.purchase_reserved_instances_offering(options[:reserved_instances_offering_id], options[:instance_count])
|
638
638
|
end
|
639
639
|
end # => ReservedInstances
|
640
640
|
|
641
641
|
class Spot
|
642
|
-
def initialize
|
643
|
-
|
642
|
+
def initialize(connection)
|
643
|
+
@conn = connection
|
644
644
|
end
|
645
645
|
|
646
646
|
def describe_spot_requests
|
647
|
-
|
647
|
+
@conn.spot_requests.table
|
648
648
|
end
|
649
649
|
|
650
650
|
def describe_spot_datafeed_subscription
|
651
|
-
|
651
|
+
@conn.describe_spot_datafeed_subscription
|
652
652
|
end
|
653
653
|
|
654
|
-
def describe_spot_price_history
|
654
|
+
def describe_spot_price_history(filters)
|
655
655
|
puts filters
|
656
656
|
response = if filters.nil?
|
657
|
-
|
657
|
+
@conn.describe_spot_price_history.body['spotPriceHistorySet']
|
658
658
|
else
|
659
|
-
|
659
|
+
@conn.describe_spot_price_history(filters).body['spotPriceHistorySet']
|
660
660
|
end
|
661
661
|
Formatador.display_table(response)
|
662
662
|
end
|
@@ -671,21 +671,21 @@ module Awscli
|
|
671
671
|
Formatador.display_table(filters, [:filter_name, :desc])
|
672
672
|
end
|
673
673
|
|
674
|
-
def create_spot_datafeed_subsription
|
675
|
-
|
674
|
+
def create_spot_datafeed_subsription(bucket, prefix)
|
675
|
+
@conn.create_spot_datafeed_subscription(bucket, prefix)
|
676
676
|
end
|
677
677
|
|
678
678
|
def delete_spot_datafeed_subsription
|
679
|
-
|
679
|
+
@conn.delete_spot_datafeed_subscription
|
680
680
|
end
|
681
681
|
|
682
|
-
def request_spot_instances
|
683
|
-
sr =
|
682
|
+
def request_spot_instances(options)
|
683
|
+
sr = @conn.spot_requests.create(options)
|
684
684
|
puts "Created spot request: #{sr.id}"
|
685
685
|
end
|
686
686
|
|
687
|
-
def cancel_spot_instance_requests
|
688
|
-
sr =
|
687
|
+
def cancel_spot_instance_requests(sid)
|
688
|
+
sr = @conn.spot_requests.get(sid)
|
689
689
|
abort "Cannot find spot request with id: #{sid}" unless sr
|
690
690
|
sr.destroy
|
691
691
|
puts "Deleted spot request: #{sid}"
|
@@ -693,21 +693,21 @@ module Awscli
|
|
693
693
|
end # => Spot
|
694
694
|
|
695
695
|
class Vpc
|
696
|
-
def initialize
|
697
|
-
|
696
|
+
def initialize(connection)
|
697
|
+
@conn = connection
|
698
698
|
end
|
699
699
|
|
700
700
|
def list
|
701
|
-
|
701
|
+
@conn.vpcs.table
|
702
702
|
end
|
703
703
|
|
704
|
-
def create
|
705
|
-
vpc =
|
704
|
+
def create(options)
|
705
|
+
vpc = @conn.vpcs.create(options)
|
706
706
|
puts "Created VPC: #{vpc.id}"
|
707
707
|
end
|
708
708
|
|
709
|
-
def delete
|
710
|
-
vpc =
|
709
|
+
def delete(vpc_id)
|
710
|
+
vpc = @conn.vpcs.get(vpc_id)
|
711
711
|
abort "cannot find vpc: #{vpc_id}" unless vpc
|
712
712
|
vpc.destroy
|
713
713
|
puts "Deleted VPC : #{vpc_id}"
|
@@ -715,21 +715,21 @@ module Awscli
|
|
715
715
|
end # => Vpc
|
716
716
|
|
717
717
|
class Subnet
|
718
|
-
def initialize
|
719
|
-
|
718
|
+
def initialize(connection)
|
719
|
+
@conn = connection
|
720
720
|
end
|
721
721
|
|
722
722
|
def list
|
723
|
-
|
723
|
+
@conn.subnets.table
|
724
724
|
end
|
725
725
|
|
726
|
-
def create
|
727
|
-
subnet =
|
726
|
+
def create(options)
|
727
|
+
subnet = @conn.subnets.create(options)
|
728
728
|
puts "Created Subnet: #{subnet.id}"
|
729
729
|
end
|
730
730
|
|
731
|
-
def delete
|
732
|
-
subnet =
|
731
|
+
def delete(subnet_id)
|
732
|
+
subnet = @conn.subnets.get(subnet_id)
|
733
733
|
abort "Cannot find subnet: #{subnet_id}" unless subnet
|
734
734
|
subnet.destroy
|
735
735
|
puts "Deleted subnet: #{subnet_id}"
|
@@ -737,57 +737,57 @@ module Awscli
|
|
737
737
|
end # => Subnet
|
738
738
|
|
739
739
|
class NetworkAcl
|
740
|
-
def initialize
|
741
|
-
|
740
|
+
def initialize(connection)
|
741
|
+
@conn = connection
|
742
742
|
end
|
743
743
|
|
744
744
|
def list
|
745
|
-
puts
|
745
|
+
puts 'Listing Network Acls'
|
746
746
|
end
|
747
747
|
|
748
748
|
end # => NetworkAcl
|
749
749
|
|
750
750
|
class NetworkInterfaces
|
751
|
-
def initialize
|
752
|
-
|
751
|
+
def initialize(connection)
|
752
|
+
@conn = connection
|
753
753
|
end
|
754
754
|
|
755
755
|
def list
|
756
|
-
|
756
|
+
@conn.network_interfaces.table
|
757
757
|
end
|
758
758
|
|
759
|
-
def create
|
760
|
-
nic =
|
759
|
+
def create(options)
|
760
|
+
nic = @conn.network_interfaces.create(options)
|
761
761
|
puts "Create network interface #{nic.network_interface_id}"
|
762
762
|
end
|
763
763
|
|
764
|
-
def delete
|
765
|
-
nic =
|
764
|
+
def delete(nic_id)
|
765
|
+
nic = @conn.network_interfaces.get(nic_id)
|
766
766
|
abort "Cannot find nic with id: #{nic_id}" unless nic
|
767
767
|
nic.destroy
|
768
768
|
puts "Deleted network interface #{nic_id}"
|
769
769
|
end
|
770
770
|
|
771
|
-
def attach
|
772
|
-
|
771
|
+
def attach(nic_id, instance_id, device_index)
|
772
|
+
@conn.attach_network_interface(nic_id, instance_id, device_index)
|
773
773
|
puts "Attached Network Interface: #{nic_id} to instance: #{instance_id}"
|
774
774
|
end
|
775
775
|
|
776
|
-
def deattach
|
777
|
-
|
778
|
-
puts "
|
776
|
+
def deattach(attachement_id, force)
|
777
|
+
@conn.detach_network_interface attachement_id, force
|
778
|
+
puts "Detached Network Interface with attachement_id: #{attachement_id}"
|
779
779
|
end
|
780
780
|
|
781
|
-
def modify_attribute
|
781
|
+
def modify_attribute(options)
|
782
782
|
case options[:attribute]
|
783
783
|
when 'description'
|
784
|
-
|
784
|
+
@conn.modify_network_interface_attribute(options[:network_interface_id], 'description', options[:description])
|
785
785
|
when 'groupSet'
|
786
|
-
|
786
|
+
@conn.modify_network_interface_attribute(options[:network_interface_id], 'groupSet', options[:group_set])
|
787
787
|
when 'sourceDestCheck'
|
788
|
-
|
788
|
+
@conn.modify_network_interface_attribute(options[:network_interface_id], 'sourceDestCheck', options[:source_dest_check])
|
789
789
|
when 'attachment'
|
790
|
-
|
790
|
+
@conn.modify_network_interface_attribute(options[:network_interface_id], 'attachment', options[:attachment])
|
791
791
|
else
|
792
792
|
abort "Invalid attribute: #{options[:attribute]}"
|
793
793
|
end
|
@@ -795,56 +795,56 @@ module Awscli
|
|
795
795
|
end # => NetworkInterfaces
|
796
796
|
|
797
797
|
class InternetGateways
|
798
|
-
def initialize
|
799
|
-
|
798
|
+
def initialize(connection)
|
799
|
+
@conn = connection
|
800
800
|
end
|
801
801
|
|
802
802
|
def list
|
803
|
-
|
803
|
+
@conn.internet_gateways.table
|
804
804
|
end
|
805
805
|
|
806
806
|
def create
|
807
|
-
gw =
|
807
|
+
gw = @conn.internet_gateways.create
|
808
808
|
puts "Created Internet Gateway: #{gw.id}"
|
809
809
|
end
|
810
810
|
|
811
|
-
def delete
|
812
|
-
gw =
|
811
|
+
def delete(gwid)
|
812
|
+
gw = @conn.internet_gateways.get(gwid)
|
813
813
|
gw.destroy
|
814
814
|
puts "Deleted Internet Gateway: #{gwid}"
|
815
815
|
end
|
816
816
|
|
817
|
-
def attach
|
818
|
-
|
817
|
+
def attach(gwid, vpcid)
|
818
|
+
@conn.internet_gateways.attach(gwid, vpcid)
|
819
819
|
puts "Attached InternetGateway: #{gwid} to VPC: #{vpcid}"
|
820
820
|
end
|
821
821
|
|
822
|
-
def deattach
|
823
|
-
|
824
|
-
puts "
|
822
|
+
def deattach(gwid, vpcid)
|
823
|
+
@conn.internet_gateways.deattach(gwid, vpcid)
|
824
|
+
puts "Detached InternetGateway: #{gwid} from VPC: #{vpcid}"
|
825
825
|
end
|
826
826
|
end # => InternetGateways
|
827
827
|
|
828
828
|
class Dhcp
|
829
|
-
def initialize
|
830
|
-
|
829
|
+
def initialize(connection)
|
830
|
+
@conn = connection
|
831
831
|
end
|
832
832
|
|
833
833
|
def list
|
834
|
-
|
834
|
+
@conn.dhcp_options.table
|
835
835
|
end
|
836
836
|
|
837
|
-
def create
|
838
|
-
|
837
|
+
def create(options)
|
838
|
+
@conn.dhcp_options.create(options)
|
839
839
|
end
|
840
840
|
|
841
|
-
def delete
|
842
|
-
dhcp =
|
841
|
+
def delete(dhcp_id)
|
842
|
+
dhcp = @conn.dhcp_options(dhcp_id)
|
843
843
|
dhcp.destroy
|
844
844
|
end
|
845
845
|
|
846
|
-
def associate
|
847
|
-
|
846
|
+
def associate(dhcp_id, vpc_id)
|
847
|
+
@conn.dhcp_options.attach(dhcp_id, vpc_id)
|
848
848
|
end
|
849
849
|
end # => Dhcp
|
850
850
|
|