stackup 0.0.1 → 0.0.2

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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 198c45027f791cb13d1ba1de4643fda60a97a18d
4
- data.tar.gz: 7aab71076441135004a10109bda7a452ec15d75d
3
+ metadata.gz: 6dc62580195d06b89d9eb18003751b1271e061fb
4
+ data.tar.gz: 51755d4592858e5a8926e52b9ac16abc424db145
5
5
  SHA512:
6
- metadata.gz: ff9a5468160fd18e6b4f80697457e76c653e5d5a755b776cd2873ee230e91148c9cd02dc9d402457e6c7ce468d8e016e6f0377b9512399c74394cf0e1d24cae2
7
- data.tar.gz: 4d13507cc1022c2073b6feb0c13eea683b8983e2468489d470b5b5c40f9fea394340fe733d592283c9d852ebce45d6d8e1c87469b64c710aa321bca607ba7b4f
6
+ metadata.gz: 9654b97ed0a4b01d84cc334d65c575e95714a12affe82d98a0316fab5d206362b16ec0ebf625ff97bcf4aa71b85d475f4ee0625f44ecda2f61213a66a86e9528
7
+ data.tar.gz: 26072daf588afb7d27b9d31e3842c40e94a090a5d429c375d56e2667c5c92116add3b6af4e7e7b1d92a3f1fcbc5d390a2fc989600faf3818c428a11cc5b6bbcb
data/Gemfile CHANGED
@@ -2,6 +2,7 @@ source "https://rubygems.org" do
2
2
  gemspec
3
3
 
4
4
  gem "rake", "~> 10.0"
5
+ gem "rubocop", "~> 0.32"
5
6
 
6
7
  group :test do
7
8
  gem "rspec", "~> 3.3"
data/Gemfile.lock CHANGED
@@ -8,6 +8,9 @@ PATH
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
+ ast (2.1.0)
12
+ astrolabe (1.3.1)
13
+ parser (~> 2.2)
11
14
  aws-sdk (2.1.20)
12
15
  aws-sdk-resources (= 2.1.20)
13
16
  aws-sdk-core (2.1.20)
@@ -20,6 +23,10 @@ GEM
20
23
  jmespath (1.0.2)
21
24
  multi_json (~> 1.0)
22
25
  multi_json (1.11.2)
26
+ parser (2.2.2.6)
27
+ ast (>= 1.1, < 3.0)
28
+ powerpack (0.1.1)
29
+ rainbow (2.0.0)
23
30
  rake (10.4.2)
24
31
  rspec (3.3.0)
25
32
  rspec-core (~> 3.3.0)
@@ -34,6 +41,13 @@ GEM
34
41
  diff-lcs (>= 1.2.0, < 2.0)
35
42
  rspec-support (~> 3.3.0)
36
43
  rspec-support (3.3.0)
44
+ rubocop (0.34.1)
45
+ astrolabe (~> 1.3)
46
+ parser (>= 2.2.2.5, < 3.0)
47
+ powerpack (~> 0.1)
48
+ rainbow (>= 1.99.1, < 3.0)
49
+ ruby-progressbar (~> 1.4)
50
+ ruby-progressbar (1.7.5)
37
51
 
38
52
  PLATFORMS
39
53
  ruby
@@ -42,6 +56,7 @@ DEPENDENCIES
42
56
  byebug
43
57
  rake (~> 10.0)
44
58
  rspec (~> 3.3)
59
+ rubocop (~> 0.32)
45
60
  stackup!
46
61
 
47
62
  BUNDLED WITH
data/README.md CHANGED
File without changes
data/Rakefile CHANGED
@@ -3,8 +3,12 @@ require "bundler/gem_tasks"
3
3
  require "rspec/core/rake_task"
4
4
 
5
5
  RSpec::Core::RakeTask.new do |t|
6
- t.pattern = 'spec/**/*_spec.rb'
6
+ t.pattern = "spec/**/*_spec.rb"
7
7
  t.rspec_opts = ["--colour", "--format", "documentation"]
8
8
  end
9
9
 
10
10
  task "default" => "spec"
11
+
12
+ require "rubocop/rake_task"
13
+
14
+ RuboCop::RakeTask.new
data/bin/stackup ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ require "clamp"
3
+ $LOAD_PATH << File.expand_path("../../lib", __FILE__)
4
+ require File.expand_path("../../lib/stackup", __FILE__)
5
+ require File.expand_path("../../lib/stackup/cli", __FILE__)
6
+
7
+ Stackup::CLI.run
data/lib/stackup.rb CHANGED
@@ -1,3 +1,3 @@
1
- require 'aws-sdk'
2
- require_relative 'stackup/monitor'
3
- require_relative 'stackup/stack'
1
+ require "aws-sdk"
2
+ require_relative "stackup/monitor"
3
+ require_relative "stackup/stack"
@@ -0,0 +1,25 @@
1
+ module Stackup
2
+ class CLI < Clamp::Command
3
+
4
+ subcommand ["stack"], "Manage a stack." do
5
+ parameter "STACK-NAME", "Name of stack", :attribute_name => :stack_name
6
+
7
+ subcommand "apply", "Create/update the stack" do
8
+ parameter "TEMPLATE", "CloudFormation template (.json)", :attribute_name => :template
9
+
10
+ def execute
11
+ stack = Stackup::Stack.new(stack_name, template)
12
+ stack.create
13
+ end
14
+ end
15
+
16
+ subcommand "delete", "Remove the stack." do
17
+ def execute
18
+ stack = Stackup::Stack.new(stack_name, nil)
19
+ stack.delete
20
+ end
21
+ end
22
+ end
23
+
24
+ end
25
+ end
@@ -1,5 +1,6 @@
1
1
  module Stackup
2
2
  class Monitor
3
+
3
4
  attr_accessor :stack, :events
4
5
  def initialize(stack)
5
6
  @stack = stack
@@ -15,6 +16,7 @@ module Stackup
15
16
  end
16
17
 
17
18
  private
19
+
18
20
  def seen?(event)
19
21
  event_id = event.event_id
20
22
  if events.include?(event_id)
data/lib/stackup/stack.rb CHANGED
@@ -1,28 +1,34 @@
1
- require 'set'
1
+ require "set"
2
2
 
3
3
  module Stackup
4
4
  class Stack
5
+
5
6
  attr_reader :stack, :name, :cf, :template, :monitor
6
7
  SUCESS_STATES = ["CREATE_COMPLETE", "UPDATE_COMPLETE"]
7
- FAILURE_STATES = ["CREATE_FAILED", "DELETE_FAILED", "UPDATE_ROLLBACK_FAILED", "ROLLBACK_FAILED", "ROLLBACK_COMPLETE","ROLLBACK_FAILED","UPDATE_ROLLBACK_COMPLETE","UPDATE_ROLLBACK_FAILED"]
8
+ FAILURE_STATES = ["CREATE_FAILED", "DELETE_COMPLETE", "DELETE_FAILED", "UPDATE_ROLLBACK_FAILED", "ROLLBACK_FAILED", "ROLLBACK_COMPLETE", "ROLLBACK_FAILED", "UPDATE_ROLLBACK_COMPLETE", "UPDATE_ROLLBACK_FAILED"]
8
9
  END_STATES = SUCESS_STATES + FAILURE_STATES
9
10
 
10
11
  def initialize(name, template)
11
12
  @cf = Aws::CloudFormation::Client.new
12
- @stack = Aws::CloudFormation::Stack.new(name: name, client: cf)
13
+ @stack = Aws::CloudFormation::Stack.new(:name => name, :client => cf)
13
14
  @monitor = Stackup::Monitor.new(@stack)
14
15
  @template = template
15
16
  @name = name
16
17
  end
17
18
 
18
19
  def create
19
- response = cf.create_stack({
20
- stack_name: name,
21
- template_body: template,
22
- disable_rollback: true
23
- })
20
+ response = cf.create_stack(:stack_name => name,
21
+ :template_body => template,
22
+ :disable_rollback => true)
23
+ stack.wait_until(:max_attempts => 1000, :delay => 10) { |resource| display_events; END_STATES.include?(resource.stack_status) }
24
24
  !response[:stack_id].nil?
25
- stack.wait_until(max_attempts: 1000, delay: 10) { |resource| display_events ; END_STATES.include?(resource.stack_status) }
25
+ end
26
+
27
+ def delete
28
+ response = cf.delete_stack(:stack_name => name)
29
+ stack.wait_until(:max_attempts => 1000, :delay => 10) { |resource| display_events; END_STATES.include?(resource.stack_status) }
30
+ rescue Aws::CloudFormation::Errors::ValidationError
31
+ puts "Stack does not exist."
26
32
  end
27
33
 
28
34
  def display_events
Binary file
data/sample.json ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "AWSTemplateFormatVersion": "2010-09-09",
3
+ "Description": "test",
4
+ "Resources": {
5
+ "EC2Instance": {
6
+ "Type": "AWS::EC2::Instance",
7
+ "Properties": {
8
+ "InstanceType": "t2.micro",
9
+ "ImageId": "ami-8bfdbeb1"
10
+ }
11
+ }
12
+ }
13
+ }
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,4 @@
1
- require File.expand_path('../../lib/stackup', __FILE__)
1
+ require File.expand_path("../../lib/stackup", __FILE__)
2
2
 
3
3
  RSpec.configure do |c|
4
4
  c.mock_with :rspec
@@ -1,20 +1,22 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  describe Stackup::Monitor do
4
- let(:stack) { Stackup::Stack.new('name', 'template') }
4
+ let(:stack) { Stackup::Stack.new("name", "template") }
5
5
  let(:monitor) { Stackup::Monitor.new(stack) }
6
- let(:event) { double(Aws::CloudFormation::Event.new(id: '1')) }
7
- let(:events) { [ event ] }
6
+ let(:event) { double(Aws::CloudFormation::Event.new(:id => "1")) }
7
+ let(:events) { [event] }
8
8
 
9
- it 'should add the event if it is non-existent' do
10
- allow(event).to receive(:event_id).and_return('1')
9
+ before do
10
+ Aws.config[:region] = "ap-southeast-2"
11
+ allow(event).to receive(:event_id).and_return("1")
11
12
  allow(stack).to receive(:events).and_return(events)
13
+ end
14
+
15
+ it "should add the event if it is non-existent" do
12
16
  expect(monitor.new_events.size).to eq(1)
13
17
  end
14
18
 
15
- it 'should skip the event if it has been shown' do
16
- allow(event).to receive(:event_id).and_return('1')
17
- allow(stack).to receive(:events).and_return(events)
19
+ it "should skip the event if it has been shown" do
18
20
  expect(monitor.new_events.size).to eq(1)
19
21
  expect(monitor.new_events.size).to eq(0)
20
22
  end
@@ -1,25 +1,34 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  describe Stackup::Stack do
4
- let(:stack) { Stackup::Stack.new('stack_name', double(String)) }
4
+ let(:stack) { Stackup::Stack.new("stack_name", double(String)) }
5
5
  let(:cf_stack) { double(Aws::CloudFormation::Stack) }
6
- let(:cf) {double(Aws::CloudFormation::Client)}
6
+ let(:cf) { double(Aws::CloudFormation::Client) }
7
7
 
8
8
  before do
9
9
  allow(Aws::CloudFormation::Client).to receive(:new).and_return(cf)
10
10
  allow(Aws::CloudFormation::Stack).to receive(:new).and_return(cf_stack)
11
11
  end
12
12
 
13
- context 'create' do
14
- let(:response) {Seahorse::Client::Http::Response.new}
15
- it 'should create stack if all is well' do
16
- allow(response).to receive(:[]).with(:stack_id).and_return('1')
13
+ context "delete" do
14
+ it "should delete the stack if it exists?" do
15
+ response = double(Struct)
16
+ allow(cf).to receive(:delete_stack).and_return(response)
17
+ allow(cf_stack).to receive(:wait_until).and_return(response)
18
+ expect(stack.delete).to be response
19
+ end
20
+ end
21
+
22
+ context "create" do
23
+ let(:response) { Seahorse::Client::Http::Response.new }
24
+ it "should create stack if all is well" do
25
+ allow(response).to receive(:[]).with(:stack_id).and_return("1")
17
26
  allow(cf).to receive(:create_stack).and_return(response)
18
27
  allow(cf_stack).to receive(:wait_until).and_return(true)
19
28
  expect(stack.create).to be true
20
29
  end
21
30
 
22
- it 'should return nil if stack was not created' do
31
+ it "should return nil if stack was not created" do
23
32
  allow(response).to receive(:[]).with(:stack_id).and_return(nil)
24
33
  allow(cf).to receive(:create_stack).and_return(response)
25
34
  allow(cf_stack).to receive(:wait_until).and_return(false)
@@ -27,27 +36,27 @@ describe Stackup::Stack do
27
36
  end
28
37
  end
29
38
 
30
- context 'validate' do
31
- it 'should be valid if cf validate say so' do
39
+ context "validate" do
40
+ it "should be valid if cf validate say so" do
32
41
  allow(cf).to receive(:validate_template).and_return({})
33
42
  expect(stack.valid?).to be true
34
43
  end
35
44
 
36
- it 'should be invalid if cf validate say so' do
37
- allow(cf).to receive(:validate_template).and_return({code: '404'})
45
+ it "should be invalid if cf validate say so" do
46
+ allow(cf).to receive(:validate_template).and_return(:code => "404")
38
47
  expect(stack.valid?).to be false
39
48
  end
40
49
 
41
50
  end
42
51
 
43
- context 'deployed' do
44
- it 'should be true if it is already deployed' do
45
- allow(cf_stack).to receive(:stack_status).and_return('CREATE_COMPLETE')
52
+ context "deployed" do
53
+ it "should be true if it is already deployed" do
54
+ allow(cf_stack).to receive(:stack_status).and_return("CREATE_COMPLETE")
46
55
  expect(stack.deployed?).to be true
47
56
  end
48
57
 
49
- it 'should be false if it is not deployed' do
50
- allow(cf_stack).to receive(:stack_status).and_raise(Aws::CloudFormation::Errors::ValidationError.new('1', '2'))
58
+ it "should be false if it is not deployed" do
59
+ allow(cf_stack).to receive(:stack_status).and_raise(Aws::CloudFormation::Errors::ValidationError.new("1", "2"))
51
60
  expect(stack.deployed?).to be false
52
61
  end
53
62
  end
data/stackup.gemspec CHANGED
@@ -1,11 +1,10 @@
1
- # coding: utf-8
2
1
  lib = File.expand_path("../lib", __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
 
5
4
  Gem::Specification.new do |spec|
6
5
 
7
6
  spec.name = "stackup"
8
- spec.version = '0.0.1'
7
+ spec.version = "0.0.2"
9
8
  spec.authors = ["Arvind Kunday", "Mike Williams"]
10
9
  spec.email = ["arvind.kunday@rea-group.com", "mike.williams@rea-group.com"]
11
10
  spec.summary = "Tools for deployment to AWS"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stackup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arvind Kunday
@@ -43,7 +43,8 @@ description:
43
43
  email:
44
44
  - arvind.kunday@rea-group.com
45
45
  - mike.williams@rea-group.com
46
- executables: []
46
+ executables:
47
+ - stackup
47
48
  extensions: []
48
49
  extra_rdoc_files: []
49
50
  files:
@@ -51,10 +52,13 @@ files:
51
52
  - Gemfile.lock
52
53
  - README.md
53
54
  - Rakefile
55
+ - bin/stackup
54
56
  - lib/stackup.rb
57
+ - lib/stackup/cli.rb
55
58
  - lib/stackup/monitor.rb
56
59
  - lib/stackup/stack.rb
57
- - pkg/stackup-0.0.1.gem
60
+ - pkg/stackup-0.0.2.gem
61
+ - sample.json
58
62
  - spec/spec_helper.rb
59
63
  - spec/stackup/monitor_spec.rb
60
64
  - spec/stackup/stack_spec.rb
@@ -79,7 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
83
  version: '0'
80
84
  requirements: []
81
85
  rubyforge_project:
82
- rubygems_version: 2.4.5.1
86
+ rubygems_version: 2.4.8
83
87
  signing_key:
84
88
  specification_version: 4
85
89
  summary: Tools for deployment to AWS
Binary file