nypl_ruby_util 0.0.2 → 0.0.6
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/deploy_helper.rb +152 -0
- data/lib/kinesis_client.rb +2 -3
- data/lib/nypl_avro.rb +1 -0
- data/lib/nypl_ruby_util.rb +4 -0
- data/lib/platform_api_client.rb +4 -1
- metadata +33 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7792a53b4410092c9b4c215da151d9bdf6dbe37e37af60c35be4bc07b2ec419e
|
4
|
+
data.tar.gz: 864bbf4ae3f196c2810884779b91f0f912871e9cc3913bb19c608926681f7560
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 330aabe2c15a245efac358c65ae96ed79ef6928d6f1b2cf92a8b136df54429dd68dcc0e5b6e77b7677cbbd716db76fc81daed2e9cd54c44bfa008d22c8a2a9cb
|
7
|
+
data.tar.gz: a95be077f61ec0c17d0a4b1c7956e35a66b98e04a4c1cd4093db9ab349bf81bc4d9d986c441cd5f801921aa3c1bd4f300bbd52774ecfb0e9809dc4640792f71b
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require 'aws-sdk-lambda'
|
2
|
+
require 'aws-sdk-cloudwatchevents'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
# Utility class for running rake methods
|
6
|
+
class DeployHelper
|
7
|
+
attr_reader(
|
8
|
+
:travis_branch,
|
9
|
+
:aws_access_key_id,
|
10
|
+
:aws_secret_access_key,
|
11
|
+
:aws_configuration,
|
12
|
+
:region,
|
13
|
+
:lambda_client,
|
14
|
+
:yaml,
|
15
|
+
:lambda_config,
|
16
|
+
:function_name,
|
17
|
+
:event
|
18
|
+
)
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
@travis_branch = ENV['TRAVIS_BRANCH'].upcase
|
22
|
+
@travis_branch = ['MAIN', 'MASTER'].include?(@travis_branch) ? 'PRODUCTION' : @travis_branch
|
23
|
+
@aws_access_key_id = ENV["AWS_ACCESS_KEY_ID_#{travis_branch}"]
|
24
|
+
@aws_secret_access_key = ENV["AWS_SECRET_ACCESS_KEY_#{travis_branch}"]
|
25
|
+
@yaml = YAML.safe_load(File.read('.travis.yml'))
|
26
|
+
@lambda_config = yaml['deploy'].find { |conf| name_matches_branch?(conf['function_name'], travis_branch) }
|
27
|
+
@region = @lambda_config['region']
|
28
|
+
@function_name = @lambda_config['function_name']
|
29
|
+
@aws_configuration = {
|
30
|
+
region: region,
|
31
|
+
access_key_id: aws_access_key_id,
|
32
|
+
secret_access_key: aws_secret_access_key
|
33
|
+
}
|
34
|
+
p 'using configuration: ', aws_configuration
|
35
|
+
p 'lambda config: ', lambda_config
|
36
|
+
@lambda_client = Aws::Lambda::Client.new(aws_configuration) if configured?
|
37
|
+
end
|
38
|
+
|
39
|
+
def configured?
|
40
|
+
aws_access_key_id && aws_secret_access_key && region
|
41
|
+
end
|
42
|
+
|
43
|
+
def name_matches_branch?(name, branch)
|
44
|
+
downcase_name = name.downcase
|
45
|
+
downcase_branch = branch.downcase
|
46
|
+
variants = [
|
47
|
+
['dev', 'development'],
|
48
|
+
['qa'],
|
49
|
+
['main', 'master', 'production', 'prod'],
|
50
|
+
]
|
51
|
+
variants.any? do |group|
|
52
|
+
group.any? { |variant| downcase_name.include? variant }\
|
53
|
+
&& group.any? { |variant| downcase_branch.include?(variant) }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def update_lambda_configuration
|
58
|
+
unless configured? && lambda_config
|
59
|
+
p 'insufficient configuration'
|
60
|
+
return nil
|
61
|
+
end
|
62
|
+
|
63
|
+
updated_lambda_configuration = {
|
64
|
+
function_name: function_name,
|
65
|
+
vpc_config: lambda_config['vpc_config'],
|
66
|
+
environment: lambda_config['environment'],
|
67
|
+
layers: lambda_config['layers']
|
68
|
+
}
|
69
|
+
updated_lambda_configuration[:function_name] = function_name
|
70
|
+
p 'updating_function_configuration with: ', updated_lambda_configuration
|
71
|
+
update_configuration_resp = lambda_client.update_function_configuration(updated_lambda_configuration)
|
72
|
+
p 'update_configuration_resp: ', update_configuration_resp
|
73
|
+
end
|
74
|
+
|
75
|
+
def update_event
|
76
|
+
unless lambda_config['event']
|
77
|
+
p 'no event config'
|
78
|
+
return nil
|
79
|
+
end
|
80
|
+
|
81
|
+
@event = lambda_config['event']
|
82
|
+
if event['event_source_arn']
|
83
|
+
add_event_source
|
84
|
+
elsif event['schedule_expression']
|
85
|
+
add_cron
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def add_event_source
|
90
|
+
existing_events = lambda_client.list_event_source_mappings({
|
91
|
+
function_name: function_name
|
92
|
+
}).event_source_mappings
|
93
|
+
|
94
|
+
existing_events.each do |existing_event|
|
95
|
+
p 'deleting event with uuid: ', existing_event.uuid, 'and arn: ', existing_event.event_source_arn
|
96
|
+
lambda_client.delete_event_source_mapping({ uuid: existing_event.uuid })
|
97
|
+
end
|
98
|
+
event_to_create = event.map { |k, v| [k.to_sym, v] }.to_h
|
99
|
+
event_to_create[:function_name] = function_name
|
100
|
+
p 'creating event: ', event_to_create
|
101
|
+
create_resp = lambda_client.create_event_source_mapping(event_to_create)
|
102
|
+
p 'created: ', create_resp
|
103
|
+
end
|
104
|
+
|
105
|
+
def add_cron
|
106
|
+
## create the event
|
107
|
+
events_client = Aws::CloudWatchEvents::Client.new(aws_configuration)
|
108
|
+
schedule_expression = event['schedule_expression']
|
109
|
+
rule_name = "#{function_name}-rule"
|
110
|
+
p 'rule_name: ', rule_name, 'schedule_expression: ', schedule_expression
|
111
|
+
events_client.put_rule(name: rule_name, schedule_expression: schedule_expression)
|
112
|
+
|
113
|
+
## next we have to connect the event to the lambda
|
114
|
+
## the first step is to get the lambda
|
115
|
+
|
116
|
+
return 'missing function_name' unless function_name
|
117
|
+
|
118
|
+
p 'getting lambda with function name', function_name
|
119
|
+
lambda_resp = lambda_client.get_function(function_name: function_name).configuration
|
120
|
+
arn = lambda_resp.function_arn
|
121
|
+
|
122
|
+
## next figure out if the lambda already has granted cloudwatch
|
123
|
+
## permission to invoke
|
124
|
+
begin
|
125
|
+
policy_resp = lambda_client.get_policy(function_name: function_name)
|
126
|
+
unless policy_resp.policy.include?("#{function_name}-permission")
|
127
|
+
add_policy = true
|
128
|
+
else
|
129
|
+
p 'lambda already has permission'
|
130
|
+
end
|
131
|
+
rescue Aws::Lambda::Errors::ResourceNotFoundException
|
132
|
+
add_policy = true
|
133
|
+
p 'no policy'
|
134
|
+
end
|
135
|
+
|
136
|
+
## if not, add permission to invoke
|
137
|
+
if add_policy
|
138
|
+
permission = lambda_client.add_permission({
|
139
|
+
function_name: function_name,
|
140
|
+
principal: 'events.amazonaws.com',
|
141
|
+
statement_id: "#{function_name}-permission",
|
142
|
+
action: 'lambda:InvokeFunction'
|
143
|
+
})
|
144
|
+
p 'permission: ', permission
|
145
|
+
end
|
146
|
+
|
147
|
+
## finally we can tell the event to invoke the lambda
|
148
|
+
target_id = "#{function_name}-lambda"
|
149
|
+
p 'putting targets ', 'rule: ', rule_name, 'target_id: ', target_id, 'arn: ', arn
|
150
|
+
events_client.put_targets(rule: rule_name, targets: [{ id: target_id, arn: arn }])
|
151
|
+
end
|
152
|
+
end
|
data/lib/kinesis_client.rb
CHANGED
@@ -18,9 +18,8 @@ class KinesisClient
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def <<(json_message)
|
21
|
-
p '<< ', config[:schema_string], avro
|
22
21
|
if config[:schema_string]
|
23
|
-
message = avro.encode(json_message)
|
22
|
+
message = avro.encode(json_message, false)
|
24
23
|
else
|
25
24
|
message = json_message
|
26
25
|
end
|
@@ -39,7 +38,7 @@ class KinesisClient
|
|
39
38
|
if resp.successful?
|
40
39
|
return_hash["code"] = "200"
|
41
40
|
return_hash["message"] = json_message, resp
|
42
|
-
$logger.info("Message sent to
|
41
|
+
$logger.info("Message sent to #{config[:stream_name]} #{json_message}, #{resp}") if $logger
|
43
42
|
else
|
44
43
|
$logger.error("message" => "FAILED to send message to HoldRequestResult #{json_message}, #{resp}.") if $logger
|
45
44
|
raise NYPLError.new json_message, resp
|
data/lib/nypl_avro.rb
CHANGED
data/lib/nypl_ruby_util.rb
CHANGED
@@ -6,6 +6,7 @@ require_relative 'directory'
|
|
6
6
|
require_relative 'nypl_avro'
|
7
7
|
require_relative 'errors'
|
8
8
|
require_relative 'kinesis_client'
|
9
|
+
require_relative 'deploy_helper'
|
9
10
|
|
10
11
|
class NYPLRubyUtil
|
11
12
|
class SierraApiClient < SierraApiClient
|
@@ -25,4 +26,7 @@ class NYPLRubyUtil
|
|
25
26
|
|
26
27
|
class KinesisClient < KinesisClient
|
27
28
|
end
|
29
|
+
|
30
|
+
class DeployHelper < DeployHelper
|
31
|
+
end
|
28
32
|
end
|
data/lib/platform_api_client.rb
CHANGED
@@ -61,6 +61,7 @@ class PlatformApiClient
|
|
61
61
|
|
62
62
|
# Authorizes the request.
|
63
63
|
def authenticate!
|
64
|
+
$logger.debug('authenticating')
|
64
65
|
# NOOP if we've already authenticated
|
65
66
|
return nil if ! access_token.nil?
|
66
67
|
|
@@ -81,8 +82,10 @@ class PlatformApiClient
|
|
81
82
|
end
|
82
83
|
|
83
84
|
if response.code == '200'
|
84
|
-
access_token = JSON.parse(response.body)["access_token"]
|
85
|
+
self.access_token = JSON.parse(response.body)["access_token"]
|
86
|
+
$logger.debug('got token')
|
85
87
|
else
|
88
|
+
$logger.debug('no token')
|
86
89
|
nil
|
87
90
|
end
|
88
91
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nypl_ruby_util
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Appel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: avro
|
@@ -52,6 +52,34 @@ dependencies:
|
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 1.36.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: aws-sdk-lambda
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: aws-sdk-cloudwatchevents
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: nypl_log_formatter
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,6 +114,7 @@ executables: []
|
|
86
114
|
extensions: []
|
87
115
|
extra_rdoc_files: []
|
88
116
|
files:
|
117
|
+
- lib/deploy_helper.rb
|
89
118
|
- lib/directory.rb
|
90
119
|
- lib/errors.rb
|
91
120
|
- lib/kinesis_client.rb
|
@@ -93,7 +122,7 @@ files:
|
|
93
122
|
- lib/nypl_avro.rb
|
94
123
|
- lib/nypl_ruby_util.rb
|
95
124
|
- lib/platform_api_client.rb
|
96
|
-
homepage:
|
125
|
+
homepage: https://github.com/NYPL/NYPLRubyUtil
|
97
126
|
licenses:
|
98
127
|
- MIT
|
99
128
|
metadata: {}
|
@@ -112,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
141
|
- !ruby/object:Gem::Version
|
113
142
|
version: '0'
|
114
143
|
requirements: []
|
115
|
-
rubygems_version: 3.
|
144
|
+
rubygems_version: 3.2.3
|
116
145
|
signing_key:
|
117
146
|
specification_version: 4
|
118
147
|
summary: A repository of common utilities for NYPL Ruby application
|