func()

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
}