awscli 0.1.2 → 0.1.3
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
- 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
|
|