Files
appium/lib/grid-register.js
2016-01-08 14:40:39 -08:00

120 lines
4.1 KiB
JavaScript

import request from 'request-promise';
import { fs } from 'appium-support';
import logger from './logger';
async function registerNode (configFile, addr, port) {
let data;
try {
data = await fs.readFile(configFile, 'utf-8');
} catch (err) {
logger.error(`Unable to load node configuration file to register with grid: ${err.message}`);
return;
}
// Check presence of data before posting it to the selenium grid
if (!data) {
logger.error('No data found in the node configuration file to send to the grid');
return;
}
await postRequest(data, addr, port);
}
async function registerToGrid (options_post, jsonObject) {
try {
let response = await request(options_post);
if (response === undefined || response.statusCode !== 200) {
throw new Error('Request failed');
}
let logMessage = `Appium successfully registered with the grid on ${jsonObject.configuration.hubHost}:${jsonObject.configuration.hubPort}`;
logger.debug(logMessage);
} catch (err) {
logger.error(`Request to register with grid was unsuccessful: ${err.message}`);
}
}
async function postRequest (data, addr, port) {
// parse json to get hub host and port
let jsonObject;
try {
jsonObject = JSON.parse(data);
} catch (err) {
logger.errorAndThrow(`Syntax error in node configuration file: ${err.message}`);
}
// if the node config does not have the appium/webdriver url, host, and port,
// automatically add it based on how appium was initialized
// otherwise, we will take whatever the user setup
// because we will always set localhost/127.0.0.1. this won't work if your
// node and grid aren't in the same place
if (!jsonObject.configuration.url || !jsonObject.configuration.host || !jsonObject.configuration.port) {
jsonObject.configuration.url = `http://${addr}:${port}/wd/hub`;
jsonObject.configuration.host = addr;
jsonObject.configuration.port = port;
// re-serialize the configuration with the auto populated data
data = JSON.stringify(jsonObject);
}
// prepare the header
let post_headers = {
'Content-Type': 'application/json',
'Content-Length': data.length
};
// the post options
let post_options = {
url: `http://${jsonObject.configuration.hubHost}:${jsonObject.configuration.hubPort}/grid/register`,
method: 'POST',
body: data,
headers: post_headers,
resolveWithFullResponse: true // return the full response, not just the body
};
if (jsonObject.configuration.register !== true) {
logger.debug(`No registration sent (${jsonObject.configuration.register} = false)`);
return;
}
let registerCycleTime = jsonObject.configuration.registerCycle;
if (registerCycleTime !== null && registerCycleTime > 0) {
// initiate a new Thread
let first = true;
logger.debug(`Starting auto register thread for grid. Will try to register every ${registerCycleTime} ms.`);
setInterval(async function () {
if (first !== true) {
let isRegistered = await isAlreadyRegistered(jsonObject);
if (isRegistered !== null && isRegistered !== true) {
// make the http POST to the grid for registration
await registerToGrid(post_options, jsonObject);
}
} else {
first = false;
await registerToGrid(post_options, jsonObject);
}
}, registerCycleTime);
}
}
async function isAlreadyRegistered (jsonObject) {
//check if node is already registered
let id = `http://${jsonObject.configuration.host}:${jsonObject.configuration.port}`;
try {
let response = await request({
uri: `http://${jsonObject.configuration.hubHost}:${jsonObject.configuration.hubPort}/grid/api/proxy?id=${id}`,
method : 'GET',
timeout : 10000,
resolveWithFullResponse: true // return the full response, not just the body
});
if (response === undefined || response.statusCode !== 200) {
throw new Error(`Request failed`);
}
let responseData = JSON.parse(response.body);
return responseData.success;
} catch (err) {
logger.debug("Hub down or not responding: ${err.message}");
}
}
export default registerNode;