nypl_ruby_util 0.0.2 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 952f7c7491f09f2e9cb290fa60b27ae4b8fb7e9813aa4770815382a0e4bbc1b6
4
- data.tar.gz: 8fbdca7f3ed50af72afb87b26a419c973197d6222971da773bd14301d8827d88
3
+ metadata.gz: 7792a53b4410092c9b4c215da151d9bdf6dbe37e37af60c35be4bc07b2ec419e
4
+ data.tar.gz: 864bbf4ae3f196c2810884779b91f0f912871e9cc3913bb19c608926681f7560
5
5
  SHA512:
6
- metadata.gz: 1b54e839d62443864394a484aa1eef3dcc3cbb5ae3d87e36fc2116e8ba3fd91d37cfdf2f6e59d08a1f22f31eba521ea9fe8c245eabb7863b675653536ebabb7c
7
- data.tar.gz: 53702ca1da7f59a1b3b2dfaa9b46c59f3cdddbc5c44634e9946ef6f36368dc04283f634295f4f422b50f339607aed76233638b6fbd1794775bc6b2c56e8a7854
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
@@ -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 HoldRequestResult #{json_message}, #{resp}") if $logger
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
@@ -32,6 +32,7 @@ class NYPLAvro
32
32
  def encode(decoded_data, base64 = true)
33
33
  bin_encoder = Avro::IO::DatumWriter.new(@schema)
34
34
  buffer = StringIO.new
35
+ buffer.set_encoding('UTF-8')
35
36
  encoder = Avro::IO::BinaryEncoder.new(buffer)
36
37
 
37
38
  begin
@@ -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
@@ -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.2
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-07-13 00:00:00.000000000 Z
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.0.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