|
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, |
@@ -1379,6 +1382,13 @@ def test_set_partition_statistics_update(table_v2_with_statistics: Table) -> Non |
1379 | 1382 | new_metadata = update_table_metadata( |
1380 | 1383 | table_v2_with_statistics.metadata, |
1381 | 1384 | (update,), |
| 1385 | + |
| 1386 | +def test_add_encryption_key(table_v3: Table) -> None: |
| 1387 | + update = AddEncryptedKeyUpdate( |
| 1388 | + key=EncryptedKey( |
| 1389 | + key_id="test", |
| 1390 | + encrypted_key_metadata=base64.b64encode("hello".encode('utf-8')) |
| 1391 | + ) |
1382 | 1392 | ) |
1383 | 1393 |
|
1384 | 1394 | expected = """ |
@@ -1437,3 +1447,52 @@ def test_remove_partition_statistics_update_with_invalid_snapshot_id(table_v2_wi |
1437 | 1447 | table_v2_with_statistics.metadata, |
1438 | 1448 | (RemovePartitionStatisticsUpdate(snapshot_id=123456789),), |
1439 | 1449 | ) |
| 1450 | + "key-id": "test", |
| 1451 | + "encrypted-key-metadata": "aGVsbG8=" |
| 1452 | + }""" |
| 1453 | + |
| 1454 | + assert table_v3.metadata.encryption_keys == [] |
| 1455 | + add_metadata = update_table_metadata(table_v3.metadata, (update,)) |
| 1456 | + assert len(add_metadata.encryption_keys) == 1 |
| 1457 | + |
| 1458 | + assert json.loads(add_metadata.encryption_keys[0].model_dump_json()) == json.loads(expected) |
| 1459 | + |
| 1460 | +def test_remove_encryption_key(table_v3: Table) -> None: |
| 1461 | + update_add = AddEncryptedKeyUpdate( |
| 1462 | + key=EncryptedKey( |
| 1463 | + key_id="test", |
| 1464 | + encrypted_key_metadata=base64.b64encode("hello".encode('utf-8')) |
| 1465 | + ) |
| 1466 | + ) |
| 1467 | + add_metadata = update_table_metadata(table_v3.metadata, (update_add,)) |
| 1468 | + assert len(add_metadata.encryption_keys) == 1 |
| 1469 | + |
| 1470 | + update_remove = RemoveEncryptedKeyUpdate(key_id="test") |
| 1471 | + remove_metadata = update_table_metadata(add_metadata, (update_remove,)) |
| 1472 | + assert len(remove_metadata.encryption_keys) == 0 |
| 1473 | + |
| 1474 | + |
| 1475 | +def test_remove_non_existent_encryption_key(table_v3: Table) -> None: |
| 1476 | + update_add = AddEncryptedKeyUpdate( |
| 1477 | + key=EncryptedKey( |
| 1478 | + key_id="test", |
| 1479 | + encrypted_key_metadata=base64.b64encode("hello".encode('utf-8')) |
| 1480 | + ) |
| 1481 | + ) |
| 1482 | + add_metadata = update_table_metadata(table_v3.metadata, (update_add,)) |
| 1483 | + assert len(add_metadata.encryption_keys) == 1 |
| 1484 | + |
| 1485 | + update_remove = RemoveEncryptedKeyUpdate(key_id="non_existent_key") |
| 1486 | + remove_metadata = update_table_metadata(add_metadata, (update_remove,)) |
| 1487 | + assert len(remove_metadata.encryption_keys) == 1 # Should be a no-op |
| 1488 | + |
| 1489 | + |
| 1490 | +def test_add_remove_encryption_key_v2_table(table_v2: Table) -> None: |
| 1491 | + update_add = AddEncryptedKeyUpdate( |
| 1492 | + key=EncryptedKey( |
| 1493 | + key_id="test_v2", |
| 1494 | + encrypted_key_metadata=base64.b64encode("hello_v2".encode('utf-8')) |
| 1495 | + ) |
| 1496 | + ) |
| 1497 | + with pytest.raises(ValueError, match=r"Cannot add encryption keys from Iceberg v1 or v2 table"): |
| 1498 | + update_table_metadata(table_v2.metadata, (update_add,)) |
0 commit comments