From e9d191212c154f6b8775249f5e439cfb130c8d08 Mon Sep 17 00:00:00 2001 From: chevvak2 Date: Fri, 10 Apr 2026 15:25:32 -0400 Subject: [PATCH 01/23] Fix helm charts: Remove incorrect biothings-annotator references - Updated Chart.yaml name from biothings-annotator to node-normalization - Fixed container name, port (8000), and image repository references - Updated all template functions to use node-normalization prefix - Fixed environment variable references and added PORT env var - Updated NCATS labels and hostname placeholders - Corrected template function calls in all Kubernetes manifests --- deploy/Chart.yaml | 4 ++-- deploy/templates/NOTES.txt | 8 ++++---- deploy/templates/_helpers.tpl | 16 ++++++++-------- deploy/templates/deployment.yaml | 16 +++++++--------- deploy/templates/ingress.yaml | 8 ++++---- deploy/templates/service.yaml | 6 +++--- deploy/values.yaml | 14 +++++++------- 7 files changed, 35 insertions(+), 37 deletions(-) diff --git a/deploy/Chart.yaml b/deploy/Chart.yaml index cffa1be..bfbe085 100644 --- a/deploy/Chart.yaml +++ b/deploy/Chart.yaml @@ -1,6 +1,6 @@ apiVersion: v2 -name: biothings-annotator -description: A Helm chart for Biothings/pending.api-annotator +name: node-normalization +description: A Helm chart for NodeNormalizationAPI # A chart can be either an 'application' or a 'library' chart. # diff --git a/deploy/templates/NOTES.txt b/deploy/templates/NOTES.txt index c987cb3..02818b6 100644 --- a/deploy/templates/NOTES.txt +++ b/deploy/templates/NOTES.txt @@ -6,16 +6,16 @@ {{- end }} {{- end }} {{- else if contains "NodePort" .Values.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "pendingapi.fullname" . }}) + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "node-normalization.fullname" . }}) export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") echo http://$NODE_IP:$NODE_PORT {{- else if contains "LoadBalancer" .Values.service.type }} NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "pendingapi.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "pendingapi.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "node-normalization.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "node-normalization.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") echo http://$SERVICE_IP:{{ .Values.service.port }} {{- else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "pendingapi.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "node-normalization.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") echo "Visit http://127.0.0.1:8080 to use your application" kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT diff --git a/deploy/templates/_helpers.tpl b/deploy/templates/_helpers.tpl index 7cde9dc..5bc42c6 100644 --- a/deploy/templates/_helpers.tpl +++ b/deploy/templates/_helpers.tpl @@ -1,7 +1,7 @@ {{/* Expand the name of the chart. */}} -{{- define "biothings-annotator.name" -}} +{{- define "node-normalization.name" -}} {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} {{- end }} @@ -10,7 +10,7 @@ Create a default fully qualified app name. We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). If release name contains chart name it will be used as a full name. */}} -{{- define "biothings-annotator.fullname" -}} +{{- define "node-normalization.fullname" -}} {{- if .Values.fullnameOverride }} {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} {{- else }} @@ -26,16 +26,16 @@ If release name contains chart name it will be used as a full name. {{/* Create chart name and version as used by the chart label. */}} -{{- define "biothings-annotator.chart" -}} +{{- define "node-normalization.chart" -}} {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} {{- end }} {{/* Common labels */}} -{{- define "biothings-annotator.labels" -}} -helm.sh/chart: {{ include "biothings-annotator.chart" . }} -{{ include "biothings-annotator.selectorLabels" . }} +{{- define "node-normalization.labels" -}} +helm.sh/chart: {{ include "node-normalization.chart" . }} +{{ include "node-normalization.selectorLabels" . }} {{- if .Chart.AppVersion }} app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} {{- end }} @@ -45,7 +45,7 @@ app.kubernetes.io/managed-by: {{ .Release.Service }} {{/* Selector labels */}} -{{- define "biothings-annotator.selectorLabels" -}} -app.kubernetes.io/name: {{ include "biothings-annotator.name" . }} +{{- define "node-normalization.selectorLabels" -}} +app.kubernetes.io/name: {{ include "node-normalization.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} {{- end }} diff --git a/deploy/templates/deployment.yaml b/deploy/templates/deployment.yaml index c3471c8..ee22f7b 100644 --- a/deploy/templates/deployment.yaml +++ b/deploy/templates/deployment.yaml @@ -1,9 +1,9 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: {{ include "biothings-annotator.fullname" . }} + name: {{ include "node-normalization.fullname" . }} labels: - {{- include "biothings-annotator.labels" . | nindent 4 }} + {{- include "node-normalization.labels" . | nindent 4 }} spec: strategy: type: {{ .Values.deployment.strategy.type }} @@ -15,11 +15,11 @@ spec: replicas: {{ .Values.deployment.replicaCount }} selector: matchLabels: - {{- include "biothings-annotator.selectorLabels" . | nindent 6 }} + {{- include "node-normalization.selectorLabels" . | nindent 6 }} template: metadata: labels: - {{- include "biothings-annotator.selectorLabels" . | nindent 8 }} + {{- include "node-normalization.selectorLabels" . | nindent 8 }} {{- toYaml .Values.ncats.labels | nindent 8 }} spec: containers: @@ -30,11 +30,9 @@ spec: - name: ES_HOST value: {{ .Values.containers.es_host }} - name: OPENTELEMETRY_ENABLED - value: "{{ .Values.containers.OPENTELEMETRY_ENABLED_VALUE }}" - - name: OPENTELEMETRY_JAEGER_HOST - value: "{{ .Values.containers.OPENTELEMETRY_JAEGER_HOST_VALUE }}" - - name: OPENTELEMETRY_JAEGER_PORT - value: "{{ .Values.containers.OPENTELEMETRY_JAEGER_PORT_VALUE }}" + value: "{{ .Values.env.OPENTELEMETRY_ENABLED_VALUE }}" + - name: PORT + value: "{{ .Values.containers.port }}" ports: - name: http containerPort: {{ .Values.containers.port }} diff --git a/deploy/templates/ingress.yaml b/deploy/templates/ingress.yaml index ae538cc..a3f85e6 100644 --- a/deploy/templates/ingress.yaml +++ b/deploy/templates/ingress.yaml @@ -1,12 +1,12 @@ {{- if .Values.ingress.enabled -}} -{{- $fullName := include "biothings-annotator.fullname" . -}} +{{- $fullName := include "node-normalization.fullname" . -}} {{- $svcPort := .Values.service.port -}} apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: {{ $fullName }} labels: - {{- include "biothings-annotator.labels" . | nindent 4 }} + {{- include "node-normalization.labels" . | nindent 4 }} {{- with .Values.ingress.annotations }} annotations: {{- toYaml . | nindent 4 }} @@ -27,7 +27,7 @@ spec: pathType: ImplementationSpecific backend: service: - name: {{ include "biothings-annotator.fullname" . }} + name: {{ include "node-normalization.fullname" . }} port: number: 80 - host: {{ .Values.ingress.annotatorHost | quote }} @@ -37,7 +37,7 @@ spec: pathType: ImplementationSpecific backend: service: - name: {{ include "biothings-annotator.fullname" . }} + name: {{ include "node-normalization.fullname" . }} port: number: 80 {{- end }} diff --git a/deploy/templates/service.yaml b/deploy/templates/service.yaml index 39dea79..25d1364 100644 --- a/deploy/templates/service.yaml +++ b/deploy/templates/service.yaml @@ -1,9 +1,9 @@ apiVersion: v1 kind: Service metadata: - name: {{ include "biothings-annotator.fullname" . }} + name: {{ include "node-normalization.fullname" . }} labels: - {{- include "biothings-annotator.labels" . | nindent 4 }} + {{- include "node-normalization.labels" . | nindent 4 }} spec: type: {{ .Values.service.type }} ports: @@ -12,4 +12,4 @@ spec: protocol: TCP name: http selector: - {{- include "biothings-annotator.selectorLabels" . | nindent 4 }} + {{- include "node-normalization.selectorLabels" . | nindent 4 }} diff --git a/deploy/values.yaml b/deploy/values.yaml index aea4391..5be1bc4 100644 --- a/deploy/values.yaml +++ b/deploy/values.yaml @@ -1,4 +1,4 @@ -# Default values for biothings-annotator. +# Default values for node-normalization. # This is a YAML-formatted file. # Declare variables to be passed into your templates. @@ -14,15 +14,15 @@ deployment: # A new pod will only be created after an old pod is taken down. maxSurge: 0 image: - repository: 853771734544.dkr.ecr.us-east-1.amazonaws.com/translator-bte-pending-api-annotator + repository: 853771734544.dkr.ecr.us-east-1.amazonaws.com/translator-node-normalization-api pullPolicy: Always # Overrides the image tag whose default is the chart appVersion. tag: DOCKER_VERSION_VALUE containers: - name: biothingsannotator + name: node-normalization es_host: ES_HOST_VALUE - port: 9000 + port: 8000 env: OPENTELEMETRY_ENABLED_VALUE: True @@ -44,13 +44,13 @@ ingress: alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}' alb.ingress.kubernetes.io/success-codes: '200' alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=600 - host: BTEPA_HOSTNAME_VALUE + host: NODE_NORM_HOSTNAME_VALUE ncats: labels: gov.nih.ncats.appenv: appenv - gov.nih.ncats.appname: bte-biothings-annotator - gov.nih.ncats.appentry: BTEPA_HOSTNAME_VALUE + gov.nih.ncats.appname: bte-node-normalization + gov.nih.ncats.appentry: NODE_NORM_HOSTNAME_VALUE gov.nih.ncats.appentrytype: https gov.nih.ncats.appentryport: tcp gov.nih.ncats.appconnnum: '1' From 7fe6e9db5009553d6507b801dd0c63f5eff01cd5 Mon Sep 17 00:00:00 2001 From: chevvak2 <114002880+chevvak2@users.noreply.github.com> Date: Mon, 13 Apr 2026 10:37:49 -0400 Subject: [PATCH 02/23] Update Jenkinsfile --- deploy/Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/Jenkinsfile b/deploy/Jenkinsfile index 7e8335f..244fff4 100644 --- a/deploy/Jenkinsfile +++ b/deploy/Jenkinsfile @@ -15,7 +15,7 @@ pipeline { pollSCM('H/5 * * * *') } environment { - DOCKER_REPO_NAME = "853771734544.dkr.ecr.us-east-1.amazonaws.com/translator-bte-pending-api-annotator" + DOCKER_REPO_NAME = "853771734544.dkr.ecr.us-east-1.amazonaws.com/translator-nodenormalization-api" KUBERNETES_BLUE_CLUSTER_NAME = "translator-eks-ci-blue-cluster" KUBERNETES_GREEN_CLUSTER_NAME = "translator-eks-ci-green-cluster" PACKAGE_DIR = "docker" From 23dc27774eb66ac69bbc4fb3dd56a860875faef3 Mon Sep 17 00:00:00 2001 From: chevvak2 <114002880+chevvak2@users.noreply.github.com> Date: Mon, 13 Apr 2026 10:38:14 -0400 Subject: [PATCH 03/23] Update values.yaml --- deploy/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/values.yaml b/deploy/values.yaml index 5be1bc4..817fe0f 100644 --- a/deploy/values.yaml +++ b/deploy/values.yaml @@ -14,7 +14,7 @@ deployment: # A new pod will only be created after an old pod is taken down. maxSurge: 0 image: - repository: 853771734544.dkr.ecr.us-east-1.amazonaws.com/translator-node-normalization-api + repository: 853771734544.dkr.ecr.us-east-1.amazonaws.com/translator-nodenormalization-api pullPolicy: Always # Overrides the image tag whose default is the chart appVersion. tag: DOCKER_VERSION_VALUE From 81a3a5a6c390027a0e454a4fc27a34f11474bc42 Mon Sep 17 00:00:00 2001 From: chevvak2 <114002880+chevvak2@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:06:06 -0400 Subject: [PATCH 04/23] Update Dockerfile --- docker/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 39b690c..fc4d230 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -24,8 +24,8 @@ WORKDIR /home/nodenorm/configuration COPY --from=builder --chown=nodenorm:nodenorm /build/nodenorm/src/nodenorm/config/config.default.json /home/nodenorm/configuration/default.json COPY --from=builder --chown=nodenorm:nodenorm /build/nodenorm/version.txt /home/nodenorm/configuration/version.txt -COPY --chown=nodenorm:nodenorm docker/configuration/supervisord.conf /etc/supervisor/supervisord.conf -COPY --chown=nodenorm:nodenorm docker/configuration/Caddyfile /etc/caddy/Caddyfile +COPY --chown=nodenorm:nodenorm ./docker/configuration/supervisord.conf /etc/supervisor/supervisord.conf +COPY --chown=nodenorm:nodenorm ./docker/configuration/Caddyfile /etc/caddy/Caddyfile COPY --from=caddy_builder --chown=nodenorm:nodenorm /usr/bin/caddy /usr/bin/caddy From 70d47a20da1ca226d005f35596f3b6e643bc608b Mon Sep 17 00:00:00 2001 From: chevvak2 <114002880+chevvak2@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:08:34 -0400 Subject: [PATCH 05/23] Create .dockerignore --- .dockerignore | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..97487f1 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +# ignore everything +* + +# allow required files +!Dockerfile +!docker/ +!docker/configuration/ +!docker/configuration/* From 0548a2e97366f8c909b7fafdb628c13c3c3f59f6 Mon Sep 17 00:00:00 2001 From: chevvak2 <114002880+chevvak2@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:09:11 -0400 Subject: [PATCH 06/23] Update Dockerfile --- docker/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index fc4d230..39b690c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -24,8 +24,8 @@ WORKDIR /home/nodenorm/configuration COPY --from=builder --chown=nodenorm:nodenorm /build/nodenorm/src/nodenorm/config/config.default.json /home/nodenorm/configuration/default.json COPY --from=builder --chown=nodenorm:nodenorm /build/nodenorm/version.txt /home/nodenorm/configuration/version.txt -COPY --chown=nodenorm:nodenorm ./docker/configuration/supervisord.conf /etc/supervisor/supervisord.conf -COPY --chown=nodenorm:nodenorm ./docker/configuration/Caddyfile /etc/caddy/Caddyfile +COPY --chown=nodenorm:nodenorm docker/configuration/supervisord.conf /etc/supervisor/supervisord.conf +COPY --chown=nodenorm:nodenorm docker/configuration/Caddyfile /etc/caddy/Caddyfile COPY --from=caddy_builder --chown=nodenorm:nodenorm /usr/bin/caddy /usr/bin/caddy From badbb5978062a9512e39031afc2d43df2a824aea Mon Sep 17 00:00:00 2001 From: chevvak2 <114002880+chevvak2@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:14:43 -0400 Subject: [PATCH 07/23] Update .dockerignore --- .dockerignore | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.dockerignore b/.dockerignore index 97487f1..fdb096e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,8 +1,3 @@ -# ignore everything * - -# allow required files -!Dockerfile -!docker/ -!docker/configuration/ -!docker/configuration/* +docker/ +**/* From bc30786224f1349c730f7159eab94cd183dbb07c Mon Sep 17 00:00:00 2001 From: chevvak2 <114002880+chevvak2@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:17:14 -0400 Subject: [PATCH 08/23] Update Dockerfile --- docker/Dockerfile | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 39b690c..6f3e743 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -8,26 +8,42 @@ RUN git clone -b ${NODENORM_BRANCH} --recursive ${NODENORM_REPO} . RUN git rev-parse HEAD > /build/nodenorm/version.txt RUN pip wheel --wheel-dir=/build/wheels /build/nodenorm + FROM caddy:2.8-builder AS caddy_builder RUN xcaddy build + FROM python:3.12-slim -RUN apt update -q -y && apt install -y --no-install-recommends git supervisor curl telnet && rm -rf /var/lib/apt/lists/* + +RUN apt update -q -y && apt install -y --no-install-recommends \ + git supervisor curl telnet && rm -rf /var/lib/apt/lists/* + RUN useradd -m nodenorm && usermod -aG sudo nodenorm -USER nodenorm + WORKDIR /home/nodenorm/ + RUN python -m venv /home/nodenorm/venv -COPY --from=builder --chown=nodenorm:nodenorm /build/wheels /home/nodenorm/wheels -RUN /home/nodenorm/venv/bin/pip install /home/nodenorm/wheels/*.whl && rm -rf /home/nodenorm/wheels + +COPY --from=builder /build/wheels /home/nodenorm/wheels +RUN /home/nodenorm/venv/bin/pip install /home/nodenorm/wheels/*.whl \ + && rm -rf /home/nodenorm/wheels + WORKDIR /home/nodenorm/configuration -COPY --from=builder --chown=nodenorm:nodenorm /build/nodenorm/src/nodenorm/config/config.default.json /home/nodenorm/configuration/default.json -COPY --from=builder --chown=nodenorm:nodenorm /build/nodenorm/version.txt /home/nodenorm/configuration/version.txt -COPY --chown=nodenorm:nodenorm docker/configuration/supervisord.conf /etc/supervisor/supervisord.conf -COPY --chown=nodenorm:nodenorm docker/configuration/Caddyfile /etc/caddy/Caddyfile +COPY --from=builder /build/nodenorm/src/nodenorm/config/config.default.json \ + /home/nodenorm/configuration/default.json + +COPY --from=builder /build/nodenorm/version.txt \ + /home/nodenorm/configuration/version.txt + + +# ✅ LOCAL CONFIG FILES (THIS IS THE FIX) +COPY docker/configuration/supervisord.conf /etc/supervisor/supervisord.conf +COPY docker/configuration/Caddyfile /etc/caddy/Caddyfile + -COPY --from=caddy_builder --chown=nodenorm:nodenorm /usr/bin/caddy /usr/bin/caddy +COPY --from=caddy_builder /usr/bin/caddy /usr/bin/caddy STOPSIGNAL SIGINT From bababcb0380bec4bc81383708cacf71172e62446 Mon Sep 17 00:00:00 2001 From: chevvak2 <114002880+chevvak2@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:20:59 -0400 Subject: [PATCH 09/23] Update Dockerfile --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 6f3e743..4536f29 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -37,7 +37,7 @@ COPY --from=builder /build/nodenorm/src/nodenorm/config/config.default.json \ COPY --from=builder /build/nodenorm/version.txt \ /home/nodenorm/configuration/version.txt - +COPY pwd && ls # ✅ LOCAL CONFIG FILES (THIS IS THE FIX) COPY docker/configuration/supervisord.conf /etc/supervisor/supervisord.conf COPY docker/configuration/Caddyfile /etc/caddy/Caddyfile From 451d9f819d16e053b6892f792e05f583b6d3af15 Mon Sep 17 00:00:00 2001 From: chevvak2 <114002880+chevvak2@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:21:44 -0400 Subject: [PATCH 10/23] Update Dockerfile --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 4536f29..093f3f1 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -37,7 +37,7 @@ COPY --from=builder /build/nodenorm/src/nodenorm/config/config.default.json \ COPY --from=builder /build/nodenorm/version.txt \ /home/nodenorm/configuration/version.txt -COPY pwd && ls +RUN pwd && ls # ✅ LOCAL CONFIG FILES (THIS IS THE FIX) COPY docker/configuration/supervisord.conf /etc/supervisor/supervisord.conf COPY docker/configuration/Caddyfile /etc/caddy/Caddyfile From 6e7fabe5b7e8e4f55165ad72b53543a192579d5c Mon Sep 17 00:00:00 2001 From: chevvak2 <114002880+chevvak2@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:26:12 -0400 Subject: [PATCH 11/23] Update Dockerfile --- docker/Dockerfile | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 093f3f1..30d5f11 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -8,46 +8,36 @@ RUN git clone -b ${NODENORM_BRANCH} --recursive ${NODENORM_REPO} . RUN git rev-parse HEAD > /build/nodenorm/version.txt RUN pip wheel --wheel-dir=/build/wheels /build/nodenorm - FROM caddy:2.8-builder AS caddy_builder RUN xcaddy build - FROM python:3.12-slim - -RUN apt update -q -y && apt install -y --no-install-recommends \ - git supervisor curl telnet && rm -rf /var/lib/apt/lists/* - +RUN apt update -q -y && apt install -y --no-install-recommends git supervisor curl telnet && rm -rf /var/lib/apt/lists/* RUN useradd -m nodenorm && usermod -aG sudo nodenorm - +USER nodenorm WORKDIR /home/nodenorm/ - RUN python -m venv /home/nodenorm/venv - -COPY --from=builder /build/wheels /home/nodenorm/wheels -RUN /home/nodenorm/venv/bin/pip install /home/nodenorm/wheels/*.whl \ - && rm -rf /home/nodenorm/wheels - +COPY --from=builder --chown=nodenorm:nodenorm /build/wheels /home/nodenorm/wheels +RUN /home/nodenorm/venv/bin/pip install /home/nodenorm/wheels/*.whl && rm -rf /home/nodenorm/wheels WORKDIR /home/nodenorm/configuration +COPY --from=builder --chown=nodenorm:nodenorm /build/nodenorm/src/nodenorm/config/config.default.json /home/nodenorm/configuration/default.json +COPY --from=builder --chown=nodenorm:nodenorm /build/nodenorm/version.txt /home/nodenorm/configuration/version.txt -COPY --from=builder /build/nodenorm/src/nodenorm/config/config.default.json \ - /home/nodenorm/configuration/default.json - -COPY --from=builder /build/nodenorm/version.txt \ - /home/nodenorm/configuration/version.txt - -RUN pwd && ls -# ✅ LOCAL CONFIG FILES (THIS IS THE FIX) -COPY docker/configuration/supervisord.conf /etc/supervisor/supervisord.conf -COPY docker/configuration/Caddyfile /etc/caddy/Caddyfile - - +# Switch back to root for system-level operations +USER root +COPY configuration/supervisord.conf /etc/supervisor/supervisord.conf +COPY configuration/Caddyfile /etc/caddy/Caddyfile COPY --from=caddy_builder /usr/bin/caddy /usr/bin/caddy +# Switch back to nodenorm user for runtime +USER nodenorm + STOPSIGNAL SIGINT EXPOSE 9000 +# Run supervisord as root to manage processes +USER root ENTRYPOINT ["supervisord"] CMD ["-c", "/etc/supervisor/supervisord.conf"] From 4ce895dc0cfc415110c02d52c47e688a88915dd9 Mon Sep 17 00:00:00 2001 From: chevvak2 <114002880+chevvak2@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:40:32 -0400 Subject: [PATCH 12/23] Update supervisord.conf --- docker/configuration/supervisord.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/configuration/supervisord.conf b/docker/configuration/supervisord.conf index 97aaad9..d91453f 100644 --- a/docker/configuration/supervisord.conf +++ b/docker/configuration/supervisord.conf @@ -18,6 +18,7 @@ stderr_logfile_backups=0 [program:python_app] command=/home/nodenorm/venv/bin/python -m nodenorm --port=9001 +user=nodenorm autorestart=true stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 From 721965d55dbba7963495751576840ce8437f0670 Mon Sep 17 00:00:00 2001 From: chevvak2 <114002880+chevvak2@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:53:34 -0400 Subject: [PATCH 13/23] Update Caddyfile --- docker/configuration/Caddyfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/configuration/Caddyfile b/docker/configuration/Caddyfile index d490b99..12d2ee2 100644 --- a/docker/configuration/Caddyfile +++ b/docker/configuration/Caddyfile @@ -1,5 +1,5 @@ -:9000 { - reverse_proxy localhost:9001 +:8000 { + reverse_proxy localhost:8000 encode zstd gzip log { output stdout From 93c814054b9673403d1d7f8d9f5f44e0f562d2ba Mon Sep 17 00:00:00 2001 From: chevvak2 <114002880+chevvak2@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:54:05 -0400 Subject: [PATCH 14/23] Update Dockerfile --- docker/Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 30d5f11..d9a55c2 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -16,6 +16,9 @@ RUN apt update -q -y && apt install -y --no-install-recommends git supervisor cu RUN useradd -m nodenorm && usermod -aG sudo nodenorm USER nodenorm WORKDIR /home/nodenorm/ +# Set PyStow home directory to a writable location +ENV PYSTOW_HOME=/home/nodenorm/.pystow +RUN mkdir -p /home/nodenorm/.pystow RUN python -m venv /home/nodenorm/venv COPY --from=builder --chown=nodenorm:nodenorm /build/wheels /home/nodenorm/wheels RUN /home/nodenorm/venv/bin/pip install /home/nodenorm/wheels/*.whl && rm -rf /home/nodenorm/wheels @@ -35,7 +38,7 @@ USER nodenorm STOPSIGNAL SIGINT -EXPOSE 9000 +EXPOSE 8000 # Run supervisord as root to manage processes USER root From 8e998892b8ee30016b6339b47de3bbbddc7d89cc Mon Sep 17 00:00:00 2001 From: chevvak2 Date: Mon, 13 Apr 2026 14:03:01 -0400 Subject: [PATCH 15/23] Merge remote Docker improvements with critical NodeNorm fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✅ Combined changes: - Remote: Clean Docker structure, port consistency updates - Local: PyStow permissions fix, ES config.json, environment variables 🔧 Key fixes preserved: - Custom config.json with correct Elasticsearch host - PYSTOW_HOME environment variable setup - Port 8000 standardization across all components - Enhanced supervisord configuration Resolves NodeNormalization pod crash loop issues. --- docker/Dockerfile | 4 +++- docker/configuration/config.json | 32 +++++++++++++++++++++++++++ docker/configuration/supervisord.conf | 3 ++- 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 docker/configuration/config.json diff --git a/docker/Dockerfile b/docker/Dockerfile index d9a55c2..4ac5c2d 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -27,12 +27,14 @@ WORKDIR /home/nodenorm/configuration COPY --from=builder --chown=nodenorm:nodenorm /build/nodenorm/src/nodenorm/config/config.default.json /home/nodenorm/configuration/default.json COPY --from=builder --chown=nodenorm:nodenorm /build/nodenorm/version.txt /home/nodenorm/configuration/version.txt +# Override with corrected configuration +COPY --chown=nodenorm:nodenorm configuration/config.json /home/nodenorm/configuration/config.json + # Switch back to root for system-level operations USER root COPY configuration/supervisord.conf /etc/supervisor/supervisord.conf COPY configuration/Caddyfile /etc/caddy/Caddyfile COPY --from=caddy_builder /usr/bin/caddy /usr/bin/caddy - # Switch back to nodenorm user for runtime USER nodenorm diff --git a/docker/configuration/config.json b/docker/configuration/config.json new file mode 100644 index 0000000..13422b8 --- /dev/null +++ b/docker/configuration/config.json @@ -0,0 +1,32 @@ +{ + "webserver": { + "HOST": "localhost", + "PORT": 8000, + "ENABLE_CURL_CLIENT": true, + "SETTINGS": { + "debug": true, + "autoreload": true + } + }, + "api": { + "API_PREFIX": "nodenorm", + "API_VERSION": "" + }, + "elasticsearch": { + "ES_HOST": "http://elasticsearch.es-core-components.svc.cluster.local:9200", + "ES_INDEX": "nodenorm", + "ES_ALIAS": "nodenorm", + "ES_DOC_TYPE": "node", + "ES_INDICES": {}, + "ES_ARGS": { + "sniff": false, + "request_timeout": 60 + } + }, + "telemetry": { + "OPENTELEMETRY_ENABLED": true, + "OPENTELEMETRY_SERVICE_NAME": "NodeNorm", + "OPENTELEMETRY_JAEGER_HOST": "http://localhost", + "OPENTELEMETRY_JAEGER_PORT": 6831 + } +} \ No newline at end of file diff --git a/docker/configuration/supervisord.conf b/docker/configuration/supervisord.conf index d91453f..9830dc5 100644 --- a/docker/configuration/supervisord.conf +++ b/docker/configuration/supervisord.conf @@ -17,8 +17,9 @@ stderr_logfile_maxbytes=0 stderr_logfile_backups=0 [program:python_app] -command=/home/nodenorm/venv/bin/python -m nodenorm --port=9001 +command=/home/nodenorm/venv/bin/python -m nodenorm --conf=/home/nodenorm/configuration/config.json --port=8000 user=nodenorm +environment=PYSTOW_HOME=/home/nodenorm/.pystow autorestart=true stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 From 44016f976654bcc1975d7a1208f8edab4ca1e94a Mon Sep 17 00:00:00 2001 From: chevvak2 Date: Mon, 13 Apr 2026 14:04:33 -0400 Subject: [PATCH 16/23] Fix pod naming: Force deployment name to 'node-normalization' Add fullnameOverride to prevent deployment name from being: - OLD: biothings-annotator-node-normalization-xxx-xxx - NEW: node-normalization-xxx-xxx This overrides the default logic that combines Helm release name with chart name, ensuring clean pod names. --- deploy/values.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/deploy/values.yaml b/deploy/values.yaml index 817fe0f..43eb3db 100644 --- a/deploy/values.yaml +++ b/deploy/values.yaml @@ -2,6 +2,9 @@ # This is a YAML-formatted file. # Declare variables to be passed into your templates. +# Override the full deployment name to prevent release name prefix +fullnameOverride: "node-normalization" + deployment: replicaCount: 1 strategy: From 7b69ccd9ae3918074990316c8c24cb53877c3279 Mon Sep 17 00:00:00 2001 From: chevvak2 Date: Mon, 13 Apr 2026 14:20:48 -0400 Subject: [PATCH 17/23] Disable OpenTelemetry to fix missing module error - Set OPENTELEMETRY_ENABLED: false in config.json - Resolves ModuleNotFoundError: No module named 'opentelemetry' - ES index validation now working after creating nodenorm index The pod should now start successfully without telemetry dependencies. --- docker/configuration/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/configuration/config.json b/docker/configuration/config.json index 13422b8..c46ab5f 100644 --- a/docker/configuration/config.json +++ b/docker/configuration/config.json @@ -24,7 +24,7 @@ } }, "telemetry": { - "OPENTELEMETRY_ENABLED": true, + "OPENTELEMETRY_ENABLED": false, "OPENTELEMETRY_SERVICE_NAME": "NodeNorm", "OPENTELEMETRY_JAEGER_HOST": "http://localhost", "OPENTELEMETRY_JAEGER_PORT": 6831 From 95305aec83ceec11ee618314e471dbe04956ed47 Mon Sep 17 00:00:00 2001 From: chevvak2 Date: Mon, 13 Apr 2026 14:29:44 -0400 Subject: [PATCH 18/23] Fix port conflict: Python app port 9001, Caddy serves 8000 --- docker/configuration/Caddyfile | 2 +- docker/configuration/supervisord.conf | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docker/configuration/Caddyfile b/docker/configuration/Caddyfile index 12d2ee2..73599df 100644 --- a/docker/configuration/Caddyfile +++ b/docker/configuration/Caddyfile @@ -1,5 +1,5 @@ :8000 { - reverse_proxy localhost:8000 + reverse_proxy localhost:9001 encode zstd gzip log { output stdout diff --git a/docker/configuration/supervisord.conf b/docker/configuration/supervisord.conf index 9830dc5..5af24c9 100644 --- a/docker/configuration/supervisord.conf +++ b/docker/configuration/supervisord.conf @@ -17,7 +17,7 @@ stderr_logfile_maxbytes=0 stderr_logfile_backups=0 [program:python_app] -command=/home/nodenorm/venv/bin/python -m nodenorm --conf=/home/nodenorm/configuration/config.json --port=8000 +command=/home/nodenorm/venv/bin/python -m nodenorm --conf=/home/nodenorm/configuration/config.json --port=9001 user=nodenorm environment=PYSTOW_HOME=/home/nodenorm/.pystow autorestart=true @@ -27,3 +27,4 @@ stdout_logfile_backups=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 stderr_logfile_backups=0 +cl \ No newline at end of file From f7f2d400508f80ebb8a1b5c355672d9467d57f2f Mon Sep 17 00:00:00 2001 From: chevvak2 Date: Mon, 13 Apr 2026 14:40:18 -0400 Subject: [PATCH 19/23] Fix supervisord.conf parsing error: remove incomplete line --- docker/configuration/supervisord.conf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docker/configuration/supervisord.conf b/docker/configuration/supervisord.conf index 5af24c9..d50dad9 100644 --- a/docker/configuration/supervisord.conf +++ b/docker/configuration/supervisord.conf @@ -26,5 +26,4 @@ stdout_logfile_maxbytes=0 stdout_logfile_backups=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 -stderr_logfile_backups=0 -cl \ No newline at end of file +stderr_logfile_backups=0 \ No newline at end of file From d966b2b739d1c731b8ceda0a1fb6d48c2e2d0ad8 Mon Sep 17 00:00:00 2001 From: chevvak2 Date: Mon, 13 Apr 2026 14:51:12 -0400 Subject: [PATCH 20/23] Fix Elasticsearch API compatibility in health handler - Patch health.py to use keyword arguments for indices.get() call - Resolves TypeError with Elasticsearch client 8.19.3 - Enables /status endpoint to work properly for health checks --- docker/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docker/Dockerfile b/docker/Dockerfile index 4ac5c2d..ce8db8b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -23,6 +23,9 @@ RUN python -m venv /home/nodenorm/venv COPY --from=builder --chown=nodenorm:nodenorm /build/wheels /home/nodenorm/wheels RUN /home/nodenorm/venv/bin/pip install /home/nodenorm/wheels/*.whl && rm -rf /home/nodenorm/wheels +# Fix Elasticsearch API compatibility issue in health handler +RUN sed -i 's/biothings_metadata = await async_client.indices.get(search_indices)/biothings_metadata = await async_client.indices.get(index=search_indices)/' /home/nodenorm/venv/lib/python3.12/site-packages/nodenorm/handlers/health.py + WORKDIR /home/nodenorm/configuration COPY --from=builder --chown=nodenorm:nodenorm /build/nodenorm/src/nodenorm/config/config.default.json /home/nodenorm/configuration/default.json COPY --from=builder --chown=nodenorm:nodenorm /build/nodenorm/version.txt /home/nodenorm/configuration/version.txt From 21060d079d4a294e33dda72e84513285f67b5832 Mon Sep 17 00:00:00 2001 From: chevvak2 Date: Mon, 13 Apr 2026 14:56:51 -0400 Subject: [PATCH 21/23] Improve health handler fixes with clean patch file - Replace complex sed commands with clean patched health.py - Fixes both Elasticsearch API compatibility (8.x) and metadata access issues - Provides resilient health check that works without complex metadata dependencies - Uses default babel version fallback when metadata unavailable --- docker/Dockerfile | 4 +-- docker/patches/health.py | 70 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 docker/patches/health.py diff --git a/docker/Dockerfile b/docker/Dockerfile index ce8db8b..53d34f7 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -23,8 +23,8 @@ RUN python -m venv /home/nodenorm/venv COPY --from=builder --chown=nodenorm:nodenorm /build/wheels /home/nodenorm/wheels RUN /home/nodenorm/venv/bin/pip install /home/nodenorm/wheels/*.whl && rm -rf /home/nodenorm/wheels -# Fix Elasticsearch API compatibility issue in health handler -RUN sed -i 's/biothings_metadata = await async_client.indices.get(search_indices)/biothings_metadata = await async_client.indices.get(index=search_indices)/' /home/nodenorm/venv/lib/python3.12/site-packages/nodenorm/handlers/health.py +# Apply patches to fix NodeNormalization compatibility issues +COPY --chown=nodenorm:nodenorm patches/health.py /home/nodenorm/venv/lib/python3.12/site-packages/nodenorm/handlers/health.py WORKDIR /home/nodenorm/configuration COPY --from=builder --chown=nodenorm:nodenorm /build/nodenorm/src/nodenorm/config/config.default.json /home/nodenorm/configuration/default.json diff --git a/docker/patches/health.py b/docker/patches/health.py new file mode 100644 index 0000000..f8df770 --- /dev/null +++ b/docker/patches/health.py @@ -0,0 +1,70 @@ +from urllib.parse import urlparse + +from elasticsearch import AsyncElasticsearch + +from biothings.web.handlers import BaseHandler + +from nodenorm.biolink import BIOLINK_MODEL_VERSION + + +class NodeNormHealthHandler(BaseHandler): + """ + Important Endpoints + * /_cat/nodes + + Patched version to handle missing metadata gracefully and fix ES API compatibility + """ + + name = "health" + + async def get(self): + async_client: AsyncElasticsearch = self.biothings.elasticsearch.async_client + search_indices = self.biothings.elasticsearch.indices + + try: + # Fixed: Use keyword argument for ES 8.x compatibility + biothings_metadata = await async_client.indices.get(index=search_indices) + + # Use default babel version since metadata access may not be available + babel_version = "1.9" # Default fallback version + babel_markdown = f"https://github.com/ncatstranslator/Babel/blob/master/releases/{babel_version}.md" + + try: + attributes = [ + "name", + "cpu", + "disk.avail", + "disk.total", + "disk.used", + "disk.used_percent", + "heap.current", + "heap.max", + "load_1m", + "load_5m", + "load_15m", + "uptime,version", + ] + h_string = ",".join(attributes) + cat_nodes_response = await async_client.cat.nodes(format="json", h=h_string) + nodes_status = {node["name"]: node for node in cat_nodes_response} + nodes = {"elasticsearch": {"nodes": nodes_status}} + except Exception: + # Fallback if ES cluster info fails + nodes = {"elasticsearch": {"status": "connected"}} + + status_response = { + "status": "running", + "babel_version": babel_version, + "babel_version_url": babel_markdown, + "biolink_model_toolkit_version": BIOLINK_MODEL_VERSION, + **nodes, + } + + except Exception as e: + status_response = { + "status": "error", + "error": str(e), + "babel_version": "unknown" + } + + self.finish(status_response) \ No newline at end of file From 230cbd19a2b1dd8648fe81cc4dc5e80f549e3f12 Mon Sep 17 00:00:00 2001 From: chevvak2 Date: Tue, 14 Apr 2026 12:28:52 -0400 Subject: [PATCH 22/23] Fix Docker repository URL to use chevvak2 fork - Update from biothings/NodeNormalizationAPI to chevvak2/NodeNormalizationAPI - Ensures Docker build uses the correct repository with our fixes --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 53d34f7..45c5bee 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,6 +1,6 @@ FROM python:3.12 AS builder -ARG NODENORM_REPO=https://github.com/biothings/NodeNormalizationAPI.git +ARG NODENORM_REPO=https://github.com/chevvak2/NodeNormalizationAPI.git ARG NODENORM_BRANCH=main WORKDIR /build/nodenorm From 2f178f1de3fe48c93089647fe59b950c7b936f7c Mon Sep 17 00:00:00 2001 From: chevvak2 <114002880+chevvak2@users.noreply.github.com> Date: Mon, 27 Apr 2026 22:59:16 -0400 Subject: [PATCH 23/23] Update deploy.sh --- deploy/deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/deploy.sh b/deploy/deploy.sh index de2ad12..1796392 100644 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -1,6 +1,6 @@ #!/bin/bash -projectName="biothings-annotator" +projectName="node-normalization" namespace="bte" #set +x