holoscan 2.6.0__cp312-cp312-manylinux_2_35_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. holoscan-2.6.0.data/purelib/holoscan/__init__.py +133 -0
  2. holoscan-2.6.0.data/purelib/holoscan/cli/__init__.py +32 -0
  3. holoscan-2.6.0.data/purelib/holoscan/cli/__main__.py +159 -0
  4. holoscan-2.6.0.data/purelib/holoscan/cli/common/argparse_types.py +153 -0
  5. holoscan-2.6.0.data/purelib/holoscan/cli/common/artifact_sources.py +149 -0
  6. holoscan-2.6.0.data/purelib/holoscan/cli/common/constants.py +119 -0
  7. holoscan-2.6.0.data/purelib/holoscan/cli/common/dockerutils.py +509 -0
  8. holoscan-2.6.0.data/purelib/holoscan/cli/common/enum_types.py +52 -0
  9. holoscan-2.6.0.data/purelib/holoscan/cli/common/exceptions.py +130 -0
  10. holoscan-2.6.0.data/purelib/holoscan/cli/common/sdk_utils.py +180 -0
  11. holoscan-2.6.0.data/purelib/holoscan/cli/common/utils.py +130 -0
  12. holoscan-2.6.0.data/purelib/holoscan/cli/logging.json +37 -0
  13. holoscan-2.6.0.data/purelib/holoscan/cli/nics/__init__.py +18 -0
  14. holoscan-2.6.0.data/purelib/holoscan/cli/nics/nics.py +34 -0
  15. holoscan-2.6.0.data/purelib/holoscan/cli/packager/__init__.py +18 -0
  16. holoscan-2.6.0.data/purelib/holoscan/cli/packager/arguments.py +137 -0
  17. holoscan-2.6.0.data/purelib/holoscan/cli/packager/config_reader.py +181 -0
  18. holoscan-2.6.0.data/purelib/holoscan/cli/packager/container_builder.py +368 -0
  19. holoscan-2.6.0.data/purelib/holoscan/cli/packager/manifest_files.py +220 -0
  20. holoscan-2.6.0.data/purelib/holoscan/cli/packager/models.py +93 -0
  21. holoscan-2.6.0.data/purelib/holoscan/cli/packager/package_command.py +189 -0
  22. holoscan-2.6.0.data/purelib/holoscan/cli/packager/packager.py +122 -0
  23. holoscan-2.6.0.data/purelib/holoscan/cli/packager/parameters.py +558 -0
  24. holoscan-2.6.0.data/purelib/holoscan/cli/packager/platforms.py +402 -0
  25. holoscan-2.6.0.data/purelib/holoscan/cli/packager/templates/Dockerfile.jinja2 +470 -0
  26. holoscan-2.6.0.data/purelib/holoscan/cli/packager/templates/dockerignore +93 -0
  27. holoscan-2.6.0.data/purelib/holoscan/cli/packager/templates/tools.sh +416 -0
  28. holoscan-2.6.0.data/purelib/holoscan/cli/py.typed +0 -0
  29. holoscan-2.6.0.data/purelib/holoscan/cli/runner/__init__.py +18 -0
  30. holoscan-2.6.0.data/purelib/holoscan/cli/runner/resources.py +174 -0
  31. holoscan-2.6.0.data/purelib/holoscan/cli/runner/run_command.py +203 -0
  32. holoscan-2.6.0.data/purelib/holoscan/cli/runner/runner.py +306 -0
  33. holoscan-2.6.0.data/purelib/holoscan/cli/version/__init__.py +18 -0
  34. holoscan-2.6.0.data/purelib/holoscan/cli/version/version.py +50 -0
  35. holoscan-2.6.0.data/purelib/holoscan/conditions/__init__.py +57 -0
  36. holoscan-2.6.0.data/purelib/holoscan/core/__init__.py +430 -0
  37. holoscan-2.6.0.data/purelib/holoscan/decorator.py +592 -0
  38. holoscan-2.6.0.data/purelib/holoscan/executors/__init__.py +26 -0
  39. holoscan-2.6.0.data/purelib/holoscan/graphs/__init__.py +32 -0
  40. holoscan-2.6.0.data/purelib/holoscan/gxf/__init__.py +57 -0
  41. holoscan-2.6.0.data/purelib/holoscan/lib/gxf_extensions/libgxf_holoscan_wrapper.so +0 -0
  42. holoscan-2.6.0.data/purelib/holoscan/lib/gxf_extensions/libgxf_holoscan_wrapper_lib.so +0 -0
  43. holoscan-2.6.0.data/purelib/holoscan/lib/gxf_extensions/libgxf_ucx_holoscan.so +0 -0
  44. holoscan-2.6.0.data/purelib/holoscan/lib/gxf_extensions/libgxf_ucx_holoscan_lib.so +0 -0
  45. holoscan-2.6.0.data/purelib/holoscan/lib/libgxf_app.so +0 -0
  46. holoscan-2.6.0.data/purelib/holoscan/lib/libgxf_core.so +0 -0
  47. holoscan-2.6.0.data/purelib/holoscan/lib/libgxf_cuda.so +0 -0
  48. holoscan-2.6.0.data/purelib/holoscan/lib/libgxf_logger.so +0 -0
  49. holoscan-2.6.0.data/purelib/holoscan/lib/libgxf_multimedia.so +0 -0
  50. holoscan-2.6.0.data/purelib/holoscan/lib/libgxf_rmm.so +0 -0
  51. holoscan-2.6.0.data/purelib/holoscan/lib/libgxf_sample.so +0 -0
  52. holoscan-2.6.0.data/purelib/holoscan/lib/libgxf_serialization.so +0 -0
  53. holoscan-2.6.0.data/purelib/holoscan/lib/libgxf_std.so +0 -0
  54. holoscan-2.6.0.data/purelib/holoscan/lib/libgxf_ucx.so +0 -0
  55. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_core.so.2.6.0 +0 -0
  56. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_infer.so.2.6.0 +0 -0
  57. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_infer_onnx_runtime.so.2.6.0 +0 -0
  58. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_infer_torch.so.2.6.0 +0 -0
  59. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_infer_utils.so.2.6.0 +0 -0
  60. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_logger.so.2.6.0 +0 -0
  61. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_aja.so.2.6.0 +0 -0
  62. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_async_ping_rx.so.2.6.0 +0 -0
  63. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_async_ping_tx.so.2.6.0 +0 -0
  64. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_bayer_demosaic.so.2.6.0 +0 -0
  65. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_format_converter.so.2.6.0 +0 -0
  66. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_gxf_codelet.so.2.6.0 +0 -0
  67. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_holoviz.so.2.6.0 +0 -0
  68. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_inference.so.2.6.0 +0 -0
  69. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_inference_processor.so.2.6.0 +0 -0
  70. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_ping_rx.so.2.6.0 +0 -0
  71. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_ping_tensor_rx.so.2.6.0 +0 -0
  72. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_ping_tensor_tx.so.2.6.0 +0 -0
  73. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_ping_tx.so.2.6.0 +0 -0
  74. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_segmentation_postprocessor.so.2.6.0 +0 -0
  75. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_v4l2.so.2.6.0 +0 -0
  76. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_video_stream_recorder.so.2.6.0 +0 -0
  77. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_op_video_stream_replayer.so.2.6.0 +0 -0
  78. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_profiler.so.2.6.0 +0 -0
  79. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_spdlog_logger.so.2.6.0 +0 -0
  80. holoscan-2.6.0.data/purelib/holoscan/lib/libholoscan_viz.so.2.6.0 +0 -0
  81. holoscan-2.6.0.data/purelib/holoscan/lib/libucm.so.0.0.0 +0 -0
  82. holoscan-2.6.0.data/purelib/holoscan/lib/libucp.so.0.0.0 +0 -0
  83. holoscan-2.6.0.data/purelib/holoscan/lib/libucs.so.0.0.0 +0 -0
  84. holoscan-2.6.0.data/purelib/holoscan/lib/libucs_signal.so.0.0.0 +0 -0
  85. holoscan-2.6.0.data/purelib/holoscan/lib/libuct.so.0.0.0 +0 -0
  86. holoscan-2.6.0.data/purelib/holoscan/lib/libyaml-cpp.so.0.7.0 +0 -0
  87. holoscan-2.6.0.data/purelib/holoscan/lib/ucx/libucm_cuda.so.0.0.0 +0 -0
  88. holoscan-2.6.0.data/purelib/holoscan/lib/ucx/libucs_fuse.so.0.0.0 +0 -0
  89. holoscan-2.6.0.data/purelib/holoscan/lib/ucx/libuct_cma.so.0.0.0 +0 -0
  90. holoscan-2.6.0.data/purelib/holoscan/lib/ucx/libuct_cuda.so.0.0.0 +0 -0
  91. holoscan-2.6.0.data/purelib/holoscan/lib/ucx/libuct_cuda_gdrcopy.so.0.0.0 +0 -0
  92. holoscan-2.6.0.data/purelib/holoscan/lib/ucx/libuct_ib.so.0.0.0 +0 -0
  93. holoscan-2.6.0.data/purelib/holoscan/lib/ucx/libuct_rdmacm.so.0.0.0 +0 -0
  94. holoscan-2.6.0.data/purelib/holoscan/lib/ucx/libuct_xpmem.so.0.0.0 +0 -0
  95. holoscan-2.6.0.data/purelib/holoscan/lib/ucx/libucx_perftest_cuda.so.0.0.0 +0 -0
  96. holoscan-2.6.0.data/purelib/holoscan/logger/__init__.py +37 -0
  97. holoscan-2.6.0.data/purelib/holoscan/network_contexts/__init__.py +28 -0
  98. holoscan-2.6.0.data/purelib/holoscan/operators/__init__.py +97 -0
  99. holoscan-2.6.0.data/purelib/holoscan/operators/aja_source/__init__.py +22 -0
  100. holoscan-2.6.0.data/purelib/holoscan/operators/bayer_demosaic/__init__.py +24 -0
  101. holoscan-2.6.0.data/purelib/holoscan/operators/format_converter/__init__.py +23 -0
  102. holoscan-2.6.0.data/purelib/holoscan/operators/gxf_codelet/__init__.py +67 -0
  103. holoscan-2.6.0.data/purelib/holoscan/operators/holoviz/__init__.py +424 -0
  104. holoscan-2.6.0.data/purelib/holoscan/operators/inference/__init__.py +23 -0
  105. holoscan-2.6.0.data/purelib/holoscan/operators/inference_processor/__init__.py +23 -0
  106. holoscan-2.6.0.data/purelib/holoscan/operators/ping_rx/__init__.py +45 -0
  107. holoscan-2.6.0.data/purelib/holoscan/operators/ping_tensor_rx/__init__.py +22 -0
  108. holoscan-2.6.0.data/purelib/holoscan/operators/ping_tensor_tx/__init__.py +22 -0
  109. holoscan-2.6.0.data/purelib/holoscan/operators/ping_tx/__init__.py +46 -0
  110. holoscan-2.6.0.data/purelib/holoscan/operators/segmentation_postprocessor/__init__.py +23 -0
  111. holoscan-2.6.0.data/purelib/holoscan/operators/v4l2_video_capture/__init__.py +23 -0
  112. holoscan-2.6.0.data/purelib/holoscan/operators/video_stream_recorder/__init__.py +22 -0
  113. holoscan-2.6.0.data/purelib/holoscan/operators/video_stream_replayer/__init__.py +22 -0
  114. holoscan-2.6.0.data/purelib/holoscan/resources/__init__.py +147 -0
  115. holoscan-2.6.0.data/purelib/holoscan/schedulers/__init__.py +32 -0
  116. holoscan-2.6.0.data/purelib/holoscan-2.6.0.pth +1 -0
  117. holoscan-2.6.0.dist-info/LICENSE.txt +202 -0
  118. holoscan-2.6.0.dist-info/METADATA +125 -0
  119. holoscan-2.6.0.dist-info/NOTICE.txt +174 -0
  120. holoscan-2.6.0.dist-info/NVIDIA-AI-PRODUCT-EULA.txt +243 -0
  121. holoscan-2.6.0.dist-info/RECORD +126 -0
  122. holoscan-2.6.0.dist-info/WHEEL +5 -0
  123. holoscan-2.6.0.dist-info/axle.lck +0 -0
  124. holoscan-2.6.0.dist-info/entry_points.txt +3 -0
  125. holoscan-2.6.0.dist-info/symlinks.txt +82 -0
  126. holoscan-2.6.0.dist-info/top_level.txt +3 -0
@@ -0,0 +1,402 @@
1
+ """
2
+ SPDX-FileCopyrightText: Copyright (c) 2023-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3
+ SPDX-License-Identifier: Apache-2.0
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License");
6
+ you may not use this file except in compliance with the License.
7
+ You may obtain a copy of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS,
13
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ See the License for the specific language governing permissions and
15
+ limitations under the License.
16
+ """ # noqa: E501
17
+
18
+ import logging
19
+ from argparse import Namespace
20
+ from pathlib import Path
21
+ from typing import Optional, Union
22
+
23
+ from ..common.artifact_sources import ArtifactSources
24
+ from ..common.constants import Constants
25
+ from ..common.dockerutils import image_exists
26
+ from ..common.enum_types import ApplicationType, SdkType
27
+ from ..common.exceptions import IncompatiblePlatformConfigurationError, InvalidSdkError
28
+ from ..common.sdk_utils import detect_sdk, detect_sdk_version
29
+ from .parameters import PlatformParameters
30
+
31
+
32
+ class Platform:
33
+ def __init__(self, artifact_sources: ArtifactSources) -> None:
34
+ """
35
+ Args:
36
+ args (Namespace): Input arguments for Packager from CLI
37
+ """
38
+ self._logger = logging.getLogger("packager")
39
+ self._artifact_sources = artifact_sources
40
+
41
+ def configure_platforms(
42
+ self,
43
+ args: Namespace,
44
+ temp_dir: str,
45
+ version: str,
46
+ application_type: ApplicationType,
47
+ ) -> tuple[SdkType, str, str, list[PlatformParameters]]:
48
+ """Configures a list of platforms that need to be built.
49
+ 1. Detect the SDK to use
50
+ 2. Detect the version of the SDK to use
51
+ 3. Ensure user provided arguments are valid and do not conflict
52
+ 4. Builds a list of platforms to be built where each platform includes the following:
53
+ a. SDK distribution file(s) to use
54
+ b. Base image to use
55
+ c. Build image to use if application type is C++
56
+
57
+ Args:
58
+ args (Namespace): user provided arguments
59
+ temp_dir (str): temporary path for storing downloaded artifacts
60
+ version (str): application version
61
+ application_type (ApplicationType): application type
62
+
63
+ Returns:
64
+ Tuple[SdkType, str, str, List[PlatformParameters]]: A tuple contains SDK, Holoscan SDK
65
+ version, MONAI Deploy App SDK version and list of platforms to be built
66
+ """
67
+ sdk = detect_sdk(args.sdk)
68
+ holoscan_sdk_version, monai_deploy_app_sdk_version = detect_sdk_version(
69
+ sdk, self._artifact_sources, args.sdk_version
70
+ )
71
+
72
+ self._validate_platform_options(args, sdk)
73
+
74
+ platforms = []
75
+ for platform in args.platform:
76
+ platform_config = args.platform_config
77
+
78
+ platform_parameters = PlatformParameters(platform, platform_config, args.tag, version)
79
+
80
+ (
81
+ platform_parameters.custom_base_image,
82
+ platform_parameters.base_image,
83
+ ) = self._find_base_image(platform_parameters, holoscan_sdk_version, args.base_image)
84
+
85
+ platform_parameters.build_image = self._find_build_image(
86
+ platform_parameters, holoscan_sdk_version, application_type, args.build_image
87
+ )
88
+
89
+ (
90
+ (
91
+ platform_parameters.custom_holoscan_sdk,
92
+ platform_parameters.holoscan_sdk_file,
93
+ ),
94
+ (
95
+ platform_parameters.custom_monai_deploy_sdk,
96
+ platform_parameters.monai_deploy_sdk_file,
97
+ ),
98
+ ) = self._select_sdk_file(
99
+ platform_parameters,
100
+ temp_dir,
101
+ sdk,
102
+ holoscan_sdk_version,
103
+ monai_deploy_app_sdk_version,
104
+ application_type,
105
+ args.holoscan_sdk_file,
106
+ args.monai_deploy_sdk_file,
107
+ )
108
+
109
+ if sdk is SdkType.Holoscan:
110
+ platform_parameters.health_probe = self._artifact_sources.health_probe(
111
+ holoscan_sdk_version
112
+ )[platform_parameters.platform_arch.value]
113
+
114
+ platforms.append(platform_parameters)
115
+
116
+ return (sdk, holoscan_sdk_version, monai_deploy_app_sdk_version, platforms)
117
+
118
+ def _validate_platform_options(self, args: Namespace, sdk: SdkType):
119
+ """Validates user requests.
120
+ - Packager accepts a single SDK distribution file, if user requests to build x64 and arm64
121
+ at the same time, raise exception
122
+ - If Packager was called using 'holoscan' command while user provides a MONAI Deploy APP
123
+ SDK file, raise exception
124
+
125
+ Args:
126
+ args (Namespace): user provided arguments
127
+ sdk (SdkType): SDK type
128
+
129
+ Raises:
130
+ IncompatiblePlatformConfigurationError: when validation fails
131
+ """
132
+ if (args.holoscan_sdk_file is not None or args.monai_deploy_sdk_file is not None) and len(
133
+ args.platform
134
+ ) > 1:
135
+ raise IncompatiblePlatformConfigurationError(
136
+ "Validation error: '--sdk-file' cannot be used with multiple platforms."
137
+ )
138
+ if sdk == SdkType.Holoscan and args.monai_deploy_sdk_file is not None:
139
+ raise IncompatiblePlatformConfigurationError(
140
+ "--monai-deploy-sdk-file was used. Did you mean to use "
141
+ "'monai-deploy package' command instead?"
142
+ )
143
+
144
+ def _find_base_image(
145
+ self,
146
+ platform_parameters: PlatformParameters,
147
+ sdk_version: str,
148
+ base_image: Optional[str] = None,
149
+ ) -> tuple[bool, str]:
150
+ """
151
+ Ensure user provided base image exists in Docker or locate the base image to use based on
152
+ request platform.
153
+
154
+ Args:
155
+ platform_parameters (PlatformParameters): target platform parameters
156
+ sdk_version (str): SDK version
157
+ base_image (Optional[str]): user provided base image
158
+
159
+ Returns:
160
+ (Tuple(bool, str)): bool: True if using user provided image.
161
+ str: base image for building the image based on the given
162
+ platform and SDK version.
163
+ """
164
+ if base_image is not None:
165
+ if image_exists(base_image):
166
+ return (True, base_image)
167
+ else:
168
+ raise InvalidSdkError(f"Specified base image cannot be found: {base_image}")
169
+
170
+ try:
171
+ return (
172
+ False,
173
+ self._artifact_sources.base_image(sdk_version)[
174
+ platform_parameters.platform_config.value
175
+ ],
176
+ )
177
+ except Exception as ex:
178
+ raise IncompatiblePlatformConfigurationError(
179
+ f"""No base image found for the selected configuration:
180
+ Platform: {platform_parameters.platform}
181
+ Configuration: {platform_parameters.platform_config}
182
+ Version: {sdk_version}"""
183
+ ) from ex
184
+
185
+ def _find_build_image(
186
+ self,
187
+ platform_parameters: PlatformParameters,
188
+ sdk_version: str,
189
+ application_type: ApplicationType,
190
+ build_image: Optional[str] = None,
191
+ ) -> Optional[str]:
192
+ """
193
+ Ensure user provided build image exists or locate the build image to use based on the
194
+ requested platform.
195
+
196
+ Args:
197
+ platform_parameters (PlatformParameters): target platform parameters
198
+ sdk_version (str): SDK version
199
+ application_type (ApplicationType): application type
200
+ build_image (Optional[str]): user provided build image
201
+
202
+ Returns:
203
+ (str): build image for building the image based on the given platform and SDK version.
204
+ """
205
+ if build_image is not None:
206
+ if image_exists(build_image):
207
+ return build_image
208
+ else:
209
+ raise InvalidSdkError(f"Specified build image cannot be found: {build_image}")
210
+
211
+ if application_type == ApplicationType.CppCMake:
212
+ try:
213
+ return self._artifact_sources.build_images(sdk_version)[
214
+ platform_parameters.platform_config.value
215
+ ][platform_parameters.platform.value]
216
+ except Exception as ex:
217
+ raise IncompatiblePlatformConfigurationError(
218
+ f"No build image found for the selected configuration:"
219
+ f"\n Platform: {platform_parameters.platform.value}"
220
+ f"\n Configuration: {platform_parameters.platform_config.value}"
221
+ f"\n Version: {sdk_version}"
222
+ ) from ex
223
+ else:
224
+ return None
225
+
226
+ def _select_sdk_file(
227
+ self,
228
+ platform_parameters: PlatformParameters,
229
+ temp_dir: str,
230
+ sdk: SdkType,
231
+ holoscan_sdk_version: str,
232
+ monai_deploy_app_sdk_version: Optional[str],
233
+ application_type: ApplicationType,
234
+ holoscan_sdk_file: Optional[Path] = None,
235
+ monai_deploy_sdk_file: Optional[Path] = None,
236
+ ) -> tuple[
237
+ tuple[bool, Union[Path, str]],
238
+ tuple[Union[Optional[Path], Optional[str]], Union[Optional[Path], Optional[str]]],
239
+ ]:
240
+ """
241
+ Detects the SDK distributable to use based on internal mapping or user input.
242
+
243
+ - C++ & binary applications, attempt to download the SDK file.
244
+ - Python application, use Holoscan or MONAI Deploy App SDK PyPI package.
245
+
246
+ Args:
247
+ platform_parameters (PlatformParameters): target platform parameters
248
+ temp_dir (str): temporary location for storing downloaded files.
249
+ sdk (SdkType): SDK to use
250
+ holoscan_sdk_version (str): Holoscan SDK version
251
+ monai_deploy_app_sdk_version (Optional[str]): MONAI Deploy SDK version
252
+ application_type (ApplicationType): application type
253
+ holoscan_sdk_file (Optional[Path]): path to the user specified Holoscan SDK file
254
+ monai_deploy_sdk_file (Optional[Path]): path to the user specified MONAI Deploy
255
+ App SDK file
256
+
257
+ Returns:
258
+ (Tuple[Union[Path, str], Union[Path, str, None]]): A tuple where the first value
259
+ contains Holoscan SDK and the second value contains MONAI Deploy App SDK.
260
+
261
+ Raises:
262
+ InvalidSdkError: when user specified SDK file does not pass validation.
263
+ """
264
+ if sdk == SdkType.Holoscan:
265
+ return (
266
+ self._get_holoscan_sdk(
267
+ platform_parameters,
268
+ temp_dir,
269
+ SdkType.Holoscan,
270
+ holoscan_sdk_version,
271
+ application_type,
272
+ holoscan_sdk_file,
273
+ ),
274
+ (None, None),
275
+ )
276
+ elif sdk == SdkType.MonaiDeploy:
277
+ if monai_deploy_app_sdk_version is None:
278
+ raise InvalidSdkError("MONAI Deploy App SDK version missing")
279
+ return (
280
+ self._get_holoscan_sdk(
281
+ platform_parameters,
282
+ temp_dir,
283
+ SdkType.Holoscan,
284
+ holoscan_sdk_version,
285
+ application_type,
286
+ holoscan_sdk_file,
287
+ ),
288
+ self._get_monai_deploy_sdk(monai_deploy_app_sdk_version, monai_deploy_sdk_file),
289
+ )
290
+ return (None, None)
291
+
292
+ def _get_holoscan_sdk(
293
+ self,
294
+ platform_parameters: PlatformParameters,
295
+ temp_dir: str,
296
+ sdk: SdkType,
297
+ sdk_version: str,
298
+ application_type: ApplicationType,
299
+ sdk_file: Optional[Path] = None,
300
+ ) -> tuple[bool, Union[Path, str]]:
301
+ """
302
+ Validates Holoscan SDK redistributable file if specified.
303
+ Otherwise, attempt to download the SDK file from internet.
304
+
305
+ Args:
306
+ platform_parameters (PlatformParameters): Platform parameters
307
+ temp_dir (str): Temporary location for storing downloaded distribution files.
308
+ sdk (SdkType): SDK for building the application
309
+ sdk_version (str): SDK version. Defaults to None.
310
+ application_type (ApplicationType): application type
311
+ sdk_file (Optional[Path], optional): SDK file from user input. Defaults to None.
312
+
313
+ Raises:
314
+ InvalidSdkError: when an invalid SDK file is provided or unable to find matching SDK
315
+ file.
316
+
317
+ Returns:
318
+ Tuple[bool, Union[Path, str]]:
319
+ bool: True when user provides SDk file. Otherwise, False.
320
+ Union[Path, str]: User provided SDK file path or package version.
321
+ """
322
+ assert sdk is SdkType.Holoscan
323
+
324
+ if sdk_file is not None:
325
+ if application_type in [
326
+ ApplicationType.PythonModule,
327
+ ApplicationType.PythonFile,
328
+ ]:
329
+ if sdk_file.suffix not in Constants.PYPI_FILE_EXTENSIONS:
330
+ raise InvalidSdkError(
331
+ "Invalid SDK file format, must be a PyPI wheel file with .whl file "
332
+ "extension."
333
+ )
334
+ return (True, sdk_file)
335
+ elif application_type in [
336
+ ApplicationType.CppCMake,
337
+ ApplicationType.Binary,
338
+ ]:
339
+ if sdk_file.suffix != Constants.DEBIAN_FILE_EXTENSION:
340
+ raise InvalidSdkError(
341
+ "Invalid SDK file format, must be a Debian package file with .deb "
342
+ "file extension."
343
+ )
344
+ return (True, sdk_file)
345
+
346
+ raise InvalidSdkError(f"Unknown application type: {application_type.value}")
347
+ else:
348
+ if application_type in [
349
+ ApplicationType.PythonModule,
350
+ ApplicationType.PythonFile,
351
+ ]:
352
+ wheel_package_version = self._artifact_sources.wheel_package_version(sdk_version)
353
+
354
+ if wheel_package_version is None:
355
+ raise InvalidSdkError(
356
+ "Unable to locate matching Holoscan SDK PyPI package with "
357
+ f"version {sdk_version}."
358
+ )
359
+
360
+ return (False, wheel_package_version)
361
+ elif application_type in [
362
+ ApplicationType.CppCMake,
363
+ ApplicationType.Binary,
364
+ ]:
365
+ debian_package_version = self._artifact_sources.debian_package_version(sdk_version)
366
+
367
+ if debian_package_version is None:
368
+ raise InvalidSdkError(
369
+ "Unable to locate matching Holoscan SDK Debian package with "
370
+ f"version {sdk_version}."
371
+ )
372
+
373
+ return (False, debian_package_version)
374
+
375
+ raise InvalidSdkError(f"Unknown application type: {application_type.value}")
376
+
377
+ def _get_monai_deploy_sdk(
378
+ self, monai_deploy_app_sdk_version: Optional[str], sdk_file: Optional[Path] = None
379
+ ) -> tuple[bool, Union[Optional[Path], Optional[str]]]:
380
+ """
381
+ Validates MONAI Deploy SDK redistributable file if specified.
382
+ Otherwise, Docker build stage will install the SDK from PyPI.
383
+
384
+ Args:
385
+ sdk_file (Optional[Path], optional): SDK file from user input. Defaults to None.
386
+ monai_deploy_app_sdk_version: (Optional[str]): MONAI Deploy App SDK version
387
+ Raises:
388
+ InvalidSdkError: when an invalid SDK file is provided or unable to find matching SDK
389
+ file.
390
+
391
+ Returns:
392
+ Union[Path, str]: Path to the SDK redistributable file.
393
+ """
394
+
395
+ if sdk_file is not None:
396
+ if sdk_file.suffix not in Constants.PYPI_FILE_EXTENSIONS:
397
+ raise InvalidSdkError(
398
+ "Invalid SDK file format, must be a PyPI wheel file with .whl file extension."
399
+ )
400
+ return (True, sdk_file)
401
+
402
+ return (False, None)