cucloud 0.5.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- Y2I4NDQwZTdiOTNjZDdlNmJlYmE3NTM4YTIxNWIyN2QwYTU1YzFmMA==
4
+ OTI1MTYwMTY3YzBhZDI0YjA5YjBjM2M0NDc3MGMzYjA1YzAwZDZjZQ==
5
5
  data.tar.gz: !binary |-
6
- NGI4NWI2ZWE0NGVkODUyZWU3ZWQ1NWZjNWE0NTJjYmQ4MWU1MDNmNw==
6
+ NTI0MjVhN2M1MGE0MDE2Mjc1NmNlZTIzZWYyZmVhNDJjZDRhYTM0Mg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- N2U5YTQ1ZGRlZjkzY2M3MGZlYzliMDYwN2YxMDI2MWFlOWQwZmMwN2UyM2Y5
10
- Yzg3ZTQ1ZjkxYTMwMGZhZjNmYTA0MmNkMmQ3MmQwODJlZTk2MDBiYmIyMTYx
11
- NTFjMWNlYmY1MDcwM2RmYjRlYzdhZTcwMTg1NGZjZGM1ZjViODI=
9
+ Mzk2YjU0MTNlZDJmMWRiMmJlOGYxNzUxZGI1MGVjMzRhNDFjZGJiNDY1NjI3
10
+ MTg3YjhkM2I2MzhmMjI0YjZhMDBmN2FkZGMzMDFlYzBlNWQ4Yjc1ZTgzMTcy
11
+ MjQ2OWQ3NzcwYWRmOWVmODg5ZTEwMzc5NTM0YzBiOTBhYzYzMmY=
12
12
  data.tar.gz: !binary |-
13
- OTY1YjdhN2ExZDgwNjllYjVmMGI2YTllN2Q0NDUzYjNiOTVlYjgyZTM1Y2Rh
14
- OGRmMGM0ZmFjMzMyMjI0NGQxM2I2OGY5YmU0ODU3ZmI3NjQwYzdmNmZlMTFm
15
- YjdmMGY0NmRjMjg5M2NmNzk4NzcxZjFmM2RhZTcwNWQwNWEwNjk=
13
+ MWVlMDNkYTY5NzgxZDQ1YmE3ODk2MThjMGQ2ZWMzN2JiNzMxYmQ1MTA3MDU5
14
+ ZGI3ODZiYjE3MGY2ZTQ1MTZmZWJhYTUyMDM2MzNlYmZiMjMyYTkwYTAzYTQy
15
+ OWNiODUxOTAwYjRkOGRlYzc4YjdjOGI4Mjk0NWVlM2RhODNmNmI=
data/.rubocop.yml CHANGED
@@ -19,3 +19,6 @@ Metrics/PerceivedComplexity:
19
19
  # disable get/set warnings - many of our methods are performing API calls and get_ seems appropriate naming
20
20
  Style/AccessorMethodName:
21
21
  Enabled: false
22
+
23
+ Metrics/ClassLength:
24
+ Max: 200
@@ -3,16 +3,33 @@ module Cucloud
3
3
  class Ec2Utils
4
4
  # This is the command sent to ubuntu for patching
5
5
  UBUNTU_PATCH_COMMAND = 'apt-get update; apt-get -y upgrade; reboot'.freeze
6
- # THis is the command sent to amazon linux machines for patching
6
+ # This is the command sent to amazon linux machines for patching
7
7
  AMAZON_PATCH_COMMAND = 'yum update -y; reboot & disown '.freeze
8
+ # Used in time calculations
9
+ SECONDS_IN_A_DAY = 86_400
10
+ # Max attemps for a waiter to try
11
+ WAITER_MAX_ATTEMPS = 240
12
+ # Delay between calls used by waiter to check status
13
+ WAITER_DELAY = 15
8
14
 
9
15
  def initialize(ec2_client = Aws::EC2::Client.new, ssm_utils = Cucloud::SSMUtils.new)
10
16
  @ec2 = ec2_client
11
17
  @ssm_utils = ssm_utils
12
18
  end
13
19
 
20
+ # Get instnace object
21
+ # @param instance_id [String] instance id in the format of i-121231231231
22
+ # @return [Aws::EC2::Instance] Object represneting the intance see
23
+ # http://docs.aws.amazon.com/sdkforruby/api/Aws/EC2/Instance.html
24
+ def get_instance(instance_id)
25
+ Aws::EC2::Instance.new(id: instance_id, client: @ec2)
26
+ end
27
+
14
28
  # Get instance information for a specific instance
15
- def get_instance(instance)
29
+ # @param instance [String] instance id in the format of i-121231231231
30
+ # @return [array] aws reservations see
31
+ # http://docs.aws.amazon.com/sdkforruby/api/Aws/EC2/Client.html#describe_instances-instance_method
32
+ def get_instance_information(instance)
16
33
  @ec2.describe_instances(instance_ids: [instance])
17
34
  end
18
35
 
@@ -125,5 +142,77 @@ module Cucloud
125
142
 
126
143
  all_instances
127
144
  end
145
+
146
+ # Get the nice name of the ec2 intsance from the 'Name" tag'
147
+ # @param instance_id [String] instance id in the format of i-121231231231
148
+ # @return [String] Name of instacnce if found or nil if not found
149
+ def get_instance_name(instance_id)
150
+ instance = get_instance(instance_id)
151
+ tag_name = instance.tags.find { |tag| tag.key.eql?('Name') }
152
+ tag_name ? tag_name.value : nil
153
+ end
154
+
155
+ # Create a snapshot of an EBS volume and apply supplied tags
156
+ # will wait 20 minutes for the process to completed
157
+ # @param volume_id [String] volume id in the formate of vol-121231231231
158
+ # @param snapshot_desc [String] Description of the snapshot
159
+ # @param tags [Array] Array of key value pairs to be applied as tags to the snapshot
160
+ # @return snapshot information see
161
+ # http://docs.aws.amazon.com/sdkforruby/api/Aws/EC2/Client.html#create_tags-instance_method
162
+ def create_ebs_snapshot(volume_id, snapshot_desc, tags = [])
163
+ snapshot_info = @ec2.create_snapshot(
164
+ volume_id: volume_id,
165
+ description: snapshot_desc
166
+ )
167
+
168
+ @ec2.wait_until(:snapshot_completed, snapshot_ids: [snapshot_info.snapshot_id]) do |w|
169
+ w.max_attempts = WAITER_MAX_ATTEMPS
170
+ w.delay = WAITER_DELAY
171
+ end
172
+
173
+ @ec2.create_tags(resources: [snapshot_info.snapshot_id], tags: tags) unless tags.empty?
174
+
175
+ snapshot_info
176
+ end
177
+
178
+ # Preforms a backup on volumes that do not have a recent snapshot_info
179
+ # @param days [Integer] defaults to 5
180
+ # @return [Array<Hash>] An array of hashes containing snapshot_id, instance_name and volume
181
+ def backup_volumes_unless_recent_backup(days = 5)
182
+ volumes_backed_up_recently = volumes_with_snapshot_within_last_days(days)
183
+ snapshots_created = []
184
+
185
+ volumes = @ec2.describe_volumes(filters: [{ name: 'attachment.status', values: ['attached'] }])
186
+ volumes.volumes.each do |volume|
187
+ next if volumes_backed_up_recently[volume.volume_id.to_s]
188
+ instance_name = get_instance_name(volume.attachments[0].instance_id)
189
+
190
+ tags = instance_name ? [{ key: 'Instance Name', value: instance_name }] : []
191
+ snapshot_info = create_ebs_snapshot(volume.volume_id,
192
+ 'auto-ebs-snap-' + Time.now.strftime('%Y-%m-%d-%H:%M:%S'),
193
+ tags)
194
+
195
+ snapshots_created.push(snapshot_id: snapshot_info.snapshot_id,
196
+ instance_name: instance_name,
197
+ volume: volume.volume_id)
198
+ end
199
+
200
+ snapshots_created
201
+ end
202
+
203
+ # Find volumes that have a recent snapshot
204
+ # @param days [Integer] defaults to 5
205
+ # @return [Array] list of volume ids that have recent snapshots
206
+ def volumes_with_snapshot_within_last_days(days = 5)
207
+ volumes_backed_up_recently = {}
208
+
209
+ snapshots = @ec2.describe_snapshots(owner_ids: ['self'], filters: [{ name: 'status', values: ['completed'] }])
210
+ snapshots.snapshots.each do |snapshot|
211
+ if snapshot.start_time > Time.now - (SECONDS_IN_A_DAY * days)
212
+ volumes_backed_up_recently[snapshot.volume_id.to_s] = true
213
+ end
214
+ end
215
+ volumes_backed_up_recently
216
+ end
128
217
  end
129
218
  end
@@ -1,5 +1,5 @@
1
1
  module Cucloud
2
2
  # Disable mutable constant warning - freezing this oddly breaks bundler
3
3
  # rubocop:disable Style/MutableConstant
4
- VERSION = '0.5.0'
4
+ VERSION = '0.6.1'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cucloud
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - sbower
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2016-08-02 00:00:00.000000000 Z
13
+ date: 2016-08-17 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: aws-sdk