Skip to content

Commit c7437e5

Browse files
committed
DeviceManager/LVM: Added unit tests
1 parent fbbf15c commit c7437e5

File tree

6 files changed

+183
-2
lines changed

6 files changed

+183
-2
lines changed

Gopkg.lock

Lines changed: 9 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
@@ -55,6 +55,10 @@ func NewPmemDeviceManagerLVM() (PmemDeviceManager, error) {
5555
}
5656
ctx.Free()
5757

58+
return NewPmemDeviceManagerLVMForVGs(volumeGroups)
59+
}
60+
61+
func NewPmemDeviceManagerLVMForVGs(volumeGroups []string) (PmemDeviceManager, error) {
5862
devices, err := listDevices(volumeGroups...)
5963
if err != nil {
6064
return nil, err
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
/*
2+
Copyright 2019 Intel Corporation.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
package pmdmanager_test
7+
8+
import (
9+
"io/ioutil"
10+
"os"
11+
"testing"
12+
13+
pmdmanager "github.com/intel/pmem-csi/pkg/pmem-device-manager"
14+
pmemexec "github.com/intel/pmem-csi/pkg/pmem-exec"
15+
. "github.com/onsi/ginkgo"
16+
. "github.com/onsi/gomega"
17+
losetup "gopkg.in/freddierice/go-losetup.v1"
18+
)
19+
20+
const (
21+
vgname = "test-group"
22+
nsmode = "fsdax"
23+
vgsize = uint64(1) * 1024 * 1024 * 1024 // 1Gb
24+
)
25+
26+
func TestPmdLVM(t *testing.T) {
27+
RegisterFailHandler(Fail)
28+
RunSpecs(t, "PMEM LVM Suite")
29+
}
30+
31+
var _ = Describe("DeviceManage LVM", func() {
32+
var dm pmdmanager.PmemDeviceManager
33+
var vg *testVGS
34+
var err error
35+
36+
BeforeEach(func() {
37+
vg, err = createTestVGS(vgname, nsmode, vgsize)
38+
Expect(err).Should(BeNil(), "Failed to create volume group")
39+
40+
dm, err = pmdmanager.NewPmemDeviceManagerLVMForVGs([]string{vg.name})
41+
Expect(err).Should(BeNil(), "Failed to create LVM device manager")
42+
})
43+
44+
AfterEach(func() {
45+
if err = vg.Clean(); err != nil {
46+
// Failed to clean
47+
}
48+
})
49+
50+
Context("CreateDevice", func() {
51+
It("Should create a new device", func() {
52+
name := "test-dev"
53+
size := uint64(2) * 1024 * 1024 // 2Mb
54+
err := dm.CreateDevice(name, size, nsmode)
55+
Expect(err).Should(BeNil(), "Failed to create new device")
56+
57+
dev, err := dm.GetDevice(name)
58+
Expect(err).Should(BeNil(), "Failed to retrieve device info")
59+
Expect(dev.Name).Should(Equal(name), "Name mismatch")
60+
Expect(dev.Size >= size).Should(BeTrue(), "Size mismatch")
61+
Expect(dev.Path).ShouldNot(BeNil(), "Null device path")
62+
})
63+
})
64+
})
65+
66+
type testVGS struct {
67+
name string
68+
loopDev losetup.Device
69+
backedFile string
70+
}
71+
72+
func createTestVGS(vgname, nsmode string, size uint64) (*testVGS, error) {
73+
var err error
74+
var file *os.File
75+
var dev losetup.Device
76+
77+
By("Creating temporary file")
78+
if file, err = ioutil.TempFile("", "test-lvm-dev"); err != nil {
79+
return nil, err
80+
}
81+
82+
defer func() {
83+
if err != nil && file != nil {
84+
os.Remove(file.Name())
85+
}
86+
}()
87+
88+
By("Closing file")
89+
if err = file.Close(); err != nil {
90+
return nil, err
91+
}
92+
93+
By("File truncating")
94+
if err = os.Truncate(file.Name(), int64(size)); err != nil {
95+
return nil, err
96+
}
97+
98+
By("losetup.Attach")
99+
dev, err = losetup.Attach(file.Name(), 0, false)
100+
if err != nil {
101+
return nil, err
102+
}
103+
104+
defer func() {
105+
if err != nil {
106+
By("losetup.Detach")
107+
dev.Detach() // nolint errcheck
108+
}
109+
}()
110+
111+
By("Creating volume group")
112+
// TODO: resuse vgm code
113+
cmdArgs := []string{"--force", vgname, dev.Path()}
114+
if _, err := pmemexec.RunCommand("vgcreate", cmdArgs...); err != nil { // nolint gosec
115+
return nil, err
116+
}
117+
118+
defer func() {
119+
if err != nil {
120+
By("Removing volume group")
121+
pmemexec.RunCommand("vgremove", "--force", vgname)
122+
}
123+
}()
124+
125+
By("Append tag(s) to volume group")
126+
if _, err = pmemexec.RunCommand("vgchange", "--addtag", string(nsmode), vgname); err != nil {
127+
return nil, err
128+
}
129+
130+
return &testVGS{
131+
name: vgname,
132+
loopDev: dev,
133+
backedFile: file.Name(),
134+
}, nil
135+
}
136+
137+
func (vg *testVGS) Clean() error {
138+
By("Removing volume group")
139+
if _, err := pmemexec.RunCommand("vgremove", "--force", vg.name); err != nil {
140+
return err
141+
}
142+
143+
By("losetup.Detach()")
144+
if err := vg.loopDev.Detach(); err != nil {
145+
return err
146+
}
147+
148+
By("Removing temp file")
149+
if err := os.Remove(vg.backedFile); err != nil {
150+
return err
151+
}
152+
153+
return nil
154+
}

test/test.make

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,21 @@ test_e2e: start
117117

118118
# Execute simple unit tests.
119119
.PHONY: run_tests
120-
test: run_tests
120+
test: run_tests run_device_manager_tests
121121
RUN_TESTS = TEST_WORK=$(abspath _work) \
122-
$(TEST_CMD) $(shell go list $(TEST_ARGS) | sed -e 's;$(IMPORT_PATH);.;')
122+
$(TEST_CMD) $(shell go list $(TEST_ARGS) | grep -v pmem-device-manager | sed -e 's;$(IMPORT_PATH);.;')
123+
RUN_DM_TESTS = \
124+
$(TEST_CMD) -c ./pkg/pmem-device-manager -o _work/device-manager-tests && \
125+
docker run -ti --privileged -e http_proxy=${HTTP_PROXY} -e https_proxy=${HTTPS_PROXY} -v $(PWD)/_work:/tests -v "/usr/lib:/usr/local/lib" \
126+
golang bash -c "apt-get update && apt-get install -y lvm2 libkmod2 && \
127+
printf 'global {use_lvmetad = 0}\nactivation { udev_sync = 0 udev_rules = 0 }'>/etc/lvm/lvm.conf && \
128+
/tests/device-manager-tests"
123129
run_tests: _work/pmem-ca/.ca-stamp _work/evil-ca/.ca-stamp
124130
$(RUN_TESTS)
125131

132+
run_device_manager_tests:
133+
$(RUN_DM_TESTS)
134+
126135
_work/%/.ca-stamp: test/setup-ca.sh _work/.setupcfssl-stamp
127136
rm -rf $(@D)
128137
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
@@ -57,6 +57,7 @@ golang.org/x/time;golang time;BSD 3-clause "New" or "Revised" License
5757
google.golang.org/appengine;Golang appengine;Apache License 2.0
5858
google.golang.org/genproto;Google go-genproto;Apache License 2.0
5959
google.golang.org/grpc;grpc grpc-go;Apache License 2.0
60+
gopkg.in/freddierice/go-losetup.v1; Go losetup; MIt License
6061
gopkg.in/fsnotify.v1;fsnotify;BSD 3-clause "New" or "Revised" License
6162
gopkg.in/inf.v0;go-inf;BSD 3-clause "New" or "Revised" License
6263
gopkg.in/square/go-jose.v2;go-jose;Apache License 2.0

0 commit comments

Comments
 (0)