Skip to content
This repository was archived by the owner on Oct 22, 2024. It is now read-only.

Commit 368d73d

Browse files
committed
DeviceManager/LVM: Added unit tests
1 parent 161848e commit 368d73d

File tree

14 files changed

+602
-2
lines changed

14 files changed

+602
-2
lines changed

Gopkg.lock

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Gopkg.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@
4444
name = "github.com/kubernetes-csi/csi-test"
4545
version = "2.1.0"
4646

47+
[[constraint]]
48+
name = "gopkg.in/freddierice/go-losetup.v1"
49+
branch = "v1"
50+
4751
# We have to select the right version by name because of the "kubernetes-" prefix, dep doesn't
4852
# recognize these as normal releases. Upstream is considering to change the tagging,
4953
# see https://github.com/kubernetes/kubernetes/issues/72638.

pkg/pmem-device-manager/pmd-lvm.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ func NewPmemDeviceManagerLVM() (PmemDeviceManager, error) {
6161
}
6262
ctx.Free()
6363

64+
return NewPmemDeviceManagerLVMForVGs(volumeGroups)
65+
}
66+
67+
func NewPmemDeviceManagerLVMForVGs(volumeGroups []string) (PmemDeviceManager, error) {
6468
devices, err := listDevices(volumeGroups...)
6569
if err != nil {
6670
return nil, err
Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
1+
/*
2+
Copyright 2019 Intel Corporation.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
package pmdmanager_test
7+
8+
import (
9+
"fmt"
10+
"io/ioutil"
11+
"math/rand"
12+
"os"
13+
"testing"
14+
15+
pmdmanager "github.com/intel/pmem-csi/pkg/pmem-device-manager"
16+
pmemexec "github.com/intel/pmem-csi/pkg/pmem-exec"
17+
. "github.com/onsi/ginkgo"
18+
. "github.com/onsi/gomega"
19+
losetup "gopkg.in/freddierice/go-losetup.v1"
20+
)
21+
22+
const (
23+
vgname = "test-group"
24+
nsmode = "fsdax"
25+
vgsize = uint64(1) * 1024 * 1024 * 1024 // 1Gb
26+
)
27+
28+
func TestPmdLVM(t *testing.T) {
29+
RegisterFailHandler(Fail)
30+
RunSpecs(t, "PMEM LVM Suite")
31+
}
32+
33+
var _ = Describe("DeviceManage LVM", func() {
34+
var dm pmdmanager.PmemDeviceManager
35+
var vg *testVGS
36+
var err error
37+
38+
BeforeEach(func() {
39+
vg, err = createTestVGS(vgname, nsmode, vgsize)
40+
Expect(err).Should(BeNil(), "Failed to create volume group")
41+
42+
dm, err = pmdmanager.NewPmemDeviceManagerLVMForVGs([]string{vg.name})
43+
Expect(err).Should(BeNil(), "Failed to create LVM device manager")
44+
})
45+
46+
AfterEach(func() {
47+
if err = vg.Clean(); err != nil {
48+
// Failed to clean
49+
}
50+
})
51+
52+
Context("LVM", func() {
53+
It("Should create a new device", func() {
54+
name := "test-dev"
55+
size := uint64(2) * 1024 * 1024 // 2Mb
56+
err := dm.CreateDevice(name, size, nsmode)
57+
Expect(err).Should(BeNil(), "Failed to create new device")
58+
59+
dev, err := dm.GetDevice(name)
60+
Expect(err).Should(BeNil(), "Failed to retrieve device info")
61+
Expect(dev.Name).Should(Equal(name), "Name mismatch")
62+
Expect(dev.Size >= size).Should(BeTrue(), "Size mismatch")
63+
Expect(dev.Path).ShouldNot(BeNil(), "Null device path")
64+
})
65+
66+
It("Should fail to retrieve non-existent device", func() {
67+
_, err := dm.GetDevice("unknown")
68+
Expect(err).ShouldNot(BeNil(), "Error expected")
69+
//Expect(os.IsNotExist(err.Cause())).Should(BeTrue(), "expected error is os.ErrNotExist")
70+
//Expect(dev).Should(BeNil(), "returned device should be nil")
71+
})
72+
73+
It("Should list devices", func() {
74+
max_devices := 4
75+
max_deletes := 2
76+
sizes := map[string]uint64{}
77+
78+
list, err := dm.ListDevices()
79+
Expect(err).Should(BeNil(), "Failed to list devices")
80+
Expect(len(list)).Should(BeEquivalentTo(0), "count mismatch")
81+
82+
for i := 1; i <= max_devices; i++ {
83+
name := fmt.Sprintf("list-dev-%d", i)
84+
sizes[name] = rand.Uint64() % 16 * 1024 * 1024
85+
err := dm.CreateDevice(name, sizes[name], nsmode)
86+
Expect(err).Should(BeNil(), "Failed to create new device")
87+
}
88+
list, err = dm.ListDevices()
89+
Expect(err).Should(BeNil(), "Failed to list devices")
90+
Expect(len(list)).Should(BeEquivalentTo(max_devices), "count mismatch")
91+
for _, dev := range list {
92+
size, ok := sizes[dev.Name]
93+
Expect(ok).Should(BeTrue(), "Unexpected device name:"+dev.Name)
94+
Expect(dev.Size >= size).Should(BeTrue(), "Device size mismatch")
95+
}
96+
97+
for i := 1; i <= max_deletes; i++ {
98+
name := fmt.Sprintf("list-dev-%d", i)
99+
delete(sizes, name)
100+
err = dm.DeleteDevice(name, false)
101+
Expect(err).Should(BeNil(), "Error while deleting device '"+name+"'")
102+
}
103+
104+
// List device after deleting a device
105+
list, err = dm.ListDevices()
106+
Expect(err).Should(BeNil(), "Failed to list devices")
107+
Expect(len(list)).Should(BeEquivalentTo(max_devices-max_deletes), "count mismatch")
108+
for _, dev := range list {
109+
size, ok := sizes[dev.Name]
110+
Expect(ok).Should(BeTrue(), "Unexpected device name:"+dev.Name)
111+
Expect(dev.Size >= size).Should(BeTrue(), "Device size mismatch")
112+
}
113+
})
114+
115+
It("Should delete devices", func() {
116+
name := "delete-dev"
117+
size := uint64(2) * 1024 * 1024 // 2Mb
118+
err := dm.CreateDevice(name, size, nsmode)
119+
Expect(err).Should(BeNil(), "Failed to create new device")
120+
121+
dev, err := dm.GetDevice(name)
122+
Expect(err).Should(BeNil(), "Failed to retrieve device info")
123+
Expect(dev.Name).Should(Equal(name), "Name mismatch")
124+
Expect(dev.Size >= size).Should(BeTrue(), "Size mismatch")
125+
Expect(dev.Path).ShouldNot(BeNil(), "Null device path")
126+
127+
err = dm.DeleteDevice(name, true)
128+
Expect(err).Should(BeNil(), "Failed to delete device")
129+
130+
_, err = dm.GetDevice(name)
131+
Expect(err).ShouldNot(BeNil(), "GetDevice() should fail on deleted device")
132+
//Expect(os.IsNotExist(errors.Cause())).Should(BeTrue(), "expected error is os.ErrNotExist")
133+
//Expect(dev).Should(BeNil(), "returned device should be nil")
134+
135+
err = dm.DeleteDevice(name, true)
136+
Expect(err).Should(BeNil(), "DeleteDevice() is not idempotent")
137+
})
138+
})
139+
})
140+
141+
type testVGS struct {
142+
name string
143+
loopDev losetup.Device
144+
backedFile string
145+
}
146+
147+
func createTestVGS(vgname, nsmode string, size uint64) (*testVGS, error) {
148+
var err error
149+
var file *os.File
150+
var dev losetup.Device
151+
152+
By("Creating temporary file")
153+
if file, err = ioutil.TempFile("", "test-lvm-dev"); err != nil {
154+
return nil, err
155+
}
156+
157+
defer func() {
158+
if err != nil && file != nil {
159+
os.Remove(file.Name())
160+
}
161+
}()
162+
163+
By("Closing file")
164+
if err = file.Close(); err != nil {
165+
return nil, err
166+
}
167+
168+
By("File truncating")
169+
if err = os.Truncate(file.Name(), int64(size)); err != nil {
170+
return nil, err
171+
}
172+
173+
By("losetup.Attach")
174+
dev, err = losetup.Attach(file.Name(), 0, false)
175+
if err != nil {
176+
return nil, err
177+
}
178+
179+
defer func() {
180+
if err != nil {
181+
By("losetup.Detach")
182+
dev.Detach() // nolint errcheck
183+
}
184+
}()
185+
186+
By("Creating volume group")
187+
// TODO: resuse vgm code
188+
cmdArgs := []string{"--force", vgname, dev.Path()}
189+
if _, err := pmemexec.RunCommand("vgcreate", cmdArgs...); err != nil { // nolint gosec
190+
return nil, err
191+
}
192+
193+
defer func() {
194+
if err != nil {
195+
By("Removing volume group")
196+
pmemexec.RunCommand("vgremove", "--force", vgname)
197+
}
198+
}()
199+
200+
By("Append tag(s) to volume group")
201+
if _, err = pmemexec.RunCommand("vgchange", "--addtag", string(nsmode), vgname); err != nil {
202+
return nil, err
203+
}
204+
205+
return &testVGS{
206+
name: vgname,
207+
loopDev: dev,
208+
backedFile: file.Name(),
209+
}, nil
210+
}
211+
212+
func (vg *testVGS) Clean() error {
213+
By("Removing volume group")
214+
if _, err := pmemexec.RunCommand("vgremove", "--force", vg.name); err != nil {
215+
return err
216+
}
217+
218+
By("losetup.Detach()")
219+
if err := vg.loopDev.Detach(); err != nil {
220+
return err
221+
}
222+
223+
By("Removing temp file")
224+
if err := os.Remove(vg.backedFile); err != nil {
225+
return err
226+
}
227+
228+
return nil
229+
}

test/test.make

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
TEST_CMD=go test
22
TEST_ARGS=$(IMPORT_PATH)/pkg/...
3+
SUDO=$(shell [ $$(id -u) -eq 0 ] && echo env || echo sudo)
34

45
.PHONY: vet
56
test: vet
@@ -127,12 +128,17 @@ test_e2e: start
127128

128129
# Execute simple unit tests.
129130
.PHONY: run_tests
130-
test: run_tests
131+
test: run_tests run_device_manager_tests
131132
RUN_TESTS = TEST_WORK=$(abspath _work) \
132-
$(TEST_CMD) $(shell go list $(TEST_ARGS) | sed -e 's;$(IMPORT_PATH);.;')
133+
$(TEST_CMD) $(shell go list $(TEST_ARGS) | grep -v pmem-device-manager | sed -e 's;$(IMPORT_PATH);.;')
134+
RUN_DM_TESTS = \
135+
$(TEST_CMD) ./pkg/pmem-device-manager -exec $(SUDO)
133136
run_tests: _work/pmem-ca/.ca-stamp _work/evil-ca/.ca-stamp
134137
$(RUN_TESTS)
135138

139+
run_device_manager_tests:
140+
$(RUN_DM_TESTS)
141+
136142
_work/%/.ca-stamp: test/setup-ca.sh _work/.setupcfssl-stamp
137143
rm -rf $(@D)
138144
WORKDIR='$(@D)' PATH='$(PWD)/_work/bin/:$(PATH)' CA='$*' EXTRA_CNS="wrong-node-controller" $<

vendor-bom.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ golang.org/x/time;golang time;BSD 3-clause "New" or "Revised" License
5252
google.golang.org/appengine;Golang appengine;Apache License 2.0
5353
google.golang.org/genproto;Google go-genproto;Apache License 2.0
5454
google.golang.org/grpc;grpc grpc-go;Apache License 2.0
55+
gopkg.in/freddierice/go-losetup.v1; Go losetup; MIt License
5556
gopkg.in/fsnotify.v1;fsnotify;BSD 3-clause "New" or "Revised" License
5657
gopkg.in/inf.v0;go-inf;BSD 3-clause "New" or "Revised" License
5758
gopkg.in/square/go-jose.v2;go-jose;Apache License 2.0

vendor/gopkg.in/freddierice/go-losetup.v1/.gitignore

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/gopkg.in/freddierice/go-losetup.v1/LICENSE

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/gopkg.in/freddierice/go-losetup.v1/README.md

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)