Skip to content

Commit

Permalink
Merge pull request #656 from cloudfoundry/update-asat-app-dependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
silvestre authored May 18, 2022
2 parents 0e624fd + 1556f84 commit e80cbc0
Show file tree
Hide file tree
Showing 4,207 changed files with 349,652 additions and 92,468 deletions.
The diff you're trying to view is too large. We only load the first 3000 changed files.
8 changes: 8 additions & 0 deletions .github/dependabot.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,11 @@ updates:
interval: "daily"
time: "08:00"
timezone: "Europe/Berlin"

# The ASATS app
- package-ecosystem: "npm"
directory: "/src/acceptance/assets/app/nodeApp/"
schedule:
interval: "daily"
time: "08:00"
timezone: "Europe/Berlin"
22 changes: 22 additions & 0 deletions .github/workflows/eslint.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
name: eslint

on: [pull_request]

jobs:
eslint:
name: eslint
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: setup node
uses: actions/setup-node@v3
with:
node-version: '16'
- run: npm install
working-directory: src/acceptance/assets/app/nodeApp
- uses: reviewdog/action-eslint@v1
with:
workdir: "src/acceptance/assets/app/nodeApp"
eslint_flags: ''
fail_on_error: true
2 changes: 1 addition & 1 deletion .tool-versions
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ golang 1.18.2
java openjdk-11
ruby 2.7.4
maven 3.6.3
nodejs 16.10.0
nodejs 16.14.0
ginkgo 2.1.3
golangci-lint 1.46.1

3 changes: 3 additions & 0 deletions src/acceptance/assets/app/nodeApp/.eslintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": "standard"
}
290 changes: 147 additions & 143 deletions src/acceptance/assets/app/nodeApp/app.js
Original file line number Diff line number Diff line change
@@ -1,188 +1,192 @@
var express = require('express');
var app = express();
const fs = require('fs').promises;
var request = require('request');
var enableCpuTest = false;
const os = require('os');
const cpuCount = os.cpus().length;
const { Worker } = require("worker_threads");

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
const express = require('express')
const app = express()
const fs = require('fs')
const https = require('https')
const axios = require('axios')
const os = require('os')
const cpuCount = os.cpus().length
const { BroadcastChannel, Worker } = require('worker_threads')

app.get('/slow/:time', async function (req, res) {
var delayInMS = parseInt(req.params.time, 10);
await new Promise(done => setTimeout(done, delayInMS));
res.status(200).send('dummy application with slow response');
});
const delayInMS = parseInt(req.params.time, 10)
await new Promise((resolve, reject) => {
setTimeout(() => resolve(), delayInMS)
})
res.status(200).send('dummy application with slow response')
})

app.get('/fast', function (req, res) {
res.status(200).send('dummy application with fast response');
});
res.status(200).send('dummy application with fast response')
})

app.get('/health', function (req, res) {
res.status(200).json({status: "OK", cpuTestRunning: enableCpuTest});
});
res.status(200).json({ status: 'OK' })
})

app.get('/', function (req, res) {
res.status(200).send('dummy application root');
});
res.status(200).send('dummy application root')
})

app.listen(process.env.PORT || 8080, function () {
console.log('dummy application started');
});
console.log('dummy application started')
})

app.get('/custom-metrics/:type/:value', function (req, res) {
app.get('/custom-metrics/:type/:value', async function (req, res) {
try {
var metricType = req.params.type;
var metricValue = parseInt(req.params.value, 10);
var instanceIndex = process.env.CF_INSTANCE_INDEX;
var appGuid = JSON.parse(process.env.VCAP_APPLICATION).application_id;

var postData = {
"instance_index": parseInt(instanceIndex),
"metrics": [{
"name": metricType,
"value": parseInt(metricValue),
"unit": "test-unit"
const metricType = req.params.type
const metricValue = parseInt(req.params.value, 10)
const instanceIndex = process.env.CF_INSTANCE_INDEX
const appGuid = JSON.parse(process.env.VCAP_APPLICATION).application_id

const postData = {
instance_index: parseInt(instanceIndex),
metrics: [{
name: metricType,
value: parseInt(metricValue),
unit: 'test-unit'
}]
}
var credentials = {};
var metricsForwarderURL = "";
var mfUsername = "";
var mfPassword = "";
let credentials = {}
let metricsForwarderURL = ''
let mfUsername = ''
let mfPassword = ''
// for service offering
if (process.env.VCAP_SERVICES) {
var vcapServices = JSON.parse(process.env.VCAP_SERVICES);
if (vcapServices.autoscaler && vcapServices.autoscaler[0]
&& vcapServices.autoscaler[0].credentials) {
credentials = vcapServices.autoscaler[0].credentials;
metricsForwarderURL = credentials.custom_metrics.url;
mfUsername = credentials.custom_metrics.username;
mfPassword = credentials.custom_metrics.password;
const vcapServices = JSON.parse(process.env.VCAP_SERVICES)
if (vcapServices.autoscaler && vcapServices.autoscaler[0] &&
vcapServices.autoscaler[0].credentials) {
credentials = vcapServices.autoscaler[0].credentials
metricsForwarderURL = credentials.custom_metrics.url
mfUsername = credentials.custom_metrics.username
mfPassword = credentials.custom_metrics.password
}
}
//for build-in offering
if (metricsForwarderURL === "" || mfUsername === "" || mfPassword === "") {
// for build-in offering
if (metricsForwarderURL === '' || mfUsername === '' || mfPassword === '') {
if (process.env.AUTO_SCALER_CUSTOM_METRIC_ENV) {
credentials = JSON.parse(process.env.AUTO_SCALER_CUSTOM_METRIC_ENV);
metricsForwarderURL = credentials.url;
mfUsername = credentials.username;
mfPassword = credentials.password;
credentials = JSON.parse(process.env.AUTO_SCALER_CUSTOM_METRIC_ENV)
metricsForwarderURL = credentials.url
mfUsername = credentials.username
mfPassword = credentials.password
} else {
console.log("Not all credentials!!!!");
console.log('Not all credentials!!!!')
console.log(
`metricsForwarderURL "${metricsForwarderURL}" || mfUsername === "${mfUsername}" || mfPassword "${mfPassword}`);
`metricsForwarderURL "${metricsForwarderURL}" || mfUsername === "${mfUsername}" || mfPassword "${mfPassword}`)
console.log(process.env.VCAP_SERVICES)
res.status(500).json({error: "No credentials found"})
res.status(500).json({ error: 'No credentials found' })
return
}
}

var options = {
uri: metricsForwarderURL + '/v1/apps/' + appGuid + '/metrics',
const options = {
url: metricsForwarderURL + '/v1/apps/' + appGuid + '/metrics',
method: 'POST',
body: JSON.stringify(postData),
data: postData,
headers: {
'Content-Type': 'application/json',
'Authorization': 'Basic ' + Buffer.from(
mfUsername + ":" + mfPassword).toString('base64')
}
Authorization: 'Basic ' + Buffer.from(
mfUsername + ':' + mfPassword).toString('base64')
},
validateStatus: null
}
request(options, function (err, result, body) {
if (err || result.statusCode !== 200) {
console.log(err);
res.status(result.statusCode).json(
{error: err, body: body, statusCode: result.statusCode});
} else {
res.status(200).send("success");
const result = await axios(options)
if (result.status !== 200) {
console.log(`Got non-200 response ${result.status} response ${result.data}`)
const payload = {
statusCode: result.status,
response: result.data
}
});
res.status(500).json(payload).end()
} else {
res.status(200).send('success')
}
} catch (err) {
console.log(err);
res.status(500).json({exception: JSON.stringify(err)}).end();
console.log(err)
res.status(500).json({ exception: JSON.stringify(err) }).end()
}
})

app.get('/custom-metrics/mtls/:type/:value', async function (req, res) {
try {
var metricType = req.params.type;
var metricValue = parseInt(req.params.value, 10);
var instanceIndex = process.env.CF_INSTANCE_INDEX;
var appGuid = JSON.parse(process.env.VCAP_APPLICATION).application_id;

var postData = {
"instance_index": parseInt(instanceIndex),
"metrics": [{
"name": metricType,
"value": parseInt(metricValue),
"unit": "test-unit"
}]
}
var credentials = {};
var metricsForwarderURL = "";

// for service offering
if (process.env.VCAP_SERVICES) {
var vcapServices = JSON.parse(process.env.VCAP_SERVICES);
if (vcapServices.autoscaler && vcapServices.autoscaler[0] && vcapServices.autoscaler[0].credentials) {
credentials = vcapServices.autoscaler[0].credentials;
metricsForwarderURL = credentials.custom_metrics.mtls_url;
}
}

var options = {
uri: metricsForwarderURL + '/v1/apps/' + appGuid + '/metrics',
method: 'POST',
key: await fs.readFile(process.env.CF_INSTANCE_KEY),
cert: await fs.readFile(process.env.CF_INSTANCE_CERT),
body: JSON.stringify(postData),
headers: { 'Content-Type': 'application/json' }
}
request(options, function (err, result, body) {
if (err || result.statusCode > 299) {
console.log("error: " + err)
var payload = {
err: err ? err.message : null,
statusCode: result ? result.statusCode : null,
response: body,
}
console.log(JSON.stringify(payload));
res.status(500).json(payload).end();
} else {
res.status(200).send("success with mtls").end();
}
});

}catch(err) {
var payload = { exception: err };
console.log(payload);
res.status(500).json(payload);
try {
const metricType = req.params.type
const metricValue = parseInt(req.params.value, 10)
const instanceIndex = process.env.CF_INSTANCE_INDEX
const appGuid = JSON.parse(process.env.VCAP_APPLICATION).application_id

const postData = {
instance_index: parseInt(instanceIndex),
metrics: [{
name: metricType,
value: parseInt(metricValue),
unit: 'test-unit'
}]
}
});
let credentials = {}
let metricsForwarderURL = ''

// for service offering
if (process.env.VCAP_SERVICES) {
const vcapServices = JSON.parse(process.env.VCAP_SERVICES)
if (vcapServices.autoscaler && vcapServices.autoscaler[0] && vcapServices.autoscaler[0].credentials) {
credentials = vcapServices.autoscaler[0].credentials
metricsForwarderURL = credentials.custom_metrics.mtls_url
}
}

const httpsAgent = new https.Agent({
cert: fs.readFileSync(process.env.CF_INSTANCE_CERT),
key: fs.readFileSync(process.env.CF_INSTANCE_KEY)
})
const options = {
url: metricsForwarderURL + '/v1/apps/' + appGuid + '/metrics',
method: 'POST',
data: postData,
headers: { 'Content-Type': 'application/json' },
validateStatus: null,
httpsAgent
}
const result = await axios(options)
if (result.status !== 200) {
console.log(`Got non-200 response ${result.status} response ${result.data}`)
const payload = {
statusCode: result.status,
response: result.data
}
res.status(500).json(payload).end()
} else {
res.status(200).send('success with mtls').end()
}
} catch (err) {
const payload = { exception: err }
console.log(payload)
res.status(500).json(payload)
}
})

app.get('/cpu/:util/:minute', async function (req, res) {
var util = parseInt(req.params.util, 10);
var minute = parseInt(req.params.minute, 10);
var maxUtil = cpuCount * 100;
util = Math.max(1, util);
util = Math.min(maxUtil, util);
var msg = 'set app cpu utilization to ' + util + '% for ' + minute + ' minutes';
maxWorkerUtil = 99;
remainingUtil = util;
let util = parseInt(req.params.util, 10)
const minute = parseInt(req.params.minute, 10)
const maxUtil = cpuCount * 100
util = Math.max(1, util)
util = Math.min(maxUtil, util)
const msg = 'set app cpu utilization to ' + util + '% for ' + minute + ' minutes'
const maxWorkerUtil = 99
let remainingUtil = util
while (remainingUtil > maxWorkerUtil) {
workerUtil = maxWorkerUtil;
startWorker(workerUtil, minute);
remainingUtil = remainingUtil - maxWorkerUtil;
startWorker(maxWorkerUtil, minute)
remainingUtil = remainingUtil - maxWorkerUtil
};
startWorker(remainingUtil, minute);
res.status(200).send(msg);
});
startWorker(remainingUtil, minute)
res.status(200).send(msg)
})

function startWorker(util, minute) {
const worker = new Worker("./worker.js", { workerData: { util: util, minute: minute } });
function startWorker (util, minute) {
new Worker('./worker.js', { workerData: { util, minute } }) // eslint-disable-line no-new
}

app.get('/cpu/close', async function (req, res) {
enableCpuTest = false;
res.status(200).send('close cpu test');
});
const bc = new BroadcastChannel('stop_channel')
bc.postMessage('stop')

res.status(200).send('close cpu test')
})
1 change: 1 addition & 0 deletions src/acceptance/assets/app/nodeApp/node_modules/.bin/acorn

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/acceptance/assets/app/nodeApp/node_modules/.bin/eslint

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/acceptance/assets/app/nodeApp/node_modules/.bin/json5

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit e80cbc0

Please sign in to comment.