Skip to content

Commit 903927c

Browse files
committed
Merge branch 'unit-tests/create_container' into 'master'
[unit test]: create & delete container See merge request !118
2 parents 6cb8039 + 62ae115 commit 903927c

18 files changed

+797
-112
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ default.etcd/*
88
vendor/*
99
clean.sh
1010
.vscode/*
11+
*.test

Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@ build: deps
2323
go build -ldflags "$(GO_LDFLAGS)" -a -tags netgo -installsuffix netgo -o eru-core
2424

2525
test: deps
26+
sed -i "143s/\*http.Transport/http.RoundTripper/" ./vendor/github.com/docker/docker/client/client.go
2627
go vet `go list ./... | grep -v '/vendor/'`
2728
go test -v `glide nv`

cluster/calcium/backup.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,13 @@ func (c *calcium) Backup(id, srcPath string) (*types.BackupMessage, error) {
2222
}
2323
log.Debugf("Backup %s for container %s", srcPath, id)
2424
container, err := c.GetContainer(id)
25+
if err != nil {
26+
return nil, err
27+
}
2528
node, err := c.GetNode(container.Podname, container.Nodename)
29+
if err != nil {
30+
return nil, err
31+
}
2632
ctx := utils.ToDockerContext(node.Engine)
2733

2834
resp, stat, err := node.Engine.CopyFromContainer(ctx, container.ID, srcPath)
@@ -40,7 +46,7 @@ func (c *calcium) Backup(id, srcPath string) (*types.BackupMessage, error) {
4046
}
4147
now := time.Now().Format("2006.01.02.15.04.05")
4248
baseDir := filepath.Join(c.config.BackupDir, appname, entrypoint)
43-
err = os.MkdirAll(baseDir, os.FileMode(0400))
49+
err = os.MkdirAll(baseDir, os.FileMode(0700)) // drwx------
4450
if err != nil {
4551
log.Errorf("Error during mkdir %s, %v", baseDir, err)
4652
return nil, err
@@ -52,6 +58,7 @@ func (c *calcium) Backup(id, srcPath string) (*types.BackupMessage, error) {
5258
file, err := os.Create(backupFile)
5359
if err != nil {
5460
log.Errorf("Error during create backup file %s: %v", backupFile, err)
61+
return nil, err
5562
}
5663
defer file.Close()
5764

@@ -67,5 +74,6 @@ func (c *calcium) Backup(id, srcPath string) (*types.BackupMessage, error) {
6774
return &types.BackupMessage{
6875
Status: "ok",
6976
Size: stat.Size,
77+
Path: backupFile,
7078
}, nil
7179
}

cluster/calcium/backup_test.go

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package calcium
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestBackup(t *testing.T) {
11+
initMockConfig()
12+
13+
srcPath := "/tmp"
14+
_, err = mockc.Backup(mockID, srcPath)
15+
assert.Error(t, err)
16+
assert.Equal(t, err.Error(), "BackupDir not set")
17+
18+
config.BackupDir = "/tmp"
19+
mockc, err = New(config)
20+
assert.NoError(t, err)
21+
22+
mockc.SetStore(mockStore)
23+
msg, err := mockc.Backup(mockID, srcPath)
24+
assert.NoError(t, err)
25+
26+
assert.Equal(t, msg.Status, "ok")
27+
t.Log("Backup to ", msg.Path)
28+
29+
os.RemoveAll(msg.Path)
30+
}

cluster/calcium/build_image_test.go

+22
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,25 @@ func TestSingleBuildDockerFile(t *testing.T) {
105105
f.Close()
106106
os.Remove(f.Name())
107107
}
108+
109+
func TestBuildImageError(t *testing.T) {
110+
initMockConfig()
111+
reponame := "git@github.com:docker/jira-test.git"
112+
_, err := mockc.BuildImage(reponame, "x-version", "998", "")
113+
assert.Error(t, err)
114+
assert.Contains(t, err.Error(), "No build pod set in config")
115+
116+
mockc.config.Docker.BuildPod = "dev_pod"
117+
_, err = mockc.BuildImage(reponame, "x-version", "998", "")
118+
assert.Contains(t, err.Error(), "Public Key not found")
119+
}
120+
121+
func TestCreateImageTag(t *testing.T) {
122+
initMockConfig()
123+
appname := "appname"
124+
version := "version"
125+
imageTag := createImageTag(mockc.config, appname, version)
126+
cfg := mockc.config.Docker
127+
expectTag := fmt.Sprintf("%s/%s/%s:%s", cfg.Hub, cfg.HubPrefix, appname, version)
128+
assert.Equal(t, expectTag, imageTag)
129+
}
+144
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
package calcium
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/stretchr/testify/mock"
8+
9+
"github.com/docker/docker/client"
10+
"github.com/stretchr/testify/assert"
11+
"gitlab.ricebook.net/platform/core/types"
12+
)
13+
14+
func TestPullImage(t *testing.T) {
15+
initMockConfig()
16+
17+
nodes, err := mockc.store.GetAllNodes()
18+
if err != nil || len(nodes) == 0 {
19+
t.Fatal(err)
20+
}
21+
22+
if err := pullImage(nodes[0], image); err != nil {
23+
t.Fatal(err)
24+
}
25+
}
26+
27+
func TestCreateContainerWithMemPrior(t *testing.T) {
28+
initMockConfig()
29+
30+
specs := types.Specs{
31+
Appname: "root",
32+
Entrypoints: map[string]types.Entrypoint{
33+
"test": types.Entrypoint{
34+
Command: "sleep 9999",
35+
Ports: []types.Port{"6006/tcp"},
36+
HealthCheckPort: 6006,
37+
HealthCheckUrl: "",
38+
HealthCheckExpectedCode: 200,
39+
},
40+
},
41+
Build: []string{""},
42+
Base: image,
43+
}
44+
opts := &types.DeployOptions{
45+
Appname: "root",
46+
Image: image,
47+
Podname: podname,
48+
Entrypoint: "test",
49+
Count: 3,
50+
Memory: 268435456,
51+
CPUQuota: 1,
52+
}
53+
54+
// Create Container with memory prior
55+
t.Log("Create containers with memory prior")
56+
createCh, err := mockc.createContainerWithMemoryPrior(specs, opts)
57+
assert.NoError(t, err)
58+
ids := []string{}
59+
for msg := range createCh {
60+
assert.True(t, msg.Success)
61+
ids = append(ids, msg.ContainerID)
62+
fmt.Printf("Get Container ID: %s\n", msg.ContainerID)
63+
}
64+
65+
// get containers
66+
clnt, _ := client.NewClient("http://127.0.0.1", "v1.29", mockDockerHTTPClient(), nil)
67+
cs := []types.Container{}
68+
for _, id := range ids {
69+
c := types.Container{
70+
ID: id,
71+
Engine: clnt,
72+
}
73+
cs = append(cs, c)
74+
mockStore.On("GetContainer", id).Return(&c, nil)
75+
}
76+
mockStore.On("GetContainers", ids).Return(&cs, nil)
77+
78+
// Remove Container
79+
t.Log("Remove containers")
80+
removeCh, err := mockc.RemoveContainer(ids)
81+
assert.NoError(t, err)
82+
for msg := range removeCh {
83+
fmt.Printf("ID: %s, Message: %s\n", msg.ContainerID, msg.Message)
84+
assert.True(t, msg.Success)
85+
}
86+
}
87+
88+
func TestClean(t *testing.T) {
89+
initMockConfig()
90+
91+
// delete pod
92+
err := mockc.store.DeletePod(podname, false)
93+
assert.Error(t, err)
94+
assert.Contains(t, err.Error(), "still has nodes, delete the nodes first")
95+
96+
// force delete
97+
err = mockc.store.DeletePod(podname, true)
98+
assert.NoError(t, err)
99+
100+
}
101+
102+
func TestCreateContainerWithCPUPrior(t *testing.T) {
103+
initMockConfig()
104+
105+
specs := types.Specs{
106+
Appname: "root",
107+
Entrypoints: map[string]types.Entrypoint{
108+
"test": types.Entrypoint{
109+
Command: "sleep 9999",
110+
Ports: []types.Port{"6006/tcp"},
111+
HealthCheckPort: 6006,
112+
HealthCheckUrl: "",
113+
HealthCheckExpectedCode: 200,
114+
},
115+
},
116+
Build: []string{""},
117+
Base: image,
118+
}
119+
opts := &types.DeployOptions{
120+
Appname: "root",
121+
Image: image,
122+
Podname: podname,
123+
Entrypoint: "test",
124+
Count: 3,
125+
Memory: 268435456,
126+
CPUQuota: 1,
127+
}
128+
129+
// update node
130+
mockStore.On("UpdateNode", mock.MatchedBy(func(input *types.Node) bool {
131+
return true
132+
})).Return(nil)
133+
134+
// Create Container with memory prior
135+
t.Log("Create containers with memory prior")
136+
createCh, err := mockc.createContainerWithCPUPrior(specs, opts)
137+
assert.NoError(t, err)
138+
ids := []string{}
139+
for msg := range createCh {
140+
assert.True(t, msg.Success)
141+
ids = append(ids, msg.ContainerID)
142+
fmt.Printf("Get Container ID: %s\n", msg.ContainerID)
143+
}
144+
}

0 commit comments

Comments
 (0)