mirror of
https://github.com/openstf/stf
synced 2025-10-04 02:09:32 +02:00
Shut down stf local in proper order so that the console doesn't get ugly.
This commit is contained in:
parent
78b768406a
commit
aec95d87a4
2 changed files with 130 additions and 95 deletions
64
lib/cli.js
64
lib/cli.js
|
@ -459,6 +459,7 @@ program
|
|||
var log = logger.createLogger('cli')
|
||||
, options = cliutil.lastArg(arguments)
|
||||
|
||||
var procs = [
|
||||
// app triproxy
|
||||
procutil.fork(__filename, [
|
||||
'triproxy', 'app001'
|
||||
|
@ -466,74 +467,53 @@ program
|
|||
, '--bind-dealer', options.bindAppDealer
|
||||
, '--bind-pull', options.bindAppPull
|
||||
])
|
||||
.catch(function(err) {
|
||||
log.error('app triproxy died', err.stack)
|
||||
})
|
||||
|
||||
// device triproxy
|
||||
procutil.fork(__filename, [
|
||||
, procutil.fork(__filename, [
|
||||
'triproxy', 'dev001'
|
||||
, '--bind-pub', options.bindDevPub
|
||||
, '--bind-dealer', options.bindDevDealer
|
||||
, '--bind-pull', options.bindDevPull
|
||||
])
|
||||
.catch(function(err) {
|
||||
log.error('device triproxy died', err.stack)
|
||||
})
|
||||
|
||||
// processor one
|
||||
procutil.fork(__filename, [
|
||||
, procutil.fork(__filename, [
|
||||
'processor', 'proc001'
|
||||
, '--connect-app-dealer', options.bindAppDealer
|
||||
, '--connect-dev-dealer', options.bindDevDealer
|
||||
])
|
||||
.catch(function(err) {
|
||||
log.error('processor 001 died', err.stack)
|
||||
})
|
||||
|
||||
// processor two
|
||||
procutil.fork(__filename, [
|
||||
, procutil.fork(__filename, [
|
||||
'processor', 'proc002'
|
||||
, '--connect-app-dealer', options.bindAppDealer
|
||||
, '--connect-dev-dealer', options.bindDevDealer
|
||||
])
|
||||
.catch(function(err) {
|
||||
log.error('processor 002 died', err.stack)
|
||||
})
|
||||
|
||||
// reaper one
|
||||
procutil.fork(__filename, [
|
||||
, procutil.fork(__filename, [
|
||||
'reaper', 'reaper001'
|
||||
, '--connect-push', options.bindDevPull
|
||||
])
|
||||
.catch(function(err) {
|
||||
log.error('reaper 001 died', err.stack)
|
||||
})
|
||||
|
||||
// provider
|
||||
procutil.fork(__filename, [
|
||||
, procutil.fork(__filename, [
|
||||
'provider'
|
||||
, '--name', options.provider
|
||||
, '--connect-sub', options.bindDevPub
|
||||
, '--connect-push', options.bindDevPull
|
||||
].concat(cliutil.allUnknownArgs(arguments)))
|
||||
.catch(function(err) {
|
||||
log.error('provider died', err.stack)
|
||||
})
|
||||
|
||||
// auth-mock
|
||||
procutil.fork(__filename, [
|
||||
, procutil.fork(__filename, [
|
||||
'auth-mock'
|
||||
, '--port', options.authPort
|
||||
, '--secret', options.authSecret
|
||||
, '--app-url', util.format('http://localhost:%d/', options.appPort)
|
||||
])
|
||||
.catch(function(err) {
|
||||
log.error('auth-mock died', err.stack)
|
||||
})
|
||||
|
||||
// app
|
||||
procutil.fork(__filename, [
|
||||
, procutil.fork(__filename, [
|
||||
'app'
|
||||
, '--port', options.appPort
|
||||
, '--secret', options.authSecret
|
||||
|
@ -547,8 +527,34 @@ program
|
|||
}
|
||||
return extra
|
||||
}()))
|
||||
]
|
||||
|
||||
function shutdown() {
|
||||
log.info('Shutting down all child processes')
|
||||
procs.forEach(function(proc) {
|
||||
proc.cancel()
|
||||
})
|
||||
return Promise.settle(procs)
|
||||
}
|
||||
|
||||
process.on('SIGINT', function() {
|
||||
log.info('Received SIGINT, waiting for processes to terminate')
|
||||
})
|
||||
|
||||
process.on('SIGTERM', function() {
|
||||
log.info('Received SIGTERM, waiting for processes to terminate')
|
||||
})
|
||||
|
||||
Promise.all(procs)
|
||||
.then(function() {
|
||||
process.exit(0)
|
||||
})
|
||||
.catch(function(err) {
|
||||
log.error('app died', err.stack)
|
||||
log.fatal('Child process had an error', err.stack)
|
||||
return shutdown()
|
||||
.then(function() {
|
||||
process.exit(1)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
|
|
|
@ -4,9 +4,10 @@ var cp = require('child_process')
|
|||
var Promise = require('bluebird')
|
||||
|
||||
function ExitError(code) {
|
||||
Error.call(this, util.format('Exit code "%d"', code))
|
||||
Error.call(this)
|
||||
this.name = 'ExitError'
|
||||
this.code = code
|
||||
this.message = util.format('Exit code "%d"', code)
|
||||
Error.captureStackTrace(this, ExitError)
|
||||
}
|
||||
|
||||
|
@ -17,20 +18,48 @@ module.exports.ExitError = ExitError
|
|||
|
||||
// Export
|
||||
module.exports.fork = function() {
|
||||
var args = arguments
|
||||
var resolver = Promise.defer()
|
||||
var proc = cp.fork.apply(cp, arguments)
|
||||
|
||||
return new Promise(function(resolve, reject) {
|
||||
var proc = cp.fork.apply(cp, args)
|
||||
function sigintListener() {
|
||||
proc.kill('SIGINT')
|
||||
}
|
||||
|
||||
function sigtermListener() {
|
||||
proc.kill('SIGTERM')
|
||||
}
|
||||
|
||||
process.on('SIGINT', sigintListener)
|
||||
process.on('SIGTERM', sigtermListener)
|
||||
|
||||
proc.on('error', function(err) {
|
||||
reject(err)
|
||||
resolver.reject(err)
|
||||
proc.kill()
|
||||
})
|
||||
|
||||
proc.on('exit', function(code) {
|
||||
if (code > 0) {
|
||||
reject(new ExitError(code))
|
||||
proc.on('exit', function(code, signal) {
|
||||
if (signal) {
|
||||
resolver.resolve(code)
|
||||
}
|
||||
else if (code > 0 && code !== 130 && code !== 143) {
|
||||
resolver.reject(new ExitError(code))
|
||||
}
|
||||
else {
|
||||
resolver.resolve(code)
|
||||
}
|
||||
})
|
||||
|
||||
return resolver.promise.cancellable()
|
||||
.finally(function() {
|
||||
process.removeListener('SIGINT', sigintListener)
|
||||
process.removeListener('SIGTERM', sigtermListener)
|
||||
})
|
||||
.catch(Promise.CancellationError, function(err) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
proc.on('exit', function() {
|
||||
resolver.resolve()
|
||||
})
|
||||
proc.kill()
|
||||
})
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue