If the restore configuration specifies a protected resource as a restore target, use that as the destination for the restore. First step is to ensure the provided target can be retrieved and identified. --- #### Does this PR need a docs update or release note? - [x] 🕐 Yes, but in a later PR #### Type of change - [x] 🌻 Feature #### Issue(s) * #3562 #### Test Plan - [x] ⚡ Unit test
81 lines
2.1 KiB
Go
81 lines
2.1 KiB
Go
package utils
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/alcionai/clues"
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/alcionai/corso/src/cli/flags"
|
|
. "github.com/alcionai/corso/src/cli/print"
|
|
"github.com/alcionai/corso/src/internal/common/dttm"
|
|
"github.com/alcionai/corso/src/pkg/control"
|
|
)
|
|
|
|
type RestoreCfgOpts struct {
|
|
Collisions string
|
|
Destination string
|
|
// DTTMFormat is the timestamp format appended
|
|
// to the default folder name. Defaults to
|
|
// dttm.HumanReadable.
|
|
DTTMFormat dttm.TimeFormat
|
|
ProtectedResource string
|
|
RestorePermissions bool
|
|
|
|
Populated flags.PopulatedFlags
|
|
}
|
|
|
|
func makeRestoreCfgOpts(cmd *cobra.Command) RestoreCfgOpts {
|
|
return RestoreCfgOpts{
|
|
Collisions: flags.CollisionsFV,
|
|
Destination: flags.DestinationFV,
|
|
DTTMFormat: dttm.HumanReadable,
|
|
ProtectedResource: flags.ToResourceFV,
|
|
RestorePermissions: flags.RestorePermissionsFV,
|
|
|
|
// populated contains the list of flags that appear in the
|
|
// command, according to pflags. Use this to differentiate
|
|
// between an "empty" and a "missing" value.
|
|
Populated: flags.GetPopulatedFlags(cmd),
|
|
}
|
|
}
|
|
|
|
// validateRestoreConfigFlags checks common restore flags for
|
|
// correctness and interdependencies.
|
|
func validateRestoreConfigFlags(fv string, opts RestoreCfgOpts) error {
|
|
_, populated := opts.Populated[flags.CollisionsFN]
|
|
_, foundInValidSet := control.ValidCollisionPolicies()[control.CollisionPolicy(fv)]
|
|
|
|
if populated && !foundInValidSet {
|
|
return clues.New("invalid entry for " + flags.CollisionsFN)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func MakeRestoreConfig(
|
|
ctx context.Context,
|
|
opts RestoreCfgOpts,
|
|
) control.RestoreConfig {
|
|
if len(opts.DTTMFormat) == 0 {
|
|
opts.DTTMFormat = dttm.HumanReadable
|
|
}
|
|
|
|
restoreCfg := control.DefaultRestoreConfig(opts.DTTMFormat)
|
|
|
|
if _, ok := opts.Populated[flags.CollisionsFN]; ok {
|
|
restoreCfg.OnCollision = control.CollisionPolicy(opts.Collisions)
|
|
}
|
|
|
|
if _, ok := opts.Populated[flags.DestinationFN]; ok {
|
|
restoreCfg.Location = opts.Destination
|
|
}
|
|
|
|
restoreCfg.ProtectedResource = opts.ProtectedResource
|
|
restoreCfg.IncludePermissions = opts.RestorePermissions
|
|
|
|
Infof(ctx, "Restoring to folder %s", restoreCfg.Location)
|
|
|
|
return restoreCfg
|
|
}
|