summaryrefslogtreecommitdiff
diff options
authorPaweł Stołowski <stolowski@gmail.com>2021-01-19 13:11:04 +0000
committerPaweł Stołowski <stolowski@gmail.com>2021-01-19 13:11:04 +0000
commit32ee2e70040c6d2d0d27c282616075e76ac1b15e (patch)
tree5c31d30bf9a40d2698c88ed4eb6a7fd6877d73b3
parent7467a4905554801bc075ca8b757d547572cc7de9 (diff)
Fix returning of snap names when duplicated snapshot is detected.snapshots/fix-import-duplicated
-rw-r--r--overlord/snapshotstate/backend/backend.go9
-rw-r--r--overlord/snapshotstate/backend/backend_test.go2
-rw-r--r--overlord/snapshotstate/snapshotstate.go2
-rw-r--r--overlord/snapshotstate/snapshotstate_test.go5
4 files changed, 12 insertions, 6 deletions
diff --git a/overlord/snapshotstate/backend/backend.go b/overlord/snapshotstate/backend/backend.go
index 711b6ce032..f4d6bb3bff 100644
--- a/overlord/snapshotstate/backend/backend.go
+++ b/overlord/snapshotstate/backend/backend.go
@@ -692,7 +692,8 @@ func writeOneSnapshotFile(targetPath string, tr io.Reader) error {
}
type DuplicatedSnapshotImportError struct {
- SetID uint64
+ SetID uint64
+ SnapNames []string
}
func (e DuplicatedSnapshotImportError) Error() string {
@@ -721,7 +722,11 @@ func checkDuplicatedSnapshotSetWithContentHash(ctx context.Context, contentHash
return fmt.Errorf("cannot calculate content hash for %v: %v", setID, err)
}
if bytes.Equal(h, contentHash) {
- return DuplicatedSnapshotImportError{setID}
+ var snapNames []string
+ for _, snapshot := range ss.Snapshots {
+ snapNames = append(snapNames, snapshot.Snap)
+ }
+ return DuplicatedSnapshotImportError{SetID: setID, SnapNames: snapNames}
}
}
return nil
diff --git a/overlord/snapshotstate/backend/backend_test.go b/overlord/snapshotstate/backend/backend_test.go
index d931e262cf..8f78b0747a 100644
--- a/overlord/snapshotstate/backend/backend_test.go
+++ b/overlord/snapshotstate/backend/backend_test.go
@@ -1016,7 +1016,7 @@ func (s *snapshotSuite) TestImportDuplicated(c *check.C) {
_, err = backend.Import(ctx, 123, buf)
dupErr, ok := err.(backend.DuplicatedSnapshotImportError)
c.Assert(ok, check.Equals, true)
- c.Assert(dupErr, check.DeepEquals, backend.DuplicatedSnapshotImportError{SetID: shID})
+ c.Assert(dupErr, check.DeepEquals, backend.DuplicatedSnapshotImportError{SetID: shID, SnapNames: []string{"hello-snap"}})
}
func (s *snapshotSuite) TestImportExportRoundtrip(c *check.C) {
diff --git a/overlord/snapshotstate/snapshotstate.go b/overlord/snapshotstate/snapshotstate.go
index e4be94ae95..662ebe37c4 100644
--- a/overlord/snapshotstate/snapshotstate.go
+++ b/overlord/snapshotstate/snapshotstate.go
@@ -338,7 +338,7 @@ func Import(ctx context.Context, st *state.State, r io.Reader) (setID uint64, sn
if err := removeSnapshotState(st, dupErr.SetID); err != nil {
return 0, nil, err
}
- return dupErr.SetID, snapNames, nil
+ return dupErr.SetID, dupErr.SnapNames, nil
}
return 0, nil, err
}
diff --git a/overlord/snapshotstate/snapshotstate_test.go b/overlord/snapshotstate/snapshotstate_test.go
index 61927f27b8..1b214c7ae3 100644
--- a/overlord/snapshotstate/snapshotstate_test.go
+++ b/overlord/snapshotstate/snapshotstate_test.go
@@ -1641,7 +1641,7 @@ func (snapshotSuite) TestImportSnapshotDuplicate(c *check.C) {
st := state.New(nil)
restore := snapshotstate.MockBackendImport(func(ctx context.Context, id uint64, r io.Reader) ([]string, error) {
- return nil, backend.DuplicatedSnapshotImportError{SetID: 3}
+ return nil, backend.DuplicatedSnapshotImportError{SetID: 3, SnapNames: []string{"foo-snap"}}
})
defer restore()
@@ -1652,9 +1652,10 @@ func (snapshotSuite) TestImportSnapshotDuplicate(c *check.C) {
})
st.Unlock()
- sid, _, err := snapshotstate.Import(context.TODO(), st, bytes.NewBufferString(""))
+ sid, snapNames, err := snapshotstate.Import(context.TODO(), st, bytes.NewBufferString(""))
c.Assert(err, check.IsNil)
c.Check(sid, check.Equals, uint64(3))
+ c.Check(snapNames, check.DeepEquals, []string{"foo-snap"})
st.Lock()
defer st.Unlock()