vgh 0.1.2 → 0.2.0

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.
@@ -0,0 +1,49 @@
1
+ shared_context 'AWS Dummy' do
2
+
3
+ before(:all) do
4
+ @fqdn = 'test.example.com'
5
+
6
+ AWS.stub!
7
+ AWS.config({:access_key_id => '1234', :secret_access_key => '4321'})
8
+ @ec2 = AWS::EC2.new
9
+
10
+ # Instance
11
+ @instance = @ec2.instances['i-12345678']
12
+
13
+ # Volumes
14
+ @volume1 = @ec2.volumes['vol-11111111']
15
+ @tag1 = @volume1.tag('Name', :value => 'VolumeName')
16
+ @tag2 = @volume1.tag('Checkpoint')
17
+
18
+ @volume2 = @ec2.volumes['vol-22222222']
19
+ @tag3 = @volume2.tag('Checkpoint')
20
+
21
+ @volume3 = @ec2.volumes['vol-33333333']
22
+
23
+ # Tags
24
+ @tag_collection = AWS::EC2::TagCollection
25
+ @tag_hash = {
26
+ 'Name' => 'TestTag',
27
+ 'MyTAG' => 'TestValue'
28
+ }
29
+
30
+ # Attachments
31
+ @device1 = '/dev/sdz1'
32
+ @device2 = '/dev/sdz2'
33
+ @device3 = '/dev/sdz3'
34
+ @attachment1 = AWS::EC2::Attachment.new(@volume1, @instance, @device1)
35
+ @attachment2 = AWS::EC2::Attachment.new(@volume2, @instance, @device2)
36
+ @attachment3 = AWS::EC2::Attachment.new(@volume3, @instance, @device3)
37
+ @instance_mappings = {
38
+ @device1 => @attachment1,
39
+ @device2 => @attachment2,
40
+ @device3 => @attachment3
41
+ }
42
+
43
+ # Snapshots
44
+ @snapshot = @ec2.snapshots['snap-12345678']
45
+
46
+ end
47
+
48
+ end
49
+
data/spec/helpers/spec.rb CHANGED
@@ -1,3 +1,6 @@
1
+ require 'rspec'
2
+ require 'aws-sdk'
3
+
1
4
  RSpec.configure do |config|
2
5
  config.treat_symbols_as_metadata_keys_with_true_values = true
3
6
  config.run_all_when_everything_filtered = true
@@ -14,26 +17,5 @@ class Dummy
14
17
  end
15
18
  end
16
19
 
17
- shared_context "Dummy Instance" do
18
- before(:each) do
19
- AWS.stub!
20
- AWS.config({:access_key_id => '', :secret_access_key => ''})
21
- @ec2 = AWS::EC2.new
22
- @instance = AWS::EC2::Instance.new('i-12345678')
23
- @fqdn = 'test.example.com'
24
- @volume = AWS::EC2::Volume.new('vol-12345678')
25
- @snapshot = AWS::EC2::Snapshot.new('snap-12345678')
26
- @device = '/dev/test'
27
- @attachment = AWS::EC2::Attachment.new(@volume, @instance, @device)
28
- @instance.stub(:block_device_mappings).and_return({
29
- @device => @attachment
30
- })
20
+ require "#{File.dirname(__FILE__)}/aws_mock.rb"
31
21
 
32
- subject.stub(:ec2).and_return(@ec2)
33
- subject.stub(:instance_id).and_return(@instance.id)
34
- subject.stub(:fqdn).and_return(@fqdn)
35
- subject.stub(:instance).and_return(@instance)
36
- subject.stub(:snapshot).and_return(@snapshot)
37
- subject.stub(:message).and_return(Dummy.new)
38
- end
39
- end
data/spec/logging_spec.rb CHANGED
@@ -3,9 +3,34 @@ require 'vgh'
3
3
  require 'vgh/logging'
4
4
 
5
5
  describe VGH::Logging do
6
- it "Should write logs" do
7
- log = VGH::Logging.new.log
8
- log.should_receive(:info).with("RSpec Test")
9
- log.info("RSpec Test")
6
+
7
+ it 'Should write STDOUT messages' do
8
+ subject.log.should_receive(:stdout).with('RSpec Test')
9
+ subject.log.stdout('RSpec Test')
10
+ end
11
+
12
+ it 'Should write DEBUG messages' do
13
+ subject.log.should_receive(:debug).with('RSpec Test')
14
+ subject.log.debug('RSpec Test')
15
+ end
16
+
17
+ it 'Should write INFO messages' do
18
+ subject.log.should_receive(:info).with('RSpec Test')
19
+ subject.log.info('RSpec Test')
20
+ end
21
+
22
+ it 'Should write WARN messages' do
23
+ subject.log.should_receive(:warn).with('RSpec Test')
24
+ subject.log.warn('RSpec Test')
25
+ end
26
+
27
+ it 'Should write ERROR messages' do
28
+ subject.log.should_receive(:error).with('RSpec Test')
29
+ subject.log.error('RSpec Test')
30
+ end
31
+
32
+ it 'Should write FATAL messages' do
33
+ subject.log.should_receive(:fatal).with('RSpec Test')
34
+ subject.log.fatal('RSpec Test')
10
35
  end
11
36
  end
data/spec/output_spec.rb CHANGED
@@ -7,9 +7,35 @@ require 'vgh/logging'
7
7
  require 'vgh/configuration'
8
8
 
9
9
  describe VGH::Output do
10
- let(:message) {VGH::Output.new}
11
- it "Should write messages" do
12
- message.should_receive(:stdout).with("RSpec Test")
13
- message.stdout("RSpec Test")
10
+
11
+ it 'Should write STDOUT messages' do
12
+ subject.should_receive(:stdout).with('RSpec Test')
13
+ subject.stdout('RSpec Test')
14
+ end
15
+
16
+ it 'Should write DEBUG messages' do
17
+ subject.should_receive(:debug).with('RSpec Test')
18
+ subject.debug('RSpec Test')
19
+ end
20
+
21
+ it 'Should write INFO messages' do
22
+ subject.should_receive(:info).with('RSpec Test')
23
+ subject.info('RSpec Test')
24
+ end
25
+
26
+ it 'Should write WARN messages' do
27
+ subject.should_receive(:warn).with('RSpec Test')
28
+ subject.warn('RSpec Test')
29
+ end
30
+
31
+ it 'Should write ERROR messages' do
32
+ subject.should_receive(:error).with('RSpec Test')
33
+ subject.error('RSpec Test')
14
34
  end
35
+
36
+ it 'Should write FATAL messages' do
37
+ subject.should_receive(:fatal).with('RSpec Test')
38
+ subject.fatal('RSpec Test')
39
+ end
40
+
15
41
  end
@@ -0,0 +1,11 @@
1
+ require 'helpers/spec'
2
+ require 'vgh/version'
3
+
4
+ describe VGH do
5
+
6
+ it 'Should return a semantic version number' do
7
+ extend VGH
8
+ version.should =~ /\d+\.\d+\.\d+/
9
+ end
10
+
11
+ end
data/vgh.gemspec CHANGED
@@ -24,4 +24,5 @@ Gem::Specification.new do |gem|
24
24
  gem.add_development_dependency "rake"
25
25
  gem.add_development_dependency "yard"
26
26
  gem.add_development_dependency "bundler"
27
+ gem.add_development_dependency "reek"
27
28
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vgh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-29 00:00:00.000000000 Z
12
+ date: 2013-01-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk
@@ -107,6 +107,22 @@ dependencies:
107
107
  - - ! '>='
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: reek
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
110
126
  description: Vlad's custom scripts
111
127
  email:
112
128
  - vgit@vladgh.com
@@ -126,17 +142,16 @@ files:
126
142
  - Rakefile
127
143
  - bin/vgh
128
144
  - conf/config.yml.example
129
- - conf/ec2-backup.config.yml.example
130
145
  - lib/vgh.rb
131
146
  - lib/vgh/apps.rb
147
+ - lib/vgh/apps/checkpoint.rb
132
148
  - lib/vgh/apps/ec2_backup.rb
133
149
  - lib/vgh/cli.rb
134
150
  - lib/vgh/configuration.rb
135
- - lib/vgh/extended_aws.rb
136
- - lib/vgh/extended_aws/extended_ec2.rb
137
- - lib/vgh/extended_aws/extended_ec2/metadata.rb
138
- - lib/vgh/extended_aws/extended_ec2/snapshot.rb
139
- - lib/vgh/extended_aws/extended_ec2/volume.rb
151
+ - lib/vgh/ec2.rb
152
+ - lib/vgh/ec2/metadata.rb
153
+ - lib/vgh/ec2/snapshot.rb
154
+ - lib/vgh/ec2/volume.rb
140
155
  - lib/vgh/logging.rb
141
156
  - lib/vgh/output.rb
142
157
  - lib/vgh/system.rb
@@ -145,12 +160,15 @@ files:
145
160
  - lib/vgh/version.rb
146
161
  - spec/apps_spec.rb
147
162
  - spec/cli_spec.rb
148
- - spec/extended_aws/extended_ec2/metadata_spec.rb
149
- - spec/extended_aws/extended_ec2/snapshot_spec.rb
150
- - spec/extended_aws/extended_ec2/volume_spec.rb
163
+ - spec/configuration_spec.rb
164
+ - spec/ec2/metadata_spec.rb
165
+ - spec/ec2/snapshot_spec.rb
166
+ - spec/ec2/volume_spec.rb
167
+ - spec/helpers/aws_mock.rb
151
168
  - spec/helpers/spec.rb
152
169
  - spec/logging_spec.rb
153
170
  - spec/output_spec.rb
171
+ - spec/version_spec.rb
154
172
  - tasks/documentation.rake
155
173
  - vgh.gemspec
156
174
  homepage: https://github.com/vladgh/vgh
@@ -165,12 +183,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
165
183
  - - ! '>='
166
184
  - !ruby/object:Gem::Version
167
185
  version: '0'
186
+ segments:
187
+ - 0
188
+ hash: -87386979
168
189
  required_rubygems_version: !ruby/object:Gem::Requirement
169
190
  none: false
170
191
  requirements:
171
192
  - - ! '>='
172
193
  - !ruby/object:Gem::Version
173
194
  version: '0'
195
+ segments:
196
+ - 0
197
+ hash: -87386979
174
198
  requirements: []
175
199
  rubyforge_project:
176
200
  rubygems_version: 1.8.23
@@ -180,10 +204,13 @@ summary: A collection of custom scripts used on VladGh.com
180
204
  test_files:
181
205
  - spec/apps_spec.rb
182
206
  - spec/cli_spec.rb
183
- - spec/extended_aws/extended_ec2/metadata_spec.rb
184
- - spec/extended_aws/extended_ec2/snapshot_spec.rb
185
- - spec/extended_aws/extended_ec2/volume_spec.rb
207
+ - spec/configuration_spec.rb
208
+ - spec/ec2/metadata_spec.rb
209
+ - spec/ec2/snapshot_spec.rb
210
+ - spec/ec2/volume_spec.rb
211
+ - spec/helpers/aws_mock.rb
186
212
  - spec/helpers/spec.rb
187
213
  - spec/logging_spec.rb
188
214
  - spec/output_spec.rb
215
+ - spec/version_spec.rb
189
216
  has_rdoc:
@@ -1,12 +0,0 @@
1
- # EC2-Backup app settings
2
-
3
- # Expiration period
4
- :expiration: 7 # Number of days to keep the snapshots
5
-
6
- # MySQL Settings
7
- :mysql_user: 'dbadmin' # The MySQL user that can flush the tables
8
- :mysql_pwd: 'MyStrongPassword' # The password of the above MySQL user
9
-
10
- # Remote settings
11
- #:instance: 'i-12345678' # The id of the remote instance you want to backup
12
- #:fqdn: 'MyServer.Example.com' # The FQDN of the remote instance you want to backup
@@ -1,87 +0,0 @@
1
- module VGH
2
- module Extended_AWS
3
- module Extended_EC2
4
-
5
- # Creates a snapshot of the specified volume.
6
- #
7
- # == Usage
8
- #
9
- # snap = Snapshot.new.
10
- # snap.create(id, tag)
11
- #
12
- class Snapshot
13
-
14
- # @return [Object] The Snapshot object
15
- attr_reader :snapshot
16
-
17
- # The workflow to create a snapshot:
18
- # - create snapshot
19
- # - add a name tag
20
- # - add an info tag
21
- # @param [String] volume_id The ID of the volume to snapshot
22
- # @param [String] volume_tag The Tag of the volume to snapshot
23
- def create(volume_id, volume_tag)
24
- create_snapshot(volume_id, volume_tag)
25
- name_tag
26
- info_tag(volume_id)
27
- message.info "Creating and tagging snapshot \"#{snapshot.id}\""
28
- end
29
-
30
- # Creates a snapshot for the specified volume
31
- # @param [String] volume_id The ID of the volume to snapshot
32
- # @param [String] volume_tag The tag of the volume to snapshot
33
- # @return [Object] The newly created snapshot object
34
- def create_snapshot(volume_id, volume_tag)
35
- @snapshot = ec2.volumes[volume_id].
36
- create_snapshot("Backup for #{volume_id}(#{volume_tag})")
37
- end
38
-
39
- # Creates a name tag for the newly created snapshot.
40
- # The name is the FQDN of the current instance.
41
- def name_tag
42
- ec2.snapshots[snapshot.id].tag('Name', :value => fqdn)
43
- end
44
-
45
- # Creates an info tag for the newly created snapshot
46
- def info_tag(volume_id)
47
- ec2.snapshots[snapshot.id].tag("Backup_#{instance_id}", :value => volume_id)
48
- end
49
-
50
- # Purges expired snapshots
51
- def purge
52
- expired.each do |snap|
53
- message.info "Deleting expired snapshot (#{snap.id})"
54
- snap.delete
55
- end
56
- end
57
-
58
- # Creates a list of expired snapshots according to the expiration time
59
- # specified in the app's configuration file
60
- # @return [Array] An array of expired snapshot objects
61
- def expired
62
- @expired = []
63
- all.each {|snap|
64
- if snap.start_time < (Time.now - app_config[:expiration]*24*60*60)
65
- @expired.push snap
66
- end
67
- }
68
- return @expired
69
- end
70
-
71
- # Returns a list of snapshots that are named the same with the current FQDN.
72
- def all
73
- @all ||= ec2.snapshots.
74
- with_owner('self').
75
- tagged('Name').tagged_values(fqdn)
76
- end
77
-
78
- end # class Snapshot
79
-
80
- end # module Extended_EC2
81
- end # module Extended_AWS
82
- end # module VGH
83
-
84
- require 'vgh/system'
85
- require 'vgh/output'
86
- require 'vgh/configuration'
87
- require 'vgh/extended_aws/extended_ec2/metadata'
@@ -1,66 +0,0 @@
1
- module VGH
2
- module Extended_AWS
3
- module Extended_EC2
4
-
5
- # Collects information about the EBS volumes attached to the current instance.
6
- # == Usage
7
- # @volume = Volume.new
8
- # @volume.list.map {|id, info|
9
- # puts id
10
- # puts info[:tag]
11
- # puts info[:device)
12
- # }
13
- #
14
- class Volume
15
-
16
- # @return An instance object
17
- def instance
18
- @instance ||= ec2.instances[instance_id]
19
- end
20
-
21
- # Creates a Hash collection of volumes containing their id, tag and device
22
- # @return [Hash]
23
- def list
24
- @list = {}
25
- mappings.map {|device, info|
26
- volume_id = info.volume.id
27
- @list[volume_id] = {
28
- :device => device,
29
- :tag => tag(volume_id)
30
- }
31
- }
32
- return @list
33
- end
34
-
35
- # Returns a Hash containing the block device mappings of the current instance.
36
- # @return [Hash]
37
- def mappings
38
- message.info "Creating a list of volumes..."
39
- @mappings ||= instance.block_device_mappings
40
- end
41
-
42
- # Get volume's Name tag
43
- # @return [String] The tag of the volume or (NOTAG) if a tag does not exists.
44
- def tag(volume_id)
45
- v_tags = tags(volume_id)
46
- v_tags.count == 0 ? @tag = '(NOTAG)' : @tag = v_tags.first.value
47
- end
48
-
49
- # Returns a collection of tags for the specified volume.
50
- # @param [String] volume_id The id of the volume to query for tags.
51
- def tags(volume_id)
52
- @tags = ec2.tags.
53
- filter('resource-type', 'volume').
54
- filter('key', 'Name').
55
- filter('resource-id', volume_id)
56
- end
57
-
58
- end # class Volume
59
-
60
- end # module Extended_EC2
61
- end # module Extended_AWS
62
- end # module VGH
63
-
64
- require 'vgh/output'
65
- require 'vgh/configuration'
66
- require 'vgh/extended_aws/extended_ec2/metadata'
@@ -1,10 +0,0 @@
1
- module VGH
2
- module Extended_AWS
3
-
4
- # A collection of classes used with the AWS-SDK for Ruby (EC2).
5
- module Extended_EC2
6
-
7
- end
8
-
9
- end # module Extended_AWS
10
- end # module VGH
@@ -1,10 +0,0 @@
1
- require 'aws-sdk'
2
-
3
- module VGH
4
-
5
- # A collection of classes used with the AWS-SDK for Ruby.
6
- module Extended_AWS
7
-
8
- end # module Extended_AWS
9
-
10
- end # module VGH
@@ -1,24 +0,0 @@
1
- require 'helpers/spec'
2
-
3
- require 'vgh/extended_aws/extended_ec2/metadata'
4
-
5
- describe VGH::Extended_AWS::Extended_EC2::MetaData do
6
-
7
- before(:each) do
8
- subject.stub(:message).and_return(Dummy.new)
9
- end
10
-
11
- it "Should retrieve the instance id" do
12
- unless subject.instance_id.nil?
13
- subject.instance_id.should match(/i\-.*/)
14
- end
15
- end
16
-
17
- it "Should retrieve the root device" do
18
- unless subject.root_device.nil?
19
- subject.root_device.should match(/\/dev\/.*/)
20
- end
21
- end
22
-
23
- end
24
-
@@ -1,48 +0,0 @@
1
- require 'helpers/spec'
2
-
3
- require 'aws-sdk'
4
- require 'vgh/extended_aws/extended_ec2/snapshot'
5
- require 'vgh/system'
6
-
7
- describe VGH::Extended_AWS::Extended_EC2::Snapshot do
8
-
9
- include_context "Dummy Instance"
10
-
11
- it "Should return a snapshot" do
12
- subject.snapshot(@volume.id, 'test').should be_a(AWS::EC2::Snapshot)
13
- end
14
-
15
- it "Should add a Name tag to a snapshot" do
16
- subject.name_tag.should be_a(AWS::EC2::Tag)
17
- end
18
-
19
- it "Should add an Info tag to a snapshot" do
20
- subject.info_tag(@volume.id).should be_a(AWS::EC2::Tag)
21
- end
22
-
23
- it "Should get a list of all snapshots" do
24
- subject.all.should be_a(AWS::EC2::SnapshotCollection)
25
- end
26
-
27
- it "Should create an array of expired snapshots" do
28
- subject.expired.should be_empty
29
- end
30
-
31
- it "Should purge expired snapshots" do
32
- subject.purge.should be_empty
33
- end
34
-
35
- #it "Should create a list of volumes" do
36
- #subject.list.should be_a_kind_of Hash
37
- #end
38
-
39
- #it "Should get a collection of volume tags" do
40
- #subject.tags(@volume.id).should be_a(AWS::EC2::TagCollection)
41
- #end
42
-
43
- #it "If no tags, it should return (NOTAG)" do
44
- #subject.tag(@volume.id).should eq('(NOTAG)')
45
- #end
46
-
47
- end
48
-
@@ -1,27 +0,0 @@
1
- require 'helpers/spec'
2
-
3
- require 'aws-sdk'
4
- require 'vgh/extended_aws/extended_ec2/volume'
5
-
6
- describe VGH::Extended_AWS::Extended_EC2::Volume do
7
-
8
- include_context "Dummy Instance"
9
-
10
- it "Should create a hash with block device mappings" do
11
- subject.mappings.should be_a_kind_of Hash
12
- end
13
-
14
- it "Should create a list of volumes" do
15
- subject.list.should be_a_kind_of Hash
16
- end
17
-
18
- it "Should get a collection of volume tags" do
19
- subject.tags(@volume.id).should be_a(AWS::EC2::TagCollection)
20
- end
21
-
22
- it "If no tags, it should return (NOTAG)" do
23
- subject.tag(@volume.id).should eq('(NOTAG)')
24
- end
25
-
26
- end
27
-