Skip to content

Commit 8c3c3f9

Browse files
committed
cephfs: add clone progress report in clone status
add clone progress report in clone status output Signed-off-by: Nikhil-Ladha <nikhilladha1999@gmail.com>
1 parent 2c86010 commit 8c3c3f9

File tree

2 files changed

+86
-2
lines changed

2 files changed

+86
-2
lines changed

cephfs/admin/clone.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,18 @@ type CloneSource struct {
8181
Snapshot string `json:"snapshot"`
8282
}
8383

84+
// CloneProgressReport contains the progress report of a subvolume clone.
85+
type CloneProgressReport struct {
86+
PercentageCloned string `json:"percentage cloned"`
87+
AmountCloned string `json:"amount cloned"`
88+
FilesCloned string `json:"files cloned"`
89+
}
90+
8491
// CloneStatus reports on the status of a subvolume clone.
8592
type CloneStatus struct {
86-
State CloneState `json:"state"`
87-
Source CloneSource `json:"source"`
93+
State CloneState `json:"state"`
94+
Source CloneSource `json:"source"`
95+
ProgressReport CloneProgressReport `json:"progress_report"`
8896

8997
// failure can be obtained through .GetFailure()
9098
failure *CloneFailure

cephfs/admin/clone_progress_test.go

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
//go:build !main
2+
3+
package admin
4+
5+
import (
6+
"testing"
7+
"time"
8+
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
func TestCloneProgress(t *testing.T) {
13+
fsa := getFSAdmin(t)
14+
volume := "cephfs"
15+
group := "Park"
16+
subname := "Jurrasic"
17+
snapname := "dinodna1"
18+
clonename := "babydino"
19+
20+
err := fsa.CreateSubVolumeGroup(volume, group, nil)
21+
assert.NoError(t, err)
22+
defer func() {
23+
err := fsa.RemoveSubVolumeGroup(volume, group)
24+
assert.NoError(t, err)
25+
}()
26+
27+
svopts := &SubVolumeOptions{
28+
Mode: 0750,
29+
Size: 20 * gibiByte,
30+
}
31+
err = fsa.CreateSubVolume(volume, group, subname, svopts)
32+
assert.NoError(t, err)
33+
defer func() {
34+
err := fsa.RemoveSubVolume(volume, group, subname)
35+
assert.NoError(t, err)
36+
}()
37+
38+
err = fsa.CreateSubVolumeSnapshot(volume, group, subname, snapname)
39+
assert.NoError(t, err)
40+
defer func() {
41+
err := fsa.RemoveSubVolumeSnapshot(volume, group, subname, snapname)
42+
assert.NoError(t, err)
43+
}()
44+
45+
err = fsa.CloneSubVolumeSnapshot(
46+
volume, group, subname, snapname, clonename,
47+
&CloneOptions{TargetGroup: group})
48+
assert.NoError(t, err)
49+
defer func() {
50+
err := fsa.RemoveSubVolume(volume, group, clonename)
51+
assert.NoError(t, err)
52+
}()
53+
54+
wasInProgress := false
55+
for done := false; !done; {
56+
status, err := fsa.CloneStatus(volume, group, clonename)
57+
assert.NoError(t, err)
58+
assert.NotNil(t, status)
59+
switch status.State {
60+
case ClonePending:
61+
case CloneInProgress:
62+
wasInProgress = true
63+
assert.Equal(t, status.ProgressReport.PercentageCloned, "")
64+
assert.Equal(t, status.ProgressReport.AmountCloned, "")
65+
assert.Equal(t, status.ProgressReport.FilesCloned, "")
66+
case CloneComplete:
67+
done = true
68+
case CloneFailed:
69+
t.Fatal("clone failed")
70+
default:
71+
t.Fatalf("invalid clone status: %q", status.State)
72+
}
73+
time.Sleep(5 * time.Millisecond)
74+
}
75+
assert.Equal(t, wasInProgress, true)
76+
}

0 commit comments

Comments
 (0)