@@ -86,12 +86,12 @@ def unlock_instance(driver, instance, client):
8686 return False
8787
8888
89- def make_instance_snapshot_backup (instance , error , group ,
90- provider_class = VolumeProviderSnapshot ,
91- target_volume = None ,
92- current_hour = None ,
93- task = None ,
94- persist = 0 ):
89+ def make_instance_dccm_snapshot_backup (instance , error , group ,
90+ provider_class = VolumeProviderSnapshot ,
91+ target_volume = None ,
92+ current_hour = None ,
93+ task = None ,
94+ persist = 0 ):
9595 LOG .info ("Make instance backup for {}" .format (instance ))
9696 provider = provider_class (instance )
9797 infra = instance .databaseinfra
@@ -212,6 +212,169 @@ def make_instance_snapshot_backup(instance, error, group,
212212 return snapshot
213213
214214
215+ def make_instance_gcp_snapshot_backup (
216+ instance , error , group , provider_class = VolumeProviderSnapshot , target_volume = None ,
217+ current_hour = None , task = None , persist = 0
218+ ):
219+ LOG .info ("Make instance backup for {}" .format (instance ))
220+ provider = provider_class (instance )
221+ infra = instance .databaseinfra
222+ database = infra .databases .first ()
223+
224+ backup_retry_attempts = Configuration .get_by_name_as_int ('backup_retry_attempts' , default = 3 )
225+
226+ snapshot = Snapshot .create (
227+ instance , group , target_volume or provider .volume ,
228+ environment = provider .environment , persistent = True if persist != 0 else False
229+ )
230+
231+ snapshot_final_status = Snapshot .SUCCESS
232+
233+ locked = None
234+ client = None
235+ driver = infra .get_driver ()
236+ try :
237+ client = driver .get_client (instance )
238+ locked = lock_instance (driver , instance , client )
239+ if not locked :
240+ snapshot_final_status = Snapshot .WARNING
241+
242+ if 'MySQL' in type (driver ).__name__ :
243+ mysql_binlog_save (client , instance )
244+
245+ has_snapshot = Snapshot .objects .filter (
246+ status = Snapshot .WARNING , instance = instance , end_at__year = datetime .now ().year ,
247+ end_at__month = datetime .now ().month , end_at__day = datetime .now ().day
248+ )
249+ backup_hour_list = Configuration .get_by_name_as_list ('make_database_backup_hour' )
250+ if not snapshot_final_status == Snapshot .WARNING and not has_snapshot :
251+ cont = 0
252+ for _ in range (backup_retry_attempts ):
253+ cont += 1
254+ try :
255+ code = 201
256+ response , data = provider .new_take_snapshot (persist = persist )
257+
258+ if response .status_code < 400 :
259+ break
260+
261+ if cont >= 3 :
262+ raise IndexError
263+
264+ except IndexError as e :
265+ response , content = e
266+ if response .status_code == 503 :
267+ errormsg = "{} - 503 error creating snapshot for instance: {}. It will try again in 30 seconds. " .format (
268+ strftime ("%d/%m/%Y %H:%M:%S" ), instance
269+ )
270+ LOG .error (errormsg )
271+ if task :
272+ task .add_detail (errormsg )
273+ sleep (30 )
274+ else :
275+ raise e
276+
277+ if response .status_code < 400 :
278+ while code != 200 :
279+ sleep (20 )
280+ snap_response , snap_status = provider .take_snapshot_status (data ['identifier' ])
281+ if snap_response .status_code in [200 , 202 ]:
282+ unlock_instance (driver , instance , client )
283+ if snap_response .status_code == 200 :
284+ break
285+ if snap_response .status_code >= 400 :
286+ raise error
287+ code = snap_response .status_code
288+
289+ snapshot .done (snap_status )
290+ snapshot .save ()
291+ else :
292+ errormsg = response ['message' ]
293+ set_backup_error (infra , snapshot , errormsg )
294+ else :
295+ if str (current_hour ) in backup_hour_list :
296+ raise Exception ("Backup with WARNING already created today." )
297+
298+ except Exception as e :
299+ errormsg = "Error creating snapshot: {}" .format (e )
300+ error ['errormsg' ] = errormsg
301+ set_backup_error (infra , snapshot , errormsg )
302+ return snapshot
303+ finally :
304+ unlock_instance (driver , instance , client )
305+
306+ if not snapshot .size :
307+ command = "du -sb /data/.snapshot/%s | awk '{print $1}'" % (
308+ snapshot .snapshot_name
309+ )
310+ try :
311+ output = instance .hostname .ssh .run_script (command )
312+ size = int (output ['stdout' ][0 ])
313+ snapshot .size = size
314+ except Exception as e :
315+ snapshot .size = 0
316+ LOG .error ("Error exec remote command {}" .format (e ))
317+
318+ backup_path = database .backup_path
319+ if backup_path :
320+ now = datetime .now ()
321+ target_path = "{}/{}/{}/{}/{}" .format (
322+ backup_path ,
323+ now .strftime ("%Y_%m_%d" ),
324+ instance .hostname .hostname .split ('.' )[0 ],
325+ now .strftime ("%Y%m%d%H%M%S" ),
326+ infra .name
327+ )
328+ snapshot_path = "/data/.snapshot/{}/data/" .format (
329+ snapshot .snapshot_name
330+ )
331+ command = """
332+ if [ -d "{backup_path}" ]
333+ then
334+ rm -rf {backup_path}/20[0-9][0-9]_[0-1][0-9]_[0-3][0-9] &
335+ mkdir -p {target_path}
336+ cp -r {snapshot_path} {target_path} &
337+ fi
338+ """ .format (backup_path = backup_path ,
339+ target_path = target_path ,
340+ snapshot_path = snapshot_path )
341+ try :
342+ instance .hostname .ssh .run_script (command )
343+ except Exception as e :
344+ LOG .error ("Error exec remote command {}" .format (e ))
345+
346+ snapshot .status = snapshot_final_status
347+ snapshot .end_at = datetime .now ()
348+ snapshot .save ()
349+ register_backup_dbmonitor (infra , snapshot )
350+
351+ return snapshot
352+
353+
354+ def make_instance_snapshot_backup (instance , error , group ,
355+ provider_class = VolumeProviderSnapshot ,
356+ target_volume = None ,
357+ current_hour = None ,
358+ task = None ,
359+ persist = 0 ):
360+ infra = instance .databaseinfra
361+ env = infra .environment
362+ if env .name == 'prod' :
363+ return make_instance_dccm_snapshot_backup (instance , error , group ,
364+ provider_class = provider_class ,
365+ target_volume = target_volume ,
366+ current_hour = current_hour ,
367+ task = task ,
368+ persist = persist )
369+ else :
370+ return make_instance_gcp_snapshot_backup (instance , error , group ,
371+ provider_class = provider_class ,
372+ target_volume = target_volume ,
373+ current_hour = current_hour ,
374+ task = task ,
375+ persist = persist )
376+
377+
215378def make_instance_snapshot_backup_upgrade_disk (instance , error , group , provider_class = VolumeProviderSnapshot ,
216379 target_volume = None ,
217380 current_hour = None ):
@@ -742,6 +905,7 @@ def _create_database_backup(instance, task, group, current_hour, persist):
742905
743906 error = {}
744907 try :
908+ LOG .info ('Starting make database snapshot' )
745909 snapshot = make_instance_snapshot_backup (
746910 instance = instance ,
747911 error = error ,
0 commit comments