@orcabus/platform-cdk-constructs 0.0.102 → 0.0.104

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.
package/.jsii CHANGED
@@ -7163,6 +7163,6 @@
7163
7163
  "symbolId": "shared-config/slack:SlackAlerts"
7164
7164
  }
7165
7165
  },
7166
- "version": "0.0.102",
7167
- "fingerprint": "Hef5eUEuQANqtuVO8TDAnwhrGFM8+86Cdr6Nu/QQycw="
7166
+ "version": "0.0.104",
7167
+ "fingerprint": "8AsqEKwEq47IHwU7uXbyWa7zxnJSt8IBwMi+dm3nfvs="
7168
7168
  }
@@ -15,7 +15,7 @@ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
15
15
  const aws_route53_targets_1 = require("aws-cdk-lib/aws-route53-targets");
16
16
  const config_1 = require("./config");
17
17
  class OrcaBusApiGateway extends constructs_1.Construct {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.apigateway.OrcaBusApiGateway", version: "0.0.102" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.apigateway.OrcaBusApiGateway", version: "0.0.104" };
19
19
  /**
20
20
  * The AWS region where the API Gateway is deployed.
21
21
  */
@@ -13,7 +13,7 @@ exports.CROSS_DEPLOYMENT_ARTIFACT_BUCKET_NAME = "orcabus-cross-deployment-codepi
13
13
  exports.CROSS_DEPLOYMENT_ARTIFACT_KMS_ALIAS = "orcabus-cross-deployment-codepipeline-artifact";
14
14
  exports.CROSS_DEPLOYMENT_ARTIFACT_KMS_ARN_SSM_PARAMETER_NAME = "/orcabus/deployment-stack-pipeline/artifact-bucket/kms-key-arn";
15
15
  class CrossDeploymentArtifactBucket extends constructs_1.Construct {
16
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.deploymentPipeline.CrossDeploymentArtifactBucket", version: "0.0.102" };
16
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.deploymentPipeline.CrossDeploymentArtifactBucket", version: "0.0.104" };
17
17
  /**
18
18
  * The S3 bucket used to store artifacts for cross-deployment pipelines.
19
19
  */
@@ -32,7 +32,7 @@ exports.DEFAULT_SYNTH_STEP_PARTIAL_BUILD_SPEC = {
32
32
  * before using this construct.
33
33
  */
34
34
  class DeploymentStackPipeline extends constructs_1.Construct {
35
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.deploymentPipeline.DeploymentStackPipeline", version: "0.0.102" };
35
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.deploymentPipeline.DeploymentStackPipeline", version: "0.0.104" };
36
36
  /**
37
37
  * The code pipeline construct that is created.
38
38
  */
package/dynamodb/index.js CHANGED
@@ -40,7 +40,7 @@ const dynamodb = __importStar(require("aws-cdk-lib/aws-dynamodb"));
40
40
  const aws_cdk_lib_1 = require("aws-cdk-lib");
41
41
  const config_1 = require("./config");
42
42
  class DynamoDbPartitionedConstruct extends constructs_1.Construct {
43
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.dynamodb.DynamoDbPartitionedConstruct", version: "0.0.102" };
43
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.dynamodb.DynamoDbPartitionedConstruct", version: "0.0.104" };
44
44
  table;
45
45
  constructor(scope, id, props) {
46
46
  super(scope, id);
@@ -75,7 +75,7 @@ class DynamoDbPartitionedConstruct extends constructs_1.Construct {
75
75
  }
76
76
  exports.DynamoDbPartitionedConstruct = DynamoDbPartitionedConstruct;
77
77
  class DynamoDbNonPartitionedConstruct extends constructs_1.Construct {
78
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.dynamodb.DynamoDbNonPartitionedConstruct", version: "0.0.102" };
78
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.dynamodb.DynamoDbNonPartitionedConstruct", version: "0.0.104" };
79
79
  table;
80
80
  constructor(scope, id, props) {
81
81
  super(scope, id);
package/ecs/index.js CHANGED
@@ -55,7 +55,7 @@ exports.LAMBDA_ARCHITECTURE_MAP = {
55
55
  ['ARM64']: lambda.Architecture.ARM_64
56
56
  };
57
57
  class EcsFargateTaskConstruct extends constructs_1.Construct {
58
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.ecs.EcsFargateTaskConstruct", version: "0.0.102" };
58
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.ecs.EcsFargateTaskConstruct", version: "0.0.104" };
59
59
  cluster;
60
60
  taskDefinition;
61
61
  taskExecutionRole;
@@ -17,7 +17,7 @@ var SfnEventStatus;
17
17
  SfnEventStatus["ABORTED"] = "ABORTED";
18
18
  })(SfnEventStatus || (exports.SfnEventStatus = SfnEventStatus = {}));
19
19
  class SfnSlackNotification extends constructs_1.Construct {
20
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.eventbridgeRule.SfnSlackNotification", version: "0.0.102" };
20
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.eventbridgeRule.SfnSlackNotification", version: "0.0.104" };
21
21
  rule;
22
22
  constructor(scope, id, props) {
23
23
  super(scope, id);
package/lambda/index.js CHANGED
@@ -57,7 +57,7 @@ function getPythonUvDockerImage() {
57
57
  return aws_cdk_lib_1.DockerImage.fromBuild(path_1.default.join(__dirname, 'build_python'));
58
58
  }
59
59
  class PythonUvFunction extends aws_lambda_python_alpha_1.PythonFunction {
60
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.lambda.PythonUvFunction", version: "0.0.102" };
60
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.lambda.PythonUvFunction", version: "0.0.104" };
61
61
  // Class constructs, to be used for caching the layers
62
62
  // This means that if there are multiple lambdas throughout the stack
63
63
  // They will all use the same layer
@@ -7,7 +7,7 @@ Workflow helpers - a collection of helper functions for the workflow
7
7
  """
8
8
 
9
9
  # Standard library imports
10
- from typing import List
10
+ from typing import List, Optional
11
11
 
12
12
  # Local imports
13
13
  from . import get_fastq_request
@@ -15,12 +15,35 @@ from .globals import FASTQ_ENDPOINT, FASTQ_SET_ENDPOINT
15
15
  from .models import FastqListRowDict
16
16
 
17
17
 
18
- def to_fastq_list_row(fastq_id) -> FastqListRowDict:
18
+ def to_fastq_list_row(
19
+ fastq_id: str,
20
+ bucket: Optional[str] = None,
21
+ key_prefix: Optional[str] = None,
22
+ ) -> FastqListRowDict:
19
23
  return get_fastq_request(
20
- f"{FASTQ_ENDPOINT}/{fastq_id}/toFastqListRow"
24
+ f"{FASTQ_ENDPOINT}/{fastq_id}/toFastqListRow",
25
+ params=dict(filter(
26
+ lambda param_iter_: param_iter_[1] is not None,
27
+ {
28
+ "bucket": bucket,
29
+ "keyPrefix": key_prefix,
30
+ }.items()
31
+ ))
21
32
  )
22
33
 
23
- def to_fastq_list_rows(fastq_set_id: str) -> List[FastqListRowDict]:
34
+
35
+ def to_fastq_list_rows(
36
+ fastq_set_id: str,
37
+ bucket: Optional[str] = None,
38
+ key_prefix: Optional[str] = None,
39
+ ) -> List[FastqListRowDict]:
24
40
  return get_fastq_request(
25
- f"{FASTQ_SET_ENDPOINT}/{fastq_set_id}/toFastqListRows"
41
+ f"{FASTQ_SET_ENDPOINT}/{fastq_set_id}/toFastqListRows",
42
+ params=dict(filter(
43
+ lambda param_iter_: param_iter_[1] is not None,
44
+ {
45
+ "bucket": bucket,
46
+ "keyPrefix": key_prefix,
47
+ }.items()
48
+ ))
26
49
  )
@@ -5,7 +5,7 @@ import json
5
5
  from functools import reduce
6
6
  from operator import concat
7
7
  from pathlib import Path
8
- from typing import List, Dict, Union
8
+ from typing import List, Dict, Union, Optional, Unpack
9
9
  import typing
10
10
  import boto3
11
11
  from datetime import datetime, timedelta, timezone
@@ -14,7 +14,7 @@ from itertools import batched
14
14
 
15
15
  # Local imports
16
16
  from .errors import S3FileNotFoundError, S3DuplicateFileCopyError
17
- from .models import FileObject, StorageClassPriority
17
+ from .models import FileObject, StorageClassPriority, FileQueryParameters
18
18
  from ..utils.miscell import get_bucket_key_pair_from_uri
19
19
  from . import (
20
20
  get_file_manager_request_response_results,
@@ -84,7 +84,10 @@ def get_file_object_from_id(s3_object_id: str) -> FileObject:
84
84
  return FileObject(**response[0])
85
85
 
86
86
 
87
- def get_file_object_from_ingest_id(ingest_id: str, **kwargs) -> FileObject:
87
+ def get_file_object_from_ingest_id(
88
+ ingest_id: str,
89
+ **kwargs: Unpack[FileQueryParameters]
90
+ ) -> FileObject:
88
91
  response = get_file_manager_request_response_results(S3_LIST_ENDPOINT, {
89
92
  "ingestId": ingest_id,
90
93
  **kwargs
@@ -199,8 +202,21 @@ def get_s3_uri_from_s3_object_id(s3_object_id: str) -> str:
199
202
  return f"s3://{file_object['bucket']}/{file_object['key']}"
200
203
 
201
204
 
202
- def get_s3_uri_from_ingest_id(ingest_id: str) -> str:
203
- file_object: FileObject = get_file_object_from_ingest_id(ingest_id)
205
+ def get_s3_uri_from_ingest_id(
206
+ ingest_id: str,
207
+ bucket: Optional[str] = None,
208
+ key_prefix: Optional[str] = None
209
+ ) -> str:
210
+ file_object: FileObject = get_file_object_from_ingest_id(
211
+ ingest_id=ingest_id,
212
+ **dict(filter(
213
+ lambda param_iter_: param_iter_[1] is not None,
214
+ {
215
+ "bucket": bucket,
216
+ "key": f"{key_prefix}*" if key_prefix else None
217
+ }.items()
218
+ ))
219
+ )
204
220
  return f"s3://{file_object['bucket']}/{file_object['key']}"
205
221
 
206
222
 
@@ -2,7 +2,9 @@ from typing import (
2
2
  Optional,
3
3
  TypedDict,
4
4
  Dict,
5
- Literal
5
+ Literal,
6
+ NotRequired,
7
+ Any
6
8
  )
7
9
 
8
10
  """
@@ -49,6 +51,54 @@ StorageClassPriority: Dict[StorageClassType, int] = {
49
51
  "DeepArchive": 6,
50
52
  }
51
53
 
54
+ EventType = Literal[
55
+ "Created",
56
+ "Deleted",
57
+ "Other"
58
+ ]
59
+
60
+ ReasonType = Literal[
61
+ "CreatedPut",
62
+ "CreatedPost",
63
+ "CreatedCopy",
64
+ "CreatedCompleteMultipartUpload",
65
+ "Deleted",
66
+ "DeletedLifecycle",
67
+ "Restored",
68
+ "RestoreExpired",
69
+ "StorageClassChanged",
70
+ "Crawl",
71
+ "Unknown",
72
+ "CrawlRestored"
73
+ ]
74
+
75
+ ArchiveStatusType = Literal[
76
+ "ArchiveAccess",
77
+ "DeepArchiveAccess"
78
+ ]
79
+
80
+
81
+ class FileQueryParameters(TypedDict):
82
+ caseSensitive: NotRequired[bool]
83
+ currentState: NotRequired[bool]
84
+ eventType: NotRequired[EventType]
85
+ bucket: NotRequired[str]
86
+ key: NotRequired[str]
87
+ versionId: NotRequired[str]
88
+ eventTime: NotRequired[str]
89
+ size: NotRequired[int]
90
+ sha256: NotRequired[str]
91
+ lastModifiedDate: NotRequired[str]
92
+ eTag: NotRequired[str]
93
+ storageClass: NotRequired[StorageClassType]
94
+ isDeleteMarker: NotRequired[bool]
95
+ reason: NotRequired[ReasonType]
96
+ archiveStatus: NotRequired[ArchiveStatusType]
97
+ isAccessible: NotRequired[bool]
98
+ ingestId: NotRequired[str]
99
+ attributes: NotRequired[Dict[str, Any]]
100
+
101
+
52
102
  class FileObject(TypedDict):
53
103
  # Identifier
54
104
  s3ObjectId: str
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env python3
2
2
 
3
3
  # Standard imports
4
- from typing import Dict, Optional
4
+ from io import BufferedReader
5
+ from typing import Dict, Optional, Tuple
5
6
 
6
7
  # Local imports
7
8
  from ..utils.requests_helpers import (
@@ -43,11 +44,20 @@ def get_sequence_request_response_results(
43
44
  def sequence_post_request(
44
45
  endpoint: str,
45
46
  json_data: Optional[Dict] = None,
47
+ files: Optional[Dict[str, Tuple[str, BufferedReader, str]]] = None,
46
48
  ) -> Dict:
49
+ """
50
+ Waap POST request with sequence base url
51
+ :param endpoint:
52
+ :param json_data:
53
+ :param files:
54
+ :return:
55
+ """
47
56
  return post_request(
48
57
  get_sequence_url(endpoint),
49
- json_data=json_data
50
- )
58
+ json_data=json_data,
59
+ files=files,
60
+ )
51
61
 
52
62
 
53
63
  from .sequence_helpers import (
@@ -141,15 +141,13 @@ def add_samplesheet(
141
141
  :return: Response from the API containing the updated sequence information.
142
142
  """
143
143
  # Open the sample sheet file
144
- with open(samplesheet_path, 'r') as ss_file:
145
- ss_content = ss_file.read()
146
-
147
- return sequence_post_request(
148
- endpoint=f"{SEQUENCE_RUN_ENDPOINT}/action/add_samplesheet/",
149
- json_data={
150
- "file": ss_content,
151
- "instrument_run_id": instrument_run_id,
152
- "created_by": created_by,
153
- "comment": comment
154
- }
155
- )
144
+ with open(samplesheet_path, 'rb') as file_data:
145
+ return sequence_post_request(
146
+ endpoint=f"{SEQUENCE_RUN_ENDPOINT}/action/add_samplesheet/",
147
+ files={
148
+ "file": ("SampleSheet.csv", file_data, 'text/csv'),
149
+ "instrument_run_id": (None, instrument_run_id),
150
+ "created_by": (None, created_by),
151
+ "comment": (None, comment),
152
+ }
153
+ )
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env python3
2
- import json
3
- from typing import Dict, Optional, List, Union
4
- from urllib.parse import urlunparse, unquote, urlparse, parse_qs
5
2
 
6
3
  # Standard imports
4
+ import json
7
5
  import requests
6
+ from io import BufferedReader
7
+ from typing import Dict, Optional, List, Union, Tuple
8
+ from urllib.parse import urlunparse, unquote, urlparse, parse_qs
8
9
  import logging
9
10
  from copy import deepcopy
10
-
11
11
  from fastapi.encoders import jsonable_encoder
12
12
  from requests import HTTPError
13
13
 
@@ -159,13 +159,15 @@ def patch_request(
159
159
  def post_request(
160
160
  url: str,
161
161
  json_data: Optional[Dict] = None,
162
- params: Optional[Dict] = None
162
+ params: Optional[Dict] = None,
163
+ files: Optional[Dict[str, Tuple[str, BufferedReader, str]]] = None,
163
164
  ) -> Dict:
164
165
  """
165
166
  Run post request against the fastq endpoint
166
167
  :param json_data:
167
168
  :param url:
168
169
  :param params:
170
+ :param files:
169
171
  :return:
170
172
  """
171
173
  # Get authorization header
@@ -173,7 +175,11 @@ def post_request(
173
175
  "Authorization": f"Bearer {get_orcabus_token()}",
174
176
  }
175
177
 
176
- if json_data is not None:
178
+ # Set content type headers
179
+ if files is not None:
180
+ # Let requests set the content type for multipart
181
+ pass
182
+ elif json_data is not None:
177
183
  headers.update({
178
184
  "Content-Type": "application/json"
179
185
  })
@@ -183,7 +189,8 @@ def post_request(
183
189
  url,
184
190
  headers=headers,
185
191
  json=json_data,
186
- params=params
192
+ params=params,
193
+ files=files,
187
194
  )
188
195
 
189
196
  try:
@@ -28,7 +28,8 @@ def list_workflow_runs(
28
28
  :param current_status:
29
29
  :return:
30
30
  """
31
- return get_workflow_request_response_results(
31
+ # Get workflow runs
32
+ workflow_runs = get_workflow_request_response_results(
32
33
  WORKFLOW_RUN_ENDPOINT,
33
34
  params=dict(filter(
34
35
  lambda item: item[1] is not None,
@@ -36,12 +37,21 @@ def list_workflow_runs(
36
37
  "workflow__name": workflow_name,
37
38
  "workflow__version": workflow_version,
38
39
  "workflow__codeVersion": code_version,
39
- "currentState__status": current_status,
40
40
  "analysisRun__orcabusId": analysis_run_id
41
41
  }.items()
42
42
  ))
43
43
  )
44
44
 
45
+ # Check if status is set?
46
+ if current_status is None:
47
+ return workflow_runs
48
+
49
+ # Filter by status
50
+ return list(filter(
51
+ lambda workflow_run_iter_: workflow_run_iter_.get("currentState", {}).get("status") == current_status,
52
+ workflow_runs
53
+ ))
54
+
45
55
 
46
56
  # Deprecated
47
57
  def list_workflow_runs_by_workflow_name(
@@ -13,7 +13,7 @@ const aws_cloudwatch_actions_1 = require("aws-cdk-lib/aws-cloudwatch-actions");
13
13
  * SNS topic.
14
14
  */
15
15
  class MonitoredQueue extends constructs_1.Construct {
16
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.monitoredQueue.MonitoredQueue", version: "0.0.102" };
16
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.monitoredQueue.MonitoredQueue", version: "0.0.104" };
17
17
  queue;
18
18
  deadLetterQueue;
19
19
  alarm;
@@ -7,7 +7,7 @@ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
7
7
  * A construct which represents a named role that a Lambda function can assume.
8
8
  */
9
9
  class NamedLambdaRole extends aws_iam_1.Role {
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.namedLambdaRole.NamedLambdaRole", version: "0.0.102" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.namedLambdaRole.NamedLambdaRole", version: "0.0.104" };
11
11
  constructor(scope, id, props) {
12
12
  super(scope, id, {
13
13
  assumedBy: new aws_iam_1.ServicePrincipal("lambda.amazonaws.com"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orcabus/platform-cdk-constructs",
3
- "version": "0.0.102",
3
+ "version": "0.0.104",
4
4
  "description": "CDK Package for OrcaBus infrastructure.",
5
5
  "main": "index.ts",
6
6
  "types": "index.d.ts",
@@ -15,7 +15,7 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
15
15
  * to the provider framework.
16
16
  */
17
17
  class ProviderFunction extends constructs_1.Construct {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.provider.ProviderFunction", version: "0.0.102" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.provider.ProviderFunction", version: "0.0.104" };
19
19
  _function;
20
20
  _response;
21
21
  constructor(scope, id, props) {
@@ -23,7 +23,7 @@ exports.VPC_LOOKUP_PROPS = {
23
23
  * Helper for looking up the shared OrcaBus VPC.
24
24
  */
25
25
  class OrcaBusVpc {
26
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.sharedConfig.networking.OrcaBusVpc", version: "0.0.102" };
26
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.sharedConfig.networking.OrcaBusVpc", version: "0.0.104" };
27
27
  /**
28
28
  * The shared VPC that is used by OrcaBus.
29
29
  * @param scope
@@ -42,7 +42,7 @@ exports.SHARED_SECURITY_GROUP_NAME = "OrcaBusSharedComputeSecurityGroup";
42
42
  * Helper for looking up the shared compute security group by name.
43
43
  */
44
44
  class OrcaBusSharedComputeSecurityGroup {
45
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.sharedConfig.networking.OrcaBusSharedComputeSecurityGroup", version: "0.0.102" };
45
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.sharedConfig.networking.OrcaBusSharedComputeSecurityGroup", version: "0.0.104" };
46
46
  /**
47
47
  * The shared security group that is used by compute resources to access the database.
48
48
  * @param scope
@@ -11,7 +11,7 @@ exports.SLACK_ALERTS_SNS_TOPIC = "AwsChatBotTopic-alerts";
11
11
  * A helper class to construct the arn for the slack SNS topic.
12
12
  */
13
13
  class SlackAlerts {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.sharedConfig.slack.SlackAlerts", version: "0.0.102" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.sharedConfig.slack.SlackAlerts", version: "0.0.104" };
15
15
  /**
16
16
  * Format the ARN for the slack alerts SNS topic for the current stack.
17
17
  * @param stack