in internal/onetime/hanadiskrestore/hanadiskrestore.go [250:330]
func (r *Restorer) restoreHandler(ctx context.Context, mcc metricClientCreator, gceServiceCreator onetime.GCEServiceFunc, computeServiceCreator onetime.ComputeServiceFunc, cp *ipb.CloudProperties, checkDataDir getDataPaths, checkLogDir getLogPaths) subcommands.ExitStatus {
var err error
if err = r.validateParameters(runtime.GOOS, cp); err != nil {
r.oteLogger.LogMessageToConsole(err.Error())
return subcommands.ExitUsageError
}
r.timeSeriesCreator, err = mcc(ctx)
if err != nil {
log.CtxLogger(ctx).Errorw("Failed to create Cloud Monitoring metric client", "error", err)
return subcommands.ExitFailure
}
r.gceService, err = gceServiceCreator(ctx)
if err != nil {
r.oteLogger.LogErrorToFileAndConsole(ctx, "ERROR: Failed to create GCE service", err)
return subcommands.ExitFailure
}
log.CtxLogger(ctx).Infow("Starting HANA disk snapshot restore", "sid", r.Sid)
r.oteLogger.LogUsageAction(usagemetrics.HANADiskRestore)
if r.computeService, err = computeServiceCreator(ctx); err != nil {
r.oteLogger.LogErrorToFileAndConsole(ctx, "ERROR: Failed to create compute service,", err)
return subcommands.ExitFailure
}
if err := r.checkPreConditions(ctx, cp, checkDataDir, checkLogDir, commandlineexecutor.ExecuteCommand); err != nil {
r.oteLogger.LogErrorToFileAndConsole(ctx, "ERROR: Pre-restore check failed,", err)
return subcommands.ExitFailure
}
if !r.SkipDBSnapshotForChangeDiskType {
if err := r.prepare(ctx, cp, hanabackup.WaitForIndexServerToStopWithRetry, commandlineexecutor.ExecuteCommand); err != nil {
r.oteLogger.LogErrorToFileAndConsole(ctx, "ERROR: HANA restore prepare failed,", err)
return subcommands.ExitFailure
}
} else {
if err := r.prepareForHANAChangeDiskType(ctx, cp); err != nil {
r.oteLogger.LogErrorToFileAndConsole(ctx, "ERROR: HANA restore prepare failed,", err)
return subcommands.ExitFailure
}
}
// Rescanning to prevent any volume group naming conflicts
// with restored disk's volume group.
hanabackup.RescanVolumeGroups(ctx)
workflowStartTime = time.Now()
if !r.isGroupSnapshot {
if err := r.diskRestore(ctx, commandlineexecutor.ExecuteCommand, cp); err != nil {
return subcommands.ExitFailure
}
r.oteLogger.LogUsageAction(usagemetrics.HANADiskRestoreSucceeded)
} else {
if err := r.groupRestore(ctx, cp); err != nil {
return subcommands.ExitFailure
}
r.oteLogger.LogUsageAction(usagemetrics.HANADiskGroupRestoreSucceeded)
}
workflowDur := time.Since(workflowStartTime)
defer r.sendDurationToCloudMonitoring(ctx, metricPrefix+r.Name()+"/totaltime", workflowDur, cloudmonitoring.NewDefaultBackOffIntervals(), cp)
successMessage := "SUCCESS: HANA restore from disk snapshot successful. Please refer to https://cloud.google.com/solutions/sap/docs/agent-for-sap/latest/perform-disk-snapshot-backup-recovery#recovery_db_for_scaleup for next steps."
if r.isScaleout {
successMessage = "SUCCESS: HANA restore from disk group snapshot successful. Please refer to https://cloud.google.com/solutions/sap/docs/agent-for-sap/latest/perform-disk-snapshot-backup-recovery#recover-db-for-scale-out for next steps."
}
r.oteLogger.LogMessageToFileAndConsole(ctx, successMessage)
if r.labelsOnDetachedDisk != "" {
if !r.isGroupSnapshot {
if err := r.appendLabelsToDetachedDisk(ctx, r.DataDiskName); err != nil {
return subcommands.ExitFailure
}
} else {
for _, d := range r.disks {
if err := r.appendLabelsToDetachedDisk(ctx, d.disk.DiskName); err != nil {
return subcommands.ExitFailure
}
}
}
}
return subcommands.ExitSuccess
}