swaggerless 0.1.2 → 0.1.3
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 +4 -4
- data/lib/swaggerless/cleaner.rb +78 -0
- data/lib/swaggerless/deployer.rb +3 -61
- data/lib/swaggerless/swaggerextractor.rb +68 -0
- data/lib/swaggerless/version.rb +1 -1
- data/lib/tasks/swaggerless.rake +8 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a596bd778896068d191ed0e6005a6aa09decd43
|
4
|
+
data.tar.gz: 4f419c8aeebf5264c0db03388d57aecb593b061e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c75f5ac8c1d2c077f72f1ff83941f0b6c83d014980b4256837125f2cdc6920bd9638dc3c58b3ba67c4d84a3ed718c437b6ae2c54c8b730010c4201b813882cad
|
7
|
+
data.tar.gz: 13a6c99d9526d9fedefc9d089b5bf7d3f33f6b4296a2ab2a3c7cc4210978692aeb40f6e12cc8aeae47f99475615e5af75717746003f80011ef39eeffadaa1545
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require "aws-sdk"
|
2
|
+
|
3
|
+
module Swaggerless
|
4
|
+
|
5
|
+
class Cleaner
|
6
|
+
|
7
|
+
def initialize(account, region)
|
8
|
+
@region = region
|
9
|
+
@account = account
|
10
|
+
@api_gateway_client = Aws::APIGateway::Client.new(region: @region)
|
11
|
+
@lambda_client = Aws::Lambda::Client.new(region: @region)
|
12
|
+
@swaggerExtractor = Swaggerless::SwaggerExtractor.new();
|
13
|
+
end
|
14
|
+
|
15
|
+
def clean_unused_deployments(swagger)
|
16
|
+
apis = @api_gateway_client.get_rest_apis(limit: 500).data
|
17
|
+
api = apis.items.select { |a| a.name == swagger['info']['title'] }.first
|
18
|
+
|
19
|
+
if api
|
20
|
+
used_deployments = Hash.new
|
21
|
+
response = @api_gateway_client.get_stages({rest_api_id: api.id})
|
22
|
+
response.item.each do |stage|
|
23
|
+
puts "Deployment #{stage.deployment_id} used by #{stage.stage_name}"
|
24
|
+
used_deployments[stage.deployment_id] = stage.stage_name
|
25
|
+
end
|
26
|
+
response = @api_gateway_client.get_deployments({rest_api_id: api.id, limit: 500})
|
27
|
+
time_threshold = Time.now
|
28
|
+
response.items.each do |deployment|
|
29
|
+
puts "Deployment #{deployment.id} is not used and old enough to be pruned"
|
30
|
+
if used_deployments[deployment.id] == nil and Time.at(deployment.created_date) < time_threshold
|
31
|
+
@api_gateway_client.delete_deployment({rest_api_id: api.id, deployment_id: deployment.id})
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
response = @api_gateway_client.get_deployments({rest_api_id: api.id, limit: 500})
|
36
|
+
lambda_liases_used = Hash.new
|
37
|
+
response.items.each do |deployment|
|
38
|
+
first_char = deployment.description.rindex(":")
|
39
|
+
if first_char
|
40
|
+
func_alias = deployment.description[deployment.description.rindex(":")+2..-1]
|
41
|
+
puts "Lambda alias #{func_alias} still used by deployment #{deployment.id}"
|
42
|
+
lambda_liases_used[func_alias] = deployment.id
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
configured_lambdas = @swaggerExtractor.get_lambda_map(swagger)
|
47
|
+
configured_lambdas.each do |functionName, value|
|
48
|
+
lambda_versions_used = Hash.new
|
49
|
+
resp = @lambda_client.list_aliases({function_name: functionName, max_items: 500 })
|
50
|
+
resp.aliases.each do |funcAlias|
|
51
|
+
if lambda_liases_used[funcAlias.name] == nil then
|
52
|
+
puts "Deleting alias #{funcAlias.name} for lambda function #{functionName}"
|
53
|
+
@lambda_client.delete_alias({function_name: functionName, name: funcAlias.name})
|
54
|
+
else
|
55
|
+
puts "Lambda version #{funcAlias.function_version} still used by function deployment #{functionName}"
|
56
|
+
lambda_versions_used[funcAlias.function_version] = funcAlias.name
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
resp = @lambda_client.list_versions_by_function({function_name: functionName, max_items: 500})
|
62
|
+
resp.versions.each do |lambda|
|
63
|
+
if lambda.version != "$LATEST" and lambda_versions_used[lambda.version] == nil
|
64
|
+
puts "Deleting lambda version #{lambda.version} of function #{functionName}"
|
65
|
+
@lambda_client.delete_function({function_name: functionName, qualifier: lambda.version})
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
data/lib/swaggerless/deployer.rb
CHANGED
@@ -12,6 +12,7 @@ module Swaggerless
|
|
12
12
|
@output_path = 'output'
|
13
13
|
@verbose = false;
|
14
14
|
@function_alias = get_current_package_alias
|
15
|
+
@swaggerExtractor = Swaggerless::SwaggerExtractor.new();
|
15
16
|
end
|
16
17
|
|
17
18
|
def create_lambda_package(directory, outputName)
|
@@ -22,16 +23,6 @@ module Swaggerless
|
|
22
23
|
return swagger["info"]["title"].gsub(/\s+/, '_')
|
23
24
|
end
|
24
25
|
|
25
|
-
EXT_LAMBDA_NAME = 'x-amazon-lambda-name'
|
26
|
-
EXT_LAMBDA_HANDLER = 'x-amazon-lambda-handler'
|
27
|
-
EXT_LAMBDA_TIMEOUT = 'x-amazon-lambda-timeout'
|
28
|
-
EXT_LAMBDA_RUNTIME = 'x-amazon-lambda-runtime'
|
29
|
-
|
30
|
-
AMZ_APIGATEWAY_AUTHORIZER = 'x-amazon-apigateway-authorizer'
|
31
|
-
|
32
|
-
SWGR_OPERATION_ID = 'operationId'
|
33
|
-
SWGR_SUMMARY = 'summary'
|
34
|
-
|
35
26
|
def deploy_authoirizers_and_update_authorizers_uri(lambda_role_arn, swagger)
|
36
27
|
swagger["securityDefinitions"].each do |securityDefinitionName, securityDefinition|
|
37
28
|
if securityDefinition[AMZ_APIGATEWAY_AUTHORIZER] != nil then
|
@@ -61,7 +52,7 @@ module Swaggerless
|
|
61
52
|
end
|
62
53
|
|
63
54
|
def deploy_lambdas_and_update_uris(lambda_role_arn, swagger)
|
64
|
-
lambdas_configs = get_lambda_map(swagger)
|
55
|
+
lambdas_configs = @swaggerExtractor.get_lambda_map(swagger)
|
65
56
|
deployed_operations = Hash.new
|
66
57
|
swagger["paths"].each do |path, path_config|
|
67
58
|
path_config.each do |method, method_config|
|
@@ -142,7 +133,7 @@ module Swaggerless
|
|
142
133
|
while true do
|
143
134
|
begin
|
144
135
|
puts "Creating API Gateway Deployment"
|
145
|
-
@api_gateway_client.create_deployment({rest_api_id: api_id, stage_name: @env, description: "Automated deployment of #{@env}", variables: {"env" => @env }});
|
136
|
+
@api_gateway_client.create_deployment({rest_api_id: api_id, stage_name: @env, description: "Automated deployment of #{@env} using lambda: #{@function_alias}", variables: {"env" => @env }});
|
146
137
|
url = "https://#{api_id}.execute-api.#{@region}.amazonaws.com/#{@env}/"
|
147
138
|
puts "API available at #{url}"
|
148
139
|
return url;
|
@@ -154,55 +145,6 @@ module Swaggerless
|
|
154
145
|
|
155
146
|
end
|
156
147
|
|
157
|
-
private
|
158
|
-
|
159
|
-
def get_lambda_map(swagger)
|
160
|
-
lambdas_map = Hash.new
|
161
|
-
swagger["paths"].each do |path, path_config|
|
162
|
-
path_config.each do |method, method_config|
|
163
|
-
if lambdas_map[method_config[EXT_LAMBDA_NAME]] then
|
164
|
-
stored_version = lambdas_map[method_config[EXT_LAMBDA_NAME]];
|
165
|
-
encountered_version = build_lambda_config_hash(method_config)
|
166
|
-
unless is_lambda_config_correct(stored_version, encountered_version) then
|
167
|
-
raise "Lambda #{method_config[EXT_LAMBDA_NAME]} mentioned multiple times in configuration with different settings"
|
168
|
-
end
|
169
|
-
lambdas_map[method_config[EXT_LAMBDA_NAME]]['description'] = 'Part of ' + Deployer.get_service_prefix(swagger)
|
170
|
-
else
|
171
|
-
lambdas_map[method_config[EXT_LAMBDA_NAME]] = build_lambda_config_hash(method_config)
|
172
|
-
end
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
swagger["securityDefinitions"].each do |securityDefinitionName, securityDefinition|
|
177
|
-
if securityDefinition[AMZ_APIGATEWAY_AUTHORIZER] != nil then
|
178
|
-
if lambdas_map[securityDefinition[EXT_LAMBDA_NAME]] then
|
179
|
-
stored_version = lambdas_map[securityDefinition[AMZ_APIGATEWAY_AUTHORIZER][EXT_LAMBDA_NAME]];
|
180
|
-
encountered_version = build_lambda_config_hash(securityDefinition[AMZ_APIGATEWAY_AUTHORIZER])
|
181
|
-
unless is_lambda_config_correct(stored_version, encountered_version)
|
182
|
-
raise "Lambda #{method_config[EXT_LAMBDA_NAME]} mentioned multiple times in configuration with different settings"
|
183
|
-
end
|
184
|
-
lambdas_map[securityDefinition[EXT_LAMBDA_NAME]].description = 'Part of ' + Deployer.get_service_prefix(swagger)
|
185
|
-
else
|
186
|
-
lambdas_map[securityDefinition[EXT_LAMBDA_NAME]] = build_lambda_config_hash(securityDefinition)
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
190
|
-
return lambdas_map
|
191
|
-
end
|
192
|
-
|
193
|
-
def is_lambda_config_correct(l1, l2)
|
194
|
-
return (l1['handler'] == l2['handler'] and
|
195
|
-
l1['timeout'] == l2['timeout'] and
|
196
|
-
l1['runtime'] == l2['runtime'])
|
197
|
-
end
|
198
|
-
|
199
|
-
def build_lambda_config_hash(method_config)
|
200
|
-
{ handler: method_config[EXT_LAMBDA_HANDLER],
|
201
|
-
timeout: method_config[EXT_LAMBDA_TIMEOUT],
|
202
|
-
runtime: method_config[EXT_LAMBDA_RUNTIME],
|
203
|
-
description: method_config[SWGR_SUMMARY]}
|
204
|
-
end
|
205
|
-
|
206
148
|
end
|
207
149
|
|
208
150
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require "aws-sdk"
|
2
|
+
|
3
|
+
module Swaggerless
|
4
|
+
|
5
|
+
EXT_LAMBDA_NAME = 'x-amazon-lambda-name'
|
6
|
+
EXT_LAMBDA_HANDLER = 'x-amazon-lambda-handler'
|
7
|
+
EXT_LAMBDA_TIMEOUT = 'x-amazon-lambda-timeout'
|
8
|
+
EXT_LAMBDA_RUNTIME = 'x-amazon-lambda-runtime'
|
9
|
+
|
10
|
+
AMZ_APIGATEWAY_AUTHORIZER = 'x-amazon-apigateway-authorizer'
|
11
|
+
|
12
|
+
SWGR_OPERATION_ID = 'operationId'
|
13
|
+
SWGR_SUMMARY = 'summary'
|
14
|
+
|
15
|
+
class SwaggerExtractor
|
16
|
+
|
17
|
+
def get_lambda_map(swagger)
|
18
|
+
lambdas_map = Hash.new
|
19
|
+
swagger["paths"].each do |path, path_config|
|
20
|
+
path_config.each do |method, method_config|
|
21
|
+
if lambdas_map[method_config[EXT_LAMBDA_NAME]] then
|
22
|
+
stored_version = lambdas_map[method_config[EXT_LAMBDA_NAME]];
|
23
|
+
encountered_version = build_lambda_config_hash(method_config)
|
24
|
+
unless is_lambda_config_correct(stored_version, encountered_version) then
|
25
|
+
raise "Lambda #{method_config[EXT_LAMBDA_NAME]} mentioned multiple times in configuration with different settings"
|
26
|
+
end
|
27
|
+
lambdas_map[method_config[EXT_LAMBDA_NAME]]['description'] = 'Part of ' + Deployer.get_service_prefix(swagger)
|
28
|
+
elsif method_config[EXT_LAMBDA_NAME]
|
29
|
+
lambdas_map[method_config[EXT_LAMBDA_NAME]] = build_lambda_config_hash(method_config)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
swagger["securityDefinitions"].each do |securityDefinitionName, securityDefinition|
|
35
|
+
if securityDefinition[AMZ_APIGATEWAY_AUTHORIZER] != nil then
|
36
|
+
if lambdas_map[securityDefinition[EXT_LAMBDA_NAME]] then
|
37
|
+
stored_version = lambdas_map[securityDefinition[AMZ_APIGATEWAY_AUTHORIZER][EXT_LAMBDA_NAME]];
|
38
|
+
encountered_version = build_lambda_config_hash(securityDefinition[AMZ_APIGATEWAY_AUTHORIZER])
|
39
|
+
unless is_lambda_config_correct(stored_version, encountered_version)
|
40
|
+
raise "Lambda #{method_config[EXT_LAMBDA_NAME]} mentioned multiple times in configuration with different settings"
|
41
|
+
end
|
42
|
+
lambdas_map[securityDefinition[EXT_LAMBDA_NAME]].description = 'Part of ' + Deployer.get_service_prefix(swagger)
|
43
|
+
else
|
44
|
+
lambdas_map[securityDefinition[EXT_LAMBDA_NAME]] = build_lambda_config_hash(securityDefinition)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
return lambdas_map
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def is_lambda_config_correct(l1, l2)
|
54
|
+
return (l1['handler'] == l2['handler'] and
|
55
|
+
l1['timeout'] == l2['timeout'] and
|
56
|
+
l1['runtime'] == l2['runtime'])
|
57
|
+
end
|
58
|
+
|
59
|
+
def build_lambda_config_hash(method_config)
|
60
|
+
{ handler: method_config[EXT_LAMBDA_HANDLER],
|
61
|
+
timeout: method_config[EXT_LAMBDA_TIMEOUT],
|
62
|
+
runtime: method_config[EXT_LAMBDA_RUNTIME],
|
63
|
+
description: method_config[SWGR_SUMMARY]}
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
data/lib/swaggerless/version.rb
CHANGED
data/lib/tasks/swaggerless.rake
CHANGED
@@ -29,7 +29,7 @@ namespace :swaggerless do
|
|
29
29
|
swagger_content = File.read(@swaggerSpecFile)
|
30
30
|
swagger = YAML.load(swagger_content)
|
31
31
|
ENV["apiUrl"] = Swaggerless::Deployer.new(@awsAccount, @awsRegion, args[:environment].gsub(/[^a-zA-Z0-9_]/, "_")).create_api_gateway_deployment(@lambdaRoleArn, swagger)
|
32
|
-
puts "Setting
|
32
|
+
puts "Setting ENV[apiUrl] to point to the deployed API"
|
33
33
|
end
|
34
34
|
|
35
35
|
desc 'Package the project for AWS Lambda'
|
@@ -54,4 +54,11 @@ namespace :swaggerless do
|
|
54
54
|
FileUtils.rm_rf('output')
|
55
55
|
end
|
56
56
|
|
57
|
+
desc 'Clean AWS resources'
|
58
|
+
task :clean_aws_resources do
|
59
|
+
swagger_content = File.read(@swaggerSpecFile)
|
60
|
+
swagger = YAML.load(swagger_content)
|
61
|
+
Swaggerless::Cleaner.new(@awsAccount, @awsRegion).clean_unused_deployments(swagger)
|
62
|
+
end
|
63
|
+
|
57
64
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: swaggerless
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rafal Nowosielski
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-11-
|
11
|
+
date: 2016-11-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -93,8 +93,10 @@ files:
|
|
93
93
|
- README.md
|
94
94
|
- Rakefile
|
95
95
|
- lib/swaggerless.rb
|
96
|
+
- lib/swaggerless/cleaner.rb
|
96
97
|
- lib/swaggerless/deployer.rb
|
97
98
|
- lib/swaggerless/packager.rb
|
99
|
+
- lib/swaggerless/swaggerextractor.rb
|
98
100
|
- lib/swaggerless/version.rb
|
99
101
|
- lib/tasks/swaggerless.rake
|
100
102
|
- swaggerless.gemspec
|