0
Fork 0
mirror of https://github.com/verdaccio/verdaccio.git synced 2024-12-16 21:56:25 -05:00

[GH-131] add cache option to uplinks

This commit is contained in:
cklein 2017-03-04 00:39:26 +01:00 committed by Carsten Klein
parent c2741683b2
commit 7018fc99a2
16 changed files with 266 additions and 19 deletions

1
.gitignore vendored
View file

@ -5,6 +5,7 @@ verdaccio-*.tgz
### ###
!bin/verdaccio !bin/verdaccio
test-storage* test-storage*
.verdaccio_test_env
node_modules node_modules

View file

@ -59,6 +59,10 @@ uplinks:
#headers: #headers:
# authorization: "Basic YourBase64EncodedCredentials==" # authorization: "Basic YourBase64EncodedCredentials=="
# set this to false to prevent tarballs from this upstream
# to be stored in the local storage (defaults to true)
#cache: false
packages: packages:
# uncomment this for packages with "local-" prefix to be available # uncomment this for packages with "local-" prefix to be available
# for admin only, it's a recommended way of handling private packages # for admin only, it's a recommended way of handling private packages

View file

@ -140,6 +140,9 @@ class Config {
} }
// sanity check for uplinks // sanity check for uplinks
for (let i in self.uplinks) { for (let i in self.uplinks) {
if (self.uplinks[i].cache == null) {
self.uplinks[i].cache = true;
}
if (Object.prototype.hasOwnProperty.call(self.uplinks, i)) { if (Object.prototype.hasOwnProperty.call(self.uplinks, i)) {
check_user_or_uplink(i); check_user_or_uplink(i);
} }

View file

@ -279,10 +279,14 @@ class Storage {
if (uplink == null) { if (uplink == null) {
uplink = new Proxy({ uplink = new Proxy({
url: file.url, url: file.url,
cache: true,
_autogenerated: true, _autogenerated: true,
}, self.config); }, self.config);
} }
let savestream = self.local.add_tarball(name, filename); let savestream = null;
if (uplink.config.cache) {
savestream = self.local.add_tarball(name, filename);
}
let on_open = function() { let on_open = function() {
// prevent it from being called twice // prevent it from being called twice
on_open = function() {}; on_open = function() {};
@ -312,6 +316,7 @@ class Storage {
} }
}; };
if (savestream) {
savestream.on('open', function() { savestream.on('open', function() {
on_open(); on_open();
}); });
@ -325,6 +330,9 @@ class Storage {
savestream = null; savestream = null;
on_open(); on_open();
}); });
} else {
on_open();
}
} }
} }

View file

@ -16,6 +16,8 @@ uplinks:
timeout: 100ms timeout: 100ms
server2: server2:
url: http://localhost:55552/ url: http://localhost:55552/
server3:
url: http://localhost:55553/
baduplink: baduplink:
url: http://localhost:55666/ url: http://localhost:55666/

View file

@ -0,0 +1,36 @@
storage: ./test-storage3
users:
test:
password: a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
web:
enable: true
uplinks:
server1:
url: http://localhost:55551/
# cache: true
server2:
url: http://localhost:55552/
cache: false
logs:
- {type: stdout, format: pretty, level: trace}
packages:
'pkg-gh131':
access: $all
proxy: server1
'pkg-gh1312':
access: $all
proxy: server2
'*':
access: $all
listen: 55553
# expose internal methods
_debug: true

90
test/functional/gh131.js Normal file
View file

@ -0,0 +1,90 @@
'use strict';
const fs = require('fs');
const path = require('path');
const assert = require('assert');
const crypto = require('crypto');
const STORAGE = 'test-storage3';
const TARBALL = 'blahblah';
const PKG_GH131 = 'pkg-gh131';
const PKG_GH1312 = 'pkg-gh1312';
function isCached(pkgname, tarballname) {
return fs.existsSync(path.join(__dirname, STORAGE, pkgname, tarballname));
}
function readfile(x) {
return fs.readFileSync(path.join(__dirname, x));
}
module.exports = function() {
const server = process.server;
const server2 = process.server2;
const server3 = process.server3;
before(function() {
return server.add_package(PKG_GH131);
});
before(function() {
return server.put_tarball(PKG_GH131, TARBALL, readfile('fixtures/binary'))
.status(201)
.body_ok(/.*/);
});
before(function() {
const pkg = require('./lib/package')(PKG_GH131);
pkg.dist.shasum = crypto.createHash('sha1').update(readfile('fixtures/binary')).digest('hex');
return server.put_version(PKG_GH131, '0.0.1', pkg)
.status(201)
.body_ok(/published/);
});
before(function() {
return server3.get_package(PKG_GH131)
.status(200);
});
before(function() {
return server3.get_tarball(PKG_GH131, TARBALL)
.status(200);
});
it('should be caching packages from uplink server1', function () {
assert.equal(isCached(PKG_GH131, TARBALL), true);
});
before(function() {
return server2.add_package(PKG_GH1312);
});
before(function() {
return server2.put_tarball(PKG_GH1312, TARBALL, readfile('fixtures/binary'))
.status(201)
.body_ok(/.*/);
});
before(function() {
const pkg = require('./lib/package')(PKG_GH1312);
pkg.dist.shasum = crypto.createHash('sha1').update(readfile('fixtures/binary')).digest('hex');
return server2.put_version(PKG_GH1312, '0.0.1', pkg)
.status(201)
.body_ok(/published/);
});
before(function() {
return server3.get_package(PKG_GH1312)
.status(200);
});
before(function() {
return server3.get_tarball(PKG_GH1312, TARBALL)
.status(200);
});
it('must not be caching packages from uplink server2', function () {
assert.equal(isCached(PKG_GH1312, TARBALL), false);
});
};

View file

@ -8,18 +8,20 @@ const exec = require('child_process').exec;
describe('Func', function() { describe('Func', function() {
const server = process.server; const server = process.server;
const server2 = process.server2; const server2 = process.server2;
const server3 = process.server3;
before(function(done) { before(function(done) {
Promise.all([ Promise.all([
require('./lib/startup').start('./test-storage', './config-1.yaml'), require('./lib/startup').start('./test-storage', './config-1.yaml'),
require('./lib/startup').start('./test-storage2', './config-2.yaml'), require('./lib/startup').start('./test-storage2', './config-2.yaml'),
require('./lib/startup').start('./test-storage3', './config-3.yaml'),
]).then(() => { ]).then(() => {
done(); done();
}); });
}); });
before(function() { before(function() {
return Promise.all([server, server2].map(function(server) { return Promise.all([server, server2, server3].map(function(server) {
return server.debug().status(200).then(function(body) { return server.debug().status(200).then(function(body) {
server.pid = body.pid; server.pid = body.pid;
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
@ -34,7 +36,7 @@ describe('Func', function() {
}); });
before(function auth() { before(function auth() {
return Promise.all([server, server2].map(function(server, cb) { return Promise.all([server, server2, server3].map(function(server, cb) {
return server.auth('test', 'test').status(201).body_ok(/'test'/); return server.auth('test', 'test').status(201).body_ok(/'test'/);
})); }));
}); });
@ -58,6 +60,8 @@ describe('Func', function() {
require('./logout')(); require('./logout')();
require('./addtag')(); require('./addtag')();
require('./plugins')(); require('./plugins')();
// requires packages published to server1/server2
require('./gh131')();
after(function(done) { after(function(done) {
const check = (server) => { const check = (server) => {
@ -78,7 +82,7 @@ describe('Func', function() {
}); });
}); });
}; };
Promise.all([check(server), check(server2)]).then(function() { Promise.all([check(server), check(server2), check(server3)]).then(function() {
done(); done();
}, (reason) => { }, (reason) => {
assert.equal(reason, null); assert.equal(reason, null);

View file

@ -8,6 +8,7 @@ const Server = require('./server');
const forks = process.forks = []; const forks = process.forks = [];
process.server = Server('http://localhost:55551/'); process.server = Server('http://localhost:55551/');
process.server2 = Server('http://localhost:55552/'); process.server2 = Server('http://localhost:55552/');
process.server3 = Server('http://localhost:55553/');
process.express = express(); process.express = express();
process.express.listen(55550); process.express.listen(55550);
@ -39,6 +40,13 @@ module.exports.start = function(dir, conf) {
}; };
process.on('exit', function() { process.on('exit', function() {
if (forks[0]) forks[0].kill(); if (forks[0]) {
if (forks[1]) forks[1].kill(); forks[0].kill();
}
if (forks[1]) {
forks[1].kill();
}
if (forks[2]) {
forks[2].kill();
}
}); });

View file

@ -0,0 +1,25 @@
storage: ./.verdaccio_test_env/test-storage
users:
test:
password: a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
uplinks:
npmjs:
url: https://registry.npmjs.org/
cache: false
logs:
- {type: stdout, format: pretty, level: trace}
packages:
jju:
allow_access: all
allow_publish: all
proxy_access: npmjs
'*':
allow_access: all
allow_publish: all
listen: 55501

View file

@ -38,7 +38,7 @@ system('npm install jju') and quit('fail');
(`node -e 'console.log(require("jju").parse("{qwerty:123}").qwerty+456)'` =~ /579/) or quit('fail'); (`node -e 'console.log(require("jju").parse("{qwerty:123}").qwerty+456)'` =~ /579/) or quit('fail');
system('npm publish ../verdaccio-test-1.2.3.tgz') and quit('fail'); system('npm publish ../verdaccio-test-1.2.3.tgz') and quit('fail');
system('npm tag verdaccio-test@1.2.3 meow') and quit('fail'); system('npm dist-tag add verdaccio-test@1.2.3 meow') and quit('fail');
system('npm install verdaccio-test@meow') and quit('fail'); system('npm install verdaccio-test@meow') and quit('fail');
(`node -e 'require("verdaccio-test")'` =~ /w==w/) or quit('fail'); (`node -e 'require("verdaccio-test")'` =~ /w==w/) or quit('fail');

View file

@ -0,0 +1,44 @@
#!/usr/bin/perl
# note to readers: in perl it's useful, in javascript it isn't
use strict;
# setting up working environment && chdir there
use Cwd 'abs_path';
use File::Basename;
$ENV{HOME} = dirname(abs_path( __FILE__ )) . '/.verdaccio_test_env';
system('rm -rf .verdaccio_test_env ; mkdir .verdaccio_test_env') and quit('fail');
chdir $ENV{HOME};
use Data::Dumper;
my $pid;
sub quit {
print $_[0]."\n";
exec("kill $pid ; exit 1");
}
# run verdaccio in a child process
if (($pid = fork()) == 0) {
exec "../../../bin/verdaccio ../config_nocache.yaml";
die "exec failed";
}
system('mkdir node_modules') and quit('fail');
system('npm set verdaccio_test_config 12345') and quit('fail');
if (`cat .npmrc` !~ /verdaccio_test_config/) {
quit "npm is using wrong config";
}
system('npm set registry http://localhost:55501') and quit('fail');
system(q{/bin/echo -e 'test\ntest\ns@s.s\n' | npm adduser}) and quit('fail');
system('npm install jju') and quit('fail');
system('test ! -f ./test-storage/jju/jju-*.tgz') and quit('fail');
quit("
==================================================================
All tests seem to be executed successfully, nothing is broken yet.
==================================================================");

Binary file not shown.

17
test/unit/config.js Normal file
View file

@ -0,0 +1,17 @@
'use strict';
const assert = require('assert');
const config_hash = require('./partials/config');
const Config = require('../../lib/config');
describe('Config', function() {
before(function() {
this.config = new Config(config_hash);
});
it('npmjs uplink should have a default cache option that is true', function() {
assert.equal(this.config.uplinks['npmjs'].cache, true);
});
});

View file

@ -1,7 +1,12 @@
'use strict'; 'use strict';
let config = { const config = {
storage: __dirname + '/test-storage', storage: __dirname + '/test-storage',
uplinks: {
'npmjs': {
'url': 'https://registry.npmjs.org/'
}
},
packages: { packages: {
'*': { '*': {
allow_access: '$all', allow_access: '$all',