Skip to content

Commit da6bcb4

Browse files
authored
Merge pull request #91 from ecmwf-projects/bugfix-jsons-in-copy
Bugfix: JSONS were not included in the copy
2 parents bb62747 + 64e88d3 commit da6bcb4

File tree

2 files changed

+19
-14
lines changed

2 files changed

+19
-14
lines changed

cdsobs/cli/_copy_dataset.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ def copy_inside(
159159
if dry_run:
160160
logger.info(f"Would copy {len(entries)} with assets: {assets}")
161161
else:
162-
new_assets = s3_copy(init_s3client, entries, dest_dataset)
162+
new_assets = s3_copy(init_s3client, assets, dest_dataset)
163163
try:
164164
catalogue_copy(init_session, entries, init_s3client, dest_dataset)
165165
except (Exception, KeyboardInterrupt):
@@ -251,23 +251,24 @@ def copy_outside(
251251
dest_config,
252252
dest_dataset,
253253
entries,
254+
assets,
254255
init_config,
255256
init_s3client,
256257
init_session,
257258
)
258259

259260

260261
def _copy_outside_logic(
261-
dest_config, dest_dataset, entries, init_config, init_s3client, init_session
262+
dest_config, dest_dataset, entries, assets, init_config, init_s3client, init_session
262263
):
263264
if init_config.s3config == dest_config.s3config:
264265
# namespace may be different, so we need another s3 client here
265266
dest_s3client = S3Client.from_config(dest_config.s3config)
266-
new_assets = s3_copy(dest_s3client, entries, dest_dataset)
267+
new_assets = s3_copy(dest_s3client, assets, dest_dataset)
267268
else:
268269
# get new destination client as current client
269270
dest_s3client = S3Client.from_config(dest_config.s3config)
270-
new_assets = s3_export(init_s3client, dest_s3client, entries, dest_dataset)
271+
new_assets = s3_export(init_s3client, dest_s3client, assets, dest_dataset)
271272
try:
272273
if init_config.catalogue_db == dest_config.catalogue_db:
273274
catalogue_copy(init_session, entries, dest_s3client, dest_dataset)
@@ -321,12 +322,12 @@ def catalogue_copy(
321322
catalogue_repo.create(new_schema)
322323

323324

324-
def s3_copy(s3client: S3Client, entries, dest_dataset):
325+
def s3_copy(s3client: S3Client, assets: list[str], dest_dataset: str) -> list[str]:
325326
"""Copy into another bucket."""
326327
new_assets = []
327328
try:
328-
for entry in entries:
329-
new_asset = copy_asset(dest_dataset, entry, s3client)
329+
for asset in assets:
330+
new_asset = copy_asset(dest_dataset, asset, s3client)
330331
new_assets.append(new_asset)
331332
except (Exception, KeyboardInterrupt):
332333
s3_rollback(s3client, new_assets)
@@ -337,8 +338,7 @@ def s3_copy(s3client: S3Client, entries, dest_dataset):
337338
@retry(
338339
wait=wait_random_exponential(multiplier=0.5, max=60), stop=stop_after_attempt(10)
339340
)
340-
def copy_asset(dest_dataset, entry, s3client):
341-
source_asset = entry.asset
341+
def copy_asset(dest_dataset: str, source_asset: str, s3client) -> str:
342342
source_bucket, name = source_asset.split("/")
343343
dest_bucket = s3client.get_bucket_name(dest_dataset)
344344
s3client.create_directory(dest_bucket)
@@ -353,9 +353,14 @@ def s3_rollback(s3_client, assets):
353353
s3_client.delete_file(bucket, name)
354354

355355

356-
def s3_export(init_s3client: S3Client, dest_s3client: S3Client, entries, dest_dataset):
356+
def s3_export(
357+
init_s3client: S3Client,
358+
dest_s3client: S3Client,
359+
assets: list[str],
360+
dest_dataset: str,
361+
) -> list[str]:
357362
"""Download from one S3 and upload to another."""
358-
object_urls = [init_s3client.get_url_from_asset(e.asset) for e in entries]
363+
object_urls = [init_s3client.get_url_from_asset(asset) for asset in assets]
359364
new_assets = []
360365
try:
361366
dest_bucket = dest_s3client.get_bucket_name(dest_dataset)

tests/cli/test_copy_delete_dataset.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def test_copy_delete_dataset_inside(test_repository, test_config):
4444
with get_session(test_config.catalogue_db) as test_session:
4545
assert len(CatalogueRepository(test_session).get_by_dataset("test")) == 2
4646
dest_bucket = test_repository.s3_client.get_bucket_name("test")
47-
assert len(list(test_repository.s3_client.list_directory_objects(dest_bucket))) == 2
47+
assert len(list(test_repository.s3_client.list_directory_objects(dest_bucket))) == 5
4848
# Copy again to check that existing entries are not copied
4949
result = runner.invoke(
5050
app,
@@ -55,7 +55,7 @@ def test_copy_delete_dataset_inside(test_repository, test_config):
5555
with get_session(test_config.catalogue_db) as test_session:
5656
assert len(CatalogueRepository(test_session).get_by_dataset("test")) == 2
5757
dest_bucket = test_repository.s3_client.get_bucket_name("test")
58-
assert len(list(test_repository.s3_client.list_directory_objects(dest_bucket))) == 2
58+
assert len(list(test_repository.s3_client.list_directory_objects(dest_bucket))) == 5
5959
# Test delete, with dry run and without
6060
delete_invoke_params = [
6161
"delete-dataset",
@@ -89,7 +89,7 @@ def test_copy_delete_dataset_inside(test_repository, test_config):
8989
assert result.exit_code == 0
9090
with get_session(test_config.catalogue_db) as test_session:
9191
assert len(CatalogueRepository(test_session).get_by_dataset("test")) == 1
92-
assert len(list(test_repository.s3_client.list_directory_objects(dest_bucket))) == 1
92+
assert len(list(test_repository.s3_client.list_directory_objects(dest_bucket))) == 4
9393
# Delete all
9494
delete_all_invoke_params = [
9595
"delete-dataset",

0 commit comments

Comments
 (0)