1 | import test from 'ava'
|
2 | import fs from 'fs'
|
3 | import { Node } from '../lib/node'
|
4 | import { Secret } from '../lib/secret'
|
5 | import { Service } from '../lib/service'
|
6 | import Swarm from '../lib/swarm'
|
7 | import { Task } from '../lib/task'
|
8 | import { Docker } from '../lib/docker'
|
9 |
|
10 | const socket = process.env.DOCKER_SOCKET || '/var/run/docker.sock'
|
11 | const isSocket = fs.existsSync(socket) ? fs.statSync(socket).isSocket() : false
|
12 | const docker = isSocket
|
13 | ? new Docker()
|
14 | : new Docker({ socketPath: socket })
|
15 |
|
16 | const createService = _ =>
|
17 | docker.service.create({
|
18 | "Name": "redis-" + Date.now(),
|
19 | "TaskTemplate": {
|
20 | "ContainerSpec": {
|
21 | "Image": "redis"
|
22 | },
|
23 | "Resources": {
|
24 | "Limits": {},
|
25 | "Reservations": {}
|
26 | },
|
27 | "RestartPolicy": {},
|
28 | "Placement": {}
|
29 | },
|
30 | "Mode": {
|
31 | "Replicated": {
|
32 | "Replicas": 1
|
33 | }
|
34 | },
|
35 | "UpdateConfig": {
|
36 | "Parallelism": 1
|
37 | },
|
38 | "EndpointSpec": {
|
39 | "ExposedPorts": [{
|
40 | "Protocol": "tcp",
|
41 | "Port": 6379
|
42 | }]
|
43 | }
|
44 | })
|
45 |
|
46 | test.before(async t => {
|
47 | const node = await docker.swarm.init({
|
48 | "ListenAddr": "127.0.0.1:4500",
|
49 | "AdvertiseAddr": "127.0.0.1:4500",
|
50 | "ForceNewCluster": true,
|
51 | "Spec": {
|
52 | "AcceptancePolicy": {
|
53 | "Policies": [{
|
54 | "Role": "MANAGER",
|
55 | "Autoaccept": false
|
56 | }, {
|
57 | "Role": "WORKER",
|
58 | "Autoaccept": true
|
59 | }]
|
60 | },
|
61 | "Orchestration": {},
|
62 | "Raft": {},
|
63 | "Dispatcher": {},
|
64 | "CAConfig": {}
|
65 | }
|
66 | })
|
67 | t.is(node.constructor, Node)
|
68 | })
|
69 |
|
70 | test.after('cleanup', t => {
|
71 | docker.swarm.leave({ 'force': true })
|
72 | })
|
73 |
|
74 | test('inspect', async t => {
|
75 | const swarm = await docker.swarm.status()
|
76 | t.is(swarm.constructor, Swarm)
|
77 | })
|
78 |
|
79 | test('create-service', async t => {
|
80 | const service = await createService()
|
81 | t.is(service.constructor, Service)
|
82 | })
|
83 |
|
84 | test('list-services', async t => {
|
85 | const service = await createService()
|
86 | const services = await docker.service.list()
|
87 | t.is(services.constructor, Array)
|
88 | t.not(services.length, 0)
|
89 | })
|
90 |
|
91 | test('inspect-service', async t => {
|
92 | const service = await (await createService()).status()
|
93 | t.is(service.constructor, Service)
|
94 | })
|
95 |
|
96 | test('update-service', async t => {
|
97 | const service = await (await createService()).status()
|
98 | const data = service.data.Spec
|
99 | data.version = service.data.Version.Index
|
100 | const res = await service.update(data)
|
101 | t.is(res.constructor, Service)
|
102 | })
|
103 |
|
104 | test('delete-service', async t => {
|
105 | const service = await (await createService()).status()
|
106 | t.notThrows(service.remove())
|
107 | })
|
108 |
|
109 | test('logs-service', async t => {
|
110 | const res = await (await createService()).logs({stdout: true})
|
111 | t.is(res.constructor, String)
|
112 | })
|
113 |
|
114 |
|
115 | test('list-tasks', async t => {
|
116 | const tasks = await docker.task.list()
|
117 | t.is(tasks.constructor, Array)
|
118 | })
|
119 |
|
120 | test('list-nodes', async t => {
|
121 | const nodes = await docker.node.list()
|
122 | t.is(nodes.constructor, Array)
|
123 | t.is(nodes[0].constructor, Node)
|
124 | })
|
125 |
|
126 | test('inspect-node', async t => {
|
127 | const nodes = await docker.node.list()
|
128 | const node = await nodes[0].status()
|
129 | t.is(node.constructor, Node)
|
130 | })
|
131 |
|
132 | test('remove-node', async t => {
|
133 | const nodes = await docker.node.list()
|
134 | const node = await nodes[0].status()
|
135 | t.throws(node.remove())
|
136 | })
|
137 |
|
138 | test('list-secret', async t => {
|
139 | const secrets = await docker.secret.list()
|
140 | t.is(secrets.constructor, Array)
|
141 | })
|
142 |
|
143 | test('create-secret', async t => {
|
144 | const secret = await docker.secret.create({
|
145 | "Name": "app-key.crt",
|
146 | "Labels": {
|
147 | "foo": "bar"
|
148 | },
|
149 | "Data": "VEhJUyBJUyBOT1QgQSBSRUFMIENFUlRJRklDQVRFCg=="
|
150 | })
|
151 |
|
152 | t.is(secret.constructor, Secret)
|
153 | t.notThrows(secret.remove())
|
154 | })
|
155 |
|
156 | test('status-secret', async t => {
|
157 | const secret = await docker.secret.create({
|
158 | "Name": "app-key1.crt",
|
159 | "Data": "VEhJUyBJUyBOT1QgQSBSRUFMIENFUlRJRklDQVRFCg=="
|
160 | })
|
161 | const secretStatus = await secret.status()
|
162 |
|
163 | t.is(secretStatus.constructor, Secret)
|
164 | t.notThrows(secret.remove())
|
165 | })
|