in internal/onetime/hanadiskbackup/hanadiskbackup.go [280:388]
func (s *Snapshot) snapshotHandler(ctx context.Context, gceServiceCreator onetime.GCEServiceFunc, computeServiceCreator onetime.ComputeServiceFunc, checkDataDir checkDataDirFunc, cp *ipb.CloudProperties) (string, subcommands.ExitStatus) {
var err error
s.status = false
defer s.sendStatusToMonitoring(ctx, cloudmonitoring.NewDefaultBackOffIntervals(), cp)
s.gceService, err = gceServiceCreator(ctx)
if err != nil {
errMessage := "ERROR: Failed to create GCE service"
s.oteLogger.LogErrorToFileAndConsole(ctx, errMessage, err)
return errMessage, subcommands.ExitFailure
}
if s.hanaDataPath, s.logicalDataPath, s.physicalDataPath, err = checkDataDir(ctx, commandlineexecutor.ExecuteCommand); err != nil {
errMessage := "ERROR: Failed to check preconditions"
s.oteLogger.LogErrorToFileAndConsole(ctx, errMessage, err)
return errMessage, subcommands.ExitFailure
}
if msg, exitStatus := s.validateDisks(ctx, cp, commandlineexecutor.ExecuteCommand); exitStatus != subcommands.ExitSuccess {
return msg, exitStatus
}
if s.groupSnapshotName != "" {
snapshotList, err := s.gceService.ListSnapshots(ctx, s.Project)
if err != nil {
errMessage := "ERROR: Failed to check if group snapshot exists"
s.oteLogger.LogErrorToFileAndConsole(ctx, errMessage, err)
return errMessage, subcommands.ExitFailure
}
for _, snapshot := range snapshotList.Items {
if snapshot.Labels["goog-sapagent-isg"] == s.groupSnapshotName {
errMessage := "ERROR: Group snapshot with given name already exists"
s.oteLogger.LogErrorToFileAndConsole(ctx, errMessage, fmt.Errorf("group snapshot with given name already exists"))
return errMessage, subcommands.ExitFailure
}
}
}
log.CtxLogger(ctx).Infow("Starting disk snapshot for HANA", "sid", s.Sid)
s.oteLogger.LogUsageAction(usagemetrics.HANADiskSnapshot)
if s.HDBUserstoreKey != "" {
s.oteLogger.LogUsageAction(usagemetrics.HANADiskSnapshotUserstoreKey)
}
dbp := databaseconnector.Params{
Username: s.HanaDBUser,
Password: s.Password,
PasswordSecret: s.PasswordSecret,
Host: s.Host,
Port: s.Port,
HDBUserKey: s.HDBUserstoreKey,
GCEService: s.gceService,
Project: s.Project,
SID: s.Sid,
}
if s.SkipDBSnapshotForChangeDiskType {
s.oteLogger.LogMessageToFileAndConsole(ctx, "Skipping connecting to HANA Database in case of changedisktype workflow.")
} else if s.db, err = databaseconnector.CreateDBHandle(ctx, dbp); err != nil {
errMessage := "ERROR: Failed to connect to database"
s.oteLogger.LogErrorToFileAndConsole(ctx, errMessage, err)
return errMessage, subcommands.ExitFailure
}
s.computeService, err = computeServiceCreator(ctx)
if err != nil {
errMessage := "ERROR: Failed to create compute service"
s.oteLogger.LogErrorToFileAndConsole(ctx, errMessage, err)
return errMessage, subcommands.ExitFailure
}
workflowStartTime := time.Now()
if s.SkipDBSnapshotForChangeDiskType {
err := s.runWorkflowForChangeDiskType(ctx, s.createSnapshot, cp)
if err != nil {
errMessage := "ERROR: Failed to run HANA disk snapshot workflow"
s.oteLogger.LogErrorToFileAndConsole(ctx, errMessage, err)
return errMessage, subcommands.ExitFailure
}
} else if s.groupSnapshot {
if err := s.runWorkflowForInstantSnapshotGroups(ctx, runQuery, cp); err != nil {
errMessage := "ERROR: Failed to run HANA disk snapshot workflow"
s.oteLogger.LogErrorToFileAndConsole(ctx, errMessage, err)
return errMessage, subcommands.ExitFailure
}
} else if err = s.runWorkflowForDiskSnapshot(ctx, runQuery, s.createSnapshot, cp); err != nil {
errMessage := "ERROR: Failed to run HANA disk snapshot workflow"
s.oteLogger.LogErrorToFileAndConsole(ctx, errMessage, err)
return errMessage, subcommands.ExitFailure
}
workflowDur := time.Since(workflowStartTime)
snapshotName := s.SnapshotName
var successMessage string
if s.groupSnapshot {
snapshotName = s.groupSnapshotName
successMessage = fmt.Sprintf("SUCCESS: HANA backup and group disk snapshot creation successful. Group Backup Name: %s", snapshotName)
s.oteLogger.LogMessageToConsole(successMessage)
s.oteLogger.LogUsageAction(usagemetrics.HANADiskGroupBackupSucceeded)
} else {
successMessage = fmt.Sprintf("SUCCESS: HANA backup and disk snapshot creation successful. Snapshot Name: %s", snapshotName)
s.oteLogger.LogMessageToConsole(successMessage)
s.oteLogger.LogUsageAction(usagemetrics.HANADiskBackupSucceeded)
}
s.sendDurationToCloudMonitoring(ctx, metricPrefix+s.Name()+"/totaltime", snapshotName, workflowDur, cloudmonitoring.NewDefaultBackOffIntervals(), cp)
s.status = true
return successMessage, subcommands.ExitSuccess
}