Skip to content

Commit

Permalink
Add support for restoring specific snapshot (#1927) (#1956)
Browse files Browse the repository at this point in the history
/cherry-pick

Signed-off-by: hmsayem <hmsayem@appscode.com>
  • Loading branch information
1gtm committed Oct 4, 2023
1 parent 209aaa4 commit d2810a4
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 6 deletions.
27 changes: 21 additions & 6 deletions pkg/restore.go
Expand Up @@ -226,14 +226,14 @@ func (opt *mongoOptions) restoreMongoDB(targetRef api_v1beta1.TargetRef) (*resti
// So, for stand-alone MongoDB and MongoDB ReplicaSet, we don't have to do anything.
// We only need to update totalHosts field for sharded MongoDB

restoreSession, err := opt.stashClient.StashV1beta1().RestoreSessions(opt.namespace).Get(context.TODO(), opt.restoreSessionName, metav1.GetOptions{})
if err != nil {
return nil, err
}
opt.totalHosts = 1
// For sharded MongoDB, parameter.ConfigServer will not be empty
if parameters.ConfigServer != "" {
opt.totalHosts = len(parameters.ReplicaSets) + 1 // for each shard there will be one key in parameters.ReplicaSet
restoreSession, err := opt.stashClient.StashV1beta1().RestoreSessions(opt.namespace).Get(context.TODO(), opt.restoreSessionName, metav1.GetOptions{})
if err != nil {
return nil, err
}
_, err = stash_cs_util.UpdateRestoreSessionStatus(
context.TODO(),
opt.stashClient.StashV1beta1(),
Expand Down Expand Up @@ -311,9 +311,8 @@ func (opt *mongoOptions) restoreMongoDB(targetRef api_v1beta1.TargetRef) (*resti
Host: hostKey,
SourceHost: hostKey,
FileName: opt.defaultDumpOptions.FileName,
Snapshot: opt.defaultDumpOptions.Snapshot,
Snapshot: opt.getSnapshotForHost(hostKey, restoreSession.Spec.Target.Rules),
}

// setup pipe command
restoreCmd := restic.Command{
Name: MongoRestoreCMD,
Expand Down Expand Up @@ -426,3 +425,19 @@ func (opt *mongoOptions) getHostRestoreStats(err error) []api_v1beta1.HostRestor

return restoreStats
}

func (opt *mongoOptions) getSnapshotForHost(hostname string, rules []api_v1beta1.Rule) string {
var hostSnapshot string
for _, rule := range rules {
if len(rule.TargetHosts) == 0 || containsString(rule.TargetHosts, hostname) {
hostSnapshot = rule.Snapshots[0]
// if rule has empty targetHost then check further rules to see if any other rule with non-empty targetHost matches
if len(rule.TargetHosts) == 0 {
continue
} else {
return hostSnapshot
}
}
}
return hostSnapshot
}
9 changes: 9 additions & 0 deletions pkg/utils.go
Expand Up @@ -94,3 +94,12 @@ func containsArg(args []string, checklist sets.String) bool {
}
return false
}

func containsString(a []string, e string) bool {
for _, s := range a {
if s == e {
return true
}
}
return false
}

0 comments on commit d2810a4

Please sign in to comment.