Skip to content

Commit a27fa2b

Browse files
authored
Merge branch 'main' into di-543-govnotify-ingestion-for-customer-services
2 parents 5a084a0 + 1659e76 commit a27fa2b

File tree

64 files changed

+803
-2444
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+803
-2444
lines changed

.github/workflows/deploy_terraform.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ on:
7777
jobs:
7878
deploy:
7979
name: Terraform Apply
80-
runs-on: ubuntu-20.04
80+
runs-on: ubuntu-24.04
8181
environment: ${{ inputs.environment }}
8282
steps:
8383
- name: Checkout Source
@@ -86,7 +86,7 @@ jobs:
8686
- name: Set Github Auth
8787
run: git config --global url."https://oauth2:${{ secrets.TERRAFORM_SECRET_TOKEN}}@github.com".insteadOf https://github.com
8888
shell: bash
89-
89+
9090
- name: Install Terraform
9191
uses: hashicorp/[email protected]
9292
with:

.github/workflows/deploy_terraform_networking.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,15 @@ on:
7373
jobs:
7474
deploy:
7575
name: Terraform Apply
76-
runs-on: ubuntu-20.04
76+
runs-on: ubuntu-24.04
7777
environment: ${{ inputs.environment }}
7878
steps:
7979
- name: Checkout Source
8080
uses: actions/checkout@v3
8181

8282
- name: Set Github Auth
8383
run: git config --global url."https://oauth2:${{ secrets.TERRAFORM_SECRET_TOKEN}}@github.com".insteadOf https://github.com
84-
shell: bash
84+
shell: bash
8585

8686
- name: Install Terraform
8787
uses: hashicorp/[email protected]

.github/workflows/flake8_linter_python_files.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323

2424
- name: Get Changed Files
2525
id: changed-files
26-
uses: tj-actions/changed-files@v44
26+
uses: tj-actions/changed-files@2f7c5bfce28377bc069a65ba478de0a74aa0ca32 # v46.0.1
2727
with:
2828
files: |
2929
**.py

.github/workflows/lint-terraform.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,15 @@ on:
6666
jobs:
6767
lint:
6868
name: Terraform Lint
69-
runs-on: ubuntu-20.04
69+
runs-on: ubuntu-24.04
7070
steps:
7171
- name: Checkout
7272
uses: actions/checkout@v3
7373

7474
- name: Set Github Auth
7575
run: git config --global url."https://oauth2:${{ secrets.TERRAFORM_SECRET_TOKEN}}@github.com".insteadOf https://github.com
7676
shell: bash
77-
77+
7878
- name: Install Terraform
7979
uses: hashicorp/[email protected]
8080
with:

.github/workflows/plan-terraform.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,17 @@ on:
6666
jobs:
6767
plan:
6868
name: Terraform Plan
69-
runs-on: ubuntu-20.04
69+
runs-on: ubuntu-24.04
7070
steps:
7171
- uses: terraform-compliance/github_action@main
7272

7373
- name: Checkout
7474
uses: actions/checkout@v3
75-
75+
7676
- name: Set Github Auth
7777
run: git config --global url."https://oauth2:${{ secrets.TERRAFORM_SECRET_TOKEN}}@github.com".insteadOf https://github.com
7878
shell: bash
79-
79+
8080
- name: Install Terraform
8181
uses: hashicorp/[email protected]
8282
with:

.github/workflows/test-python-and-lambda.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66
jobs:
77
tests:
88
name: Test Python Jobs & Lambda Functions
9-
runs-on: ubuntu-20.04
9+
runs-on: ubuntu-24.04
1010
steps:
1111
- name: Checkout
1212
uses: actions/checkout@v3

.github/workflows/unlock_terraform_state.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ on:
7676
jobs:
7777
deploy:
7878
name: Terraform State Unlock
79-
runs-on: ubuntu-20.04
79+
runs-on: ubuntu-24.04
8080
steps:
8181
- name: Checkout Source
8282
uses: actions/checkout@v3

.github/workflows/validate-and-lint-terraform.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ on:
6666
jobs:
6767
validate:
6868
name: Terraform Validate
69-
runs-on: ubuntu-20.04
69+
runs-on: ubuntu-24.04
7070
steps:
7171
- name: Checkout
7272
uses: actions/checkout@v3
@@ -108,15 +108,15 @@ jobs:
108108
109109
lint:
110110
name: Terraform Lint
111-
runs-on: ubuntu-20.04
111+
runs-on: ubuntu-24.04
112112
steps:
113113
- name: Checkout
114114
uses: actions/checkout@v3
115115

116116
- name: Set Github Auth
117117
run: git config --global url."https://oauth2:${{ secrets.TERRAFORM_SECRET_TOKEN}}@github.com".insteadOf https://github.com
118118
shell: bash
119-
119+
120120
- name: Install Terraform
121121
uses: hashicorp/[email protected]
122122
with:

lambdas/icaseworks_api_ingestion/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ install-requirements:
55
# the requirements are generated so that the packages
66
# could be downloaded and packaged up for the lambda
77

8-
. venv/bin/activate && sudo pipenv lock --requirements > requirements.txt
8+
. venv/bin/activate && sudo pipenv requirements > requirements.txt
99
. venv/bin/activate && sudo pip install --target ./lib -r requirements.txt
1010
rm -rf venv/

lambdas/icaseworks_api_ingestion/main.py

Lines changed: 64 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,33 @@
1-
import sys
2-
3-
sys.path.append('./lib/')
4-
5-
import pybase64
6-
import json
1+
import datetime
72
import hashlib
83
import hmac
4+
import json
5+
import logging
96
import re
10-
import requests
7+
import sys
118
import time
12-
import boto3
13-
from dotenv import load_dotenv
149
from os import getenv
15-
import datetime
16-
import logging
10+
11+
12+
# needs to be above imports for the additional dependencies
13+
# flake8 E402 would complain about this so is ignored
14+
sys.path.append("./lib/")
15+
16+
import boto3 # noqa: E402
17+
import pybase64 # noqa: E402
18+
import requests # noqa: E402
19+
from dotenv import load_dotenv # noqa: E402
20+
1721

1822
logger = logging.getLogger()
1923
logger.setLevel(logging.INFO)
2024

2125

2226
def remove_illegal_characters(string):
2327
"""Removes illegal characters from string"""
24-
regex_list = [['=', ""], ['\/', "_"], ['+', "-"]]
28+
regex_list = [["=", ""], ["\/", "_"], ["+", "-"]] # noqa: W605
2529
for r in regex_list:
26-
string = re.sub(string=string,
27-
pattern="[{}]".format(r[0]),
28-
repl=r[1])
30+
string = re.sub(string=string, pattern="[{}]".format(r[0]), repl=r[1])
2931
return string
3032

3133

@@ -44,37 +46,39 @@ def dictionary_to_string(dictionary):
4446
def create_signature(header, payload, secret):
4547
"""Encode JSON string"""
4648
# hashed header, hashed payload, string secret
47-
unsigned_token = header + '.' + payload
48-
key_bytes = bytes(secret, 'utf-8')
49-
string_to_sign_bytes = bytes(unsigned_token, 'utf-8')
50-
signature_hash = hmac.new(key_bytes, string_to_sign_bytes, digestmod=hashlib.sha256).digest()
49+
unsigned_token = header + "." + payload
50+
key_bytes = bytes(secret, "utf-8")
51+
string_to_sign_bytes = bytes(unsigned_token, "utf-8")
52+
signature_hash = hmac.new(
53+
key_bytes, string_to_sign_bytes, digestmod=hashlib.sha256
54+
).digest()
5155
encoded_signature = pybase64.b64encode(signature_hash)
52-
encoded_signature = encoded_signature.decode('utf-8')
56+
encoded_signature = encoded_signature.decode("utf-8")
5357
encoded_signature = remove_illegal_characters(encoded_signature)
5458
return encoded_signature
5559

5660

5761
def get_token(url, encoded_header, encoded_payload, signature, headers):
5862
"""Get token"""
5963
assertion = encoded_header + "." + encoded_payload + "." + signature
60-
data = f'assertion={assertion}&grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer'
64+
data = f"assertion={assertion}&grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer"
6165
response = requests.post(url, headers=headers, data=data)
6266
response_json = response.json()
63-
auth_token = response_json.get('access_token')
67+
auth_token = response_json.get("access_token")
6468
return auth_token
6569

6670

6771
def get_icaseworks_report_from(report_id, from_date, auth_headers, auth_payload):
6872
report_url = "https://hackneyreports.icasework.com/getreport?"
69-
request_url = f'{report_url}ReportId={report_id}&Format=json&From={from_date}'
70-
logger.info(f'Request url: {request_url}')
73+
request_url = f"{report_url}ReportId={report_id}&Format=json&From={from_date}"
74+
logger.info(f"Request url: {request_url}")
7175
response = requests.get(request_url, headers=auth_headers, data=auth_payload)
72-
logger.info(f'Status Code: {response.status_code}')
76+
logger.info(f"Status Code: {response.status_code}")
7377
return response.content
7478

7579

7680
def write_dataframe_to_s3(s3_client, data, s3_bucket, output_folder, filename):
77-
filename = re.sub('[^a-zA-Z0-9]+', '-', filename).lower()
81+
filename = re.sub("[^a-zA-Z0-9]+", "-", filename).lower()
7882
current_date = datetime.datetime.now()
7983
day = single_digit_to_zero_prefixed_string(current_date.day)
8084
month = single_digit_to_zero_prefixed_string(current_date.month)
@@ -83,7 +87,7 @@ def write_dataframe_to_s3(s3_client, data, s3_bucket, output_folder, filename):
8387
return s3_client.put_object(
8488
Bucket=s3_bucket,
8589
Body=data,
86-
Key=f"{output_folder}/import_year={year}/import_month={month}/import_day={day}/import_date={date}/{filename}.json"
90+
Key=f"{output_folder}/import_year={year}/import_month={month}/import_day={day}/import_date={date}/{filename}.json",
8791
)
8892

8993

@@ -102,14 +106,16 @@ def lambda_handler(event, lambda_context):
102106
url = "https://hackney.icasework.com/token"
103107

104108
headers = {
105-
'Content-Type': 'application/x-www-form-urlencoded',
109+
"Content-Type": "application/x-www-form-urlencoded",
106110
}
107111

108112
# Get api api credentials from secrets manager
109113
secret_name = getenv("SECRET_NAME")
110-
secrets_manager_client = boto3.client('secretsmanager')
111-
api_credentials_response = retrieve_credentials_from_secrets_manager(secrets_manager_client, secret_name)
112-
api_credentials = json.loads(api_credentials_response['SecretString'])
114+
secrets_manager_client = boto3.client("secretsmanager")
115+
api_credentials_response = retrieve_credentials_from_secrets_manager(
116+
secrets_manager_client, secret_name
117+
)
118+
api_credentials = json.loads(api_credentials_response["SecretString"])
113119
api_key = api_credentials.get("api_key")
114120
secret = api_credentials.get("secret")
115121

@@ -122,11 +128,7 @@ def lambda_handler(event, lambda_context):
122128
# Create payload
123129
current_unix_time = int(time.time())
124130
str_time = str(current_unix_time)
125-
payload_object = {
126-
"iss": api_key,
127-
"aud": url,
128-
"iat": str_time
129-
}
131+
payload_object = {"iss": api_key, "aud": url, "iat": str_time}
130132

131133
payload_object = dictionary_to_string(payload_object)
132134

@@ -136,16 +138,21 @@ def lambda_handler(event, lambda_context):
136138
signature = create_signature(header, payload, secret)
137139

138140
# Get token from response
139-
auth_token = get_token(url=url, encoded_header=header, encoded_payload=payload, signature=signature,
140-
headers=headers)
141+
auth_token = get_token(
142+
url=url,
143+
encoded_header=header,
144+
encoded_payload=payload,
145+
signature=signature,
146+
headers=headers,
147+
)
141148

142149
# Create auth header for API Calls and auth payload
143-
authorization = f'Bearer {auth_token}'
150+
authorization = f"Bearer {auth_token}"
144151

145152
auth_payload = {}
146153

147154
auth_headers = {
148-
'Authorization': authorization,
155+
"Authorization": authorization,
149156
}
150157

151158
report_tables = [
@@ -164,22 +171,32 @@ def lambda_handler(event, lambda_context):
164171
date_to_track_from = today - datetime.timedelta(days=1)
165172
logger.info(f"Date to track from: {date_to_track_from}")
166173

167-
s3_client = boto3.client('s3')
174+
s3_client = boto3.client("s3")
168175

169176
for report_details in report_tables:
170-
logger.info(f'Pulling report for {report_details["name"]}')
177+
logger.info(f"Pulling report for {report_details['name']}")
171178
case_id_report_id = report_details["id"]
172-
case_id_list = get_icaseworks_report_from(case_id_report_id, date_to_track_from, auth_headers, auth_payload)
179+
case_id_list = get_icaseworks_report_from(
180+
case_id_report_id, date_to_track_from, auth_headers, auth_payload
181+
)
173182
report_details["data"] = case_id_list
174-
write_dataframe_to_s3(s3_client, report_details["data"], s3_bucket, output_folder_name, report_details["name"])
175-
logger.info(f'Finished writing report for {report_details["name"]} to S3')
183+
write_dataframe_to_s3(
184+
s3_client,
185+
report_details["data"],
186+
s3_bucket,
187+
output_folder_name,
188+
report_details["name"],
189+
)
190+
logger.info(f"Finished writing report for {report_details['name']} to S3")
176191

177192
# Trigger glue job to copy from landing to raw and convert to parquet
178-
glue_client = boto3.client('glue')
193+
glue_client = boto3.client("glue")
179194
start_glue_trigger(glue_client, glue_trigger_name)
180195

196+
181197
def single_digit_to_zero_prefixed_string(value):
182-
return str(value) if value > 9 else '0' + str(value)
198+
return str(value) if value > 9 else "0" + str(value)
199+
183200

184201
def start_glue_trigger(glue_client, trigger_name):
185202
trigger_details = glue_client.start_trigger(Name=trigger_name)

0 commit comments

Comments
 (0)