healthcare/api-client/v1/fhir/fhir_stores.py (335 lines of code) (raw):
# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import argparse
import os
# [START healthcare_create_fhir_store]
def create_fhir_store(project_id, location, dataset_id, fhir_store_id, version):
"""Creates a new FHIR store within the parent dataset.
See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/fhir
before running the sample."""
# Imports the Google API Discovery Service.
from googleapiclient import discovery
api_version = "v1"
service_name = "healthcare"
# Returns an authorized API client by discovering the Healthcare API
# and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
client = discovery.build(service_name, api_version)
# TODO(developer): Uncomment these lines and replace with your values.
# project_id = 'my-project' # replace with your GCP project ID
# location = 'us-central1' # replace with the parent dataset's location
# dataset_id = 'my-dataset' # replace with the FHIR store's parent dataset ID
# fhir_store_id = 'my-fhir-store' # replace with the FHIR store's ID
# version = 'R4' # replace with the FHIR store version
fhir_store_parent = "projects/{}/locations/{}/datasets/{}".format(
project_id, location, dataset_id
)
body = {"version": version}
request = (
client.projects()
.locations()
.datasets()
.fhirStores()
.create(parent=fhir_store_parent, body=body, fhirStoreId=fhir_store_id)
)
response = request.execute()
print(f"Created FHIR store: {fhir_store_id}")
return response
# [END healthcare_create_fhir_store]
# [START healthcare_delete_fhir_store]
def delete_fhir_store(project_id, location, dataset_id, fhir_store_id):
"""Deletes the specified FHIR store.
See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/fhir
before running the sample."""
# Imports the Google API Discovery Service.
from googleapiclient import discovery
api_version = "v1"
service_name = "healthcare"
# Returns an authorized API client by discovering the Healthcare API
# and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
client = discovery.build(service_name, api_version)
# TODO(developer): Uncomment these lines and replace with your values.
# project_id = 'my-project' # replace with your GCP project ID
# location = 'us-central1' # replace with the parent dataset's location
# dataset_id = 'my-dataset' # replace with the FHIR store's parent dataset
# fhir_store_id = 'my-fhir-store' # replace with the FHIR store's ID
fhir_store_parent = "projects/{}/locations/{}/datasets/{}".format(
project_id, location, dataset_id
)
fhir_store_name = f"{fhir_store_parent}/fhirStores/{fhir_store_id}"
request = (
client.projects()
.locations()
.datasets()
.fhirStores()
.delete(name=fhir_store_name)
)
response = request.execute()
print(f"Deleted FHIR store: {fhir_store_id}")
return response
# [END healthcare_delete_fhir_store]
# [START healthcare_get_fhir_store]
def get_fhir_store(project_id, location, dataset_id, fhir_store_id):
"""Gets the specified FHIR store.
See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/fhir
before running the sample."""
# Imports the Google API Discovery Service.
from googleapiclient import discovery
# Imports Python's built-in "json" module
import json
api_version = "v1"
service_name = "healthcare"
# Instantiates an authorized API client by discovering the Healthcare API
# and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
client = discovery.build(service_name, api_version)
# TODO(developer): Uncomment these lines and replace with your values.
# project_id = 'my-project' # replace with your GCP project ID
# location = 'us-central1' # replace with the parent dataset's location
# dataset_id = 'my-dataset' # replace with the FHIR store's parent dataset
# fhir_store_id = 'my-fhir-store' # replace with the FHIR store's ID
fhir_store_parent = "projects/{}/locations/{}/datasets/{}".format(
project_id, location, dataset_id
)
fhir_store_name = f"{fhir_store_parent}/fhirStores/{fhir_store_id}"
fhir_stores = client.projects().locations().datasets().fhirStores()
fhir_store = fhir_stores.get(name=fhir_store_name).execute()
print(json.dumps(fhir_store, indent=2))
return fhir_store
# [END healthcare_get_fhir_store]
# [START healthcare_get_metadata]
def get_fhir_store_metadata(project_id, location, dataset_id, fhir_store_id):
"""Gets the FHIR capability statement (STU3, R4), or the conformance statement
in the DSTU2 case for the store, which contains a description of functionality
supported by the server.
See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/fhir
before running the sample."""
# Imports the Google API Discovery Service.
from googleapiclient import discovery
# Imports Python's built-in "json" module
import json
api_version = "v1"
service_name = "healthcare"
# Instantiates an authorized API client by discovering the Healthcare API
# and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
client = discovery.build(service_name, api_version)
# TODO(developer): Uncomment these lines and replace with your values.
# project_id = 'my-project' # replace with your GCP project ID
# location = 'us-central1' # replace with the parent dataset's location
# dataset_id = 'my-dataset' # replace with the parent dataset's ID
# fhir_store_id = 'my-fhir-store' # replace with the FHIR store ID
fhir_store_parent = "projects/{}/locations/{}/datasets/{}".format(
project_id, location, dataset_id
)
fhir_store_name = f"{fhir_store_parent}/fhirStores/{fhir_store_id}"
fhir_stores = client.projects().locations().datasets().fhirStores()
response = fhir_stores.fhir().capabilities(name=fhir_store_name).execute()
print(json.dumps(response, indent=2))
return response
# [END healthcare_get_metadata]
# [START healthcare_list_fhir_stores]
def list_fhir_stores(project_id, location, dataset_id):
"""Lists the FHIR stores in the given dataset.
See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/fhir
before running the sample."""
# Imports the Google API Discovery Service.
from googleapiclient import discovery
api_version = "v1"
service_name = "healthcare"
# Instantiates an authorized API client by discovering the Healthcare API
# and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
client = discovery.build(service_name, api_version)
# TODO(developer): Uncomment these lines and replace with your values.
# project_id = 'my-project' # replace with your GCP project ID
# location = 'us-central1' # replace with the dataset's location
# dataset_id = 'my-dataset' # replace with the parent dataset's ID
fhir_store_parent = "projects/{}/locations/{}/datasets/{}".format(
project_id, location, dataset_id
)
fhir_stores = (
client.projects()
.locations()
.datasets()
.fhirStores()
.list(parent=fhir_store_parent)
.execute()
.get("fhirStores", [])
)
for fhir_store in fhir_stores:
print(fhir_store)
return fhir_stores
# [END healthcare_list_fhir_stores]
# [START healthcare_patch_fhir_store]
def patch_fhir_store(project_id, location, dataset_id, fhir_store_id, pubsub_topic):
"""Updates the FHIR store.
See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/fhir
before running the sample."""
# Imports the Google API Discovery Service.
from googleapiclient import discovery
api_version = "v1"
service_name = "healthcare"
# Instantiates an authorized API client by discovering the Healthcare API
# and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
client = discovery.build(service_name, api_version)
# TODO(developer): Uncomment these lines and replace with your values.
# project_id = 'my-project' # replace with your GCP project ID
# location = 'us-central1' # replace with the dataset's location
# dataset_id = 'my-dataset' # replace with your dataset ID
# fhir_store_id = 'my-fhir-store' # replace with the FHIR store's ID
# pubsub_topic = 'projects/{project_id}/topics/{topic_id}' # replace with your Pub/Sub topic
fhir_store_parent = "projects/{}/locations/{}/datasets/{}".format(
project_id, location, dataset_id
)
fhir_store_name = f"{fhir_store_parent}/fhirStores/{fhir_store_id}"
patch = {
"notificationConfigs": [{"pubsubTopic": pubsub_topic}] if pubsub_topic else []
}
request = (
client.projects()
.locations()
.datasets()
.fhirStores()
.patch(name=fhir_store_name, updateMask="notificationConfigs", body=patch)
)
response = request.execute()
print(
f"Patched FHIR store {fhir_store_id} with Cloud Pub/Sub topic: {pubsub_topic or 'None'}"
)
return response
# [END healthcare_patch_fhir_store]
# [START healthcare_export_fhir_resources_gcs]
def export_fhir_store_gcs(project_id, location, dataset_id, fhir_store_id, gcs_uri):
"""Export resources to a Google Cloud Storage bucket by copying
them from the FHIR store.
See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/fhir
before running the sample."""
# Imports the Google API Discovery Service.
from googleapiclient import discovery
api_version = "v1"
service_name = "healthcare"
# Instantiates an authorized API client by discovering the Healthcare API
# and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
client = discovery.build(service_name, api_version)
# TODO(developer): Uncomment these lines and replace with your values.
# project_id = 'my-project' # replace with your GCP project ID
# location = 'us-central1' # replace with the parent dataset's location
# dataset_id = 'my-dataset' # replace with the parent dataset's ID
# fhir_store_id = 'my-fhir-store' # replace with the FHIR store ID
# gcs_uri = 'my-bucket' # replace with a Cloud Storage bucket
fhir_store_parent = "projects/{}/locations/{}/datasets/{}".format(
project_id, location, dataset_id
)
fhir_store_name = f"{fhir_store_parent}/fhirStores/{fhir_store_id}"
body = {"gcsDestination": {"uriPrefix": f"gs://{gcs_uri}/fhir_export"}}
request = (
client.projects()
.locations()
.datasets()
.fhirStores()
.export(name=fhir_store_name, body=body)
)
response = request.execute()
print(f"Exported FHIR resources to bucket: gs://{gcs_uri}")
return response
# [END healthcare_export_fhir_resources_gcs]
# [START healthcare_import_fhir_resources]
def import_fhir_resources(project_id, location, dataset_id, fhir_store_id, gcs_uri):
"""Import resources into the FHIR store by copying them from the
specified source.
See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/fhir
before running the sample."""
# Imports the Google API Discovery Service.
from googleapiclient import discovery
api_version = "v1"
service_name = "healthcare"
# Instantiates an authorized API client by discovering the Healthcare API
# and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
client = discovery.build(service_name, api_version)
# TODO(developer): Uncomment these lines and replace with your values.
# project_id = 'my-project' # replace with your GCP project ID
# location = 'us-central1' # replace with the parent dataset's location
# dataset_id = 'my-dataset' # replace with the parent dataset's ID
# fhir_store_id = 'my-fhir-store' # replace with the FHIR store ID
# gcs_uri = 'my-bucket' # replace with a Cloud Storage bucket
fhir_store_parent = "projects/{}/locations/{}/datasets/{}".format(
project_id, location, dataset_id
)
fhir_store_name = f"{fhir_store_parent}/fhirStores/{fhir_store_id}"
body = {
"contentStructure": "CONTENT_STRUCTURE_UNSPECIFIED",
"gcsSource": {"uri": f"gs://{gcs_uri}"},
}
# Escape "import()" method keyword because "import"
# is a reserved keyword in Python
request = (
client.projects()
.locations()
.datasets()
.fhirStores()
.import_(name=fhir_store_name, body=body)
)
response = request.execute()
print(f"Imported FHIR resources: {gcs_uri}")
return response
# [END healthcare_import_fhir_resources]
# [START healthcare_fhir_store_get_iam_policy]
def get_fhir_store_iam_policy(project_id, location, dataset_id, fhir_store_id):
"""Gets the IAM policy for the specified FHIR store.
See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/fhir
before running the sample."""
# Imports the Google API Discovery Service.
from googleapiclient import discovery
api_version = "v1"
service_name = "healthcare"
# Instantiates an authorized API client by discovering the Healthcare API
# and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
client = discovery.build(service_name, api_version)
# TODO(developer): Uncomment these lines and replace with your values.
# project_id = 'my-project' # replace with your GCP project ID
# location = 'us-central1' # replace with the parent dataset's location
# dataset_id = 'my-dataset' # replace with the parent dataset's ID
# fhir_store_id = 'my-fhir-store' # replace with the FHIR store ID
fhir_store_parent = "projects/{}/locations/{}/datasets/{}".format(
project_id, location, dataset_id
)
fhir_store_name = f"{fhir_store_parent}/fhirStores/{fhir_store_id}"
request = (
client.projects()
.locations()
.datasets()
.fhirStores()
.getIamPolicy(resource=fhir_store_name)
)
response = request.execute()
print("etag: {}".format(response.get("name")))
return response
# [END healthcare_fhir_store_get_iam_policy]
# [START healthcare_fhir_store_set_iam_policy]
def set_fhir_store_iam_policy(
project_id,
location,
dataset_id,
fhir_store_id,
member,
role,
etag=None,
):
"""Sets the IAM policy for the specified FHIR store.
A single member will be assigned a single role. A member can be any of:
- allUsers, that is, anyone
- allAuthenticatedUsers, anyone authenticated with a Google account
- user:email, as in 'user:somebody@example.com'
- group:email, as in 'group:admins@example.com'
- domain:domainname, as in 'domain:example.com'
- serviceAccount:email,
as in 'serviceAccount:my-other-app@appspot.gserviceaccount.com'
A role can be any IAM role, such as 'roles/viewer', 'roles/owner',
or 'roles/editor'
See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/fhir
before running the sample."""
# Imports the Google API Discovery Service.
from googleapiclient import discovery
api_version = "v1"
service_name = "healthcare"
# Instantiates an authorized API client by discovering the Healthcare API
# and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
client = discovery.build(service_name, api_version)
# TODO(developer): Uncomment these lines and replace with your values.
# project_id = 'my-project' # replace with your GCP project ID
# location = 'us-central1' # replace with the parent dataset's location
# dataset_id = 'my-dataset' # replace with the parent dataset's ID
# fhir_store_id = 'my-fhir-store' # replace with the FHIR store ID
# member = 'myemail@example.com' # replace with an authorized member
# role = 'roles/viewer' # replace with a Healthcare API IAM role
fhir_store_parent = "projects/{}/locations/{}/datasets/{}".format(
project_id, location, dataset_id
)
fhir_store_name = f"{fhir_store_parent}/fhirStores/{fhir_store_id}"
policy = {"bindings": [{"role": role, "members": [member]}]}
if etag is not None:
policy["etag"] = etag
request = (
client.projects()
.locations()
.datasets()
.fhirStores()
.setIamPolicy(resource=fhir_store_name, body={"policy": policy})
)
response = request.execute()
print("etag: {}".format(response.get("name")))
print("bindings: {}".format(response.get("bindings")))
return response
# [END healthcare_fhir_store_set_iam_policy]
def parse_command_line_args():
"""Parses command line arguments."""
parser = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument(
"--project_id",
default=os.environ.get("GOOGLE_CLOUD_PROJECT"),
help="GCP cloud project name",
)
parser.add_argument("--location", default="us-central1", help="GCP location")
parser.add_argument("--dataset_id", default=None, help="Name of dataset")
parser.add_argument("--fhir_store_id", default=None, help="Name of FHIR store")
parser.add_argument(
"--pubsub_topic",
default=None,
help="The Cloud Pub/Sub topic where notifications of changes " "are published",
)
parser.add_argument(
"--gcs_uri",
default=None,
help="URI for a Google Cloud Storage directory from which files"
"should be import or to which result files"
'should be written (e.g., "bucket-id/path/to/destination/dir").',
)
parser.add_argument(
"--member",
default=None,
help='Member to add to IAM policy (e.g. "domain:example.com")',
)
parser.add_argument(
"--role", default=None, help='IAM Role to give to member (e.g. "roles/viewer")'
)
command = parser.add_subparsers(dest="command")
command.add_parser("create-fhir-store", help=create_fhir_store.__doc__)
command.add_parser("delete-fhir-store", help=delete_fhir_store.__doc__)
command.add_parser("get-fhir-store", help=get_fhir_store.__doc__)
command.add_parser("get-fhir-store-metadata", help=get_fhir_store_metadata.__doc__)
command.add_parser("list-fhir-stores", help=list_fhir_stores.__doc__)
command.add_parser("patch-fhir-store", help=patch_fhir_store.__doc__)
command.add_parser("import-fhir-resources", help=import_fhir_resources.__doc__)
command.add_parser("export-fhir-store-gcs", help=export_fhir_store_gcs.__doc__)
command.add_parser("get_iam_policy", help=get_fhir_store_iam_policy.__doc__)
command.add_parser("set_iam_policy", help=set_fhir_store_iam_policy.__doc__)
return parser.parse_args()
def run_command(args):
"""Calls the program using the specified command."""
if args.project_id is None:
print(
"You must specify a project ID or set the "
'"GOOGLE_CLOUD_PROJECT" environment variable.'
)
return
elif args.command == "create-fhir-store":
create_fhir_store(
args.project_id,
args.location,
args.dataset_id,
args.fhir_store_id,
)
elif args.command == "delete-fhir-store":
delete_fhir_store(
args.project_id,
args.location,
args.dataset_id,
args.fhir_store_id,
)
elif args.command == "get-fhir-store":
get_fhir_store(
args.project_id,
args.location,
args.dataset_id,
args.fhir_store_id,
)
elif args.command == "get-fhir-store-metadata":
get_fhir_store_metadata(
args.project_id,
args.location,
args.dataset_id,
args.fhir_store_id,
)
elif args.command == "list-fhir-stores":
list_fhir_stores(
args.project_id,
args.location,
args.dataset_id,
)
elif args.command == "patch-fhir-store":
patch_fhir_store(
args.project_id,
args.location,
args.dataset_id,
args.fhir_store_id,
args.pubsub_topic,
)
elif args.command == "export-fhir-store-gcs":
export_fhir_store_gcs(
args.project_id,
args.location,
args.dataset_id,
args.fhir_store_id,
args.gcs_uri,
)
elif args.command == "import-fhir-resources":
import_fhir_resources(
args.project_id,
args.location,
args.dataset_id,
args.fhir_store_id,
args.gcs_uri,
)
elif args.command == "get_iam_policy":
get_fhir_store_iam_policy(
args.project_id,
args.location,
args.dataset_id,
args.fhir_store_id,
)
elif args.command == "set_iam_policy":
set_fhir_store_iam_policy(
args.project_id,
args.location,
args.dataset_id,
args.fhir_store_id,
args.member,
args.role,
)
def main():
args = parse_command_line_args()
run_command(args)
if __name__ == "__main__":
main()