169
169
SPEC_BACKUPTOS3_POLICY_ENCRYPTION_DEFAULT_VALUE ,
170
170
SPEC_BACKUPTOS3_POLICY_RETENTION ,
171
171
SPEC_BACKUPTOS3_POLICY_RETENTION_DEFAULT_VALUE ,
172
+ SPEC_BACKUPTOS3_POLICY_RETENTION_DELETE_ALL_VALUE ,
172
173
RESTORE_FROMS3 ,
173
174
RESTORE_FROMS3_NAME ,
174
175
RESTORE_FROMS3_RECOVERY ,
182
183
PG_LOG_FILENAME ,
183
184
SPEC_REBUILD ,
184
185
SPCE_REBUILD_NODENAMES ,
186
+ SPEC_DELETE_S3 ,
185
187
)
186
188
187
189
PGLOG_DIR = "log"
319
321
BACKUP_MODE_NONE = "none"
320
322
BACKUP_MODE_S3_MANUAL = "manual"
321
323
BACKUP_MODE_S3_CRON = "cron"
324
+ GET_ENV_MODE_BACKUP = "backup"
325
+ GET_ENV_MODE_RESTORE = "restore"
322
326
323
327
SPECIAL_CHARACTERS = "/##/"
324
328
@@ -1715,6 +1719,41 @@ def get_policy_env(policy: TypedDict) -> List:
1715
1719
return res
1716
1720
1717
1721
1722
+ def get_need_s3_env (
1723
+ meta : kopf .Meta ,
1724
+ spec : kopf .Spec ,
1725
+ patch : kopf .Patch ,
1726
+ status : kopf .Status ,
1727
+ logger : logging .Logger ,
1728
+ mode : str ,
1729
+ need_envs : List = None ,
1730
+ ) -> List :
1731
+ res = list ()
1732
+
1733
+ if need_envs is None :
1734
+ need_envs = ["name" , SPEC_S3 , SPEC_BACKUPTOS3_POLICY ]
1735
+
1736
+ if SPEC_S3 in need_envs :
1737
+ # add s3 env by pgtools
1738
+ s3 = spec [SPEC_S3 ].copy ()
1739
+ res .append (get_s3_env (s3 ))
1740
+
1741
+ if SPEC_BACKUPTOS3_POLICY in need_envs :
1742
+ backup_policy = spec [SPEC_BACKUPCLUSTER ][SPEC_BACKUPTOS3 ].get (
1743
+ SPEC_BACKUPTOS3_POLICY , {})
1744
+ res .append (get_policy_env (backup_policy ))
1745
+
1746
+ if "name" in need_envs :
1747
+ if mode == GET_ENV_MODE_BACKUP :
1748
+ name = spec [SPEC_BACKUPCLUSTER ][SPEC_BACKUPTOS3 ].get (
1749
+ SPEC_BACKUPTOS3_NAME , None )
1750
+ elif mode == GET_ENV_MODE_RESTORE :
1751
+ name = spec [RESTORE ][RESTORE_FROMS3 ].get (RESTORE_FROMS3_NAME , None )
1752
+ res .append (get_backup_name_env (meta , name ))
1753
+
1754
+ return res
1755
+
1756
+
1718
1757
def restore_postgresql_froms3 (
1719
1758
meta : kopf .Meta ,
1720
1759
spec : kopf .Spec ,
@@ -1732,10 +1771,7 @@ def restore_postgresql_froms3(
1732
1771
name = spec [RESTORE ][RESTORE_FROMS3 ].get (RESTORE_FROMS3_NAME , None )
1733
1772
1734
1773
# add s3 env by pgtools -e
1735
- s3 = spec [SPEC_S3 ].copy ()
1736
- s3_list = get_s3_env (s3 )
1737
- name_list = get_backup_name_env (meta , name )
1738
- s3_info = [* s3_list , * name_list ]
1774
+ s3_info = get_need_s3_env (meta , spec , patch , status , logger , GET_ENV_MODE_RESTORE , [SPEC_S3 , "name" ])
1739
1775
1740
1776
tmpconns : InstanceConnections = InstanceConnections ()
1741
1777
tmpconns .add (conn )
@@ -2003,18 +2039,7 @@ def backup_postgresql_to_s3(
2003
2039
waiting_postgresql_ready (conns , logger )
2004
2040
2005
2041
# add s3 env by pgtools
2006
- s3 = spec [SPEC_S3 ].copy ()
2007
- s3_list = get_s3_env (s3 )
2008
-
2009
- backup_policy = spec [SPEC_BACKUPCLUSTER ][SPEC_BACKUPTOS3 ].get (
2010
- SPEC_BACKUPTOS3_POLICY , {})
2011
- policy_list = get_policy_env (backup_policy )
2012
-
2013
- name = spec [SPEC_BACKUPCLUSTER ][SPEC_BACKUPTOS3 ].get (
2014
- SPEC_BACKUPTOS3_NAME , None )
2015
- name_list = get_backup_name_env (meta , name )
2016
-
2017
- s3_info = [* s3_list , * policy_list , * name_list ]
2042
+ s3_info = get_need_s3_env (meta , spec , patch , status , logger , GET_ENV_MODE_BACKUP , [])
2018
2043
2019
2044
cmd = ["pgtools" , "-b" ] + s3_info
2020
2045
logging .warning (
@@ -3423,6 +3448,40 @@ def delete_storage(
3423
3448
"rm -rf " + machine_data_path )
3424
3449
3425
3450
3451
+ def delete_s3 (
3452
+ meta : kopf .Meta ,
3453
+ spec : kopf .Spec ,
3454
+ patch : kopf .Patch ,
3455
+ status : kopf .Status ,
3456
+ logger : logging .Logger ,
3457
+ ) -> None :
3458
+ if get_backup_mode (meta , spec , patch , status ,
3459
+ logger ) == BACKUP_MODE_S3_MANUAL or get_backup_mode (
3460
+ meta , spec , patch , status ,
3461
+ logger ) == BACKUP_MODE_S3_CRON :
3462
+ s3_info = get_need_s3_env (meta , spec , patch , status , logger , GET_ENV_MODE_BACKUP , [])
3463
+
3464
+ # override rentention variable
3465
+ env = SPEC_BACKUPTOS3_POLICY_RETENTION + '="' + \
3466
+ SPEC_BACKUPTOS3_POLICY_RETENTION_DELETE_ALL_VALUE + '"'
3467
+ s3_info .append ('-e' )
3468
+ s3_info .append (env )
3469
+
3470
+ readwrite_conns = connections (spec , meta , patch ,
3471
+ get_field (POSTGRESQL , READWRITEINSTANCE ),
3472
+ False , None , logger , None , status , False )
3473
+ waiting_instance_ready (readwrite_conns , logger , timeout = 1 * MINUTES )
3474
+ for conn in readwrite_conns .get_conns ():
3475
+ # delete all backup
3476
+ cmd = ["pgtools" , "-B" ] + s3_info
3477
+ output = exec_command (conn ,
3478
+ cmd ,
3479
+ logger ,
3480
+ interrupt = True ,
3481
+ user = "postgres" )
3482
+ logger .warning (f"delete all backup execute on { get_connhost (conn )} , and output = { output } " )
3483
+
3484
+
3426
3485
def delete_storages (
3427
3486
meta : kopf .Meta ,
3428
3487
spec : kopf .Spec ,
@@ -3459,6 +3518,8 @@ def delete_postgresql_cluster(
3459
3518
status : kopf .Status ,
3460
3519
logger : logging .Logger ,
3461
3520
) -> None :
3521
+ if spec [SPEC_DELETE_S3 ]:
3522
+ delete_s3 (meta , spec , patch , status , logger )
3462
3523
if spec [DELETE_PVC ]:
3463
3524
delete_storages (meta , spec , patch , status , logger )
3464
3525
@@ -3777,8 +3838,7 @@ def correct_s3_profile(
3777
3838
logger ) == BACKUP_MODE_S3_MANUAL or get_backup_mode (
3778
3839
meta , spec , patch , status ,
3779
3840
logger ) == BACKUP_MODE_S3_CRON :
3780
- s3 = spec [SPEC_S3 ].copy ()
3781
- s3_info = get_s3_env (s3 )
3841
+ s3_info = get_need_s3_env (meta , spec , patch , status , logger , GET_ENV_MODE_BACKUP , [SPEC_S3 ])
3782
3842
readwrite_conns = connections (spec , meta , patch ,
3783
3843
get_field (POSTGRESQL , READWRITEINSTANCE ),
3784
3844
False , None , logger , None , status , False )
0 commit comments