cucloud 0.5.0 → 0.6.1

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 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