Merge branch 'master' into rel_7_3_tracking

This commit is contained in:
dotasek
2024-06-25 11:08:28 -04:00
10 changed files with 73 additions and 40 deletions

View File

@@ -1,7 +1,7 @@
FROM docker.io/library/maven:3.9.4-eclipse-temurin-17 AS build-hapi FROM docker.io/library/maven:3.9.7-eclipse-temurin-17 AS build-hapi
WORKDIR /tmp/hapi-fhir-jpaserver-starter WORKDIR /tmp/hapi-fhir-jpaserver-starter
ARG OPENTELEMETRY_JAVA_AGENT_VERSION=1.31.0 ARG OPENTELEMETRY_JAVA_AGENT_VERSION=1.33.3
RUN curl -LSsO https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v${OPENTELEMETRY_JAVA_AGENT_VERSION}/opentelemetry-javaagent.jar RUN curl -LSsO https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v${OPENTELEMETRY_JAVA_AGENT_VERSION}/opentelemetry-javaagent.jar
COPY pom.xml . COPY pom.xml .
@@ -18,7 +18,7 @@ RUN mkdir /app && cp /tmp/hapi-fhir-jpaserver-starter/target/ROOT.war /app/main.
########### bitnami tomcat version is suitable for debugging and comes with a shell ########### bitnami tomcat version is suitable for debugging and comes with a shell
########### it can be built using eg. `docker build --target tomcat .` ########### it can be built using eg. `docker build --target tomcat .`
FROM bitnami/tomcat:9.0 AS tomcat FROM bitnami/tomcat:10.1 AS tomcat
RUN rm -rf /opt/bitnami/tomcat/webapps/ROOT && \ RUN rm -rf /opt/bitnami/tomcat/webapps/ROOT && \
mkdir -p /opt/bitnami/hapi/data/hapi/lucenefiles && \ mkdir -p /opt/bitnami/hapi/data/hapi/lucenefiles && \
@@ -36,7 +36,7 @@ COPY --from=build-hapi --chown=1001:1001 /tmp/hapi-fhir-jpaserver-starter/opente
ENV ALLOW_EMPTY_PASSWORD=yes ENV ALLOW_EMPTY_PASSWORD=yes
########### distroless brings focus on security and runs on plain spring boot - this is the default image ########### distroless brings focus on security and runs on plain spring boot - this is the default image
FROM gcr.io/distroless/java17-debian11:nonroot AS default FROM gcr.io/distroless/java17-debian12:nonroot AS default
# 65532 is the nonroot user's uid # 65532 is the nonroot user's uid
# used here instead of the name to allow Kubernetes to easily detect that the container # used here instead of the name to allow Kubernetes to easily detect that the container
# is running as a non-root (uid != 0) user. # is running as a non-root (uid != 0) user.

View File

@@ -13,7 +13,7 @@ In order to use this sample, you should have:
- [This project](https://github.com/hapifhir/hapi-fhir-jpaserver-starter) checked out. You may wish to create a GitHub Fork of the project and check that out instead so that you can customize the project and save the results to GitHub. - [This project](https://github.com/hapifhir/hapi-fhir-jpaserver-starter) checked out. You may wish to create a GitHub Fork of the project and check that out instead so that you can customize the project and save the results to GitHub.
### and either ### and either
- Oracle Java (JDK) installed: Minimum JDK8 or newer. - Oracle Java (JDK) installed: Minimum JDK17 or newer.
- Apache Maven build tool (newest version) - Apache Maven build tool (newest version)
### or ### or
@@ -102,7 +102,7 @@ spring:
driverClassName: org.postgresql.Driver driverClassName: org.postgresql.Driver
jpa: jpa:
properties: properties:
hibernate.dialect: ca.uhn.fhir.jpa.model.dialect.HapiFhirPostgres94Dialect hibernate.dialect: ca.uhn.fhir.jpa.model.dialect.HapiFhirPostgresDialect
hibernate.search.enabled: false hibernate.search.enabled: false
``` ```
@@ -155,7 +155,7 @@ spring:
driverClassName: org.postgresql.Driver driverClassName: org.postgresql.Driver
jpa: jpa:
properties: properties:
hibernate.dialect: ca.uhn.fhir.jpa.model.dialect.HapiFhirPostgres94Dialect hibernate.dialect: ca.uhn.fhir.jpa.model.dialect.HapiFhirPostgresDialect
hibernate.search.enabled: false hibernate.search.enabled: false
hapi: hapi:
fhir: fhir:
@@ -244,7 +244,7 @@ Server will then be accessible at http://localhost:8080/ and eg. http://localhos
### Using Spring Boot ### Using Spring Boot
```bash ```bash
mvn clean package spring-boot:repackage -Pboot && java -jar target/ROOT.war mvn clean package spring-boot:repackage -DskipTests=true -Pboot && java -jar target/ROOT.war
``` ```
Server will then be accessible at http://localhost:8080/ and eg. http://localhost:8080/fhir/metadata. Remember to adjust your overlay configuration in the application.yaml to the following: Server will then be accessible at http://localhost:8080/ and eg. http://localhost:8080/fhir/metadata. Remember to adjust your overlay configuration in the application.yaml to the following:
@@ -312,7 +312,7 @@ spring:
driverClassName: org.postgresql.Driver driverClassName: org.postgresql.Driver
jpa: jpa:
properties: properties:
hibernate.dialect: ca.uhn.fhir.jpa.model.dialect.HapiFhirPostgres94Dialect hibernate.dialect: ca.uhn.fhir.jpa.model.dialect.HapiFhirPostgresDialect
hibernate.search.enabled: false hibernate.search.enabled: false
# Then comment all hibernate.search.backend.* # Then comment all hibernate.search.backend.*
@@ -430,7 +430,7 @@ spring:
driverClassName: org.postgresql.Driver driverClassName: org.postgresql.Driver
jpa: jpa:
properties: properties:
hibernate.dialect: ca.uhn.fhir.jpa.model.dialect.HapiFhirPostgres94Dialect hibernate.dialect: ca.uhn.fhir.jpa.model.dialect.HapiFhirPostgresDialect
hibernate.search.enabled: false hibernate.search.enabled: false
# Then comment all hibernate.search.backend.* # Then comment all hibernate.search.backend.*

View File

@@ -10,8 +10,8 @@ dependencies:
version: 14.3.1 version: 14.3.1
repository: oci://registry-1.docker.io/bitnamicharts repository: oci://registry-1.docker.io/bitnamicharts
condition: postgresql.enabled condition: postgresql.enabled
appVersion: 7.0.3 appVersion: 7.2.0
version: 0.16.0 version: 0.17.0
annotations: annotations:
artifacthub.io/license: Apache-2.0 artifacthub.io/license: Apache-2.0
artifacthub.io/containsSecurityUpdates: "false" artifacthub.io/containsSecurityUpdates: "false"
@@ -24,7 +24,7 @@ annotations:
# When using the list of objects option the valid supported kinds are # When using the list of objects option the valid supported kinds are
# added, changed, deprecated, removed, fixed, and security. # added, changed, deprecated, removed, fixed, and security.
- kind: changed - kind: changed
description: updated starter image to v7.0.3 description: updated starter image to v7.2.0
- kind: changed - kind: changed
description: updated curlimages/curl to 8.6.0 description: updated curlimages/curl to 8.6.0
- kind: changed - kind: changed

View File

@@ -1,6 +1,6 @@
# HAPI FHIR JPA Server Starter Helm Chart # HAPI FHIR JPA Server Starter Helm Chart
![Version: 0.16.0](https://img.shields.io/badge/Version-0.16.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 7.0.3](https://img.shields.io/badge/AppVersion-7.0.3-informational?style=flat-square) ![Version: 0.17.0](https://img.shields.io/badge/Version-0.17.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 7.2.0](https://img.shields.io/badge/AppVersion-7.2.0-informational?style=flat-square)
This helm chart will help you install the HAPI FHIR JPA Server in a Kubernetes environment. This helm chart will help you install the HAPI FHIR JPA Server in a Kubernetes environment.
@@ -36,7 +36,7 @@ helm install hapi-fhir-jpaserver hapifhir/hapi-fhir-jpaserver
| image.pullPolicy | string | `"IfNotPresent"` | image pullPolicy to use | | image.pullPolicy | string | `"IfNotPresent"` | image pullPolicy to use |
| image.registry | string | `"docker.io"` | registry where the HAPI FHIR server image is hosted | | image.registry | string | `"docker.io"` | registry where the HAPI FHIR server image is hosted |
| image.repository | string | `"hapiproject/hapi"` | the path inside the repository | | image.repository | string | `"hapiproject/hapi"` | the path inside the repository |
| image.tag | string | `"v7.0.3@sha256:73ff82fec42e5cbb7e66338d47af09ba91c140e98beeaee41a5459572d5ae1ce"` | the image tag. As of v5.7.0, this is the `distroless` flavor by default, add `-tomcat` to use the Tomcat-based image. | | image.tag | string | `"v7.2.0@sha256:9bcafa8342b572eee248cb7c48c496863d352bbd0347e1d98ea238d09620e89b"` | the image tag. As of v5.7.0, this is the `distroless` flavor by default, add `-tomcat` to use the Tomcat-based image. |
| imagePullSecrets | list | `[]` | image pull secrets to use when pulling the image | | imagePullSecrets | list | `[]` | image pull secrets to use when pulling the image |
| ingress.annotations | object | `{}` | provide any additional annotations which may be required. Evaluated as a template. | | ingress.annotations | object | `{}` | provide any additional annotations which may be required. Evaluated as a template. |
| ingress.enabled | bool | `false` | whether to create an Ingress to expose the FHIR server HTTP endpoint | | ingress.enabled | bool | `false` | whether to create an Ingress to expose the FHIR server HTTP endpoint |

View File

@@ -7,7 +7,7 @@ image:
# -- the path inside the repository # -- the path inside the repository
repository: hapiproject/hapi repository: hapiproject/hapi
# -- the image tag. As of v5.7.0, this is the `distroless` flavor by default, add `-tomcat` to use the Tomcat-based image. # -- the image tag. As of v5.7.0, this is the `distroless` flavor by default, add `-tomcat` to use the Tomcat-based image.
tag: "v7.0.3@sha256:73ff82fec42e5cbb7e66338d47af09ba91c140e98beeaee41a5459572d5ae1ce" tag: "v7.2.0@sha256:9bcafa8342b572eee248cb7c48c496863d352bbd0347e1d98ea238d09620e89b"
# -- image pullPolicy to use # -- image pullPolicy to use
pullPolicy: IfNotPresent pullPolicy: IfNotPresent

View File

@@ -4,10 +4,15 @@ services:
build: . build: .
container_name: hapi-fhir-jpaserver-start container_name: hapi-fhir-jpaserver-start
restart: on-failure restart: on-failure
environment:
SPRING_DATASOURCE_URL: "jdbc:postgresql://hapi-fhir-postgres:5432/hapi"
SPRING_DATASOURCE_USERNAME: "admin"
SPRING_DATASOURCE_PASSWORD: "admin"
SPRING_DATASOURCE_DRIVERCLASSNAME: "org.postgresql.Driver"
ports: ports:
- "8080:8080" - "8080:8080"
hapi-fhir-postgres: hapi-fhir-postgres:
image: postgres:13-alpine image: postgres:14-alpine
container_name: hapi-fhir-postgres container_name: hapi-fhir-postgres
restart: always restart: always
environment: environment:

32
pom.xml
View File

@@ -21,7 +21,7 @@
<packaging>war</packaging> <packaging>war</packaging>
<properties> <properties>
<java.version>11</java.version> <java.version>17</java.version>
</properties> </properties>
<prerequisites> <prerequisites>
@@ -77,13 +77,13 @@
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-base</artifactId> <artifactId>hapi-fhir-base</artifactId>
<version>${project.version}</version> <version>${project.parent.version}</version>
</dependency> </dependency>
<!-- This dependency includes the EmailSenderImpl we will be using instead of standard javamail.--> <!-- This dependency includes the EmailSenderImpl we will be using instead of standard javamail.-->
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-jpaserver-subscription</artifactId> <artifactId>hapi-fhir-jpaserver-subscription</artifactId>
<version>${project.version}</version> <version>${project.parent.version}</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<groupId>com.zaxxer</groupId> <groupId>com.zaxxer</groupId>
@@ -96,7 +96,7 @@
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-jpaserver-base</artifactId> <artifactId>hapi-fhir-jpaserver-base</artifactId>
<version>${project.version}</version> <version>${project.parent.version}</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
@@ -112,13 +112,13 @@
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-storage-cr</artifactId> <artifactId>hapi-fhir-storage-cr</artifactId>
<version>${project.version}</version> <version>${project.parent.version}</version>
</dependency> </dependency>
<!-- This dependency includes the JPA MDM Server --> <!-- This dependency includes the JPA MDM Server -->
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-jpaserver-mdm</artifactId> <artifactId>hapi-fhir-jpaserver-mdm</artifactId>
<version>${project.version}</version> <version>${project.parent.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
@@ -128,13 +128,13 @@
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-server-cds-hooks</artifactId> <artifactId>hapi-fhir-server-cds-hooks</artifactId>
<version>${project.version}</version> <version>${project.parent.version}</version>
</dependency> </dependency>
<!-- This dependency includes the OpenAPI Server --> <!-- This dependency includes the OpenAPI Server -->
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-server-openapi</artifactId> <artifactId>hapi-fhir-server-openapi</artifactId>
<version>${project.version}</version> <version>${project.parent.version}</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<groupId>org.yaml</groupId> <groupId>org.yaml</groupId>
@@ -146,21 +146,21 @@
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-testpage-overlay</artifactId> <artifactId>hapi-fhir-testpage-overlay</artifactId>
<version>${project.version}</version> <version>${project.parent.version}</version>
<type>war</type> <type>war</type>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-testpage-overlay</artifactId> <artifactId>hapi-fhir-testpage-overlay</artifactId>
<version>${project.version}</version> <version>${project.parent.version}</version>
<classifier>classes</classifier> <classifier>classes</classifier>
</dependency> </dependency>
<!-- This dependency is used to include the IPS Base Implementation --> <!-- This dependency is used to include the IPS Base Implementation -->
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-jpaserver-ips</artifactId> <artifactId>hapi-fhir-jpaserver-ips</artifactId>
<version>${project.version}</version> <version>${project.parent.version}</version>
</dependency> </dependency>
<!-- HAPI-FHIR uses Logback for logging support. The logback library is included automatically by Maven as a part of the hapi-fhir-base dependency, but you also need to include a logging library. Logback <!-- HAPI-FHIR uses Logback for logging support. The logback library is included automatically by Maven as a part of the hapi-fhir-base dependency, but you also need to include a logging library. Logback
@@ -261,7 +261,7 @@
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-jpaserver-test-utilities</artifactId> <artifactId>hapi-fhir-jpaserver-test-utilities</artifactId>
<version>${project.version}</version> <version>${project.parent.version}</version>
<scope>test</scope> <scope>test</scope>
<exclusions> <exclusions>
<exclusion> <exclusion>
@@ -300,7 +300,7 @@
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-test-utilities</artifactId> <artifactId>hapi-fhir-test-utilities</artifactId>
<version>${project.version}</version> <version>${project.parent.version}</version>
<scope>test</scope> <scope>test</scope>
<exclusions> <exclusions>
<exclusion> <exclusion>
@@ -393,7 +393,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
<version>3.1.2</version> <version>3.2.5</version>
</plugin> </plugin>
</plugins> </plugins>
</pluginManagement> </pluginManagement>
@@ -429,9 +429,9 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version> <version>3.13.0</version>
<configuration> <configuration>
<release>11</release> <release>${java.version}</release>
</configuration> </configuration>
</plugin> </plugin>

View File

@@ -37,6 +37,7 @@ public class AppProperties {
private Boolean allow_multiple_delete = false; private Boolean allow_multiple_delete = false;
private Boolean allow_override_default_search_params = true; private Boolean allow_override_default_search_params = true;
private Boolean auto_create_placeholder_reference_targets = false; private Boolean auto_create_placeholder_reference_targets = false;
private Boolean mass_ingestion_mode_enabled = false;
private final Set<String> auto_version_reference_at_paths = new HashSet<>(); private final Set<String> auto_version_reference_at_paths = new HashSet<>();
private Boolean language_search_parameter_enabled = false; private Boolean language_search_parameter_enabled = false;
private Boolean dao_scheduling_enabled = true; private Boolean dao_scheduling_enabled = true;
@@ -324,6 +325,14 @@ public Cors getCors() {
this.allow_override_default_search_params = allow_override_default_search_params; this.allow_override_default_search_params = allow_override_default_search_params;
} }
public Boolean getMass_ingestion_mode_enabled() {
return mass_ingestion_mode_enabled;
}
public void setMass_ingestion_mode_enabled(Boolean mass_ingestion_mode_enabled) {
this.mass_ingestion_mode_enabled = mass_ingestion_mode_enabled;
}
public Boolean getAuto_create_placeholder_reference_targets() { public Boolean getAuto_create_placeholder_reference_targets() {
return auto_create_placeholder_reference_targets; return auto_create_placeholder_reference_targets;
} }

View File

@@ -135,6 +135,8 @@ public class FhirServerConfigCommon {
: StorageSettings.IndexEnabledEnum.DISABLED); : StorageSettings.IndexEnabledEnum.DISABLED);
jpaStorageSettings.setAutoCreatePlaceholderReferenceTargets( jpaStorageSettings.setAutoCreatePlaceholderReferenceTargets(
appProperties.getAuto_create_placeholder_reference_targets()); appProperties.getAuto_create_placeholder_reference_targets());
jpaStorageSettings.setMassIngestionMode(
appProperties.getMass_ingestion_mode_enabled());
jpaStorageSettings.setAutoVersionReferenceAtPaths(appProperties.getAuto_version_reference_at_paths()); jpaStorageSettings.setAutoVersionReferenceAtPaths(appProperties.getAuto_version_reference_at_paths());
jpaStorageSettings.setEnforceReferentialIntegrityOnWrite( jpaStorageSettings.setEnforceReferentialIntegrityOnWrite(
appProperties.getEnforce_referential_integrity_on_write()); appProperties.getEnforce_referential_integrity_on_write());

View File

@@ -6,10 +6,26 @@ server:
#Adds the option to go to eg. http://localhost:8080/actuator/health for seeing the running configuration #Adds the option to go to eg. http://localhost:8080/actuator/health for seeing the running configuration
#see https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.endpoints #see https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.endpoints
management: management:
endpoint:
endpoints: endpoints:
enabled-by-default: false
web: web:
exposure: exposure:
include: "health,prometheus" include: health,prometheus
health:
enabled: true
probes:
enabled: true
livenessState:
enabled: true
readinessState:
enabled: true
prometheus:
enabled: true
metrics:
export:
enabled: true
spring: spring:
main: main:
allow-circular-references: true allow-circular-references: true
@@ -36,7 +52,7 @@ spring:
#Hibernate dialect is automatically detected except Postgres and H2. #Hibernate dialect is automatically detected except Postgres and H2.
#If using H2, then supply the value of ca.uhn.fhir.jpa.model.dialect.HapiFhirH2Dialect #If using H2, then supply the value of ca.uhn.fhir.jpa.model.dialect.HapiFhirH2Dialect
#If using postgres, then supply the value of ca.uhn.fhir.jpa.model.dialect.HapiFhirPostgres94Dialect #If using postgres, then supply the value of ca.uhn.fhir.jpa.model.dialect.HapiFhirPostgresDialect
hibernate.dialect: ca.uhn.fhir.jpa.model.dialect.HapiFhirH2Dialect hibernate.dialect: ca.uhn.fhir.jpa.model.dialect.HapiFhirH2Dialect
# hibernate.hbm2ddl.auto: update # hibernate.hbm2ddl.auto: update
# hibernate.jdbc.batch_size: 20 # hibernate.jdbc.batch_size: 20
@@ -46,7 +62,7 @@ spring:
# hibernate.cache.use_minimal_puts: false # hibernate.cache.use_minimal_puts: false
### These settings will enable fulltext search with lucene or elastic ### These settings will enable fulltext search with lucene or elastic
hibernate.search.enabled: true hibernate.search.enabled: false
### lucene parameters ### lucene parameters
# hibernate.search.backend.type: lucene # hibernate.search.backend.type: lucene
# hibernate.search.backend.analysis.configurer: ca.uhn.fhir.jpa.search.HapiHSearchAnalysisConfigurers$HapiLuceneAnalysisConfigurer # hibernate.search.backend.analysis.configurer: ca.uhn.fhir.jpa.search.HapiHSearchAnalysisConfigurers$HapiLuceneAnalysisConfigurer
@@ -116,6 +132,7 @@ hapi:
# allow_multiple_delete: true # allow_multiple_delete: true
# allow_override_default_search_params: true # allow_override_default_search_params: true
# auto_create_placeholder_reference_targets: false # auto_create_placeholder_reference_targets: false
# mass_ingestion_mode_enabled: false
### tells the server to automatically append the current version of the target resource to references at these paths ### tells the server to automatically append the current version of the target resource to references at these paths
# auto_version_reference_at_paths: Device.patient, Device.location, Device.parent, DeviceMetric.parent, DeviceMetric.source, Observation.device, Observation.subject # auto_version_reference_at_paths: Device.patient, Device.location, Device.parent, DeviceMetric.parent, DeviceMetric.source, Observation.device, Observation.subject
# ips_enabled: false # ips_enabled: false