|
| 1 | +import logging |
1 | 2 | from pathlib import Path |
2 | 3 |
|
3 | 4 | import click |
4 | | -from prefect.blocks.core import Block |
5 | | -from prefect.deployments import Deployment |
| 5 | +from prefect import serve |
6 | 6 | from prefect.filesystems import RemoteFileSystem |
7 | | -from pygeoapi.process.manager import get_manager |
8 | | -from pygeoapi.process import exceptions |
| 7 | +from pygeoapi.process.manager.base import get_manager |
9 | 8 | from pygeoapi.util import yaml_load |
10 | 9 |
|
11 | | -from .process import BasePrefectProcessor |
| 10 | +from . import ( |
| 11 | + BasePrefectProcessor, |
| 12 | + PrefectManager, |
| 13 | +) |
| 14 | +from .manager import ProcessId |
| 15 | +from .vanilla_flow import ( |
| 16 | + generate_flow_run_name, |
| 17 | + run_vanilla_processor, |
| 18 | +) |
| 19 | + |
| 20 | +logger = logging.getLogger(__name__) |
12 | 21 |
|
13 | 22 |
|
14 | 23 | @click.group(name="prefect") |
@@ -56,44 +65,104 @@ def create_storage_block( |
56 | 65 | print("Done!") |
57 | 66 |
|
58 | 67 |
|
59 | | -@root.command() |
60 | | -@click.argument("process_id") |
| 68 | +@root.command(name="deploy-static") |
61 | 69 | @click.option("-c", "--pygeoapi-config", type=Path, envvar="PYGEOAPI_CONFIG") |
62 | | -def deploy_process( |
63 | | - process_id: str, |
64 | | - pygeoapi_config: Path, |
| 70 | +def deploy_processors_locally( |
| 71 | + pygeoapi_config: Path, |
65 | 72 | ): |
66 | | - """Create and apply prefect deployment for PROCESS_ID. |
67 | | -
|
68 | | - Configure deployment parameters for the process in pygeoapi's configuration |
69 | | - file. |
70 | | - """ |
| 73 | + """Deploy pygeoapi processes via Prefect, locally.""" |
71 | 74 | with pygeoapi_config.open() as fh: |
72 | 75 | config = yaml_load(fh) |
73 | 76 | manager = get_manager(config) |
74 | | - try: |
75 | | - processor = manager.get_processor(process_id) |
76 | | - except exceptions.UnknownProcessError as err: |
77 | | - raise click.BadParameter(f"Process {process_id!r} not found") from err |
78 | | - else: |
79 | | - if isinstance(processor, BasePrefectProcessor): |
80 | | - if processor.deployment_info is not None: |
81 | | - print(f"Deploying process {process_id!r} with prefect...") |
82 | | - if (sb := processor.deployment_info.storage_block) is not None: |
83 | | - storage = Block.load(sb) |
84 | | - else: |
85 | | - storage = None |
86 | | - deployment = Deployment.build_from_flow( |
87 | | - processor.process_flow, |
88 | | - name=processor.deployment_info.name, |
89 | | - work_queue_name=processor.deployment_info.queue, |
90 | | - storage=storage, |
91 | | - path=processor.deployment_info.storage_sub_path, |
92 | | - ignore_file=None, |
| 77 | + if not isinstance(manager, PrefectManager): |
| 78 | + raise SystemExit( |
| 79 | + "Cannot deploy as prefect flows - pygeoapi_prefect.PrefectManager " |
| 80 | + "is not being used as the pygeoapi process manager" |
| 81 | + ) |
| 82 | + to_serve = [] |
| 83 | + for processor_id in manager.processes: |
| 84 | + match processor := manager.get_processor(ProcessId(processor_id)): |
| 85 | + case BasePrefectProcessor(): |
| 86 | + logger.debug( |
| 87 | + f"Skipping process {processor_id!r} - it provides its own " |
| 88 | + f"deployment configuration" |
| 89 | + ) |
| 90 | + continue |
| 91 | + case BasePrefectProcessor(): |
| 92 | + configured_flow = run_vanilla_processor.with_options( |
| 93 | + name=processor.metadata["id"], |
| 94 | + version=processor.metadata.get("version"), |
| 95 | + flow_run_name=generate_flow_run_name, |
| 96 | + validate_parameters=True, |
| 97 | + ) |
| 98 | + flow_deployment = configured_flow.to_deployment( |
| 99 | + name=f"pygeoapi-{processor_id}-local", |
| 100 | + parameters={"processor_id": processor_id}, |
93 | 101 | ) |
94 | | - deployment.apply() |
95 | | - print("Done!") |
96 | | - else: |
97 | | - raise click.Abort("Deployment not specified in pygeoapi config file") |
98 | | - else: |
99 | | - print(f"Process {process_id!r} is not deployable with prefect, skipping...") |
| 102 | + to_serve.append(flow_deployment) |
| 103 | + case _: |
| 104 | + logger.warning(f"Unknown processor type {processor_id}, ignoring...") |
| 105 | + continue |
| 106 | + # processor = manager.get_processor(ProcessId(processor_id)) |
| 107 | + # if isinstance(processor, BasePrefectProcessor): |
| 108 | + # logger.debug( |
| 109 | + # f"Skipping process {processor_id!r} - it provides its own " |
| 110 | + # f"deployment configuration" |
| 111 | + # ) |
| 112 | + # continue |
| 113 | + # else: |
| 114 | + # configured_flow = run_vanilla_processor.with_options( |
| 115 | + # name=processor.metadata["id"], |
| 116 | + # version=processor.metadata.get("version"), |
| 117 | + # flow_run_name=generate_flow_run_name, |
| 118 | + # validate_parameters=True, |
| 119 | + # ) |
| 120 | + # flow_deployment = configured_flow.to_deployment( |
| 121 | + # name=f"pygeoapi-{processor_id}-local", |
| 122 | + # parameters={"processor_id": processor_id}, |
| 123 | + # ) |
| 124 | + # to_serve.append(flow_deployment) |
| 125 | + serve(*to_serve) |
| 126 | + |
| 127 | + |
| 128 | +# @root.command() |
| 129 | +# @click.argument("process_id") |
| 130 | +# @click.option("-c", "--pygeoapi-config", type=Path, envvar="PYGEOAPI_CONFIG") |
| 131 | +# def deploy_process( |
| 132 | +# process_id: str, |
| 133 | +# pygeoapi_config: Path, |
| 134 | +# ): |
| 135 | +# """Create and apply prefect deployment for PROCESS_ID. |
| 136 | +# |
| 137 | +# Configure deployment parameters for the process in pygeoapi's configuration |
| 138 | +# file. |
| 139 | +# """ |
| 140 | +# with pygeoapi_config.open() as fh: |
| 141 | +# config = yaml_load(fh) |
| 142 | +# manager = get_manager(config) |
| 143 | +# try: |
| 144 | +# processor = manager.get_processor(process_id) |
| 145 | +# except UnknownProcessError as err: |
| 146 | +# raise click.BadParameter(f"Process {process_id!r} not found") from err |
| 147 | +# else: |
| 148 | +# if isinstance(processor, BasePrefectProcessor): |
| 149 | +# if processor.deployment_info is not None: |
| 150 | +# print(f"Deploying process {process_id!r} with prefect...") |
| 151 | +# if (sb := processor.deployment_info.storage_block) is not None: |
| 152 | +# storage = Block.load(sb) |
| 153 | +# else: |
| 154 | +# storage = None |
| 155 | +# deployment = Deployment.build_from_flow( |
| 156 | +# processor.process_flow, |
| 157 | +# name=processor.deployment_info.name, |
| 158 | +# work_queue_name=processor.deployment_info.queue, |
| 159 | +# storage=storage, |
| 160 | +# path=processor.deployment_info.storage_sub_path, |
| 161 | +# ignore_file=None, |
| 162 | +# ) |
| 163 | +# deployment.apply() |
| 164 | +# print("Done!") |
| 165 | +# else: |
| 166 | +# raise click.Abort("Deployment not specified in pygeoapi config file") |
| 167 | +# else: |
| 168 | +# print(f"Process {process_id!r} is not deployable with prefect, skipping...") |
0 commit comments