instance-repo 1.3.5.dev2__tar.gz → 1.3.5.dev4__tar.gz
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.
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/PKG-INFO +1 -1
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/__init__.py +1 -1
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/instances.py +4 -2
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/store/oss.py +1 -1
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/transport.py +20 -7
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo.egg-info/PKG-INFO +1 -1
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/pyproject.toml +1 -1
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/README.md +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/_routing.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/_site_defaults.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/artifacts.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/bootstrap.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/cache.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/cli.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/__init__.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/benchmarks.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/config.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/datasets.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/images.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/reports.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/scaffold.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/splits.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/versions.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/workflows.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/concurrency.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/content.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/endpoints.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/errors.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/image.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/layout.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/loader.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/models.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/paths.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/release.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/repo.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/retry.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/store/__init__.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/store/acr.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/store/base.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/store/oss_discovery.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/store/registry.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/tasktoml.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/validate.py +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo.egg-info/SOURCES.txt +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo.egg-info/dependency_links.txt +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo.egg-info/entry_points.txt +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo.egg-info/requires.txt +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo.egg-info/top_level.txt +0 -0
- {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/setup.cfg +0 -0
|
@@ -769,9 +769,11 @@ class InstancesClient:
|
|
|
769
769
|
put = self._content.put(instance_id, dataset, version, split, tgz,
|
|
770
770
|
meta.to_canonical_json(), overwrite=overwrite,
|
|
771
771
|
layout=lay)
|
|
772
|
+
_tgz_size = tgz.stat().st_size
|
|
772
773
|
skipped = bool(put.get("skipped"))
|
|
773
774
|
_upload_elapsed = _time.monotonic() - _t0 - _pack_elapsed
|
|
774
|
-
|
|
775
|
+
if skipped:
|
|
776
|
+
_tgz_size = 0
|
|
775
777
|
logger.info("push %s: pack=%.1fs (%d bytes) upload=%.1fs skipped=%s",
|
|
776
778
|
instance_id, _pack_elapsed, _tgz_size,
|
|
777
779
|
_upload_elapsed, skipped)
|
|
@@ -1444,7 +1446,7 @@ class InstancesClient:
|
|
|
1444
1446
|
return []
|
|
1445
1447
|
# path 非空时,LIST 直接用子前缀缩小范围
|
|
1446
1448
|
list_prefix = asset_prefix + path_prefix if path_prefix else asset_prefix
|
|
1447
|
-
keys = list_fn(list_prefix)
|
|
1449
|
+
keys = list_fn(list_prefix, list_only=True, dataset=dataset)
|
|
1448
1450
|
if not keys:
|
|
1449
1451
|
return []
|
|
1450
1452
|
for key in keys:
|
|
@@ -629,7 +629,7 @@ class OssContentStore(BaseContentStore):
|
|
|
629
629
|
if oss_prefix and not oss_prefix.endswith("/"):
|
|
630
630
|
oss_prefix += "/"
|
|
631
631
|
|
|
632
|
-
keys = self.list_objects(oss_prefix)
|
|
632
|
+
keys = self.list_objects(oss_prefix, list_only=True, dataset=dataset)
|
|
633
633
|
|
|
634
634
|
def _download_one(key: str) -> Path:
|
|
635
635
|
rel = key[len(oss_prefix):]
|
|
@@ -327,12 +327,13 @@ class Transport:
|
|
|
327
327
|
dataset_id: str | None = None,
|
|
328
328
|
dataset_name: str | None = None,
|
|
329
329
|
permission: str | None = None,
|
|
330
|
-
list_only: bool = False
|
|
330
|
+
list_only: bool = False,
|
|
331
|
+
dataset_source: str | None = None) -> dict:
|
|
331
332
|
"""换 OSS STS 三元组(收窄到 bucket+prefix)。返回归一化小写字段。
|
|
332
333
|
|
|
333
|
-
同 (bucket,prefix,duration,dataset,permission,list_only)
|
|
334
|
-
|
|
335
|
-
|
|
334
|
+
同 (bucket,prefix,duration,dataset,permission,list_only,dataset_source)
|
|
335
|
+
在有效期内复用缓存,把 N 次签发降到 ~1 次。dataset_id / dataset_name
|
|
336
|
+
至少传一个(细粒度授权场景),二者可并存,服务端校验一致性。
|
|
336
337
|
|
|
337
338
|
``permission``(可选,admin/writer/reader)是**权限封顶**:apiserver 取
|
|
338
339
|
``min(调用方真实角色, permission)``,**只能收窄不能提权**——传 admin 不会把
|
|
@@ -343,12 +344,20 @@ class Transport:
|
|
|
343
344
|
``list_only`` 是**发现模式开关**(与 permission 封顶正交):True 时签发仅含
|
|
344
345
|
oss:ListObjects + oss:GetBucketInfo 的令牌,跳过 DatasetRBAC 检查,用于未注册
|
|
345
346
|
dataset 的 OSS 回退目录探测。二者可并存(list_only 分支优先)。
|
|
347
|
+
|
|
348
|
+
``dataset_source``(可选,"db"/"oss")指定数据集管理源:
|
|
349
|
+
- 空/"db"(默认):走 MongoDB 注册 + RBAC 授权流程
|
|
350
|
+
- "oss":纯 OSS 模式,跳过 RBAC,dataset_name/dataset_id 可不填,
|
|
351
|
+
直接按 bucket+prefix 签发 STS
|
|
346
352
|
"""
|
|
347
353
|
# 空串与 None 一律视为"不封顶"(与 Go 的 Permission == "" 语义对齐)。
|
|
348
354
|
if permission and permission not in PERMISSION_VALUES:
|
|
349
355
|
raise SchemaError(
|
|
350
356
|
f"invalid permission '{permission}'; valid values: "
|
|
351
357
|
f"{', '.join(PERMISSION_VALUES)}")
|
|
358
|
+
if dataset_source and dataset_source not in ("db", "oss"):
|
|
359
|
+
raise SchemaError(
|
|
360
|
+
f"invalid dataset_source '{dataset_source}'; valid values: db, oss")
|
|
352
361
|
|
|
353
362
|
def sign() -> dict:
|
|
354
363
|
body: dict[str, Any] = {"resource": "oss",
|
|
@@ -363,6 +372,8 @@ class Transport:
|
|
|
363
372
|
body["permission"] = permission
|
|
364
373
|
if list_only:
|
|
365
374
|
body["list_only"] = True
|
|
375
|
+
if dataset_source:
|
|
376
|
+
body["dataset_source"] = dataset_source
|
|
366
377
|
r = self.post("/apis/v1/credentials", body, idempotent=True)
|
|
367
378
|
return {
|
|
368
379
|
"access_key_id": self._require(r, "OSS_ACCESS_KEY_ID"),
|
|
@@ -376,11 +387,13 @@ class Transport:
|
|
|
376
387
|
}
|
|
377
388
|
|
|
378
389
|
ttl = float(min(duration_seconds or MIN_STS_DURATION, MAX_STS_DURATION))
|
|
379
|
-
# permission
|
|
390
|
+
# permission、list_only、dataset_source 都必须进缓存 key:否则请求 reader 封顶的调用方可能
|
|
380
391
|
# 命中此前那份未封顶(可写)的缓存令牌,权限收窄被静默绕过;list-only 令牌
|
|
381
|
-
#
|
|
392
|
+
# 也可能被普通请求复用(反之亦然),发现模式与读写模式互相污染;
|
|
393
|
+
# oss 模式凭据不能被 db 模式复用(反之亦然)。
|
|
382
394
|
cache_key = ("oss", bucket, prefix, duration_seconds,
|
|
383
|
-
dataset_id, dataset_name, permission or None, list_only
|
|
395
|
+
dataset_id, dataset_name, permission or None, list_only,
|
|
396
|
+
dataset_source or None)
|
|
384
397
|
return self._cached_cred(cache_key, sign, fallback_ttl=ttl)
|
|
385
398
|
|
|
386
399
|
def get_acr_credentials(self, acr_registry_url: str, *,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|