Skip to content

Commit 1cf2641

Browse files
authored
Feature/http download (#1)
* Added some debug logging * Added URL support with basic auth * Removed troubleshooting prints
1 parent 5c02664 commit 1cf2641

File tree

4 files changed

+56
-12
lines changed

4 files changed

+56
-12
lines changed

ecs-files-input.json

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@
9191
"type": "object",
9292
"properties": {
9393
"Url": {
94-
"type": "string"
94+
"$ref": "#/definitions/UrlDef"
9595
},
9696
"Ssm": {
9797
"$ref": "#/definitions/SsmDef"
@@ -104,6 +104,21 @@
104104
}
105105
}
106106
},
107+
"UrlDef": {
108+
"type": "object",
109+
"properties": {
110+
"Url": {
111+
"type": "string",
112+
"format": "uri"
113+
},
114+
"Username": {
115+
"type": "string"
116+
},
117+
"Password": {
118+
"type": "string"
119+
}
120+
}
121+
},
107122
"SsmDef": {
108123
"type": "object",
109124
"properties": {

ecs_files_composer/cli.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@
55
"""Console script for ecs_files_composer."""
66
import argparse
77
import sys
8-
from os import environ, path
9-
10-
import yaml
8+
from os import environ
119

10+
from ecs_files_composer.common import LOG
1211
from ecs_files_composer.ecs_files_composer import init_config, start_jobs
1312

1413

@@ -37,8 +36,8 @@ def main():
3736
if not (args.env_var or args.ssm_config or args.s3_config or args.file_path) and environ.get(
3837
"ECS_CONFIG_CONTENT", None
3938
):
39+
LOG.info("Using default env variable ECS_CONFIG_CONTENT")
4040
config = init_config(env_var="ECS_CONFIG_CONTENT")
41-
print("Config from default ECS_CONFIG_CONTENT", config)
4241
elif args.env_var:
4342
config = init_config(env_var=args.env_var)
4443
elif args.file_path:

ecs_files_composer/ecs_files_composer.py

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from typing import Any
1414

1515
import boto3
16+
import requests
1617
import yaml
1718
from boto3 import session
1819
from botocore.exceptions import ClientError
@@ -146,7 +147,9 @@ def get_content(self, secret):
146147
:param input.SecretDef secret:
147148
:return:
148149
"""
149-
params = {"SecretId": expandvars(secret.secret_id)}
150+
secret_id = expandvars(secret.secret_id)
151+
params = {"SecretId": secret_id}
152+
LOG.debug(f"Retrieving secretsmanager://{secret_id}")
150153
if secret.version_id:
151154
params["VersionId"] = secret.version_id
152155
if secret.version_stage:
@@ -194,7 +197,7 @@ def handle_sources(self, iam_override=None):
194197
:return:
195198
"""
196199
if self.source.url:
197-
pass
200+
self.handle_http_content()
198201
elif self.source.ssm:
199202
self.handle_ssm_source(iam_override)
200203
elif self.source.s3:
@@ -217,6 +220,7 @@ def handle_ssm_source(self, iam_override=None):
217220
:return:
218221
"""
219222
parameter_name = expandvars(self.source.ssm.parameter_name)
223+
LOG.debug(f"Retrieving ssm://{parameter_name}")
220224
if self.source.ssm.iam_override:
221225
fetcher = SsmFetcher(iam_config_object=self.source.ssm.iam_override)
222226
else:
@@ -232,6 +236,7 @@ def handle_s3_source(self, iam_override=None):
232236
"""
233237
bucket_name = expandvars(self.source.s3.bucket_name)
234238
key = expandvars(self.source.s3.key)
239+
LOG.debug(f"Retrieving s3://{bucket_name}/{key}")
235240
if self.source.s3.iam_override:
236241
fetcher = S3Fetcher(iam_config_object=self.source.s3.iam_override)
237242
else:
@@ -251,10 +256,26 @@ def handle_secret_source(self, iam_override=None):
251256
fetcher = SecretFetcher(iam_config_object=iam_override)
252257
self.content = fetcher.get_content(self.source.secret)
253258

259+
def handle_http_content(self):
260+
"""
261+
Fetches the content from a provided URI
262+
263+
"""
264+
if not self.source.url.username or not self.source.url.password:
265+
req = requests.get(self.source.url.url)
266+
else:
267+
req = requests.get(self.source.url.url, auth=(self.source.url.username, self.source.url.password))
268+
try:
269+
req.raise_for_status()
270+
self.write_content(as_bytes=True, bytes_content=req.content)
271+
except requests.exceptions.HTTPError as e:
272+
LOG.error(e)
273+
raise
274+
254275
def set_unix_settings(self):
255276
"""
256277
Applies UNIX settings to given file
257-
:return:
278+
258279
"""
259280
cmd = ["chmod", self.mode, self.path]
260281
try:
@@ -277,7 +298,7 @@ def set_unix_settings(self):
277298
else:
278299
raise
279300

280-
def write_content(self, decode=False):
301+
def write_content(self, decode=False, as_bytes=False, bytes_content=None):
281302
if isinstance(self.content, str):
282303
if decode and self.encoding == input.Encoding["base64"]:
283304
with open(self.path, "wb") as file_fd:
@@ -288,6 +309,9 @@ def write_content(self, decode=False):
288309
elif isinstance(self.content, StreamingBody):
289310
with open(self.path, "wb") as file_fd:
290311
file_fd.write(self.content.read())
312+
elif as_bytes and bytes_content:
313+
with open(self.path, "wb") as file_fd:
314+
file_fd.write(bytes_content)
291315

292316

293317
def init_config(

ecs_files_composer/input.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
# generated by datamodel-codegen:
22
# filename: ecs-files-input.json
3-
# timestamp: 2021-07-15T13:26:54+00:00
3+
# timestamp: 2021-07-16T13:56:02+00:00
44

55
from __future__ import annotations
66

77
from enum import Enum
88
from typing import Any, Dict, List, Optional
99

10-
from pydantic import BaseModel, Field
10+
from pydantic import AnyUrl, BaseModel, Field
1111

1212

1313
class Encoding(Enum):
@@ -20,6 +20,12 @@ class Context(Enum):
2020
jinja2 = 'jinja2'
2121

2222

23+
class UrlDef(BaseModel):
24+
url: Optional[AnyUrl] = Field(None, alias='Url')
25+
username: Optional[str] = Field(None, alias='Username')
26+
password: Optional[str] = Field(None, alias='Password')
27+
28+
2329
class IamOverrideDef(BaseModel):
2430
role_arn: Optional[str] = Field(None, alias='RoleArn')
2531
session_name: Optional[str] = Field(
@@ -71,7 +77,7 @@ class S3Def(BaseModel):
7177

7278

7379
class SourceDef(BaseModel):
74-
url: Optional[str] = Field(None, alias='Url')
80+
url: Optional[UrlDef] = Field(None, alias='Url')
7581
ssm: Optional[SsmDef] = Field(None, alias='Ssm')
7682
s3: Optional[S3Def] = Field(None, alias='S3')
7783
secret: Optional[SecretDef] = Field(None, alias='Secret')

0 commit comments

Comments
 (0)