Skip to content

Commit 8d21900

Browse files
committed
Updating to use the AWS SDK V2, refactoring code out of the base driver
so it is easier to read, adding unit tests, updating static analysis to match Test Kitchen
1 parent 5b977a8 commit 8d21900

16 files changed

+1015
-417
lines changed

.cane

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
--style-measure 100
21
--abc-max 30
2+
--style-measure 100

.rspec

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
--color
2+
--require spec_helper
3+
--format progress

.rubocop.yml

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Style/FileName:
2+
Exclude:
3+
- 'data/**/*'
4+
5+
Style/Next:
6+
Enabled: false
7+
8+
Style/DoubleNegation:
9+
Enabled: false

.tailor

-106
This file was deleted.

.yardopts

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
--readme README.md
2+
--markup markdown
3+
--markup-provider maruku

Gemfile

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
source 'https://rubygems.org'
1+
source "https://rubygems.org"
22

33
# Specify your gem's dependencies in kitchen-ec2.gemspec
44
gemspec
55

66
group :test do
7-
gem 'rake'
8-
gem 'pry'
7+
gem "rake"
8+
gem "pry"
99
end

Rakefile

+29-14
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,39 @@
1+
# -*- encoding: utf-8 -*-
2+
13
require "bundler/gem_tasks"
2-
require 'cane/rake_task'
3-
require 'tailor/rake_task'
4-
require 'rspec/core/rake_task'
54

5+
require "rspec/core/rake_task"
66
RSpec::Core::RakeTask.new(:test)
77

8-
desc "Run cane to check quality metrics"
9-
Cane::RakeTask.new do |cane|
10-
cane.canefile = './.cane'
11-
end
12-
13-
Tailor::RakeTask.new
14-
158
desc "Display LOC stats"
169
task :stats do
1710
puts "\n## Production Code Stats"
18-
sh "countloc -r lib/kitchen"
11+
sh "countloc -r lib/kitchen lib/kitchen.rb"
12+
puts "\n## Test Code Stats"
13+
sh "countloc -r spec features"
14+
end
15+
16+
require "finstyle"
17+
require "rubocop/rake_task"
18+
RuboCop::RakeTask.new(:style) do |task|
19+
task.options << "--display-cop-names"
20+
end
21+
22+
if RUBY_ENGINE != "jruby"
23+
require "cane/rake_task"
24+
desc "Run cane to check quality metrics"
25+
Cane::RakeTask.new do |cane|
26+
cane.canefile = "./.cane"
27+
end
28+
29+
desc "Run all quality tasks"
30+
task :quality => [:cane, :style, :stats]
31+
else
32+
desc "Run all quality tasks"
33+
task :quality => [:style, :stats]
1934
end
2035

21-
desc "Run all quality tasks"
22-
task :quality => [:cane, :tailor, :stats, :test]
36+
require "yard"
37+
YARD::Rake::YardocTask.new
2338

24-
task :default => [:quality]
39+
task :default => [:test, :quality]

kitchen-ec2.gemspec

+21-13
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,39 @@
11
# -*- encoding: utf-8 -*-
2-
lib = File.expand_path('../lib', __FILE__)
2+
lib = File.expand_path("../lib", __FILE__)
33
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4-
require 'kitchen/driver/ec2_version.rb'
4+
require "kitchen/driver/ec2_version.rb"
55

66
Gem::Specification.new do |gem|
77
gem.name = "kitchen-ec2"
88
gem.version = Kitchen::Driver::EC2_VERSION
9-
gem.license = 'Apache 2.0'
9+
gem.license = "Apache 2.0"
1010
gem.authors = ["Fletcher Nichol"]
1111
gem.email = ["[email protected]"]
1212
gem.description = "A Test Kitchen Driver for Amazon EC2"
1313
gem.summary = gem.description
1414
gem.homepage = "http://kitchen.ci/"
1515

16-
gem.files = `git ls-files`.split($/)
16+
gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
1717
gem.executables = []
1818
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
1919
gem.require_paths = ["lib"]
2020

21-
gem.add_dependency "test-kitchen", "~> 1.4.0"
22-
gem.add_dependency 'excon'
23-
gem.add_dependency 'multi_json'
24-
gem.add_dependency 'aws-sdk-v1', '~> 1.59.0'
25-
gem.add_dependency 'retryable', '~> 2.0'
21+
gem.add_dependency "test-kitchen", "~> 1.4"
22+
gem.add_dependency "excon"
23+
gem.add_dependency "multi_json"
24+
gem.add_dependency "aws-sdk-v1", "~> 1.59.0"
25+
gem.add_dependency "aws-sdk", "~> 2"
2626

27-
gem.add_development_dependency 'rspec'
28-
gem.add_development_dependency 'cane'
29-
gem.add_development_dependency 'tailor'
30-
gem.add_development_dependency 'countloc'
27+
gem.add_development_dependency "rspec", "~> 3.2"
28+
gem.add_development_dependency "countloc", "~> 0.4"
29+
gem.add_development_dependency "maruku", "~> 0.6"
30+
gem.add_development_dependency "simplecov", "~> 0.7"
31+
gem.add_development_dependency "yard", "~> 0.8"
32+
33+
# style and complexity libraries are tightly version pinned as newer releases
34+
# may introduce new and undesireable style choices which would be immediately
35+
# enforced in CI
36+
gem.add_development_dependency "finstyle", "1.4.0"
37+
gem.add_development_dependency "cane", "2.6.2"
38+
gem.add_development_dependency "climate_control"
3139
end

lib/kitchen/driver/aws/client.rb

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# -*- encoding: utf-8 -*-
2+
#
3+
# Author:: Tyler Ball (<[email protected]>)
4+
#
5+
# Copyright (C) 2015, Fletcher Nichol
6+
#
7+
# Licensed under the Apache License, Version 2.0 (the "License");
8+
# you may not use this file except in compliance with the License.
9+
# You may obtain a copy of the License at
10+
#
11+
# http://www.apache.org/licenses/LICENSE-2.0
12+
#
13+
# Unless required by applicable law or agreed to in writing, software
14+
# distributed under the License is distributed on an "AS IS" BASIS,
15+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
# See the License for the specific language governing permissions and
17+
# limitations under the License.
18+
19+
require "aws-sdk"
20+
require "aws-sdk-core/credentials"
21+
require "aws-sdk-core/shared_credentials"
22+
require "aws-sdk-core/instance_profile_credentials"
23+
24+
module Kitchen
25+
26+
module Driver
27+
28+
class Aws
29+
30+
# A class for creating and managing the EC2 client connection
31+
#
32+
# @author Tyler Ball <[email protected]>
33+
class Client
34+
35+
def initialize(region, profile_name = nil, access_key_id = nil, secret_access_key = nil)
36+
creds = self.class.get_credentials(profile_name, access_key_id, secret_access_key)
37+
Aws.config = {
38+
:region => region,
39+
:credentials => creds
40+
}
41+
end
42+
43+
# Try and get the credentials from an ordered list of locations
44+
# http://docs.aws.amazon.com/sdkforruby/api/index.html#Configuration
45+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
46+
def self.get_credentials(profile_name, access_key_id, secret_access_key)
47+
shared_creds = ::Aws::SharedCredentials.new(:profile_name => profile_name)
48+
if access_key_id && secret_access_key
49+
::Aws::Credentials.new(access_key_id, secret_access_key)
50+
# TODO: these are deprecated, remove them in the next major version
51+
elsif ENV["AWS_ACCESS_KEY"] && ENV["AWS_SECRET_KEY"]
52+
::Aws::Credentials.new(
53+
ENV["AWS_ACCESS_KEY"],
54+
ENV["AWS_SECRET_KEY"],
55+
ENV["AWS_TOKEN"]
56+
)
57+
elsif ENV["AWS_ACCESS_KEY_ID"] && ENV["AWS_SECRET_ACCESS_KEY"]
58+
::Aws::Credentials.new(
59+
ENV["AWS_ACCESS_KEY_ID"],
60+
ENV["AWS_SECRET_ACCESS_KEY"],
61+
ENV["AWS_SESSION_TOKEN"]
62+
)
63+
elsif shared_creds.loadable?
64+
shared_creds
65+
else
66+
::Aws::InstanceProfileCredentials.new(:retries => 1)
67+
end
68+
end
69+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
70+
71+
def create_instance(options)
72+
resource.create_instances(options)[0]
73+
end
74+
75+
def get_instance(id)
76+
resource.instance(id)
77+
end
78+
79+
def get_instance_from_spot_request(request_id)
80+
resource.instances(
81+
:filters => [{
82+
:name => "spot-instance-request-id",
83+
:values => [request_id]
84+
}]
85+
).to_a[0]
86+
end
87+
88+
def client
89+
@client ||= Aws::EC2::Client.new
90+
end
91+
92+
def resource
93+
@resource ||= Aws::EC2::Resource.new
94+
end
95+
96+
end
97+
98+
end
99+
100+
end
101+
102+
end

0 commit comments

Comments
 (0)