|
15 | 15 | # specific language governing permissions and limitations |
16 | 16 | # under the License. |
17 | 17 | # pylint:disable=redefined-outer-name |
| 18 | +import base64 |
18 | 19 | import json |
19 | 20 | import uuid |
20 | 21 | from copy import copy |
|
49 | 50 | TableIdentifier, |
50 | 51 | _match_deletes_to_data_file, |
51 | 52 | ) |
| 53 | +from pyiceberg.table.encryption import EncryptedKey |
52 | 54 | from pyiceberg.table.metadata import INITIAL_SEQUENCE_NUMBER, TableMetadataUtil, TableMetadataV2, _generate_snapshot_id |
53 | 55 | from pyiceberg.table.refs import MAIN_BRANCH, SnapshotRef, SnapshotRefType |
54 | 56 | from pyiceberg.table.snapshots import ( |
|
66 | 68 | ) |
67 | 69 | from pyiceberg.table.statistics import BlobMetadata, PartitionStatisticsFile, StatisticsFile |
68 | 70 | from pyiceberg.table.update import ( |
| 71 | + AddEncryptedKeyUpdate, |
69 | 72 | AddSnapshotUpdate, |
70 | 73 | AddSortOrderUpdate, |
71 | 74 | AssertCreate, |
@@ -1419,6 +1422,13 @@ def test_set_partition_statistics_update(table_v2_with_statistics: Table) -> Non |
1419 | 1422 | new_metadata = update_table_metadata( |
1420 | 1423 | table_v2_with_statistics.metadata, |
1421 | 1424 | (update,), |
| 1425 | + |
| 1426 | +def test_add_encryption_key(table_v3: Table) -> None: |
| 1427 | + update = AddEncryptedKeyUpdate( |
| 1428 | + key=EncryptedKey( |
| 1429 | + key_id="test", |
| 1430 | + encrypted_key_metadata=base64.b64encode("hello".encode('utf-8')) |
| 1431 | + ) |
1422 | 1432 | ) |
1423 | 1433 |
|
1424 | 1434 | expected = """ |
@@ -1477,3 +1487,52 @@ def test_remove_partition_statistics_update_with_invalid_snapshot_id(table_v2_wi |
1477 | 1487 | table_v2_with_statistics.metadata, |
1478 | 1488 | (RemovePartitionStatisticsUpdate(snapshot_id=123456789),), |
1479 | 1489 | ) |
| 1490 | + "key-id": "test", |
| 1491 | + "encrypted-key-metadata": "aGVsbG8=" |
| 1492 | + }""" |
| 1493 | + |
| 1494 | + assert table_v3.metadata.encryption_keys == [] |
| 1495 | + add_metadata = update_table_metadata(table_v3.metadata, (update,)) |
| 1496 | + assert len(add_metadata.encryption_keys) == 1 |
| 1497 | + |
| 1498 | + assert json.loads(add_metadata.encryption_keys[0].model_dump_json()) == json.loads(expected) |
| 1499 | + |
| 1500 | +def test_remove_encryption_key(table_v3: Table) -> None: |
| 1501 | + update_add = AddEncryptedKeyUpdate( |
| 1502 | + key=EncryptedKey( |
| 1503 | + key_id="test", |
| 1504 | + encrypted_key_metadata=base64.b64encode("hello".encode('utf-8')) |
| 1505 | + ) |
| 1506 | + ) |
| 1507 | + add_metadata = update_table_metadata(table_v3.metadata, (update_add,)) |
| 1508 | + assert len(add_metadata.encryption_keys) == 1 |
| 1509 | + |
| 1510 | + update_remove = RemoveEncryptedKeyUpdate(key_id="test") |
| 1511 | + remove_metadata = update_table_metadata(add_metadata, (update_remove,)) |
| 1512 | + assert len(remove_metadata.encryption_keys) == 0 |
| 1513 | + |
| 1514 | + |
| 1515 | +def test_remove_non_existent_encryption_key(table_v3: Table) -> None: |
| 1516 | + update_add = AddEncryptedKeyUpdate( |
| 1517 | + key=EncryptedKey( |
| 1518 | + key_id="test", |
| 1519 | + encrypted_key_metadata=base64.b64encode("hello".encode('utf-8')) |
| 1520 | + ) |
| 1521 | + ) |
| 1522 | + add_metadata = update_table_metadata(table_v3.metadata, (update_add,)) |
| 1523 | + assert len(add_metadata.encryption_keys) == 1 |
| 1524 | + |
| 1525 | + update_remove = RemoveEncryptedKeyUpdate(key_id="non_existent_key") |
| 1526 | + remove_metadata = update_table_metadata(add_metadata, (update_remove,)) |
| 1527 | + assert len(remove_metadata.encryption_keys) == 1 # Should be a no-op |
| 1528 | + |
| 1529 | + |
| 1530 | +def test_add_remove_encryption_key_v2_table(table_v2: Table) -> None: |
| 1531 | + update_add = AddEncryptedKeyUpdate( |
| 1532 | + key=EncryptedKey( |
| 1533 | + key_id="test_v2", |
| 1534 | + encrypted_key_metadata=base64.b64encode("hello_v2".encode('utf-8')) |
| 1535 | + ) |
| 1536 | + ) |
| 1537 | + with pytest.raises(ValueError, match=r"Cannot add encryption keys from Iceberg v1 or v2 table"): |
| 1538 | + update_table_metadata(table_v2.metadata, (update_add,)) |
0 commit comments