1
- const got = require ( 'got' ) ;
2
- const Docker = require ( 'dockerode' ) ;
1
+ const got = require ( 'got' )
2
+ const Docker = require ( 'dockerode' )
3
3
4
4
/**
5
5
* Docker Container driver
6
- *
6
+ *
7
7
* Handles the creation and deletation of containers to back Projects
8
- *
9
- * This driver creates Projects backed by Docker
10
- *
8
+ *
9
+ * This driver creates Projects backed by Docker
10
+ *
11
11
* @module docker
12
12
* @memberof forge.containers.drivers
13
- *
13
+ *
14
14
*/
15
15
module . exports = {
16
- /**
16
+ /**
17
17
* Initialises this driver
18
- * @param {string } app - the Vue application
18
+ * @param {string } app - the Vue application
19
19
* @param {object } options - A set of configuration options for the driver
20
20
* @return {forge.containers.ProjectArguments }
21
21
*/
22
22
init : async ( app , options ) => {
23
23
this . _app = app
24
24
this . _docker = new Docker ( {
25
- socketPath : app . config . driver . options ?. socket || '/var/run/docker.sock'
25
+ socketPath : app . config . driver . options ?. socket || '/var/run/docker.sock'
26
26
} )
27
27
this . _options = options
28
28
29
- if ( ! options . registry ) {
30
- options . registry = app . config . driver . options ?. registry || "" //use docker hub
29
+ if ( ! options . registry ) {
30
+ options . registry = app . config . driver . options ?. registry || '' // use docker hub
31
31
}
32
32
33
33
// let projects = await this._app.db.models.DockerProject.findAll()
34
- let projects = await this . _app . db . models . Project . findAll ( )
34
+ const projects = await this . _app . db . models . Project . findAll ( )
35
35
projects . forEach ( async ( project ) => {
36
- const projectSettings = await project . getAllSettings ( ) ;
36
+ // const projectSettings = await project.getAllSettings();
37
37
// let forgeProject = await this._app.db.models.Project.byId(project.id);
38
38
if ( project ) {
39
39
let container
40
40
try {
41
- container = await this . _docker . listContainers ( { filter : `name=${ project . id } ` } )
41
+ container = await this . _docker . listContainers ( { filter : `name=${ project . id } ` } )
42
42
if ( container [ 0 ] ) {
43
43
container = await this . _docker . getContainer ( container [ 0 ] . Id )
44
44
} else {
45
45
container = undefined
46
46
}
47
47
} catch ( err ) {
48
- console . log ( " Container not found" )
48
+ console . log ( ' Container not found' )
49
49
}
50
50
if ( container ) {
51
- let state = await container . inspect ( )
51
+ const state = await container . inspect ( )
52
52
if ( ! state . State . Running ) {
53
- if ( project . state == 'running' ) {
54
- //need to restart existing container
53
+ if ( project . state === 'running' ) {
54
+ // need to restart existing container
55
55
container . start ( )
56
56
}
57
- }
57
+ }
58
58
} else {
59
- //need to create
60
- let name = project . name
59
+ // need to create
61
60
this . _app . containers . _createContainer ( project ,
62
- { } , // JSON.parse(project.options),
63
- this . _options . domain ,
61
+ { } , // JSON.parse(project.options),
62
+ this . _options . domain ,
64
63
this . _options . containers [ project . type ]
65
- ) ;
64
+ )
66
65
}
67
66
}
68
67
} )
@@ -76,11 +75,8 @@ module.exports = {
76
75
* @return {forge.containers.Project }
77
76
*/
78
77
create : async ( project , options ) => {
79
-
80
78
// console.log(options)
81
79
// console.log("---")
82
-
83
-
84
80
return await this . _app . containers . _createContainer ( project , options , this . _options . domain , this . _options . containers [ project . type ] )
85
81
} ,
86
82
/**
@@ -89,33 +85,33 @@ module.exports = {
89
85
* @return {Object }
90
86
*/
91
87
remove : async ( project ) => {
92
- console . log ( " removing " , project . id )
88
+ console . log ( ' removing ' , project . id )
93
89
try {
94
90
// let forgeProject = await this._app.db.models.Project.byId(id);
95
- let container = await this . _docker . getContainer ( project . id ) //forgeProject.name);
91
+ const container = await this . _docker . getContainer ( project . id )
96
92
await container . stop ( )
97
93
await container . remove ( )
98
94
// let project = await this._app.db.models.DockerProject.byId(id)
99
95
// await project.destroy()
100
- return { status : " okay" }
96
+ return { status : ' okay' }
101
97
} catch ( err ) {
102
98
console . log ( err )
103
- return { error : err }
99
+ return { error : err }
104
100
}
105
101
} ,
106
102
/**
107
103
* Retrieves details of a project's container
108
104
* @param {string } id - id of project to query
109
- * @return {Object }
105
+ * @return {Object }
110
106
*/
111
107
details : async ( project ) => {
112
- let infoURL = " http://" + project . id + " :2880/flowforge/info"
108
+ const infoURL = ' http://' + project . id + ' :2880/flowforge/info'
113
109
try {
114
- let info = JSON . parse ( ( await got . get ( infoURL ) ) . body )
115
- return info
110
+ const info = JSON . parse ( ( await got . get ( infoURL ) ) . body )
111
+ return info
116
112
} catch ( err ) {
117
- // TODO
118
- return
113
+ // TODO
114
+ // return
119
115
}
120
116
121
117
// try {
@@ -137,28 +133,28 @@ module.exports = {
137
133
* Returns the settings for the project
138
134
*/
139
135
settings : async ( project ) => {
140
- // let project = await this._app.db.models.DockerProject.byId(id)
141
- const projectSettings = await project . getAllSettings ( )
142
- // let options = JSON.parse(project.options)
143
- let settings = { }
144
- settings . projectID = project . id
145
- settings . port = 1880
146
- settings . rootDir = "/"
147
- settings . userDir = " data"
148
- settings . baseURL = project . url
149
- settings . forgeURL = this . _app . config . base_url
136
+ // let project = await this._app.db.models.DockerProject.byId(id)
137
+ // const projectSettings = await project.getAllSettings()
138
+ // let options = JSON.parse(project.options)
139
+ const settings = { }
140
+ settings . projectID = project . id
141
+ settings . port = 1880
142
+ settings . rootDir = '/'
143
+ settings . userDir = ' data'
144
+ settings . baseURL = project . url
145
+ settings . forgeURL = this . _app . config . base_url
150
146
151
- return settings
147
+ return settings
152
148
} ,
153
149
/**
154
150
* Lists all containers
155
151
* @param {string } filter - rules to filter the containers
156
152
* @return {Object }
157
153
*/
158
154
list : async ( filter ) => {
159
- let containers = await this . _docker . listContainers ( { all : true } )
160
- //console.log(containers)
161
- return containers . map ( c => { return c . Names [ 0 ] . substring ( 1 ) } )
155
+ const containers = await this . _docker . listContainers ( { all : true } )
156
+ // console.log(containers)
157
+ return containers . map ( c => { return c . Names [ 0 ] . substring ( 1 ) } )
162
158
} ,
163
159
/**
164
160
* Starts a Project's container
@@ -173,16 +169,16 @@ module.exports = {
173
169
174
170
// }
175
171
176
- await got . post ( " http://" + project . id + " :2880/flowforge/command" , {
177
- json : {
178
- cmd : " start"
179
- }
172
+ await got . post ( ' http://' + project . id + ' :2880/flowforge/command' , {
173
+ json : {
174
+ cmd : ' start'
175
+ }
180
176
} )
181
177
182
- project . state = " starting"
178
+ project . state = ' starting'
183
179
project . save ( )
184
180
185
- return { status : " okey" }
181
+ return { status : ' okey' }
186
182
} ,
187
183
/**
188
184
* Stops a Proejct's container
@@ -197,48 +193,47 @@ module.exports = {
197
193
198
194
// }
199
195
200
- await got . post ( " http://" + project . id + " :2880/flowforge/command" , {
201
- json : {
202
- cmd : " stop"
203
- }
196
+ await got . post ( ' http://' + project . id + ' :2880/flowforge/command' , {
197
+ json : {
198
+ cmd : ' stop'
199
+ }
204
200
} )
205
- project . state = " stopped" ;
201
+ project . state = ' stopped'
206
202
project . save ( )
207
- return Promise . resolve ( { status : " okay" } )
203
+ return Promise . resolve ( { status : ' okay' } )
208
204
} ,
209
205
/**
210
206
* Restarts a Project's container
211
207
* @param {string } id - id of project to restart
212
208
* @return {forge.Status }
213
209
*/
214
210
restart : async ( project ) => {
215
- await got . post ( " http://" + project . id + " :2880/flowforge/command" , {
216
- json : {
217
- cmd : " restart"
218
- }
211
+ await got . post ( ' http://' + project . id + ' :2880/flowforge/command' , {
212
+ json : {
213
+ cmd : ' restart'
214
+ }
219
215
} )
220
216
221
- return { state : " okay" }
217
+ return { state : ' okay' }
222
218
} ,
223
219
logs : async ( project ) => {
224
220
try {
225
- let result = await got . get ( " http://" + project . id + " :2880/flowforge/logs" ) . json ( )
221
+ const result = await got . get ( ' http://' + project . id + ' :2880/flowforge/logs' ) . json ( )
226
222
return result
227
223
} catch ( err ) {
228
224
console . log ( err )
229
- return ""
225
+ return ''
230
226
}
231
227
} ,
232
228
_createContainer : async ( project , options , domain , image ) => {
233
-
234
- let networks = await this . _docker . listNetworks ( { filters :{ label : [ "com.docker.compose.network=flowforge" ] } } )
229
+ const networks = await this . _docker . listNetworks ( { filters : { label : [ 'com.docker.compose.network=flowforge' ] } } )
235
230
236
231
if ( options . registry ) {
237
- image = options . registry + "/" + image
232
+ image = options . registry + '/' + image
238
233
}
239
- let contOptions = {
234
+ const contOptions = {
240
235
Image : image ,
241
- name : project . id , //options.name,
236
+ name : project . id , // options.name,
242
237
Env : [ ] ,
243
238
Labels : { } ,
244
239
AttachStdin : false ,
@@ -249,59 +244,56 @@ module.exports = {
249
244
}
250
245
}
251
246
if ( options . env ) {
252
- Object . keys ( options . env ) . forEach ( k => {
247
+ Object . keys ( options . env ) . forEach ( k => {
253
248
if ( k ) {
254
- contOptions . Env . push ( k + "=" + options . env [ k ] )
249
+ contOptions . Env . push ( k + '=' + options . env [ k ] )
255
250
}
256
251
} )
257
252
}
258
253
259
- //TODO http/https needs to be dynamic (or we just enforce https?)
260
- //and port number
261
- let projectURL = `http://${ project . name } .${ this . _options . domain } `
254
+ // TODO http/https needs to be dynamic (or we just enforce https?)
255
+ // and port number
256
+ const projectURL = `http://${ project . name } .${ this . _options . domain } `
262
257
263
- authTokens = await project . refreshAuthTokens ( )
258
+ const authTokens = await project . refreshAuthTokens ( )
264
259
265
- //AuthProvider
266
- contOptions . Env . push ( " FORGE_CLIENT_ID=" + authTokens . clientID ) ;
267
- contOptions . Env . push ( " FORGE_CLIENT_SECRET=" + authTokens . clientSecret ) ;
268
- //TODO this needs to come from a central point
269
- contOptions . Env . push ( " FORGE_URL=" + this . _app . config . api_url ) ;
270
- contOptions . Env . push ( `BASE_URL=${ projectURL } ` ) ;
271
- //Only if we are using nginx ingress proxy
272
- contOptions . Env . push ( `VIRTUAL_HOST=${ project . name } .${ domain } ` ) ;
273
- contOptions . Env . push ( ` VIRTUAL_PORT=1880` ) ;
274
- //httpStorage settings
260
+ // AuthProvider
261
+ contOptions . Env . push ( ' FORGE_CLIENT_ID=' + authTokens . clientID )
262
+ contOptions . Env . push ( ' FORGE_CLIENT_SECRET=' + authTokens . clientSecret )
263
+ // TODO this needs to come from a central point
264
+ contOptions . Env . push ( ' FORGE_URL=' + this . _app . config . api_url )
265
+ contOptions . Env . push ( `BASE_URL=${ projectURL } ` )
266
+ // Only if we are using nginx ingress proxy
267
+ contOptions . Env . push ( `VIRTUAL_HOST=${ project . name } .${ domain } ` )
268
+ contOptions . Env . push ( ' VIRTUAL_PORT=1880' )
269
+ // httpStorage settings
275
270
contOptions . Env . push ( `FORGE_PROJECT_ID=${ project . id } ` )
276
271
contOptions . Env . push ( `FORGE_PROJECT_TOKEN=${ authTokens . token } ` )
277
-
272
+
278
273
try {
279
- let container = await this . _docker . createContainer ( contOptions ) ;
280
-
274
+ const container = await this . _docker . createContainer ( contOptions )
281
275
282
276
project . url = projectURL
283
277
project . save ( )
284
278
285
279
container . start ( )
286
- . then ( ( ) => {
287
- project . state = "running" ;
288
- project . save ( ) ;
289
- } )
290
- . catch ( err => {
291
- console . log ( err )
292
- } ) ;
293
-
294
- // console.log("all good")
280
+ . then ( ( ) => {
281
+ project . state = 'running'
282
+ project . save ( )
283
+ } )
284
+ . catch ( err => {
285
+ console . log ( err )
286
+ } )
295
287
296
288
return {
297
- id : project . id ,
298
- status : " okay" ,
289
+ id : project . id ,
290
+ status : ' okay' ,
299
291
url : projectURL ,
300
292
meta : container
301
- } ;
302
- } catch ( err ) {
303
- console . log ( " error:" , err )
304
- return { error : err }
293
+ }
294
+ } catch ( err ) {
295
+ console . log ( ' error:' , err )
296
+ return { error : err }
305
297
}
306
298
}
307
299
}
0 commit comments