@applitools/execution-grid-tunnel
Version:
Allows user to run tests with exection-grid and navigate to private hosts and ips
158 lines (145 loc) • 4.25 kB
JavaScript
const fs = require('fs')
const https = require('https')
const crypto = require('crypto')
const {getExpectedBinHash, getBinHash, frpcVersion} = require('@applitools/eg-frpc')
const {FrpcDownloadError} = require('../src/utils')
module.exports = {
downloadFrpc,
getFrpcDownloadLink,
getManualFrpcInstallingErrorMessage,
getFrpcErrorMessage,
}
async function downloadFrpc({
platform,
arch,
cacheDirectoryPath,
frpcPath,
shouldUpdate,
egTunnelManagerUrl,
logger,
}) {
const expectedHash = getExpectedBinHash({platform, arch})
const url = getFrpcDownloadLink({platform, arch, egTunnelManagerUrl})
logger.info({
action: 'start-frpc-download',
expectedHash,
url,
shouldUpdate,
})
try {
await _downloadBin({filename: frpcPath, url, logger})
const actualHash = await getBinHash(frpcPath)
if (actualHash !== expectedHash) {
logger.info({
action: 'frpc-download-unexpected-checksum',
expectedHash,
actualHash,
})
throw new Error(`Checksum failed: expected: ${expectedHash} actual: ${actualHash}`)
}
logger.info({
action: 'finish-frpc-download',
expectedHash,
actualHash,
})
} catch (e) {
console.log(e.message)
let removeFrpcError
try {
fs.unlinkSync(frpcPath)
} catch (e) {
removeFrpcError = e
} finally {
logger.info({
action: 'frpc-download-failed',
error: e.stack || e.message || String(e),
removeFrpcSuccess: removeFrpcError ? false : true,
...(removeFrpcError && {
removeFrpcError:
removeFrpcError.stack || removeFrpcError.message || String(removeFrpcError),
}),
})
}
throw new FrpcDownloadError(
url,
cacheDirectoryPath,
frpcPath,
getFrpcErrorMessage({url, cacheDirectoryPath, shouldUpdate}),
)
}
logger.info({
action: 'set-frpc-execute-permissions',
})
await fs.promises.chmod(frpcPath, 0o777)
}
function getFrpcDownloadLink({
platform,
arch,
egTunnelManagerUrl = 'https://exec-wus.applitools.com',
}) {
return `${egTunnelManagerUrl}/frpc/${frpcVersion}/${platform}/${arch}`
}
function getFrpcErrorMessage({url, cacheDirectoryPath, shouldUpdate}) {
const prefix = shouldUpdate
? `Execution Cloud reverse proxy update failed.`
: `Execution Cloud reverse proxy installation failed.`
return `${prefix} Please download the binary from ${url} and put it in ${cacheDirectoryPath}.`
}
function getManualFrpcInstallingErrorMessage({
platform,
arch,
shouldUpdate,
cacheDirectoryPath,
egTunnelManagerUrl,
_frpcPath,
}) {
const prefix = shouldUpdate
? `Please update the Execution Cloud reverse proxy binary.`
: `Please Download Execution Cloud reverse proxy binary and put it in ${cacheDirectoryPath}.`
return `${prefix}. You can download the file from ${getFrpcDownloadLink({
platform,
arch,
egTunnelManagerUrl,
})}`
}
const _downloadBin = function ({filename, url, logger}) {
return new Promise((resolve, reject) => {
const file = fs.createWriteStream(filename)
https
.get(url, function (response) {
response.pipe(file)
file.on('finish', function () {
logger.info({action: 'frpc-write-stream-finish-event'})
file.close((err) => {
logger.info({
action: 'frpc-write-stream-close-event',
filename,
success: err ? false : true,
...(err && {error: err.stack || err.message || String(err)}),
})
if (!err) resolve()
else reject(err)
})
})
})
.on('error', function (err) {
let unlinkErr
try {
fs.unlinkSync(filename)
} catch (e) {
unlinkErr = e
} finally {
logger.info({
action: 'frpc-write-stream-error-event',
filename,
...(err && {error: err.stack || err.message || String(err)}),
removeFrpcSuccess: unlinkErr ? false : true,
...(unlinkErr && {
unlinkErr: unlinkErr.stack || unlinkErr.message || String(unlinkErr),
}),
})
}
reject(err)
})
})
}