in internal/onetime/hanadiskrestore/multidisk.go [72:135]
func (r *Restorer) restoreFromGroupSnapshot(ctx context.Context, exec commandlineexecutor.Execute, cp *ipb.CloudProperties, snapshotKey string) error {
if r.gceService == nil {
return fmt.Errorf("gce service is nil")
}
snapshotList, err := r.gceService.ListSnapshots(ctx, r.Project)
if err != nil {
return err
}
// Creating a map of disk names to their respective instances.
diskToInstanceMap := make(map[string]string)
for _, d := range r.disks {
diskToInstanceMap[d.disk.DiskName] = d.instanceName
}
var lastDiskName string
var numOfDisksRestored int
for _, snapshot := range snapshotList.Items {
if snapshot.Labels["goog-sapagent-isg"] == r.GroupSnapshot {
timestamp := time.Now().Unix()
newDiskName := truncateName(ctx, snapshot.Name, fmt.Sprintf("%d", timestamp))
if r.NewDiskPrefix != "" {
newDiskName = fmt.Sprintf("%s-%s", r.NewDiskPrefix, fmt.Sprintf("%d", numOfDisksRestored+1))
}
lastDiskName = newDiskName
log.CtxLogger(ctx).Debugw("Restoring snapshot", "new Disk", newDiskName, "source disk", snapshot.Labels["goog-sapagent-disk-name"])
instanceName := diskToInstanceMap[snapshot.Labels["goog-sapagent-disk-name"]]
if err := r.restoreFromSnapshot(ctx, exec, instanceName, snapshotKey, newDiskName, snapshot.Name); err != nil {
return err
}
if err := r.modifyDiskInCG(ctx, newDiskName, true); err != nil {
log.CtxLogger(ctx).Warnw("failed to add newly attached disk to consistency group", "disk", newDiskName)
}
numOfDisksRestored++
}
}
if numOfDisksRestored != len(r.disks) {
return fmt.Errorf("required number of disks did not get restored, wanted: %v, got: %v", len(r.disks), numOfDisksRestored)
}
if !r.isScaleout {
dev, ok, err := r.gceService.DiskAttachedToInstance(r.Project, r.DataDiskZone, cp.GetInstanceName(), lastDiskName)
if err != nil {
return fmt.Errorf("failed to check if the source-disk=%v is attached to the instance", lastDiskName)
}
if !ok {
return fmt.Errorf("source-disk=%v is not attached to the instance", lastDiskName)
}
if r.DataDiskVG != "" {
if err := r.renameLVM(ctx, exec, cp, dev, lastDiskName); err != nil {
log.CtxLogger(ctx).Info("Removing newly attached restored disk")
if detachErr := r.gceService.DetachDisk(ctx, cp.GetInstanceName(), r.Project, r.DataDiskZone, lastDiskName, dev); detachErr != nil {
log.CtxLogger(ctx).Info("Failed to detach newly attached restored disk: %v", detachErr)
return detachErr
}
return err
}
}
}
return nil
}