diff --git a/engine/internal/provision/mode_local_test.go b/engine/internal/provision/mode_local_test.go index fad330f0a5727378c94ad0784fd194aba9867ef1..737fcf5f3daf441249d3e2e61cf89070adf42fd0 100644 --- a/engine/internal/provision/mode_local_test.go +++ b/engine/internal/provision/mode_local_test.go @@ -214,10 +214,6 @@ func (m mockFSManager) KeepRelation(_ string) error { return nil } -func (m mockFSManager) FindBranchBySnapshot(snapshot string) (string, error) { - return "", nil -} - func TestBuildPoolEntry(t *testing.T) { testCases := []struct { pool *resources.Pool diff --git a/engine/internal/provision/pool/manager.go b/engine/internal/provision/pool/manager.go index 9f0fdd6c2c48bee030522aa2d0cd4b2adb64e27a..30f7be2ba57d1a9efec19954d5c99e3937f3198b 100644 --- a/engine/internal/provision/pool/manager.go +++ b/engine/internal/provision/pool/manager.go @@ -78,7 +78,6 @@ type Branching interface { Reset(snapshotID string, options thinclones.ResetOptions) error HasDependentEntity(snapshotName string) ([]string, error) KeepRelation(snapshotName string) error - FindBranchBySnapshot(snapshot string) (string, error) } // Pooler describes methods for Pool providing. diff --git a/engine/internal/provision/thinclones/lvm/lvmanager.go b/engine/internal/provision/thinclones/lvm/lvmanager.go index 9dd4a3b4212ebcb604d6eac9c0f8da149ada92cd..91ae279410c25979718231cfab3f5a183a65c571 100644 --- a/engine/internal/provision/thinclones/lvm/lvmanager.go +++ b/engine/internal/provision/thinclones/lvm/lvmanager.go @@ -316,10 +316,3 @@ func (m *LVManager) KeepRelation(_ string) error { return nil } - -// FindBranchBySnapshot finds the branch which the snapshot belongs to. -func (m *LVManager) FindBranchBySnapshot(_ string) (string, error) { - log.Msg("KeepRelation is not supported for LVM. Skip the operation") - - return "", nil -} diff --git a/engine/internal/provision/thinclones/zfs/branching.go b/engine/internal/provision/thinclones/zfs/branching.go index 39d47a65d3de0406400afa81483fcd0c252e53dd..18377317ecf7d4320c46de92b5b2e8c8c0e75808 100644 --- a/engine/internal/provision/thinclones/zfs/branching.go +++ b/engine/internal/provision/thinclones/zfs/branching.go @@ -582,29 +582,6 @@ func (m *Manager) KeepRelation(snapshotName string) error { return nil } -// FindBranchBySnapshot finds the branch which the snapshot belongs to. -func (m *Manager) FindBranchBySnapshot(snapshot string) (string, error) { - branch, err := m.getProperty(branchProp, snapshot) - if err != nil { - return "", err - } - - if branch != "" { - return branch, nil - } - - child, err := m.getProperty(childProp, snapshot) - if err != nil { - return "", fmt.Errorf("failed to check snapshot child property: %w", err) - } - - if child != "" { - return m.FindBranchBySnapshot(child) - } - - return "", nil -} - func (m *Manager) addToSet(property, snapshot, value string) error { original, err := m.getProperty(property, snapshot) if err != nil { diff --git a/engine/internal/provision/thinclones/zfs/zfs.go b/engine/internal/provision/thinclones/zfs/zfs.go index 16fcaf5e1d4ea37b0f1fd82225503ee21434295f..9d89602f748f3e122dd046ab3a9af8cf1f1fc744 100644 --- a/engine/internal/provision/thinclones/zfs/zfs.go +++ b/engine/internal/provision/thinclones/zfs/zfs.go @@ -33,6 +33,9 @@ const ( // PoolMode defines the zfs filesystem name. PoolMode = "zfs" + + // Clone must have 3 segments: branch, name, revision. + numCloneSegments = 3 ) // ListEntry defines entry of ZFS list command. @@ -285,7 +288,7 @@ func (m *Manager) ListClonesNames() ([]string, error) { segments := strings.Split(bc, "/") - if len(segments) <= 1 { + if len(segments) != numCloneSegments { // It's a branch dataset, not a clone. Skip it. continue } @@ -696,6 +699,16 @@ func (m *Manager) getSnapshots() ([]resources.Snapshot, error) { continue } + branch := entry.Branch + + if branch == empty { + if parsedBranch := branching.ParseBranchNameFromSnapshot(entry.Name, m.config.Pool.Name); parsedBranch != "" { + branch = parsedBranch + } else { + branch = branching.DefaultBranch + } + } + snapshot := resources.Snapshot{ ID: entry.Name, CreatedAt: entry.Creation, @@ -703,7 +716,7 @@ func (m *Manager) getSnapshots() ([]resources.Snapshot, error) { Used: entry.Used, LogicalReferenced: entry.LogicalReferenced, Pool: m.config.Pool.Name, - Branch: entry.Branch, + Branch: branch, Message: entry.Message, } diff --git a/engine/internal/provision/thinclones/zfs/zfs_test.go b/engine/internal/provision/thinclones/zfs/zfs_test.go index 5468649fedcb35f6bd28cbbd173b33fed4f3a0ad..0001c8a647a57d9912122fa25598814d3cf1f74d 100644 --- a/engine/internal/provision/thinclones/zfs/zfs_test.go +++ b/engine/internal/provision/thinclones/zfs/zfs_test.go @@ -37,7 +37,7 @@ func TestListClones(t *testing.T) { { caseName: "single clone", cmdOutput: `datastore/branch/main/clone_pre_20200831030000 -datastore/branch/main/cls19p20l4rc73bc2v9g +datastore/branch/main/cls19p20l4rc73bc2v9g/r0 `, cloneNames: []string{ "cls19p20l4rc73bc2v9g", @@ -46,8 +46,8 @@ datastore/branch/main/cls19p20l4rc73bc2v9g { caseName: "multiple clones", cmdOutput: `datastore/branch/main/clone_pre_20200831030000 -datastore/branch/main/cls19p20l4rc73bc2v9g -datastore/branch/main/cls184a0l4rc73bc2v90 +datastore/branch/main/cls19p20l4rc73bc2v9g/r0 +datastore/branch/main/cls184a0l4rc73bc2v90/r0 `, cloneNames: []string{ "cls19p20l4rc73bc2v9g", @@ -57,8 +57,8 @@ datastore/branch/main/cls184a0l4rc73bc2v90 { caseName: "clone duplicate", cmdOutput: `datastore/branch/main/clone_pre_20200831030000 -datastore/branch/main/cls19p20l4rc73bc2v9g -datastore/branch/main/cls19p20l4rc73bc2v9g +datastore/branch/main/cls19p20l4rc73bc2v9g/r0 +datastore/branch/main/cls19p20l4rc73bc2v9g/r1 `, cloneNames: []string{ "cls19p20l4rc73bc2v9g", @@ -67,8 +67,8 @@ datastore/branch/main/cls19p20l4rc73bc2v9g { caseName: "different pool", cmdOutput: `datastore/branch/main/clone_pre_20200831030000 -dblab_pool/branch/main/cls19p20l4rc73bc2v9g -datastore/branch/main/cls184a0l4rc73bc2v90 +dblab_pool/branch/main/cls19p20l4rc73bc2v9g/r0 +datastore/branch/main/cls184a0l4rc73bc2v90/r0 `, cloneNames: []string{ "cls184a0l4rc73bc2v90", @@ -77,7 +77,7 @@ datastore/branch/main/cls184a0l4rc73bc2v90 { caseName: "no matched clone", cmdOutput: `datastore/branch/main/clone_pre_20200831030000 -dblab_pool/branch/main/cls19p20l4rc73bc2v9g +dblab_pool/branch/main/cls19p20l4rc73bc2v9g/r0 `, cloneNames: []string{}, },