1
0
Fork 0
mirror of https://github.com/openstf/stf synced 2025-10-04 10:19:30 +02:00

add new device-reserve and device-release endpoints

This commit is contained in:
Vishal Banthia 2015-12-03 19:55:26 +09:00
parent 04d410bc1d
commit dccacea43f
4 changed files with 207 additions and 20 deletions

View file

@ -871,15 +871,24 @@ program
, 'secret (or $SECRET)' , 'secret (or $SECRET)'
, String , String
, process.env.SECRET) , process.env.SECRET)
.option('-c, --connect-push <endpoint>'
, 'push endpoint'
, cliutil.list)
.action(function(options) { .action(function(options) {
if (!options.secret) { if (!options.secret) {
this.missingArgument('--secret') this.missingArgument('--secret')
} }
if (!options.connectPush) {
this.missingArgument('--connect-push')
}
require('./units/api')({ require('./units/api')({
port: options.port port: options.port
, ssid: options.ssid , ssid: options.ssid
, secret: options.secret , secret: options.secret
, endpoints: {
push: options.connectPush
}
}) })
}) })
@ -1328,6 +1337,7 @@ program
'api' 'api'
, '--port', options.apiPort , '--port', options.apiPort
, '--secret', options.authSecret , '--secret', options.authSecret
, '--connect-push', options.bindAppPull
]) ])
// websocket // websocket
, procutil.fork(__filename, [ , procutil.fork(__filename, [

View file

@ -5,12 +5,18 @@ var logger = require('../../../util/logger')
var datautil = require('../../../util/datautil') var datautil = require('../../../util/datautil')
var log = logger.createLogger('api:controllers:device') var log = logger.createLogger('api:controllers:device')
var wire = require('../../../wire')
var wireutil = require('../../../wire/util')
module.exports = { module.exports = {
getDevices: getDevices getDevices: getDevices
, getDeviceBySerial: getDeviceBySerial , getDeviceBySerial: getDeviceBySerial
, reserveDeviceBySerial: reserveDeviceBySerial
, releaseDeviceBySerial: releaseDeviceBySerial
} }
var log = logger.createLogger('api:contoller:device')
function getDevices(req, res) { function getDevices(req, res) {
dbapi.loadDevices() dbapi.loadDevices()
.then(function(cursor) { .then(function(cursor) {
@ -59,3 +65,99 @@ function getDeviceBySerial(req, res) {
}) })
}) })
} }
function reserveDeviceBySerial(req, res) {
var serial = req.swagger.params.serial.value
dbapi.loadDevice(serial)
.then(function(device) {
if (device) {
datautil.normalize(device, req.user)
if(!device.using) {
var requirements = {
'serial': {
'value': serial,
'match': 'exact'
}
}
req.options.push.send([
device.channel
, wireutil.envelope(
new wire.GroupMessage(
new wire.OwnerMessage(
req.user.email
, req.user.name
, req.user.group
)
, null
, wireutil.toDeviceRequirements(requirements)
)
)
])
res.json({
success: true
, device: device
})
} else {
res.json(500, {
success: false
, description: 'Device is being used'
})
}
} else {
res.json(500, {
success: false
, description: 'Bad device serial'
})
}
})
}
function releaseDeviceBySerial(req, res) {
var serial = req.swagger.params.serial.value
dbapi.loadDevice(serial)
.then(function(device) {
if (device) {
datautil.normalize(device, req.user)
if(device.using && device.owner.email == req.user.email) {
var requirements = {
'serial': {
'value': serial,
'match': 'exact'
}
}
req.options.push.send([
device.channel
, wireutil.envelope(
new wire.UngroupMessage(
wireutil.toDeviceRequirements(requirements)
)
)
])
res.json({
success: true
, device: device
})
} else {
res.json(500, {
success: false
, description: 'You cannot kick this device'
})
}
} else {
res.json(500, {
success: false
, description: 'Bad device serial'
})
}
})
}

View file

@ -4,38 +4,61 @@ var path = require('path')
var express = require('express') var express = require('express')
var SwaggerExpress = require('swagger-express-mw') var SwaggerExpress = require('swagger-express-mw')
var cookieSession = require('cookie-session') var cookieSession = require('cookie-session')
var Promise = require('bluebird')
var _ = require('lodash')
var logger = require('../../util/logger') var logger = require('../../util/logger')
var zmqutil = require('../../util/zmqutil')
var srv = require('../../util/srv')
var lifecycle = require('../../util/lifecycle')
module.exports = function(options) { module.exports = function(options) {
var log = logger.createLogger('api') var log = logger.createLogger('api')
, app = express() , app = express()
, server = http.createServer(app) , server = http.createServer(app)
var config = { var push = zmqutil.socket('push')
appRoot: __dirname Promise.map(options.endpoints.push, function(endpoint) {
, swaggerFile: path.resolve(__dirname, 'swagger', 'api_v1.yaml') return srv.resolve(endpoint).then(function(records) {
}; return srv.attempt(records, function(record) {
log.info('Sending output to "%s"', record.url)
push.connect(record.url)
return Promise.resolve(true)
})
})
})
.catch(function(err) {
log.fatal('Unable to connect to push endpoint', err)
lifecycle.fatal()
})
SwaggerExpress.create(config, function(err, swaggerExpress) { var config = {
if (err) { throw err; } appRoot: __dirname
, swaggerFile: path.resolve(__dirname, 'swagger', 'api_v1.yaml')
};
swaggerExpress.register(app); SwaggerExpress.create(config, function(err, swaggerExpress) {
if (err) { throw err; }
swaggerExpress.register(app);
})
// Adding options in request, so that swagger controller
// can use it.
app.use(function(req, res, next) {
var reqOptions = _.merge(options, {
'push': push
}) })
// Adding options in request, so that swagger controller req.options = reqOptions
// can use it. next()
app.use(function(req, res, next) { })
req.options = options
next()
})
// TODO: Remove this once frontend is stateless // TODO: Remove this once frontend is stateless
app.use(cookieSession({ app.use(cookieSession({
name: options.ssid name: options.ssid
, keys: [options.secret] , keys: [options.secret]
})) }))
server.listen(options.port) server.listen(options.port)
log.info('Listening on port %d', options.port) log.info('Listening on port %d', options.port)
} }

View file

@ -128,6 +128,58 @@ paths:
- accessTokenAuth: [] - accessTokenAuth: []
/swagger.json: /swagger.json:
x-swagger-pipe: swagger_raw x-swagger-pipe: swagger_raw
/devices/{serial}/reserve:
x-swagger-router-controller: device
put:
summary: Reseve Device
description: The device reserve enpoint will reserve a device if device it usable
operationId: reserveDeviceBySerial
tags:
- device
parameters:
- name: serial
in: path
description: Device Serial
required: true
type: string
responses:
"200":
description: Device Information
schema:
$ref: "#/definitions/DeviceResponse"
default:
description: Unexpected Error
schema:
$ref: "#/definitions/ErrorResponse"
security:
- accessTokenAuth: []
/devices/{serial}/release:
x-swagger-router-controller: device
put:
summary: Device Information
description: The device reserve enpoint will release a device
operationId: releaseDeviceBySerial
tags:
- device
parameters:
- name: serial
in: path
description: Device Serial
required: true
type: string
responses:
"200":
description: Device Information
schema:
$ref: "#/definitions/DeviceResponse"
default:
description: Unexpected Error
schema:
$ref: "#/definitions/ErrorResponse"
security:
- accessTokenAuth: []
/swagger.json:
x-swagger-pipe: swagger_raw
definitions: definitions:
UserResponse: UserResponse:
required: required: