Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,13 @@ The format is based on [Keep a Changelog], and this project adheres to

- Test on Ruby 3.0 and 3.1 in the CI build ([#366]).

### Changed

- Pass an options hash to the AWS SDK, instead of keyword arguments ([#371]).

[Unreleased]: https://github.com/envato/stack_master/compare/v2.13.2...HEAD
[#366]: https://github.com/envato/stack_master/pull/366
[#371]: https://github.com/envato/stack_master/pull/371

## [2.13.2] - 2022-01-25

Expand Down
4 changes: 2 additions & 2 deletions features/step_definitions/asume_role_steps.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Then(/^I expect the role "([^"]*)" is assumed in account "([^"]*)"$/) do |role, account|
expect(Aws::AssumeRoleCredentials).to receive(:new).with(
expect(Aws::AssumeRoleCredentials).to receive(:new).with({
region: instance_of(String),
role_arn: "arn:aws:iam::#{account}:role/#{role}",
role_session_name: instance_of(String)
)
})
end
2 changes: 1 addition & 1 deletion lib/stack_master/aws_driver/cloud_formation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def set_region(value)
private

def cf
@cf ||= Aws::CloudFormation::Client.new(region: region, retry_limit: 10)
@cf ||= Aws::CloudFormation::Client.new({ region: region, retry_limit: 10 })
end

end
Expand Down
10 changes: 5 additions & 5 deletions lib/stack_master/aws_driver/s3.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ def upload_files(bucket: nil, prefix: nil, region: nil, files: {})

s3 = new_s3_client(region: region)

current_objects = s3.list_objects(
current_objects = s3.list_objects({
prefix: prefix,
bucket: bucket
).map(&:contents).flatten.inject({}){|h,obj|
}).map(&:contents).flatten.inject({}){|h,obj|
h.merge(obj.key => obj)
}

Expand All @@ -38,12 +38,12 @@ def upload_files(bucket: nil, prefix: nil, region: nil, files: {})
s3_uri = "s3://#{bucket}/#{object_key}"
StackMaster.stdout.print "- #{File.basename(path)} => #{s3_uri} "

s3.put_object(
s3.put_object({
bucket: bucket,
key: object_key,
body: body,
metadata: { md5: compiled_template_md5 }
)
})
StackMaster.stdout.puts "done."
end
end
Expand All @@ -61,7 +61,7 @@ def url(bucket:, prefix:, region:, template:)
private

def new_s3_client(region: nil)
Aws::S3::Client.new(region: region || @region)
Aws::S3::Client.new({ region: region || @region })
end
end
end
Expand Down
6 changes: 3 additions & 3 deletions lib/stack_master/change_set.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@ def self.find(id)
end

def self.delete(id)
cf.delete_change_set(change_set_name: id)
cf.delete_change_set({ change_set_name: id })
end

def self.execute(id, stack_name)
cf.execute_change_set(change_set_name: id,
stack_name: stack_name)
cf.execute_change_set({ change_set_name: id,
stack_name: stack_name })
end

def self.cf
Expand Down
2 changes: 1 addition & 1 deletion lib/stack_master/commands/resources.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ def perform
private

def stack_resources
@stack_resources ||= cf.describe_stack_resources(stack_name: @stack_definition.stack_name).stack_resources
@stack_resources ||= cf.describe_stack_resources({ stack_name: @stack_definition.stack_name }).stack_resources
rescue Aws::CloudFormation::Errors::ValidationError
nil
end
Expand Down
4 changes: 2 additions & 2 deletions lib/stack_master/identity.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@ def region
end

def sts
@sts ||= Aws::STS::Client.new(region: region)
@sts ||= Aws::STS::Client.new({ region: region })
end

def iam
@iam ||= Aws::IAM::Client.new(region: region)
@iam ||= Aws::IAM::Client.new({ region: region })
end

def contains_account_id?(ids)
Expand Down
4 changes: 2 additions & 2 deletions lib/stack_master/parameter_resolvers/acm_certificate.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ def resolve(domain_name)
def all_certs
certs = []
next_token = nil
client = Aws::ACM::Client.new(region: @stack_definition.region)
client = Aws::ACM::Client.new({ region: @stack_definition.region })
loop do
resp = client.list_certificates(certificate_statuses: ['ISSUED'], next_token: next_token)
resp = client.list_certificates({ certificate_statuses: ['ISSUED'], next_token: next_token })
certs << resp.certificate_summary_list
next_token = resp.next_token
break if next_token.nil?
Expand Down
6 changes: 3 additions & 3 deletions lib/stack_master/parameter_resolvers/ami_finder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def build_filters_from_hash(hash)
end

def find_latest_ami(filters, owners = ['self'])
images = ec2.describe_images(owners: owners, filters: filters).images
images = ec2.describe_images({ owners: owners, filters: filters }).images
sorted_images = images.sort do |a, b|
Time.parse(a.creation_date) <=> Time.parse(b.creation_date)
end
Expand All @@ -29,8 +29,8 @@ def find_latest_ami(filters, owners = ['self'])
private

def ec2
@ec2 ||= Aws::EC2::Client.new(region: @region)
@ec2 ||= Aws::EC2::Client.new({ region: @region })
end
end
end
end
end
2 changes: 1 addition & 1 deletion lib/stack_master/parameter_resolvers/latest_container.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def resolve(parameters)
end

@region = parameters['region'] || @stack_definition.region
ecr_client = Aws::ECR::Client.new(region: @region)
ecr_client = Aws::ECR::Client.new({ region: @region })

images = fetch_images(parameters['repository_name'], parameters['registry_id'], ecr_client)

Expand Down
6 changes: 3 additions & 3 deletions lib/stack_master/parameter_resolvers/parameter_store.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ def initialize(config, stack_definition)

def resolve(value)
begin
ssm = Aws::SSM::Client.new(region: @stack_definition.region)
resp = ssm.get_parameter(
ssm = Aws::SSM::Client.new({ region: @stack_definition.region })
resp = ssm.get_parameter({
name: value,
with_decryption: true
)
})
rescue Aws::SSM::Errors::ParameterNotFound
raise ParameterNotFound, "Unable to find #{value} in Parameter Store"
end
Expand Down
2 changes: 1 addition & 1 deletion lib/stack_master/parameter_resolvers/stack_output.rb
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def find_stack(stack_name, region)

@stacks.fetch(stack_key) do
regional_cf = cf_for_region(unaliased_region)
cf_stack = regional_cf.describe_stacks(stack_name: stack_name).stacks.first
cf_stack = regional_cf.describe_stacks({ stack_name: stack_name }).stacks.first
@stacks[stack_key] = cf_stack
end
end
Expand Down
4 changes: 2 additions & 2 deletions lib/stack_master/role_assumer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,11 @@ def with_temporary_cf_driver(&block)
def assume_role_credentials(account, role)
credentials_key = "#{account}:#{role}"
@credentials.fetch(credentials_key) do
@credentials[credentials_key] = Aws::AssumeRoleCredentials.new(
@credentials[credentials_key] = Aws::AssumeRoleCredentials.new({
region: StackMaster.cloud_formation_driver.region,
role_arn: "arn:aws:iam::#{account}:role/#{role}",
role_session_name: "stack-master-role-assumer"
)
})
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/stack_master/security_group_finder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ class SecurityGroupFinder
MultipleSecurityGroupsFound = Class.new(StandardError)

def initialize(region)
@resource = Aws::EC2::Resource.new(region: region)
@resource = Aws::EC2::Resource.new({ region: region })
end

def find(reference)
Expand Down
2 changes: 1 addition & 1 deletion lib/stack_master/sns_topic_finder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ class SnsTopicFinder
TopicNotFound = Class.new(StandardError)

def initialize(region)
@resource = Aws::SNS::Resource.new(region: region)
@resource = Aws::SNS::Resource.new({ region: region })
end

def find(reference)
Expand Down
6 changes: 3 additions & 3 deletions lib/stack_master/stack.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,15 @@ def parameters_with_defaults

def self.find(region, stack_name)
cf = StackMaster.cloud_formation_driver
cf_stack = cf.describe_stacks(stack_name: stack_name).stacks.first
cf_stack = cf.describe_stacks({ stack_name: stack_name }).stacks.first
return unless cf_stack
parameters = cf_stack.parameters.inject({}) do |params_hash, param_struct|
params_hash[param_struct.parameter_key] = param_struct.parameter_value
params_hash
end
template_body ||= cf.get_template(stack_name: stack_name, template_stage: 'Original').template_body
template_body ||= cf.get_template({ stack_name: stack_name, template_stage: 'Original' }).template_body
template_format = TemplateUtils.identify_template_format(template_body)
stack_policy_body ||= cf.get_stack_policy(stack_name: stack_name).stack_policy_body
stack_policy_body ||= cf.get_stack_policy({ stack_name: stack_name }).stack_policy_body
outputs = cf_stack.outputs

new(region: region,
Expand Down
74 changes: 52 additions & 22 deletions spec/stack_master/aws_driver/s3_spec.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
RSpec.describe StackMaster::AwsDriver::S3 do
let(:region) { 'us-east-1' }
let(:bucket) { 'bucket' }
let(:s3) { Aws::S3::Client.new(stub_responses: true) }
let(:s3) { Aws::S3::Client.new({ stub_responses: true }) }
subject(:s3_driver) { StackMaster::AwsDriver::S3.new }

before do
Expand All @@ -16,7 +16,7 @@
context 'when set_region is called' do
it 'defaults to that region' do
s3_driver.set_region('default')
expect(Aws::S3::Client).to receive(:new).with(region: 'default').and_return(s3)
expect(Aws::S3::Client).to receive(:new).with({ region: 'default' }).and_return(s3)
files = {
'template' => {
path: 'spec/fixtures/templates/myapp_vpc.json',
Expand All @@ -43,10 +43,16 @@
end

it 'uploads files under a prefix' do
expect(s3).to receive(:put_object).with(bucket: 'bucket',
key: 'prefix/template',
body: 'file content',
metadata: {md5: "d10b4c3ff123b26dc068d43a8bef2d23"})
expect(s3).to receive(:put_object).with(
{
bucket: 'bucket',
key: 'prefix/template',
body: 'file content',
metadata: {
md5: "d10b4c3ff123b26dc068d43a8bef2d23"
}
}
)
s3_driver.upload_files(**options)
end
end
Expand All @@ -65,10 +71,16 @@
end

it 'uploads files under the bucket root' do
expect(s3).to receive(:put_object).with(bucket: 'bucket',
key: 'template',
body: 'file content',
metadata: {md5: "d10b4c3ff123b26dc068d43a8bef2d23"})
expect(s3).to receive(:put_object).with(
{
bucket: 'bucket',
key: 'template',
body: 'file content',
metadata: {
md5: "d10b4c3ff123b26dc068d43a8bef2d23"
}
}
)
s3_driver.upload_files(**options)
end
end
Expand All @@ -88,10 +100,16 @@
end

it 'uploads files under the prefix' do
expect(s3).to receive(:put_object).with(bucket: 'bucket',
key: 'prefix/template',
body: 'file content',
metadata: {md5: "d10b4c3ff123b26dc068d43a8bef2d23"})
expect(s3).to receive(:put_object).with(
{
bucket: 'bucket',
key: 'prefix/template',
body: 'file content',
metadata: {
md5: "d10b4c3ff123b26dc068d43a8bef2d23"
}
}
)
s3_driver.upload_files(**options)
end
end
Expand All @@ -115,14 +133,26 @@
end

it 'uploads all the files' do
expect(s3).to receive(:put_object).with(bucket: 'bucket',
key: 'template1',
body: 'file content',
metadata: {md5: "d10b4c3ff123b26dc068d43a8bef2d23"})
expect(s3).to receive(:put_object).with(bucket: 'bucket',
key: 'template2',
body: 'file content',
metadata: {md5: "d10b4c3ff123b26dc068d43a8bef2d23"})
expect(s3).to receive(:put_object).with(
{
bucket: 'bucket',
key: 'template1',
body: 'file content',
metadata: {
md5: "d10b4c3ff123b26dc068d43a8bef2d23"
}
}
)
expect(s3).to receive(:put_object).with(
{
bucket: 'bucket',
key: 'template2',
body: 'file content',
metadata: {
md5: "d10b4c3ff123b26dc068d43a8bef2d23"
}
}
)
s3_driver.upload_files(**options)
end
end
Expand Down
8 changes: 4 additions & 4 deletions spec/stack_master/change_set_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,22 +21,22 @@

context 'successful response' do
before do
allow(cf).to receive(:describe_change_set).with(change_set_name: 'id-1', next_token: nil).and_return(double(next_token: nil, changes: [], :changes= => nil, :next_token= => nil, status: 'CREATE_COMPLETE'))
allow(cf).to receive(:describe_change_set).with({ change_set_name: 'id-1', next_token: nil }).and_return(double(next_token: nil, changes: [], :changes= => nil, :next_token= => nil, status: 'CREATE_COMPLETE'))
end

it 'calls the create change set API with the addition of a name' do
change_set = StackMaster::ChangeSet.create(stack_name: '123')
expect(cf).to have_received(:create_change_set).with(
expect(cf).to have_received(:create_change_set).with({
stack_name: '123',
change_set_name: change_set_name
)
})
expect(change_set.failed?).to eq false
end
end

context 'unsuccessful response' do
before do
allow(cf).to receive(:describe_change_set).with(change_set_name: 'id-1', next_token: nil).and_return(double(next_token: nil, changes: [], :changes= => nil, :next_token= => nil, status: 'FAILED', status_reason: 'No changes'))
allow(cf).to receive(:describe_change_set).with({ change_set_name: 'id-1', next_token: nil }).and_return(double(next_token: nil, changes: [], :changes= => nil, :next_token= => nil, status: 'FAILED', status_reason: 'No changes'))
end

it 'is marked as failed' do
Expand Down
2 changes: 1 addition & 1 deletion spec/stack_master/commands/apply_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ def apply
end

it "deletes the stack" do
expect(cf).to receive(:delete_stack).with(stack_name: stack_name)
expect(cf).to receive(:delete_stack).with({ stack_name: stack_name })
expect { apply }.to raise_error(StackMaster::CtrlC)
end
end
Expand Down
2 changes: 1 addition & 1 deletion spec/stack_master/commands/delete_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

before do
StackMaster.cloud_formation_driver.set_region(region)
allow(Aws::CloudFormation::Client).to receive(:new).with(region: region, retry_limit: 10).and_return(cf)
allow(Aws::CloudFormation::Client).to receive(:new).with({ region: region, retry_limit: 10 }).and_return(cf)
allow(delete).to receive(:ask?).and_return('y')
allow(StackMaster::StackEvents::Streamer).to receive(:stream)
end
Expand Down
Loading