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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d694d07f97c1af61e3c9ae6711123dbf7256d1e4
4
- data.tar.gz: 9d5618bdf56253b8c8924673ebf9431ede719e8e
3
+ metadata.gz: 6a596bd778896068d191ed0e6005a6aa09decd43
4
+ data.tar.gz: 4f419c8aeebf5264c0db03388d57aecb593b061e
5
5
  SHA512:
6
- metadata.gz: f04f394a5a902379f3ed2acf25bbb3d1b6edd8da3dcbabacb9f8f1cb3e8e8fd785457d81d51c6b8138ff6bbc0f111033c2726bdc662f64164bf541388a19d752
7
- data.tar.gz: 3b76780b95ee2f581b21a4be4953dcea1e8f2ce61724ea32739015f0673e58e7e828942c0715c046c52c51b9b08c5f839d77169bc3f50fcb46d5c1087a5e73e0
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
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Swaggerless
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
@@ -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 $apiUrl environment variable to point to the deployed API"
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.2
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-28 00:00:00.000000000 Z
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