Skip to content

Commit 86543cb

Browse files
committed
it works
1 parent 96c6e73 commit 86543cb

4 files changed

Lines changed: 26 additions & 27 deletions

File tree

pyiceberg/table/encryption.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,22 @@
1616
# under the License.
1717

1818
from typing import Optional
19+
1920
from pydantic import Field
21+
2022
from pyiceberg.typedef import IcebergBaseModel
2123

2224

2325
class EncryptedKey(IcebergBaseModel):
2426
key_id: str = Field(alias="key-id", description="ID of the encryption key")
25-
encrypted_key_metadata: bytes = Field(alias="encrypted-key-metadata", description="Encrypted key and metadata, base64 encoded")
26-
encrypted_by_id: Optional[str] = Field(alias="encrypted-by-id", description="Optional ID of the key used to encrypt or wrap `key-metadata`", default=None)
27-
properties: Optional[dict[str, str]] = Field(alias="properties", description="A string to string map of additional metadata used by the table's encryption scheme", default=None)
27+
encrypted_key_metadata: bytes = Field(
28+
alias="encrypted-key-metadata", description="Encrypted key and metadata, base64 encoded"
29+
)
30+
encrypted_by_id: Optional[str] = Field(
31+
alias="encrypted-by-id", description="Optional ID of the key used to encrypt or wrap `key-metadata`", default=None
32+
)
33+
properties: Optional[dict[str, str]] = Field(
34+
alias="properties",
35+
description="A string to string map of additional metadata used by the table's encryption scheme",
36+
default=None,
37+
)

pyiceberg/table/update/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,17 @@ class UpgradeFormatVersionUpdate(IcebergBaseModel):
8585
action: Literal["upgrade-format-version"] = Field(default="upgrade-format-version")
8686
format_version: int = Field(alias="format-version")
8787

88+
8889
class AddEncryptedKeyUpdate(IcebergBaseModel):
8990
action: Literal["add-encryption-key"] = Field(default="add-encryption-key")
9091
key: EncryptedKey = Field(alias="key")
9192

93+
9294
class RemoveEncryptedKeyUpdate(IcebergBaseModel):
9395
action: Literal["remove-encryption-key"] = Field(default="remove-encryption-key")
9496
key_id: str = Field(alias="key-id")
9597

98+
9699
class AddSchemaUpdate(IcebergBaseModel):
97100
action: Literal["add-schema"] = Field(default="add-schema")
98101
schema_: Schema = Field(alias="schema")
@@ -591,6 +594,7 @@ def _(update: RemoveStatisticsUpdate, base_metadata: TableMetadata, context: _Ta
591594

592595
return base_metadata.model_copy(update={"statistics": statistics})
593596

597+
594598
@_apply_table_update.register(AddEncryptedKeyUpdate)
595599
def _(update: AddEncryptedKeyUpdate, base_metadata: TableMetadata, context: _TableMetadataUpdateContext) -> TableMetadata:
596600
context.add_update(update)
@@ -600,6 +604,7 @@ def _(update: AddEncryptedKeyUpdate, base_metadata: TableMetadata, context: _Tab
600604

601605
return base_metadata.model_copy(update={"encryption_keys": base_metadata.encryption_keys + [update.key]})
602606

607+
603608
def update_table_metadata(
604609
base_metadata: TableMetadata,
605610
updates: Tuple[TableUpdate, ...],

tests/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2341,6 +2341,7 @@ def table_v2(example_table_metadata_v2: Dict[str, Any]) -> Table:
23412341
catalog=NoopCatalog("NoopCatalog"),
23422342
)
23432343

2344+
23442345
@pytest.fixture
23452346
def table_v3(example_table_metadata_v3: Dict[str, Any]) -> Table:
23462347
table_metadata = TableMetadataV3(**example_table_metadata_v3)

tests/table/test_init.py

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
AssertLastAssignedPartitionId,
8080
AssertRefSnapshotId,
8181
AssertTableUUID,
82+
RemoveEncryptedKeyUpdate,
8283
RemovePropertiesUpdate,
8384
RemoveSnapshotRefUpdate,
8485
RemoveSnapshotsUpdate,
@@ -1349,13 +1350,9 @@ def test_remove_statistics_update(table_v2_with_statistics: Table) -> None:
13491350
(RemoveStatisticsUpdate(snapshot_id=123456789),),
13501351
)
13511352

1353+
13521354
def test_add_encryption_key(table_v3: Table) -> None:
1353-
update = AddEncryptedKeyUpdate(
1354-
key=EncryptedKey(
1355-
key_id="test",
1356-
encrypted_key_metadata=base64.b64encode("hello".encode('utf-8'))
1357-
)
1358-
)
1355+
update = AddEncryptedKeyUpdate(key=EncryptedKey(key_id="test", encrypted_key_metadata=base64.b64encode(b"hello")))
13591356

13601357
expected = """
13611358
{
@@ -1369,13 +1366,9 @@ def test_add_encryption_key(table_v3: Table) -> None:
13691366

13701367
assert json.loads(add_metadata.encryption_keys[0].model_dump_json()) == json.loads(expected)
13711368

1369+
13721370
def test_remove_encryption_key(table_v3: Table) -> None:
1373-
update_add = AddEncryptedKeyUpdate(
1374-
key=EncryptedKey(
1375-
key_id="test",
1376-
encrypted_key_metadata=base64.b64encode("hello".encode('utf-8'))
1377-
)
1378-
)
1371+
update_add = AddEncryptedKeyUpdate(key=EncryptedKey(key_id="test", encrypted_key_metadata=base64.b64encode(b"hello")))
13791372
add_metadata = update_table_metadata(table_v3.metadata, (update_add,))
13801373
assert len(add_metadata.encryption_keys) == 1
13811374

@@ -1385,12 +1378,7 @@ def test_remove_encryption_key(table_v3: Table) -> None:
13851378

13861379

13871380
def test_remove_non_existent_encryption_key(table_v3: Table) -> None:
1388-
update_add = AddEncryptedKeyUpdate(
1389-
key=EncryptedKey(
1390-
key_id="test",
1391-
encrypted_key_metadata=base64.b64encode("hello".encode('utf-8'))
1392-
)
1393-
)
1381+
update_add = AddEncryptedKeyUpdate(key=EncryptedKey(key_id="test", encrypted_key_metadata=base64.b64encode(b"hello")))
13941382
add_metadata = update_table_metadata(table_v3.metadata, (update_add,))
13951383
assert len(add_metadata.encryption_keys) == 1
13961384

@@ -1400,11 +1388,6 @@ def test_remove_non_existent_encryption_key(table_v3: Table) -> None:
14001388

14011389

14021390
def test_add_remove_encryption_key_v2_table(table_v2: Table) -> None:
1403-
update_add = AddEncryptedKeyUpdate(
1404-
key=EncryptedKey(
1405-
key_id="test_v2",
1406-
encrypted_key_metadata=base64.b64encode("hello_v2".encode('utf-8'))
1407-
)
1408-
)
1391+
update_add = AddEncryptedKeyUpdate(key=EncryptedKey(key_id="test_v2", encrypted_key_metadata=base64.b64encode(b"hello_v2")))
14091392
with pytest.raises(ValueError, match=r"Cannot add encryption keys from Iceberg v1 or v2 table"):
14101393
update_table_metadata(table_v2.metadata, (update_add,))

0 commit comments

Comments
 (0)