Skip to content

Commit ea53e1a

Browse files
authored
Merge pull request #118 from DSACMS/ndh-226-health-check-endpoint-allow-lb-requests
NDH-226: Add local and remote container hostnames to ALLOWED_HOSTS
2 parents f34fe6a + b55c505 commit ea53e1a

File tree

9 files changed

+37
-16
lines changed

9 files changed

+37
-16
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,8 @@ cython_debug/
171171
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
172172
# and can be added to the global gitignore or merged into this file. For a more nuclear
173173
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
174-
#.idea/
174+
.idea/
175+
175176
.git-credentials-alt
176177

177178
scratch/

backend/.env_template

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ NPD_DB_NAME=''
1111
NPD_DB_PORT=5432
1212
NPD_DB_ENGINE='django.db.backends.postgresql'
1313
DEBUG=True
14-
DJANGO_ALLOWED_HOSTS=['localhost', '127.0.0.1']
14+
DJANGO_ALLOWED_HOSTS=['localhost','127.0.0.1','0.0.0.0']
1515
DJANGO_LOGLEVEL='WARNING'
1616
NPD_PROJECT_NAME='[Project Name]'

backend/app/settings.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import os
1616
import sys
1717
import logging
18+
from npdfhir.middleware import HealthCheckMiddleware
1819

1920
# Detect if tests are being run
2021
TESTING = 'test' in sys.argv
@@ -35,7 +36,7 @@
3536

3637

3738
if DEBUG:
38-
ALLOWED_HOSTS = ['localhost', '127.0.0.1']
39+
ALLOWED_HOSTS = ['localhost','127.0.0.1','0.0.0.0']
3940
else:
4041
ALLOWED_HOSTS = config("DJANGO_ALLOWED_HOSTS").split(',')
4142

@@ -56,13 +57,13 @@
5657
'django_filters',
5758
'drf_yasg',
5859
'xmlrunner',
59-
'provider_directory.apps.ProviderDirectory',
6060
]
6161

6262
if not TESTING:
6363
INSTALLED_APPS.append('debug_toolbar')
6464

6565
MIDDLEWARE = [
66+
'npdfhir.middleware.HealthCheckMiddleware',
6667
'corsheaders.middleware.CorsMiddleware',
6768
'django.middleware.security.SecurityMiddleware',
6869
'django.contrib.sessions.middleware.SessionMiddleware',

backend/docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ services:
5454
NPD_DJANGO_SECRET: ${NPD_DJANGO_SECRET:-_pth2#=k8-wf-_^t%2))it+3..8la^@@97^#ock7.v=@792w7}
5555
DEBUG: ${DEBUG:-True}
5656
DJANGO_LOGLEVEL: ${DJANGO_LOGLEVEL:-INFO}
57-
DJANGO_ALLOWED_HOSTS: "${DJANGO_ALLOWED_HOSTS:-['localhost','127.0.0.1']}"
57+
DJANGO_ALLOWED_HOSTS: "${DJANGO_ALLOWED_HOSTS:-['localhost','127.0.0.1','0.0.0.0']}"
5858
NPD_DB_ENGINE: ${NPD_DB_ENGINE:-django.db.backends.postgresql}
5959
NPD_DB_NAME: ${NPD_DB_NAME:-npd_development}
6060
NPD_DB_USER: ${NPD_DB_USER:-postgres}

backend/npdfhir/middleware.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from django.http import HttpResponse
2+
3+
class HealthCheckMiddleware:
4+
def __init__(self, get_response):
5+
self.get_response = get_response
6+
7+
def __call__(self, request):
8+
if request.path == '/fhir/healthCheck':
9+
return HttpResponse('healthy')
10+
return self.get_response(request)

backend/npdfhir/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from debug_toolbar.toolbar import debug_toolbar_urls
77
from drf_yasg.views import get_schema_view
88
from drf_yasg import openapi
9+
from django.urls import path
910

1011
schema_view = get_schema_view(
1112
openapi.Info(

backend/npdfhir/views.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from rest_framework.response import Response
66
from rest_framework.pagination import PageNumberPagination
77
from rest_framework.renderers import BrowsableAPIRenderer
8-
from django.core.cache import cache
98
from .models import Provider, EndpointInstance, ClinicalOrganization
109
from .serializers import PractitionerSerializer, ClinicalOrganizationSerializer, BundleSerializer, EndpointSerializer
1110
from .mappings import genderMapping, addressUseMapping
@@ -168,7 +167,11 @@ def list(self, request):
168167
all_params = request.query_params
169168

170169
providers = Provider.objects.all().prefetch_related(
171-
'npi', 'individual', 'individual__individualtoname_set', 'individual__individualtoaddress_set', 'individual__individualtoaddress_set__address__address_us', 'individual__individualtoaddress_set__address__address_us__state_code', 'individual__individualtoaddress_set__address_use', 'individual__individualtophone_set', 'individual__individualtoemail_set', 'providertootherid_set', 'providertotaxonomy_set')
170+
'npi', 'individual', 'individual__individualtoname_set', 'individual__individualtoaddress_set',
171+
'individual__individualtoaddress_set__address__address_us',
172+
'individual__individualtoaddress_set__address__address_us__state_code',
173+
'individual__individualtoaddress_set__address_use', 'individual__individualtophone_set',
174+
'individual__individualtoemail_set', 'providertootherid_set', 'providertotaxonomy_set')
172175

173176
for param, value in all_params.items():
174177
match param:
@@ -182,7 +185,8 @@ def list(self, request):
182185
case 'name':
183186
providers = providers.annotate(
184187
search=SearchVector('individual__individualtoname__last_name',
185-
'individual__individualtoname__first_name', 'individual__individualtoname__middle_name')
188+
'individual__individualtoname__first_name',
189+
'individual__individualtoname__middle_name')
186190
).filter(search=value)
187191
case 'gender':
188192
if value in genderMapping.keys():
@@ -200,7 +204,7 @@ def list(self, request):
200204
'individual__individualtoaddress__address__address_us__delivery_line_2',
201205
'individual__individualtoaddress__address__address_us__city_name',
202206
'individual__individualtoaddress__address__address_us__state_code__abbreviation',
203-
'individual__individualtoaddress__address__address_us__zipcode',)
207+
'individual__individualtoaddress__address__address_us__zipcode', )
204208
).filter(search=value)
205209
case 'address-city':
206210
providers = providers.annotate(
@@ -284,7 +288,15 @@ def list(self, request):
284288
all_params = request.query_params
285289

286290
organizations = ClinicalOrganization.objects.all().prefetch_related(
287-
'npi', 'organization', 'organization__organizationtoname_set', 'organization__organizationtoaddress_set', 'organization__organizationtoaddress_set__address', 'organization__organizationtoaddress_set__address__address_us', 'organization__organizationtoaddress_set__address__address_us__state_code', 'organization__organizationtoaddress_set__address_use', 'organizationtootherid_set', 'organizationtotaxonomy_set', 'organization__authorized_official__individualtophone_set', 'organization__authorized_official__individualtoname_set', 'organization__authorized_official__individualtoemail_set', 'organization__authorized_official__individualtoaddress_set')
291+
'npi', 'organization', 'organization__organizationtoname_set', 'organization__organizationtoaddress_set',
292+
'organization__organizationtoaddress_set__address',
293+
'organization__organizationtoaddress_set__address__address_us',
294+
'organization__organizationtoaddress_set__address__address_us__state_code',
295+
'organization__organizationtoaddress_set__address_use', 'organizationtootherid_set',
296+
'organizationtotaxonomy_set', 'organization__authorized_official__individualtophone_set',
297+
'organization__authorized_official__individualtoname_set',
298+
'organization__authorized_official__individualtoemail_set',
299+
'organization__authorized_official__individualtoaddress_set')
288300

289301
for param, value in all_params.items():
290302
match param:
@@ -312,7 +324,7 @@ def list(self, request):
312324
'organization__organizationtoaddress__address__address_us__delivery_line_2',
313325
'organization__organizationtoaddress__address__address_us__city_name',
314326
'organization__organizationtoaddress__address__address_us__state_code__abbreviation',
315-
'organization__organizationtoaddress__address__address_us__zipcode',)
327+
'organization__organizationtoaddress__address__address_us__zipcode', )
316328
).filter(search=value)
317329
case 'address-city':
318330
organizations = organizations.annotate(

infrastructure/envs/sandbox/main.tf

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -416,9 +416,7 @@ resource "aws_lb_target_group" "api" {
416416
timeout = 5
417417
healthy_threshold = 2
418418
unhealthy_threshold = 10
419-
# TODO: Django is always returning a 400 because Django wants to know what domain/IPs requests are coming from
420-
# Setting this to HTTP 400 (Bad Request) until the Django application can be update to handle health check requests.
421-
matcher = "400"
419+
matcher = "200"
422420
}
423421
}
424422

infrastructure/modules/fhir-api/main.tf

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,6 @@ resource "aws_lb_target_group" "fhir_api" {
256256
timeout = 5
257257
healthy_threshold = 2
258258
unhealthy_threshold = 10
259-
# TODO: Django is always returning a 400 because Django wants to know what domain/IPs requests are coming from
260-
# Setting this to HTTP 400 (Bad Request) until the Django application can be update to handle health check requests.
261259
matcher = "200"
262260
}
263261
}

0 commit comments

Comments
 (0)