Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: chore: updates Node to v16 (BKTCLT-3) #226

Open
wants to merge 11 commits into
base: development/7.4
Choose a base branch
from
Open
4 changes: 3 additions & 1 deletion .eslintrc
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{ "extends": "scality" }
{
"extends": ["scality", "prettier"]
}
2 changes: 0 additions & 2 deletions .github/workflows/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ jobs:
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
- name: install dependencies
run: yarn install --frozen-lockfile
- name: run lint
run: yarn run --silent lint -- --max-warnings 0
- name: set host bucketclient.testing.local
run: sudo bash -c 'echo "127.0.0.1 bucketclient.testing.local" >> /etc/hosts'
- name: run test
Expand Down
8 changes: 8 additions & 0 deletions .prettierrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module.exports = {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we should add prettier at the same time as a node upgrade, maybe a separate PR

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree. @george-the-wizard please focus on upgrading the code to be compatible with Node 16 and any additional work can be followed up later.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@miniscruff @rahulreddy I needed it in order to be able to troubleshoot the issues efficiently, I will revert the related changes after it builds flawlessly - thx

eslintIntegration:true,
singleQuote: true,
trailingComma: 'all',
printWidth: 80,
tabWidth: 4,
useTabs: false,
};
50 changes: 28 additions & 22 deletions lib/RESTClient.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
'use strict'; // eslint-disable-line strict

// eslint-disable-line strict

const assert = require('assert');
const http = require('http');
const https = require('https');
const querystring = require('querystring');

const HttpAgent = require('agentkeepalive');
const HttpsAgent = require('agentkeepalive').HttpsAgent;
const { HttpsAgent } = require('agentkeepalive');

const werelogs = require('werelogs');
const { errors, constants } = require('arsenal');
Expand Down Expand Up @@ -51,8 +52,8 @@ class RESTClient {
}
const hostPort = remoteHost.split(':');
this.remoteHost = hostPort[0];
const port = hostPort.length > 1 ?
Number.parseInt(hostPort[1], 10) : 9000;
const port = hostPort.length > 1
? Number.parseInt(hostPort[1], 10) : 9000;
assert.ok(!Number.isNaN(port), `port ${port} is not a number`);
this.port = port;
this._useHttps = useHttps;
Expand All @@ -62,7 +63,7 @@ class RESTClient {
if (this._useHttps) {
this.agent = new HttpsAgent({
keepAlive: true,
ca: ca ? [ca] : undefined,
...(ca ? { ca: [ca] } : {}),
requestCert: true,
freeSocketTimeout: constants.httpClientFreeSocketTimeout,
});
Expand All @@ -88,9 +89,9 @@ class RESTClient {
}

createLogger(reqUids) {
return reqUids ?
this.logging.newRequestLoggerFromSerializedUids(reqUids) :
this.logging.newRequestLogger();
return reqUids
? this.logging.newRequestLoggerFromSerializedUids(reqUids)
: this.logging.newRequestLogger();
}

getPort() {
Expand Down Expand Up @@ -258,7 +259,9 @@ class RESTClient {
let path = `/default/bucket/${bucketName}/`;
path += encodeURIComponent(objName);

log.debug('deleteObject', { bucketName, objName, path, params });
log.debug('deleteObject', {
bucketName, objName, path, params,
});
this.request('DELETE', path, log, params, null, callback);
}

Expand Down Expand Up @@ -309,8 +312,7 @@ class RESTClient {
let error = errors[errorMap(res.statusMessage)];
if (error) {
error.isExpected = true;
log.debug('direct request to endpoint returned an expected error', {
error });
log.debug('direct request to endpoint returned an expected error', { error });
return callback(error, ret);
}
error = errors.InternalError.customizeDescription('unexpected error');
Expand Down Expand Up @@ -352,11 +354,12 @@ class RESTClient {
ret.push(data);
retLen += data.length;
}).on('error', callback)
.on('end', () => {
callback(null, Buffer.concat(ret, retLen).toString());
});
.on('end', () => {
callback(null, Buffer.concat(ret, retLen).toString());
});
return undefined;
});
},
);
}

/**
Expand Down Expand Up @@ -400,8 +403,11 @@ class RESTClient {
}
// somehow options can get cyclical so fields need to be chosen
// for display
log.debug('direct request to MD endpoint', { httpMethod: method,
host: options.host, port: options.port });
log.debug('direct request to MD endpoint', {
httpMethod: method,
host: options.host,
port: options.port,
});
const req = this.transport.request(options);
req.setNoDelay();

Expand All @@ -422,11 +428,11 @@ class RESTClient {
}

req.on('response', res => this.endRespond(res, res, log, callback))
.on('error', error => {
// covers system errors like ECONNREFUSED, ECONNRESET etc.
log.error('error sending request to metadata', { error });
callback(errors.InternalError);
}).end();
.on('error', error => {
// covers system errors like ECONNREFUSED, ECONNRESET etc.
log.error('error sending request to metadata', { error });
callback(errors.InternalError);
}).end();
}

/**
Expand Down
7 changes: 4 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,12 @@
},
"homepage": "https://github.com/scality/bucketclient#readme",
"devDependencies": {
"eslint": "^2.4.0",
"eslint-config-airbnb": "^6.0.0",
"eslint": "^7.32.0",
"eslint-config-airbnb": "^18.2.1",
"eslint-config-scality": "scality/Guidelines#71a059ad",
"eslint-plugin-react": "4.2.3",
"mocha": ""
"eslint-plugin-import": "^2.22.1",
"mocha": "^8.4.0"
},
"dependencies": {
"agentkeepalive": "^4.1.3",
Expand Down
32 changes: 17 additions & 15 deletions tests/unit/simple_tests.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
'use strict'; // eslint-disable-line strict

const assert = require('assert');
const fs = require('fs');
const http = require('http');
const https = require('https');

const errors = require('arsenal').errors;
const { errors } = require('arsenal');

const RESTClient = require('../../index.js').RESTClient;
const { RESTClient } = require('../../index');

const existBucket = {
name: 'Zaphod',
Expand All @@ -34,27 +32,27 @@ function makeResponse(res, code, message) {
const httpsOptions = {
key: fs.readFileSync('./tests/utils/test.key', 'ascii'),
cert: fs.readFileSync('./tests/utils/test.crt', 'ascii'),
ca: [fs.readFileSync('./tests/utils/ca.crt', 'ascii')],
requestCert: true,
};

const REST_CLIENT_SERVERNAME = 'bucketclient.testing.local';

const env = {
http: {
c: new RESTClient(['bucketclient.testing.local:9000']),
c: new RESTClient([`${REST_CLIENT_SERVERNAME}:9000`]),
s: handler => http.createServer(handler),
},
https: {
s: handler => https.createServer(httpsOptions, handler),
c: new RESTClient(['bucketclient.testing.local:9000'],
undefined,
true,
httpsOptions.key,
httpsOptions.cert,
httpsOptions.ca[0]),
c: new RESTClient([`${REST_CLIENT_SERVERNAME}:9000`],
undefined,
true,
httpsOptions.key,
httpsOptions.cert),
},
};

function handler(req, res) {
function serverHandler(req, res) {
if (req.method === 'POST') {
if (req.url === `/default/bucket/${existBucket.name}`) {
makeResponse(res, 409, 'BucketAlreadyExists');
Expand Down Expand Up @@ -92,15 +90,19 @@ Object.keys(env).forEach(key => {
let client;

beforeEach('start server', done => {
server = e.s(handler).listen(9000, done).on('error', done);
server = e.s(serverHandler).listen(9000, done).on('error', done);
client = e.c;
});

afterEach('stop server', () => { server.close(); });

it('should create a new non-existing bucket', done => {
client.createBucket(nonExistBucket.name, reqUids,
'{ status: "dead" }', done);
'{ status: "dead" }', () => {

done();

});
});

it('should try to create an already existing bucket and fail', done => {
Expand Down
49 changes: 30 additions & 19 deletions tests/utils/ca.crt
Original file line number Diff line number Diff line change
@@ -1,21 +1,32 @@
-----BEGIN CERTIFICATE-----
MIIDhDCCAmygAwIBAgIJAKBEeS7Re36hMA0GCSqGSIb3DQEBCwUAMFgxCzAJBgNV
BAYTAkZSMQ8wDQYDVQQIDAZGcmFuY2UxDjAMBgNVBAcMBVBhcmlzMRAwDgYDVQQK
DAdTY2FsaXR5MRYwFAYDVQQDDA10ZXN0aW5nLmxvY2FsMCAXDTE2MDYwNDAyMjM0
NFoYDzIyOTAwMzE5MDIyMzQ0WjBYMQswCQYDVQQGEwJGUjEPMA0GA1UECAwGRnJh
bmNlMQ4wDAYDVQQHDAVQYXJpczEQMA4GA1UECgwHU2NhbGl0eTEWMBQGA1UEAwwN
dGVzdGluZy5sb2NhbDCCASEwDQYJKoZIhvcNAQEBBQADggEOADCCAQkCggEAMH3L
VTsnjFcsxf2aAyfZ/aSU9WYr3DP5bepHhe4DZJoejzoneMAduh7VQJPWFUSIo1wV
TuwU8ibK4xdLb69muAN3mddnTnkGsZtcu47zQrPngN3y+B9I7AKMlbuciRVWZymh
8y/8RsQL+cef6XjvY9AoCVIQMRQeZaE9XVK0BY8qvp6Hd82S8cxGhi5JjCrnnX5i
AqWeU9GiIGn6gwjD+PjqcFIBXT19NhWBrOOWX8xabZqbVW5uXp0rEwglk3xEn1NG
aTV1lfSdy6k0AyBNpRHGbEAE/qs5PUt6cJADN2r3orBs4TK74VNnK1EgZW30/iRB
dWEgXlp9BCHQr9BIWwIDAQABo1AwTjAdBgNVHQ4EFgQUFPsLDK7R+gDBxL7JfjJK
tYNZEVQwHwYDVR0jBBgwFoAUFPsLDK7R+gDBxL7JfjJKtYNZEVQwDAYDVR0TBAUw
AwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAFtq9FbLqZ1Qt+UiK5SdQDRN6k3Q0KWzk
Tjx15lIhjOjyhN6QlG04rgHytoFr+Kuban7J6md25+wjckjINlezAbjEaUI+TGpN
R8StDPf96OEwJ2PsTSH+f9UqMC5OTAX+zpXuOBzoH55mTP+qa6LXQIppA0yLlN++
tHTSjWt3t2PrtuR6HuXDdgfs1o6sn+MwAGkKpwsYdT221HS+SXXjKUn8YveSBtXC
0djcdcrJNhHa6ncUQmS2Gf+RPTWt3StcC0UXoKwLX5nAPvPG6z5LXeB0LSR2ow7M
g93xIHkv02UCYFepAQfaIrbnD9YBxnYA7EBuDZKUIqnlxj1l1Y/nWA==
MIIFiDCCA3ACCQDxBsa1OYBMijANBgkqhkiG9w0BAQsFADCBhTELMAkGA1UEBhMC
RlIxDjAMBgNVBAgMBVBhcmlzMQ4wDAYDVQQHDAVQYXJpczEQMA4GA1UECgwHU2Nh
bGl0eTEjMCEGA1UEAwwaYnVja2V0Y2xpZW50LnRlc3RpbmcubG9jYWwxHzAdBgkq
hkiG9w0BCQEWEGluZm9Ac2NhbGl0eS5jb20wHhcNMjExMTA1MDAwODI5WhcNMjQw
ODI1MDAwODI5WjCBhTELMAkGA1UEBhMCRlIxDjAMBgNVBAgMBVBhcmlzMQ4wDAYD
VQQHDAVQYXJpczEQMA4GA1UECgwHU2NhbGl0eTEjMCEGA1UEAwwaYnVja2V0Y2xp
ZW50LnRlc3RpbmcubG9jYWwxHzAdBgkqhkiG9w0BCQEWEGluZm9Ac2NhbGl0eS5j
b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDTTaRa3uz6/DaoZv8C
ub3yvMq+x6i1ElrjWWGzyC+Ue80pypP1zktWLU7Q0TginP7bq9P8OIP6t+7ErsPf
Ljby8s1mQeKErslZvclzVjJ7HEmeOpcKKuDu9HOt76Jgvnga04BfuaNIiIm5go4j
SNzGoWMOtq28U21si4cWLhoUxn5ne0jeAdylr65z44/+aaZFZAr4gM+0dhEzt7mg
2FxSxa1afvS8lKkKjI7gq79wmlhBUchRBG1tZmwLXkeC4ZiEMwVwH49BMNZF6m3r
urKWCTYlNr6YDWawg4SQcHmG1QwYo6ijFBqTsJEeXSwEnlFsmWz90Z46A3ax9952
PbxPAZ8+say3AudHR+xbg9Xp75vPC3pFjeVdt83C43dPrisQWPmZYTpiXaBntBCu
6FZO8PeK6KHDBKX8MtWaKZELnqPKQi3F4Stc/lt0M3i43SqLbmpa7DcWLqOzv3Vf
kjwCROwBKVaG/LzWIyNSnBUCPz7Cu20ILSL5yQOWBqhI8a/x7NsLY+DZRCc4Xfel
GeFog5AVNcWMBy3rqUa3+8hngI7a9XnuLt8mGo/dQ2Q0mFQySL8jFHWDr2Fl0WdG
64QnB1EQCpxLIRJMhqlxxlFO6H4SSk/EaB7Cpany4sATmwGuvp38OLY0NgXuirBg
wGt4FuiCFuldQ/YZHLijq+n6VwIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQA1pDfM
rIq4ddri20xfM/K8MY/VrleyCH9fZ51vFARnwH6s9osJ6Ak9Jr9sUkLMrYzhFw1+
fQuZVXG4eBAQ3/XSMHp52ebdnF/kbjWqnAiPKW81LfttJhDjKmequ57+x+mp6Mwa
V7GcEYKXDT8PxxGt2Iy/uLg6XRBn4aCcKcMvRVN/PLjeDFsSmH09/tTK3TGXdD0M
9e9zQnOJ42RG4wIAQ//+nbup2D9S0dyLRwDKGb1qHvyMOPFNLbZTFTfJdIPXXR8N
NNKFIK1wI5o+rfJ4dDyOOVXm82dfgMTL5EQUlcIq1qnepZHXdnHPjtKzhTsheXek
6erNhJfOby3K55J5XkqF3o/nEQa8dsWdQGCQ8Uby/OBlBq+/xepkapoSrL7Hya6D
u3RzvVNJiHW9fDCBDhGhtGWhEpD4MR4xJYoBdXvWTlXqRt+sUP6FEHCScWT3wKIH
EZ9LwPDUZctQQMvScehI6sbr2ZybEonm90ib+17wgLrCe4i0liV+OJIqW4tGba9T
lhTOIltqEERfYKTkTzcO587Hh5eyIEany1Vb4usLhUVvU8irBr6o7NGKZoVFh+iG
mB93QZGs1CmyFdup1qY027fMn7CawqDT6HLwZob379BesGJ2L3nGr3g+z12n5pHw
5QGO1AfsLEo8GFQZG21awcfQ0djwSh35Oq2p5w==
-----END CERTIFICATE-----
41 changes: 23 additions & 18 deletions tests/utils/test.crt
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
-----BEGIN CERTIFICATE-----
MIIDLzCCAhcCCQDQLkuz5PWMBzANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJG
UjEPMA0GA1UECAwGRnJhbmNlMQ4wDAYDVQQHDAVQYXJpczEQMA4GA1UECgwHU2Nh
bGl0eTEWMBQGA1UEAwwNdGVzdGluZy5sb2NhbDAgFw0xNjA2MDQwMjIzNDVaGA8y
MjkwMDMxOTAyMjM0NVowWjELMAkGA1UEBhMCRlIxDzANBgNVBAgMBkZyYW5jZTEO
MAwGA1UEBwwFUGFyaXMxEDAOBgNVBAoMB1NjYWxpdHkxGDAWBgNVBAMMDyoudGVz
dGluZy5sb2NhbDCCASEwDQYJKoZIhvcNAQEBBQADggEOADCCAQkCggEAM2mKAMbd
cI9HyD1cO8GA9hVZ+mhofJk7GRfi729ozCvcoUspgUCdY7thRXOkHksTxTF0URep
N+h/Wgkft4kvha88xwwJKDKrMVQ6F/Wb7XXFI/qxSMiZMu3M4F1m5pdb51gLrWxu
FI2YOHMMLyCro0MknVpfG/xgHtMe8W3KXjE+sB5QZeguG3Dyv5BNqylYAiysKtW7
M/W3srBOXAiNpOjJfKK9VQ/7gkldUEMcEpHSd0rq9A1EI3BGfNCl0Z08gnP0OhQd
G2ga87BmkDg9Ph0P3tTb9VQ3a0hFh012xB9bPYqiOPC87SWJuN2QVRiNoSPpoWfT
bOhFZMxY5Adn2wIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAbY6N6gNmh+rmSLy9F
2sIe+cb40edjii5EyiH0gwFuSUupJ6g9GizuPFrAnRAjycvKfUQC1h/kLzjXY5xa
G4gWWUaR/JdCUEACJMjECpq6fTDAYvoae/KT80kjac1vCkBT8Rf674DR5EQ8nD3r
WbqKwRa+FJ+F4+EmYak5GCHrMod1bAhBRS8i4vY0XlQX3SeYxG74j3j0B4VpLNYz
1t4y80U669cinRh8G/zX2P72sNyoZyqiuWswG3RKx77yTOE/6jeOwKoPIPkbMZV1
/FsXTzL/JdgtkpgQ/Ke6vaoxPCx+chy2wQ3+vCk8qtyoqAqt54z1nvs0Pli8XlLa
QA+f
MIIESTCCAjECCQCYVHwZ2kG+7DANBgkqhkiG9w0BAQsFADCBhTELMAkGA1UEBhMC
RlIxDjAMBgNVBAgMBVBhcmlzMQ4wDAYDVQQHDAVQYXJpczEQMA4GA1UECgwHU2Nh
bGl0eTEjMCEGA1UEAwwaYnVja2V0Y2xpZW50LnRlc3RpbmcubG9jYWwxHzAdBgkq
hkiG9w0BCQEWEGluZm9Ac2NhbGl0eS5jb20wHhcNMjExMTA1MDAxMDM2WhcNMjMw
MzIwMDAxMDM2WjBHMQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExFDASBgNVBAoM
C015T3JnLCBJbmMuMRUwEwYDVQQDDAxteWRvbWFpbi5jb20wggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQDZsidogX8d3QlPGSU2Zb4q5cSadcHWW44yCUQD
Onjotb5zgpENZUBC5WjF8xDHXbfapW5AGSzTQkMq6xWqq0DE2wMrRWFwYYyWTl3D
5rKuOA4IWwLaK6IEUlzLc0cPGZzZ94Oten/y2DrGMRfFTaGrPK7Umu5P09hEzkzw
D6MaZIXA7Z1kSR0LrB+u/KewVxmOG8LWP88xLvzysVtuZ/6AIYpmiDzMu2hKk7ai
6zKQDQHf4J8VD7jcRTptSxA2BiJT3iWmqxuPEjtESoOkdQDsam0QdgShUiXIk1AH
geBdWW75JNTxxycHfeiUzpErGcL56ia8hYuARr9qWoXNlWzNAgMBAAEwDQYJKoZI
hvcNAQELBQADggIBAE6XGIxYLYIsZwDjinREpb+7bfwEMf62SyCmQAAbW+7m2SZg
YUAWlthxJuqyGu8MY/mlrBYqzS/2SWu6F3AtOtucxhHJOkKumFvXFPfcyohCCVQz
qPgjkOfWaCP9NUdAtm54gIXSdITGUvNm4JPy75+lM0RlFnUvanpOQWFp1qfZ3CJa
+NSVxsc/+PsmVUZ0+yorI4y6Jq2vxxIRI9sVNAociN6iqvDQ7Vd39kbdvI4lBZnI
zgF/ov/1Lyi+IhRJ5y3b30DbwldmEeec4K0HfRgPBI06BCWEtZwrfEhdk4iNF9yg
uTfEoUSBR9rsnAtZbW9OslE+BEpA5VeFoUQT7sgfgdL7Z7D1tFHvKXilc80pphmm
y9t77TNwpl9cFhcDYol3WlRdjWA5hK/qsm1uRtNCbOJJJFAT9lIjrL38DvK5Q9FU
DmEhu14i4mhlR+8kkHdWVQynbzRZqSt6TI0+Xfr/SDwQvhd1xi9iy6szqfHZQAkk
nKpu3EZX6OrWTENTQeVn+F0mRRTn8/syD5EtSRCvD5iqtNL8tWqfDh9hV23T4M5Q
sTIfy0ll9GkX9zaD84FeaaBWtkq3ZlYcED3tgZXJ2L2vCG4f5XBFSBcykrlNJlqx
Z4iU1OjxZwAweM041X8aXrI6WZi0ttgljnukG/bHZ+UO9/YenK2n7K+P2UzU
-----END CERTIFICATE-----
50 changes: 25 additions & 25 deletions tests/utils/test.key
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
Loading