awscli 0.0.3 → 0.0.4

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