jets 0.8.18 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitmodules +0 -3
- data/CHANGELOG.md +20 -1
- data/Gemfile.lock +6 -2
- data/README/prerelease.md +6 -0
- data/README/testing.md +41 -0
- data/Rakefile +9 -1
- data/jets.gemspec +1 -0
- data/lib/jets.rb +17 -18
- data/lib/jets/application.rb +26 -3
- data/lib/jets/aws_services.rb +26 -59
- data/lib/jets/aws_services/stack_status.rb +52 -0
- data/lib/jets/builders.rb +3 -2
- data/lib/jets/builders/handler_generator.rb +38 -2
- data/lib/jets/builders/shared_deducer.rb +32 -0
- data/lib/jets/cfn/builders.rb +3 -1
- data/lib/jets/cfn/builders/api_deployment_builder.rb +1 -1
- data/lib/jets/cfn/builders/api_gateway_builder.rb +1 -1
- data/lib/jets/cfn/builders/base_child_builder.rb +37 -7
- data/lib/jets/cfn/builders/controller_builder.rb +6 -1
- data/lib/jets/cfn/builders/function_builder.rb +5 -0
- data/lib/jets/cfn/builders/interface.rb +5 -6
- data/lib/jets/cfn/builders/job_builder.rb +5 -0
- data/lib/jets/cfn/builders/parent_builder.rb +17 -16
- data/lib/jets/cfn/builders/rule_builder.rb +6 -1
- data/lib/jets/cfn/builders/shared_builder.rb +14 -0
- data/lib/jets/commands.rb +9 -8
- data/lib/jets/commands/build.rb +36 -14
- data/lib/jets/commands/console.rb +1 -0
- data/lib/jets/commands/help/runner.md +17 -0
- data/lib/jets/commands/main.rb +7 -0
- data/lib/jets/commands/new.rb +39 -19
- data/lib/jets/commands/runner.rb +18 -0
- data/lib/jets/commands/sequence.rb +27 -1
- data/lib/jets/commands/templates/skeleton/.rspec +3 -0
- data/lib/jets/commands/templates/skeleton/Gemfile.tt +0 -1
- data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +2 -0
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +2 -1
- data/lib/jets/commands/templates/skeleton/config/routes.rb +5 -1
- data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +5 -4
- data/lib/jets/core.rb +8 -6
- data/lib/jets/default/application.rb +1 -0
- data/lib/jets/generator.rb +1 -1
- data/lib/jets/inflections.rb +23 -0
- data/lib/jets/job/dsl.rb +69 -47
- data/lib/jets/klass.rb +6 -1
- data/lib/jets/lambda/dsl.rb +102 -34
- data/lib/jets/lambda/function_constructor.rb +2 -2
- data/lib/jets/lambda/task.rb +10 -5
- data/lib/jets/naming.rb +13 -2
- data/lib/jets/processors/deducer.rb +13 -2
- data/lib/jets/processors/main_processor.rb +1 -1
- data/lib/jets/rails_overrides.rb +1 -1
- data/lib/jets/resource.rb +20 -5
- data/lib/jets/resource/api_gateway/deployment.rb +0 -1
- data/lib/jets/resource/associated.rb +26 -0
- data/lib/jets/resource/base.rb +12 -0
- data/lib/jets/resource/child_stack.rb +2 -0
- data/lib/jets/resource/child_stack/api_deployment.rb +9 -15
- data/lib/jets/resource/child_stack/api_gateway.rb +8 -8
- data/lib/jets/resource/child_stack/app_class.rb +41 -16
- data/lib/jets/resource/child_stack/base.rb +24 -0
- data/lib/jets/resource/child_stack/shared.rb +90 -0
- data/lib/jets/resource/config.rb +4 -0
- data/lib/jets/resource/config/config_rule.rb +66 -0
- data/lib/jets/resource/config/managed_rule.rb +15 -0
- data/lib/jets/resource/events.rb +3 -0
- data/lib/jets/resource/events/rule.rb +31 -0
- data/lib/jets/resource/iam/application_role.rb +2 -2
- data/lib/jets/resource/iam/base_role_definition.rb +4 -2
- data/lib/jets/resource/iam/class_role.rb +50 -2
- data/lib/jets/resource/iam/function_role.rb +28 -0
- data/lib/jets/resource/iam/policy_document.rb +0 -4
- data/lib/jets/resource/permission.rb +12 -6
- data/lib/jets/resource/replacer.rb +4 -0
- data/lib/jets/resource/sns.rb +3 -0
- data/lib/jets/resource/standardizer.rb +42 -0
- data/lib/jets/router.rb +9 -1
- data/lib/jets/rule/dsl.rb +51 -78
- data/lib/jets/stack.rb +105 -0
- data/lib/jets/stack/builder.rb +38 -0
- data/lib/jets/stack/definition.rb +50 -0
- data/lib/jets/stack/function.rb +60 -0
- data/lib/jets/stack/main.rb +5 -0
- data/lib/jets/stack/main/dsl.rb +33 -0
- data/lib/jets/stack/main/extensions/base.rb +45 -0
- data/lib/jets/stack/main/extensions/cloudwatch.rb +19 -0
- data/lib/jets/stack/main/extensions/lambda.rb +69 -0
- data/lib/jets/stack/main/extensions/sns.rb +12 -0
- data/lib/jets/stack/main/extensions/sqs.rb +8 -0
- data/lib/jets/stack/output.rb +38 -0
- data/lib/jets/stack/output/dsl.rb +19 -0
- data/lib/jets/stack/output/lookup.rb +36 -0
- data/lib/jets/stack/parameter.rb +38 -0
- data/lib/jets/stack/parameter/dsl.rb +42 -0
- data/lib/jets/stack/resource.rb +30 -0
- data/lib/jets/stack/resource/dsl.rb +19 -0
- data/lib/jets/version.rb +1 -1
- metadata +53 -4
- data/support/clean +0 -3
- data/support/console +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a34b4cffc9a96f0d4ce4821f38be3fef03a84a5dfa779a0ce4574b7c41fd8212
|
4
|
+
data.tar.gz: 77e840eb549a58d91c9899b79b0104f9d33e903fa4c1d53b171a168b0416fc64
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0bbf43c980eef26615b9eb8c4167c578da79c3cdf5af17d866e1fd7276618c593997f51e7a31316c96d1f561a27fb3d829ad1ea4e2b5a5f77fd2f6b7cbf906f5
|
7
|
+
data.tar.gz: 9cca888aaca0c205722c93858aad544ace8d8fe71255806a373d18461744070e5105ef055e63e1d27a4d3683a2d509063ac78403cb33ef54b869e44d0c5ec112
|
data/.gitmodules
CHANGED
data/CHANGELOG.md
CHANGED
@@ -3,8 +3,27 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
This project *loosely tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
|
5
5
|
|
6
|
+
## [0.9.0]
|
7
|
+
- Remove class name from the namespace. So namespace only has method name now. NOTE: This means upgrading from 0.8.x to 0.9.x requires a blue-green update.
|
8
|
+
- Add upgrading docs.
|
9
|
+
- Stack DSL: To support the concept of Custom Shared Resources. Supports extensions and simple functions also.
|
10
|
+
- Stack DSL: Allow for control of DependsOn attribute.
|
11
|
+
- Stack DSL: `MyStack.lookup` method
|
12
|
+
- Associated resource extensions support
|
13
|
+
- Associated resources multiple form support: long, medium, short
|
14
|
+
- Add `jets new --mode`: 3 modes: html, api, job. Remove the `--api`
|
15
|
+
- IAM policies inherit from higher precedence and superclasses.
|
16
|
+
- Add `jets runner` command
|
17
|
+
- Fix AWS Config Rules support
|
18
|
+
- Rename event_rule to events_rule
|
19
|
+
- Remove submodule project demo fixture in favor of spec/fixtures/apps/franky
|
20
|
+
- Add spec/bin/integration.sh - Simpler than the CI one and more immediately useful
|
21
|
+
- Improve AWS Config Rules docs
|
22
|
+
- Add config rules namespace setting
|
23
|
+
- Custom inflections support
|
24
|
+
|
6
25
|
## [0.8.18]
|
7
|
-
- improve performance of Jets.aws.region
|
26
|
+
- improve performance of Jets.aws.region, pull request #40 from tongueroo/dir-glob
|
8
27
|
|
9
28
|
## [0.8.17]
|
10
29
|
- fix Jets.eager_load
|
data/Gemfile.lock
CHANGED
@@ -11,7 +11,7 @@ GIT
|
|
11
11
|
PATH
|
12
12
|
remote: .
|
13
13
|
specs:
|
14
|
-
jets (0.
|
14
|
+
jets (0.9.0)
|
15
15
|
actionpack (>= 5.2.1)
|
16
16
|
actionview (>= 5.2.1)
|
17
17
|
activerecord (>= 5.2.1)
|
@@ -21,6 +21,7 @@ PATH
|
|
21
21
|
aws-sdk-dynamodb
|
22
22
|
aws-sdk-lambda
|
23
23
|
aws-sdk-s3
|
24
|
+
aws-sdk-sns
|
24
25
|
colorize
|
25
26
|
dotenv
|
26
27
|
gems
|
@@ -89,6 +90,9 @@ GEM
|
|
89
90
|
aws-sdk-core (~> 3, >= 3.26.0)
|
90
91
|
aws-sdk-kms (~> 1)
|
91
92
|
aws-sigv4 (~> 1.0)
|
93
|
+
aws-sdk-sns (1.5.0)
|
94
|
+
aws-sdk-core (~> 3, >= 3.26.0)
|
95
|
+
aws-sigv4 (~> 1.0)
|
92
96
|
aws-sigv4 (1.0.3)
|
93
97
|
builder (3.2.3)
|
94
98
|
byebug (10.0.2)
|
@@ -170,4 +174,4 @@ DEPENDENCIES
|
|
170
174
|
webpacker!
|
171
175
|
|
172
176
|
BUNDLED WITH
|
173
|
-
1.16.
|
177
|
+
1.16.3
|
data/README/testing.md
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# Testing
|
2
|
+
|
3
|
+
## Unit
|
4
|
+
|
5
|
+
To run unit tests:
|
6
|
+
|
7
|
+
bundle exec rspec
|
8
|
+
|
9
|
+
## Integration
|
10
|
+
|
11
|
+
### Locally
|
12
|
+
|
13
|
+
To run the integration tests locally, you need to create a new Jets CRUD project and start the server:
|
14
|
+
|
15
|
+
jets new demo
|
16
|
+
cd demo
|
17
|
+
jets generate scaffold Post title:string
|
18
|
+
jets server
|
19
|
+
|
20
|
+
Then you can run the postman tests:
|
21
|
+
|
22
|
+
spec/integration/local.sh
|
23
|
+
|
24
|
+
The integration_local.sh script ensures that the necessary data exists for the postman integration test to pass. It ultimately calls:
|
25
|
+
|
26
|
+
newman run spec/integration/fixtures/postman/collection.json -e spec/integration/fixtures/postman/environment.json
|
27
|
+
|
28
|
+
The integration test results should look something like this:
|
29
|
+
|
30
|
+
* [Jets Integration Test Results](https://gist.github.com/tongueroo/fcea2b2f48342d1448d3f258fcd6536c)
|
31
|
+
|
32
|
+
### Remotely
|
33
|
+
|
34
|
+
Then you can deploy the jets app and test it on real AWS Lambda.
|
35
|
+
|
36
|
+
cp ~/environment/.env.development.remote . # assumes you have a .env.development.remote
|
37
|
+
jets deploy
|
38
|
+
|
39
|
+
Run the remote integration script:
|
40
|
+
|
41
|
+
spec/integration/remote.sh
|
data/Rakefile
CHANGED
@@ -5,6 +5,13 @@ task :default => :spec
|
|
5
5
|
|
6
6
|
RSpec::Core::RakeTask.new
|
7
7
|
|
8
|
+
namespace :spec do
|
9
|
+
desc "Run integration test"
|
10
|
+
task :integration do
|
11
|
+
system("spec/bin/integration.sh")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
8
15
|
require_relative "lib/jets"
|
9
16
|
desc "Generates cli reference docs as markdown"
|
10
17
|
task :docs do
|
@@ -17,4 +24,5 @@ require 'jets/rdoc'
|
|
17
24
|
|
18
25
|
RDoc::Task.new do |rdoc|
|
19
26
|
rdoc.options += Jets::Rdoc.options
|
20
|
-
end
|
27
|
+
end
|
28
|
+
|
data/jets.gemspec
CHANGED
@@ -36,6 +36,7 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.add_dependency "aws-sdk-dynamodb"
|
37
37
|
spec.add_dependency "aws-sdk-lambda"
|
38
38
|
spec.add_dependency "aws-sdk-s3"
|
39
|
+
spec.add_dependency "aws-sdk-sns"
|
39
40
|
spec.add_dependency "colorize"
|
40
41
|
spec.add_dependency "dotenv"
|
41
42
|
spec.add_dependency "hashie"
|
data/lib/jets.rb
CHANGED
@@ -11,43 +11,42 @@ module Jets
|
|
11
11
|
# When we update Jets::RUBY_VERSION, need to update lambdagem/base.rb: def jets_ruby_version also
|
12
12
|
RUBY_VERSION = "2.5.0"
|
13
13
|
|
14
|
-
autoload :
|
15
|
-
autoload :Commands, "jets/commands"
|
16
|
-
|
14
|
+
autoload :Application, "jets/application"
|
17
15
|
autoload :AwsInfo, "jets/aws_info"
|
18
16
|
autoload :AwsServices, "jets/aws_services"
|
17
|
+
autoload :Booter, 'jets/booter'
|
19
18
|
autoload :Builders, 'jets/builders'
|
20
19
|
autoload :Call, "jets/call"
|
21
20
|
autoload :Cfn, 'jets/cfn'
|
21
|
+
autoload :CLI, "jets/cli"
|
22
|
+
autoload :Commands, "jets/commands"
|
22
23
|
autoload :Controller, 'jets/controller'
|
24
|
+
autoload :Core, "jets/core"
|
25
|
+
autoload :Dotenv, 'jets/dotenv'
|
23
26
|
autoload :Erb, "jets/erb"
|
24
27
|
autoload :Generator, "jets/generator"
|
28
|
+
autoload :IO, "jets/io"
|
25
29
|
autoload :Job, 'jets/job'
|
30
|
+
autoload :Klass, 'jets/klass'
|
26
31
|
autoload :Lambda, 'jets/lambda'
|
32
|
+
autoload :Logger, "jets/logger"
|
27
33
|
autoload :Naming, 'jets/naming'
|
28
34
|
autoload :PolyFun, 'jets/poly_fun'
|
35
|
+
autoload :Preheat, "jets/preheat"
|
29
36
|
autoload :Processors, 'jets/processors'
|
37
|
+
autoload :Rdoc, "jets/rdoc"
|
38
|
+
autoload :Resource, "jets/resource"
|
30
39
|
autoload :Route, "jets/route"
|
31
40
|
autoload :Router, "jets/router"
|
41
|
+
autoload :RubyServer, "jets/ruby_server"
|
32
42
|
autoload :Rule, 'jets/rule'
|
33
43
|
autoload :Server, "jets/server"
|
34
|
-
|
35
|
-
autoload :Application, "jets/application"
|
36
|
-
autoload :Booter, 'jets/booter'
|
37
|
-
autoload :Core, "jets/core"
|
38
|
-
autoload :Dotenv, 'jets/dotenv'
|
39
|
-
autoload :Klass, 'jets/klass'
|
40
|
-
autoload :Util, "jets/util"
|
44
|
+
autoload :Stack, "jets/stack"
|
41
45
|
autoload :Timing, "jets/timing"
|
42
|
-
autoload :
|
43
|
-
|
44
|
-
|
45
|
-
autoload :RubyServer, "jets/ruby_server"
|
46
|
-
autoload :IO, "jets/io"
|
47
|
-
autoload :Logger, "jets/logger"
|
46
|
+
autoload :Util, "jets/util"
|
47
|
+
autoload :Inflections, "jets/inflections"
|
48
48
|
|
49
|
-
|
50
|
-
autoload :Rdoc, "jets/rdoc"
|
49
|
+
extend Core # root, logger, etc
|
51
50
|
end
|
52
51
|
|
53
52
|
require "jets/core_ext/kernel"
|
data/lib/jets/application.rb
CHANGED
@@ -11,11 +11,16 @@ class Jets::Application
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def setup!
|
14
|
+
load_inflections
|
14
15
|
load_configs # load config object so following methods can use it
|
15
16
|
setup_auto_load_paths
|
16
17
|
load_routes
|
17
18
|
end
|
18
19
|
|
20
|
+
def load_inflections
|
21
|
+
Jets::Inflections.load!
|
22
|
+
end
|
23
|
+
|
19
24
|
def config
|
20
25
|
config = ActiveSupport::OrderedOptions.new
|
21
26
|
|
@@ -30,6 +35,9 @@ class Jets::Application
|
|
30
35
|
'https://gems.lambdagems.com'
|
31
36
|
]
|
32
37
|
|
38
|
+
config.inflections = ActiveSupport::OrderedOptions.new
|
39
|
+
config.inflections.irregular = {}
|
40
|
+
|
33
41
|
config
|
34
42
|
end
|
35
43
|
memoize :config
|
@@ -91,12 +99,27 @@ class Jets::Application
|
|
91
99
|
|
92
100
|
# Must set default iam_policy here instead of `def config` because we need access to
|
93
101
|
# the project_namespace and if we call it from `def config` we get an infinit loop
|
94
|
-
config.iam_policy ||=
|
95
|
-
|
102
|
+
config.iam_policy ||= default_iam_policy(project_namespace)
|
103
|
+
config.managed_policy_definitions ||= [] # default empty
|
104
|
+
end
|
105
|
+
|
106
|
+
def default_iam_policy(project_namespace)
|
107
|
+
logs = {
|
96
108
|
action: ["logs:*"],
|
97
109
|
effect: "Allow",
|
98
110
|
resource: "arn:aws:logs:#{Jets.aws.region}:#{Jets.aws.account}:log-group:/aws/lambda/#{project_namespace}-*",
|
99
|
-
}
|
111
|
+
}
|
112
|
+
policies = [logs]
|
113
|
+
|
114
|
+
if Jets::Stack.has_resources?
|
115
|
+
cloudformation = {
|
116
|
+
action: ["cloudformation:DescribeStacks"],
|
117
|
+
effect: "Allow",
|
118
|
+
resource: "arn:aws:cloudformation:#{Jets.aws.region}:#{Jets.aws.account}:stack/#{project_namespace}*",
|
119
|
+
}
|
120
|
+
policies << cloudformation
|
121
|
+
end
|
122
|
+
policies
|
100
123
|
end
|
101
124
|
|
102
125
|
# It is pretty easy to attempt to set environment variables without
|
data/lib/jets/aws_services.rb
CHANGED
@@ -1,81 +1,48 @@
|
|
1
|
-
require "aws-sdk-s3"
|
2
1
|
require "aws-sdk-cloudformation"
|
3
2
|
require "aws-sdk-cloudwatchlogs"
|
4
3
|
require "aws-sdk-lambda"
|
4
|
+
require "aws-sdk-s3"
|
5
5
|
require "aws-sdk-sts"
|
6
|
+
# Not used in Jets internally but convenient for shared resources
|
7
|
+
require "aws-sdk-sns"
|
6
8
|
|
7
9
|
module Jets::AwsServices
|
8
|
-
|
9
|
-
|
10
|
-
|
10
|
+
autoload :StackStatus, 'jets/aws_services/stack_status'
|
11
|
+
include StackStatus
|
12
|
+
extend Memoist
|
11
13
|
|
12
|
-
def
|
13
|
-
|
14
|
+
def cfn
|
15
|
+
Aws::CloudFormation::Client.new
|
14
16
|
end
|
17
|
+
memoize :cfn
|
15
18
|
|
16
|
-
def
|
17
|
-
|
19
|
+
def logs
|
20
|
+
Aws::CloudWatchLogs::Client.new
|
18
21
|
end
|
22
|
+
memoize :logs
|
19
23
|
|
20
24
|
def lambda
|
21
|
-
|
25
|
+
Aws::Lambda::Client.new
|
22
26
|
end
|
27
|
+
memoize :lambda
|
23
28
|
|
24
|
-
def
|
25
|
-
|
29
|
+
def s3
|
30
|
+
Aws::S3::Client.new
|
26
31
|
end
|
32
|
+
memoize :s3
|
27
33
|
|
28
|
-
def
|
29
|
-
|
34
|
+
def s3_resource
|
35
|
+
Aws::S3::Resource.new
|
30
36
|
end
|
37
|
+
memoize :s3_resource
|
31
38
|
|
32
|
-
def
|
33
|
-
|
34
|
-
|
35
|
-
exist = nil
|
36
|
-
begin
|
37
|
-
# When the stack does not exist an exception is raised. Example:
|
38
|
-
# Aws::CloudFormation::Errors::ValidationError: Stack with id blah does not exist
|
39
|
-
resp = cfn.describe_stacks(stack_name: stack_name)
|
40
|
-
exist = true
|
41
|
-
rescue Aws::CloudFormation::Errors::ValidationError => e
|
42
|
-
if e.message =~ /does not exist/
|
43
|
-
exist = false
|
44
|
-
elsif e.message.include?("'stackName' failed to satisfy constraint")
|
45
|
-
# Example of e.message when describe_stack with invalid stack name
|
46
|
-
# "1 validation error detected: Value 'instance_and_route53' at 'stackName' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-zA-Z][-a-zA-Z0-9]*|arn:[-a-zA-Z0-9:/._+]*"
|
47
|
-
puts "Invalid stack name: #{stack_name}"
|
48
|
-
puts "Full error message: #{e.message}"
|
49
|
-
exit 1
|
50
|
-
else
|
51
|
-
raise # re-raise exception because unsure what other errors can happen
|
52
|
-
end
|
53
|
-
end
|
54
|
-
exist
|
39
|
+
def sts
|
40
|
+
Aws::STS::Client.new
|
55
41
|
end
|
42
|
+
memoize :sts
|
56
43
|
|
57
|
-
|
58
|
-
|
59
|
-
# Returns resp so we can use it to grab data about the stack without calling api again.
|
60
|
-
def stack_in_progress?(stack_name)
|
61
|
-
return true if !stack_exists?(stack_name)
|
62
|
-
|
63
|
-
# Assumes stack exists
|
64
|
-
resp = cfn.describe_stacks(stack_name: stack_name)
|
65
|
-
status = resp.stacks[0].stack_status
|
66
|
-
if status =~ /_IN_PROGRESS$/
|
67
|
-
puts "The '#{stack_name}' stack status is #{status}. " \
|
68
|
-
"Please wait until the stack is ready and try again.".colorize(:red)
|
69
|
-
exit 0
|
70
|
-
elsif resp.stacks[0].outputs.empty? && status != 'ROLLBACK_COMPLETE'
|
71
|
-
# This Happens when the miminal stack fails at the very beginning.
|
72
|
-
# There is no s3 bucket at all. User should delete the stack.
|
73
|
-
puts "The minimal stack failed to create. Please delete the stack first and try again. " \
|
74
|
-
"You can delete the CloudFormation stack or use the `jets delete` command"
|
75
|
-
exit 0
|
76
|
-
else
|
77
|
-
true
|
78
|
-
end
|
44
|
+
def sns
|
45
|
+
Aws::SNS::Client.new
|
79
46
|
end
|
80
|
-
|
47
|
+
memoize :sns
|
81
48
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Jets::AwsServices
|
2
|
+
module StackStatus
|
3
|
+
def stack_exists?(stack_name)
|
4
|
+
return false if ENV['TEST']
|
5
|
+
|
6
|
+
exist = nil
|
7
|
+
begin
|
8
|
+
# When the stack does not exist an exception is raised. Example:
|
9
|
+
# Aws::CloudFormation::Errors::ValidationError: Stack with id blah does not exist
|
10
|
+
resp = cfn.describe_stacks(stack_name: stack_name)
|
11
|
+
exist = true
|
12
|
+
rescue Aws::CloudFormation::Errors::ValidationError => e
|
13
|
+
if e.message =~ /does not exist/
|
14
|
+
exist = false
|
15
|
+
elsif e.message.include?("'stackName' failed to satisfy constraint")
|
16
|
+
# Example of e.message when describe_stack with invalid stack name
|
17
|
+
# "1 validation error detected: Value 'instance_and_route53' at 'stackName' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-zA-Z][-a-zA-Z0-9]*|arn:[-a-zA-Z0-9:/._+]*"
|
18
|
+
puts "Invalid stack name: #{stack_name}"
|
19
|
+
puts "Full error message: #{e.message}"
|
20
|
+
exit 1
|
21
|
+
else
|
22
|
+
raise # re-raise exception because unsure what other errors can happen
|
23
|
+
end
|
24
|
+
end
|
25
|
+
exist
|
26
|
+
end
|
27
|
+
|
28
|
+
# All CloudFormation states listed here: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
|
29
|
+
#
|
30
|
+
# Returns resp so we can use it to grab data about the stack without calling api again.
|
31
|
+
def stack_in_progress?(stack_name)
|
32
|
+
return true if !stack_exists?(stack_name)
|
33
|
+
|
34
|
+
# Assumes stack exists
|
35
|
+
resp = cfn.describe_stacks(stack_name: stack_name)
|
36
|
+
status = resp.stacks[0].stack_status
|
37
|
+
if status =~ /_IN_PROGRESS$/
|
38
|
+
puts "The '#{stack_name}' stack status is #{status}. " \
|
39
|
+
"Please wait until the stack is ready and try again.".colorize(:red)
|
40
|
+
exit 0
|
41
|
+
elsif resp.stacks[0].outputs.empty? && status != 'ROLLBACK_COMPLETE'
|
42
|
+
# This Happens when the miminal stack fails at the very beginning.
|
43
|
+
# There is no s3 bucket at all. User should delete the stack.
|
44
|
+
puts "The minimal stack failed to create. Please delete the stack first and try again. " \
|
45
|
+
"You can delete the CloudFormation stack or use the `jets delete` command"
|
46
|
+
exit 0
|
47
|
+
else
|
48
|
+
true
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/jets/builders.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
class Jets::Builders
|
2
|
-
autoload :Deducer, "jets/builders/deducer"
|
3
|
-
autoload :HandlerGenerator, "jets/builders/handler_generator"
|
4
2
|
autoload :CodeBuilder, "jets/builders/code_builder"
|
3
|
+
autoload :Deducer, "jets/builders/deducer"
|
5
4
|
autoload :GemReplacer, "jets/builders/gem_replacer"
|
5
|
+
autoload :HandlerGenerator, "jets/builders/handler_generator"
|
6
|
+
autoload :SharedDeducer, "jets/builders/shared_deducer"
|
6
7
|
end
|