Skip to content

Commit 9325c6b

Browse files
committed
add makeMockDockerClient for testing
1 parent 736e71b commit 9325c6b

File tree

4 files changed

+39
-11
lines changed

4 files changed

+39
-11
lines changed

store/etcdv3/helper.go

+10
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@ import (
55
"os"
66
"strings"
77

8+
enginetypes "github.com/docker/docker/api/types"
89
engineapi "github.com/docker/docker/client"
910
"github.com/docker/go-connections/tlsconfig"
11+
enginemock "github.com/projecteru2/core/3rdmocks"
1012
"github.com/projecteru2/core/types"
1113
log "github.com/sirupsen/logrus"
14+
"github.com/stretchr/testify/mock"
1215
)
1316

1417
func dumpFromString(ca, cert, key *os.File, caStr, certStr, keyStr string) error {
@@ -29,6 +32,13 @@ func dumpFromString(ca, cert, key *os.File, caStr, certStr, keyStr string) error
2932
return nil
3033
}
3134

35+
func makeMockClient() (engineapi.APIClient, error) {
36+
engine := &enginemock.APIClient{}
37+
engine.On("Info", mock.AnythingOfType("*context.emptyCtx")).Return(
38+
enginetypes.Info{NCPU: 1, MemTotal: types.GByte + 100}, nil)
39+
return engine, nil
40+
}
41+
3242
func makeRawClient(endpoint, apiversion string) (engineapi.APIClient, error) {
3343
return engineapi.NewClient(endpoint, apiversion, nil, nil)
3444
}

store/etcdv3/mercury.go

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
const (
1919
nodeTCPPrefixKey = "tcp://"
2020
nodeSockPrefixKey = "unix://"
21+
nodeMockPrefixKey = "mock://"
2122

2223
podInfoKey = "/pod/info/%s"
2324
podNodesKey = "/pod/nodes/%s" // /pod/nodes/pod1/node1 /pod/nodes/pod1/node2

store/etcdv3/node.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ import (
2020
// storage path in etcd is `/pod/nodes/:podname/:nodename`
2121
// node->pod path in etcd is `/node/pod/:nodename`
2222
func (m *Mercury) AddNode(ctx context.Context, name, endpoint, podname, ca, cert, key string, cpu, share int, memory int64, labels map[string]string) (*types.Node, error) {
23-
if !strings.HasPrefix(endpoint, nodeTCPPrefixKey) && !strings.HasPrefix(endpoint, nodeSockPrefixKey) {
23+
if !strings.HasPrefix(endpoint, nodeTCPPrefixKey) &&
24+
!strings.HasPrefix(endpoint, nodeSockPrefixKey) &&
25+
!strings.HasPrefix(endpoint, nodeMockPrefixKey) {
2426
return nil, types.NewDetailedErr(types.ErrNodeFormat,
2527
fmt.Sprintf("endpoint must starts with %s or %s %q",
2628
nodeTCPPrefixKey, nodeSockPrefixKey, endpoint))
@@ -315,6 +317,9 @@ func (m *Mercury) makeDockerClient(ctx context.Context, podname, nodename, endpo
315317
}
316318

317319
func (m *Mercury) doMakeDockerClient(ctx context.Context, nodename, endpoint, ca, cert, key string) (engineapi.APIClient, error) {
320+
if strings.HasPrefix(endpoint, nodeMockPrefixKey) {
321+
return makeMockClient()
322+
}
318323
if m.config.Docker.CertPath == "" || (ca == "" || cert == "" || key == "") {
319324
return makeRawClient(endpoint, m.config.Docker.APIVersion)
320325
}

store/etcdv3/node_test.go

+22-10
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,43 @@ func TestNode(t *testing.T) {
1515
m := NewMercury(t, etcd.RandClient())
1616
ctx := context.Background()
1717
nodename := "testnode"
18+
nodename2 := "testnode2"
1819
endpoint := "tcp://127.0.0.1:2376"
1920
podname := "testpod"
2021
_, err := m.AddPod(ctx, podname, "CPU", "")
2122
assert.NoError(t, err)
2223
cpu := 1
2324
share := 100
2425
memory := int64(100)
26+
m.config.Scheduler.ShareBase = 100
2527
labels := map[string]string{"test": "1"}
2628

29+
// wrong endpoint
2730
_, err = m.AddNode(ctx, nodename, "abc", podname, "", "", "", cpu, share, memory, labels)
2831
assert.Error(t, err)
32+
// wrong because engine not mocked
2933
_, err = m.AddNode(ctx, nodename, endpoint, podname, "", "", "", cpu, share, memory, labels)
30-
// wrong endpoint
3134
assert.Error(t, err)
32-
// TODO there is no way to mock docker client, may be run a docker to do it.
33-
// So we test doAddNode
34-
node, err := m.doAddNode(ctx, nodename, endpoint, podname, "", "", "", cpu, share, memory, labels)
35+
36+
endpoint = "mock://mockdocker"
37+
// AddNode
38+
node, err := m.AddNode(ctx, nodename, endpoint, podname, "", "", "", cpu, share, memory, labels)
3539
assert.NoError(t, err)
3640
assert.Equal(t, node.Name, nodename)
3741
assert.Equal(t, node.CPU["0"], 100)
38-
_, err = m.doAddNode(ctx, nodename, endpoint, podname, "", "", "", cpu, share, memory, labels)
42+
// Addnode again will failed
43+
_, err = m.AddNode(ctx, nodename, endpoint, podname, "", "", "", cpu, share, memory, labels)
3944
assert.Error(t, err)
45+
// Check etcd has node data
4046
key := fmt.Sprintf(nodeInfoKey, podname, nodename)
4147
ev, err := m.GetOne(ctx, key)
4248
assert.NoError(t, err)
49+
// AddNode with mocked engine and default value
50+
node3, err := m.AddNode(ctx, nodename2, endpoint, podname, "", "", "", 0, 0, 0, labels)
51+
assert.NoError(t, err)
52+
assert.Equal(t, node3.CPU["0"], 100)
53+
assert.Equal(t, len(node3.CPU), 1)
54+
assert.Equal(t, node3.MemCap, int64(100))
4355
// GetNode
4456
_, err = m.GetNode(ctx, "nil", nodename)
4557
assert.Error(t, err)
@@ -65,14 +77,14 @@ func TestNode(t *testing.T) {
6577
assert.Equal(t, len(nodes), 0)
6678
nodes, err = m.GetNodesByPod(ctx, podname)
6779
assert.NoError(t, err)
68-
assert.Equal(t, len(nodes), 1)
80+
assert.Equal(t, len(nodes), 2)
6981
savedNode = nodes[0]
7082
assert.Equal(t, savedNode.Name, node.Name)
7183
assert.Equal(t, savedNode.Endpoint, node.Endpoint)
7284
// GetAllNodes
7385
nodes, err = m.GetAllNodes(ctx)
7486
assert.NoError(t, err)
75-
assert.Equal(t, len(nodes), 1)
87+
assert.Equal(t, len(nodes), 2)
7688
savedNode = nodes[0]
7789
assert.Equal(t, savedNode.Name, node.Name)
7890
assert.Equal(t, savedNode.Endpoint, node.Endpoint)
@@ -165,11 +177,11 @@ Dl0aR0+ZbHq5hv5feDdpeKxMxKkKnCu1cl47gKAyFet5nvK7htBUk9aIph8zDBZj
165177
cmag5uyTcIogsd5GyOg06jDD1aCqz3FbTX1KQLeSFQUCTT+m100rohrc2rW5m4Al
166178
RdCPRPt513WozkJZZAjUSP2U
167179
-----END PRIVATE KEY-----`
168-
nodename2 := "n2"
169-
node2, err := m.doAddNode(ctx, nodename2, endpoint, podname, ca, cert, certkey, cpu, share, memory, labels)
180+
nodename3 := "nodename3"
181+
node2, err := m.AddNode(ctx, nodename3, endpoint, podname, ca, cert, certkey, cpu, share, memory, labels)
170182
assert.NoError(t, err)
171183
m.config.Docker.CertPath = "/tmp"
172-
_, err = m.makeDockerClient(ctx, podname, nodename2, endpoint, true)
184+
_, err = m.makeDockerClient(ctx, podname, nodename3, endpoint, true)
173185
assert.NoError(t, err)
174186
// DeleteNode
175187
m.DeleteNode(ctx, node2)

0 commit comments

Comments
 (0)