diff --git a/NEWS.md b/NEWS.md index a0a2495e..3b07a9cf 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,12 +1,25 @@ # Changelog -## 8.1.2 +## 9.0.0 Released 2020-mm-dd +Breaking changes: +- Remove `/version` endpoint + Announcements: - Upgrade camshaft to [`0.65.3`](https://github.com/CartoDB/camshaft/blob/0.65.3/CHANGELOG.md#0653): - - Fix noisy message logs while checking analyses' limits. - - Fix CI setup, explicit use of PGPORT while creating the PostgreSQL cluster. + - Fix noisy message logs while checking analyses' limits + - Fix CI setup, explicit use of PGPORT while creating the PostgreSQL cluster +- Upgrades major windshaft release version [`windshaft@6.0.0`](https://github.com/CartoDB/Windshaft/releases/tag/6.0.0) +- Fix test where `http-fallback-image` renderer was failing quietly +- Fix stat `named map providers` cache count +- Use new signature for `onTileErrorStrategy`. Required by `windshaft@6.0.0` +- Extract `onTileErrorStrategy` to a module +- In tests, stop using mapnik module exposed by windshaft and require it from development dependencies +- Stop using `MapStore` from `windshaft` while testing and create a custom one instead +- Rename NamedMapProviderReporter by NamedMapProviderCacheReporter +- Remove `bootstrapFonts` at process startup (now done in `windshaft@6.0.0`) +- Stop checking the installed version of some dependencies while testing ## 8.1.1 Released 2020-02-17 diff --git a/app.js b/app.js index 445e5389..ca72e3f0 100755 --- a/app.js +++ b/app.js @@ -6,12 +6,11 @@ var path = require('path'); var fs = require('fs'); var _ = require('underscore'); var semver = require('semver'); +// TODO: research it it's still needed const setICUEnvVariable = require('./lib/utils/icu-data-env-setter'); -// jshint undef:false var log = console.log.bind(console); var logError = console.error.bind(console); -// jshint undef:true var nodejsVersion = process.versions.node; const { engines } = require('./package.json'); diff --git a/lib/api/api-router.js b/lib/api/api-router.js index c32d8830..7bf7da88 100644 --- a/lib/api/api-router.js +++ b/lib/api/api-router.js @@ -1,13 +1,11 @@ 'use strict'; -const path = require('path'); - const { Router: router } = require('express'); const RedisPool = require('redis-mpool'); const cartodbRedis = require('cartodb-redis'); -const windshaft = require('windshaft'); +const { factory: windshaftFactory } = require('windshaft'); const PgConnection = require('../backends/pg-connection'); const AnalysisBackend = require('../backends/analysis'); @@ -22,9 +20,7 @@ const UserLimitsBackend = require('../backends/user-limits'); const OverviewsMetadataBackend = require('../backends/overviews-metadata'); const FilterStatsApi = require('../backends/filter-stats'); const TablesExtentBackend = require('../backends/tables-extent'); - const ClusterBackend = require('../backends/cluster'); - const PubSubMetricsBackend = require('../backends/pubsub-metrics'); const LayergroupAffectedTablesCache = require('../cache/layergroup-affected-tables'); @@ -33,7 +29,7 @@ const VarnishHttpCacheBackend = require('../cache/backend/varnish-http'); const FastlyCacheBackend = require('../cache/backend/fastly'); const NamedMapProviderCache = require('../cache/named-map-provider-cache'); const NamedMapsCacheEntry = require('../cache/model/named-maps-entry'); -const NamedMapProviderReporter = require('../stats/reporter/named-map-provider'); +const NamedMapProviderCacheReporter = require('../stats/reporter/named-map-provider-cache'); const SqlWrapMapConfigAdapter = require('../models/mapconfig/adapter/sql-wrap-mapconfig-adapter'); const MapConfigNamedLayersAdapter = require('../models/mapconfig/adapter/mapconfig-named-layers-adapter'); @@ -66,6 +62,8 @@ const pubSubMetrics = require('./middlewares/pubsub-metrics'); const MapRouter = require('./map/map-router'); const TemplateRouter = require('./template/template-router'); +const getOnTileErrorStrategy = require('../utils/on-tile-error-strategy'); + module.exports = class ApiRouter { constructor ({ serverOptions, environmentOptions }) { this.serverOptions = serverOptions; @@ -85,36 +83,22 @@ module.exports = class ApiRouter { global.statsClient.gauge(keyPrefix + 'waiting', status.waiting); }); - const metadataBackend = cartodbRedis({ pool: redisPool }); - const pgConnection = new PgConnection(metadataBackend); - const windshaftLogger = environmentOptions.log_windshaft && global.log4js ? global.log4js.getLogger('[windshaft]') : null; - const mapStore = new windshaft.storage.MapStore({ - pool: redisPool, - expire_time: serverOptions.grainstore.default_layergroup_ttl, + + const { rendererCache, tileBackend, attributesBackend, previewBackend, mapBackend, mapStore } = windshaftFactory({ + rendererOptions: serverOptions, + redisPool, + onTileErrorStrategy: getOnTileErrorStrategy({ enabled: environmentOptions.enabledFeatures.onTileErrorStrategy }), logger: windshaftLogger }); - const rendererFactory = createRendererFactory({ redisPool, serverOptions, environmentOptions }); - - const rendererCacheOpts = Object.assign({ - ttl: 60000, // 60 seconds TTL by default - statsInterval: 60000 // reports stats every milliseconds defined here - }, serverOptions.renderCache || {}); - - const rendererCache = new windshaft.cache.RendererCache(rendererFactory, rendererCacheOpts); - const rendererStatsReporter = new RendererStatsReporter(rendererCache, rendererCacheOpts.statsInterval); + const rendererStatsReporter = new RendererStatsReporter(rendererCache, serverOptions.renderCache.statsInterval); rendererStatsReporter.start(); - const tileBackend = new windshaft.backend.Tile(rendererCache); - const attributesBackend = new windshaft.backend.Attributes(); - const concurrency = serverOptions.renderer.mapnik.poolSize + - serverOptions.renderer.mapnik.poolMaxWaitingClients; - const previewBackend = new windshaft.backend.Preview(rendererCache, { concurrency }); - const mapValidatorBackend = new windshaft.backend.MapValidator(tileBackend, attributesBackend); - const mapBackend = new windshaft.backend.Map(rendererCache, mapStore, mapValidatorBackend); + const metadataBackend = cartodbRedis({ pool: redisPool }); + const pgConnection = new PgConnection(metadataBackend); const surrogateKeysCacheBackends = createSurrogateKeysCacheBackends(serverOptions); const surrogateKeysCache = new SurrogateKeysCache(surrogateKeysCacheBackends); @@ -171,12 +155,11 @@ module.exports = class ApiRouter { layergroupAffectedTablesCache ); - const namedMapProviderReporter = new NamedMapProviderReporter({ + const namedMapProviderCacheReporter = new NamedMapProviderCacheReporter({ namedMapProviderCache, - intervalInMilliseconds: rendererCacheOpts.statsInterval + intervalInMilliseconds: serverOptions.renderCache.statsInterval }); - - namedMapProviderReporter.start(); + namedMapProviderCacheReporter.start(); const collaborators = { analysisStatusBackend, @@ -291,51 +274,3 @@ function createSurrogateKeysCacheBackends (serverOptions) { return cacheBackends; } - -const timeoutErrorTilePath = path.join(__dirname, '/../../assets/render-timeout-fallback.png'); -const timeoutErrorTile = require('fs').readFileSync(timeoutErrorTilePath, { encoding: null }); - -function createRendererFactory ({ redisPool, serverOptions, environmentOptions }) { - var onTileErrorStrategy; - if (environmentOptions.enabledFeatures.onTileErrorStrategy !== false) { - onTileErrorStrategy = function onTileErrorStrategy$TimeoutTile (err, tile, headers, stats, format, callback) { - function isRenderTimeoutError (err) { - return err.message === 'Render timed out'; - } - - function isDatasourceTimeoutError (err) { - return err.message && err.message.match(/canceling statement due to statement timeout/i); - } - - function isTimeoutError (err) { - return isRenderTimeoutError(err) || isDatasourceTimeoutError(err); - } - - function isRasterFormat (format) { - return format === 'png' || format === 'jpg'; - } - - if (isTimeoutError(err) && isRasterFormat(format)) { - return callback(null, timeoutErrorTile, { - 'Content-Type': 'image/png' - }, {}); - } else { - return callback(err, tile, headers, stats); - } - }; - } - - const rendererFactory = new windshaft.renderer.Factory({ - onTileErrorStrategy: onTileErrorStrategy, - mapnik: { - redisPool: redisPool, - grainstore: serverOptions.grainstore, - mapnik: serverOptions.renderer.mapnik - }, - http: serverOptions.renderer.http, - mvt: serverOptions.renderer.mvt, - torque: serverOptions.renderer.torque - }); - - return rendererFactory; -} diff --git a/lib/api/middlewares/error-middleware.js b/lib/api/middlewares/error-middleware.js index ffc64b2b..05d1bd49 100644 --- a/lib/api/middlewares/error-middleware.js +++ b/lib/api/middlewares/error-middleware.js @@ -5,8 +5,6 @@ const debug = require('debug')('windshaft:cartodb:error-middleware'); module.exports = function errorMiddleware (/* options */) { return function error (err, req, res, next) { - // jshint unused:false - // jshint maxcomplexity:9 var allErrors = Array.isArray(err) ? err : [err]; allErrors = populateLimitErrors(allErrors); @@ -115,7 +113,6 @@ module.exports.findStatusCode = findStatusCode; function statusFromErrorMessage (errMsg) { // Find an appropriate statusCode based on message - // jshint maxcomplexity:7 var statusCode = 400; if (errMsg.indexOf('permission denied') !== -1) { statusCode = 403; diff --git a/lib/backends/template-maps.js b/lib/backends/template-maps.js index e1e45c3e..9d09eb9d 100644 --- a/lib/backends/template-maps.js +++ b/lib/backends/template-maps.js @@ -83,7 +83,7 @@ TemplateMaps.prototype._redisCmd = function (redisFunc, redisArgs, callback) { var _reValidNameIdentifier = /^[a-z0-9][0-9a-z_-]*$/i; var _reValidPlaceholderIdentifier = /^[a-z][0-9a-z_]*$/i; -// jshint maxcomplexity:15 + TemplateMaps.prototype._checkInvalidTemplate = function (template) { if (template.version !== '0.0.1') { return new Error('Unsupported template version ' + template.version); diff --git a/lib/models/mapconfig/adapter/analysis-mapconfig-adapter.js b/lib/models/mapconfig/adapter/analysis-mapconfig-adapter.js index 29ffdabf..57fa8e95 100644 --- a/lib/models/mapconfig/adapter/analysis-mapconfig-adapter.js +++ b/lib/models/mapconfig/adapter/analysis-mapconfig-adapter.js @@ -15,7 +15,6 @@ function AnalysisMapConfigAdapter (analysisBackend) { module.exports = AnalysisMapConfigAdapter; AnalysisMapConfigAdapter.prototype.getMapConfig = function (user, requestMapConfig, params, context, callback) { - // jshint maxcomplexity:7 var self = this; if (!shouldAdaptLayers(requestMapConfig)) { diff --git a/lib/server-info-controller.js b/lib/server-info-controller.js index 5913c09e..a871a059 100644 --- a/lib/server-info-controller.js +++ b/lib/server-info-controller.js @@ -5,10 +5,9 @@ var HealthCheck = require('./monitoring/health-check'); var WELCOME_MSG = 'This is the CartoDB Maps API, ' + 'see the documentation at http://docs.cartodb.com/cartodb-platform/maps-api.html'; -function ServerInfoController (versions) { +function ServerInfoController () { this.healthConfig = global.environment.health || {}; this.healthCheck = new HealthCheck(global.environment.disabled_file); - this.versions = versions || {}; } module.exports = ServerInfoController; @@ -16,7 +15,6 @@ module.exports = ServerInfoController; ServerInfoController.prototype.route = function (monitorRouter) { monitorRouter.get('/health', this.health.bind(this)); monitorRouter.get('/', this.welcome.bind(this)); - monitorRouter.get('/version', this.version.bind(this)); }; ServerInfoController.prototype.welcome = function (req, res) { diff --git a/lib/server-options.js b/lib/server-options.js index e89c0b1c..c607d98b 100644 --- a/lib/server-options.js +++ b/lib/server-options.js @@ -102,8 +102,8 @@ module.exports = { }, statsd: global.environment.statsd, renderCache: { - ttl: rendererConfig.cache_ttl, - statsInterval: rendererConfig.statsInterval + ttl: rendererConfig.cache_ttl || 60000, + statsInterval: rendererConfig.statsInterval || 60000 }, renderer: { mvt: Object.assign({ dbPoolParams: global.environment.postgres.pool }, rendererConfig.mvt), diff --git a/lib/server.js b/lib/server.js index a39b1cb5..be030631 100644 --- a/lib/server.js +++ b/lib/server.js @@ -1,16 +1,9 @@ 'use strict'; -const _ = require('underscore'); -const semver = require('semver'); const express = require('express'); -const windshaft = require('windshaft'); -const { mapnik } = windshaft; - const jsonReplacer = require('./utils/json-replacer'); - const ApiRouter = require('./api/api-router'); const ServerInfoController = require('./server-info-controller'); - const StatsClient = require('./stats/client'); module.exports = function createServer (serverOptions) { @@ -21,10 +14,6 @@ module.exports = function createServer (serverOptions) { // Make stats client globally accessible global.statsClient = StatsClient.getInstance(serverOptions.statsd); - serverOptions.grainstore.mapnik_version = mapnikVersion(serverOptions); - - bootstrapFonts(serverOptions); - const app = express(); app.enable('jsonp callback'); @@ -34,70 +23,10 @@ module.exports = function createServer (serverOptions) { const apiRouter = new ApiRouter({ serverOptions, environmentOptions: global.environment }); - // TODO: remove it before releasing next major version - if (!Array.isArray(serverOptions.routes.api)) { - serverOptions.routes.api = [serverOptions.routes.api]; - } - apiRouter.route(app, serverOptions.routes.api); - const versions = getAndValidateVersions(serverOptions); - - const serverInfoController = new ServerInfoController(versions); + const serverInfoController = new ServerInfoController(); serverInfoController.route(app); return app; }; - -function bootstrapFonts (opts) { - // Set carto renderer configuration for MMLStore - opts.grainstore.carto_env = opts.grainstore.carto_env || {}; - var cenv = opts.grainstore.carto_env; - cenv.validation_data = cenv.validation_data || {}; - if (!cenv.validation_data.fonts) { - mapnik.register_system_fonts(); - mapnik.register_default_fonts(); - cenv.validation_data.fonts = _.keys(mapnik.fontFiles()); - } -} - -function mapnikVersion (opts) { - return opts.grainstore.mapnik_version || mapnik.versions.mapnik; -} - -function getAndValidateVersions (options) { - var warn = console.warn.bind(console); // jshint ignore:line - - var packageDefinition = require('../package.json'); - - var declaredDependencies = packageDefinition.dependencies || {}; - var installedDependenciesVersions = { - camshaft: require('camshaft').version, - grainstore: windshaft.grainstore.version(), - mapnik: windshaft.mapnik.versions.mapnik, - node_mapnik: windshaft.mapnik.version, - 'turbo-carto': require('turbo-carto').version, - windshaft: windshaft.version, - windshaft_cartodb: packageDefinition.version - }; - - if (process.env.NODE_ENV !== 'test') { - var dependenciesToValidate = ['camshaft', 'turbo-carto', 'windshaft']; - dependenciesToValidate.forEach(function (depName) { - var declaredDependencyVersion = declaredDependencies[depName]; - var installedDependencyVersion = installedDependenciesVersions[depName]; - if (!semver.satisfies(installedDependencyVersion, declaredDependencyVersion)) { - warn(`Dependency="${depName}" installed version="${installedDependencyVersion}" does ` + - `not match declared version="${declaredDependencyVersion}". Check your installation.`); - } - }); - - // Be nice and warn if configured mapnik version is != installed mapnik version - if (windshaft.mapnik.versions.mapnik !== options.grainstore.mapnik_version) { - warn('WARNING: detected mapnik version (' + windshaft.mapnik.versions.mapnik + ')' + - ' != configured mapnik version (' + options.grainstore.mapnik_version + ')'); - } - } - - return installedDependenciesVersions; -} diff --git a/lib/stats/reporter/named-map-provider.js b/lib/stats/reporter/named-map-provider-cache.js similarity index 86% rename from lib/stats/reporter/named-map-provider.js rename to lib/stats/reporter/named-map-provider-cache.js index c057e012..0b046fd4 100644 --- a/lib/stats/reporter/named-map-provider.js +++ b/lib/stats/reporter/named-map-provider-cache.js @@ -2,10 +2,10 @@ const statKeyTemplate = ctx => `windshaft.named-map-provider-cache.${ctx.metric}`; -module.exports = class NamedMapProviderReporter { +module.exports = class NamedMapProviderCacheReporter { constructor ({ namedMapProviderCache, intervalInMilliseconds } = {}) { this.namedMapProviderCache = namedMapProviderCache; - this.intervalInMilliseconds = intervalInMilliseconds; + this.intervalInMilliseconds = intervalInMilliseconds || 60000; this.intervalId = null; } @@ -14,8 +14,8 @@ module.exports = class NamedMapProviderReporter { const { statsClient: stats } = global; this.intervalId = setInterval(() => { - stats.gauge(statKeyTemplate({ metric: 'named-map.count' }), cache.length); const providers = cache.dump(); + stats.gauge(statKeyTemplate({ metric: 'named-map.count' }), providers.length); const namedMapInstantiations = providers.reduce((acc, { v: providers }) => { acc += Object.keys(providers).length; diff --git a/lib/stats/reporter/renderer.js b/lib/stats/reporter/renderer.js index 463eb114..046bd1ef 100644 --- a/lib/stats/reporter/renderer.js +++ b/lib/stats/reporter/renderer.js @@ -6,8 +6,6 @@ // - the mapnik-pool status: count, unused and waiting // - the internally cached objects: png and grid -var _ = require('underscore'); - function RendererStatsReporter (rendererCache, statsInterval) { this.rendererCache = rendererCache; this.statsInterval = statsInterval || 6e4; @@ -17,50 +15,16 @@ function RendererStatsReporter (rendererCache, statsInterval) { module.exports = RendererStatsReporter; RendererStatsReporter.prototype.start = function () { - var self = this; - this.renderersStatsIntervalId = setInterval(function () { - var rendererCacheEntries = self.rendererCache.renderers; + this.renderersStatsIntervalId = setInterval(() => { + const rendererStats = this.rendererCache.getStats(); - if (!rendererCacheEntries) { - return null; - } - - global.statsClient.gauge('windshaft.rendercache.count', _.keys(rendererCacheEntries).length); - - var renderersStats = _.reduce(rendererCacheEntries, function (_rendererStats, cacheEntry) { - var stats = cacheEntry.renderer && cacheEntry.renderer.getStats && cacheEntry.renderer.getStats(); - if (!stats) { - return _rendererStats; - } - - _rendererStats.pool.count += stats.pool.count; - _rendererStats.pool.unused += stats.pool.unused; - _rendererStats.pool.waiting += stats.pool.waiting; - - _rendererStats.cache.grid += stats.cache.grid; - _rendererStats.cache.png += stats.cache.png; - - return _rendererStats; - }, - { - pool: { - count: 0, - unused: 0, - waiting: 0 - }, - cache: { - png: 0, - grid: 0 + for (const [stat, value] of rendererStats) { + if (stat.startsWith('rendercache')) { + global.statsClient.gauge(`windshaft.${stat}`, value); + } else { + global.statsClient.gauge(`windshaft.mapnik-${stat}`, value); } } - ); - - global.statsClient.gauge('windshaft.mapnik-cache.png', renderersStats.cache.png); - global.statsClient.gauge('windshaft.mapnik-cache.grid', renderersStats.cache.grid); - - global.statsClient.gauge('windshaft.mapnik-pool.count', renderersStats.pool.count); - global.statsClient.gauge('windshaft.mapnik-pool.unused', renderersStats.pool.unused); - global.statsClient.gauge('windshaft.mapnik-pool.waiting', renderersStats.pool.waiting); }, this.statsInterval); this.rendererCache.on('err', rendererCacheErrorListener); diff --git a/lib/utils/on-tile-error-strategy.js b/lib/utils/on-tile-error-strategy.js new file mode 100644 index 00000000..b45e7a2e --- /dev/null +++ b/lib/utils/on-tile-error-strategy.js @@ -0,0 +1,37 @@ +'use strict'; + +const path = require('path'); +const timeoutErrorTilePath = path.join(__dirname, '/../../assets/render-timeout-fallback.png'); +const timeoutErrorTile = require('fs').readFileSync(timeoutErrorTilePath, { encoding: null }); + +module.exports = function getOnTileErrorStrategy ({ enabled }) { + let onTileErrorStrategy; + + if (enabled !== false) { + onTileErrorStrategy = async function onTileErrorStrategy$TimeoutTile (err, format) { + function isRenderTimeoutError (err) { + return err.message === 'Render timed out'; + } + + function isDatasourceTimeoutError (err) { + return err.message && err.message.match(/canceling statement due to statement timeout/i); + } + + function isTimeoutError (err) { + return isRenderTimeoutError(err) || isDatasourceTimeoutError(err); + } + + function isRasterFormat (format) { + return format === 'png' || format === 'jpg'; + } + + if (isTimeoutError(err) && isRasterFormat(format)) { + return { buffer: timeoutErrorTile, headers: { 'Content-Type': 'image/png' }, stats: {} }; + } else { + throw err; + } + }; + } + + return onTileErrorStrategy; +}; diff --git a/package-lock.json b/package-lock.json index 9114f31c..80c09e41 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "windshaft-cartodb", - "version": "8.1.2", + "version": "9.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -165,9 +165,9 @@ } }, "@carto/cartonik": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@carto/cartonik/-/cartonik-0.7.0.tgz", - "integrity": "sha512-LD5HBx3/hUL4492I++rspGJh2bcoOjLAHBE8cOLi2fyqIK0NS5bekXrz9mEWY/Ie9xLDeKn9s89FTbl7IhrLrw==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@carto/cartonik/-/cartonik-0.8.0.tgz", + "integrity": "sha512-avB1IyTxy04lN2lyyUdQPhCPRHTH4IcauhUOVFlhLOrQhxbkfrf/VXdE8dJsdlI4w6U1pTiHpiq++5+yZr2gyQ==", "requires": { "@carto/mapnik": "3.6.2-carto.16", "@mapbox/sphericalmercator": "^1.1.0", @@ -534,9 +534,9 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -790,9 +790,9 @@ } }, "canvas": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.0.tgz", - "integrity": "sha512-bEO9f1ThmbknLPxCa8Es7obPlN9W3stB1bo7njlhOFKIdUTldeTqXCh9YclCPAi2pSQs84XA0jq/QEZXSzgyMw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.1.tgz", + "integrity": "sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA==", "requires": { "nan": "^2.14.0", "node-pre-gyp": "^0.11.0", @@ -800,9 +800,9 @@ }, "dependencies": { "glob": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", - "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -841,7 +841,7 @@ }, "carto": { "version": "github:cartodb/carto#85881d99dd7fcf2c4e16478b04db67108d27a50c", - "from": "github:cartodb/carto#master", + "from": "github:cartodb/carto#0.15.1-cdb5", "requires": { "mapnik-reference": "~6.0.2", "optimist": "~0.6.0", @@ -949,9 +949,9 @@ "dev": true }, "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "chroma-js": { "version": "1.1.1", @@ -4331,9 +4331,9 @@ "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==" }, "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz", + "integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ==" } } }, @@ -4361,9 +4361,9 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "mimic-response": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.0.0.tgz", - "integrity": "sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" }, "minimatch": { "version": "3.0.4", @@ -4502,9 +4502,9 @@ "optional": true }, "needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.3.tgz", + "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "requires": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", @@ -4640,9 +4640,9 @@ }, "dependencies": { "glob": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", - "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4668,9 +4668,9 @@ "integrity": "sha1-J6WTSHY9CvegN6wqAx/vPwUQE9M=" }, "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "requires": { "abbrev": "1", "osenv": "^0.1.4" @@ -4688,17 +4688,26 @@ } }, "npm-bundled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" }, "npm-packlist": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.6.tgz", - "integrity": "sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg==", + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "requires": { "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "npm-run-path": { @@ -5466,9 +5475,9 @@ }, "dependencies": { "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" } } }, @@ -6396,6 +6405,22 @@ "d3": "3.5.17", "turbo-carto": "^0.21.1", "turf-jenks": "~1.0.1" + }, + "dependencies": { + "carto": { + "version": "github:cartodb/carto#85881d99dd7fcf2c4e16478b04db67108d27a50c", + "from": "github:cartodb/carto#master", + "requires": { + "mapnik-reference": "~6.0.2", + "optimist": "~0.6.0", + "underscore": "1.8.3" + } + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + } } }, "tough-cookie": { @@ -6594,11 +6619,11 @@ "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" }, "windshaft": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/windshaft/-/windshaft-5.6.4.tgz", - "integrity": "sha512-W+SbKM5CjpuPXMrLUXzZms6yDk0aQeIs3eAd75Ih6SYwiJo12/vxkHqMe+0KZnVj6JE/oe53tVfWHRibE70NJA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/windshaft/-/windshaft-6.0.0.tgz", + "integrity": "sha512-7GnPRZsJuHEnwC/Yp+QvMIyK/EhLqABs2RNz0iQsShqS5gdsxHCIp+koG2r31ujrl4T8JDFCT5Y2Q4yQC70EaA==", "requires": { - "@carto/cartonik": "^0.7.0", + "@carto/cartonik": "^0.8.0", "@carto/mapnik": "3.6.2-carto.16", "canvas": "^2.4.1", "carto": "github:cartodb/carto#0.15.1-cdb5", @@ -6612,15 +6637,6 @@ "torque.js": "3.1.1" }, "dependencies": { - "carto": { - "version": "github:cartodb/carto#85881d99dd7fcf2c4e16478b04db67108d27a50c", - "from": "github:cartodb/carto#0.15.1-cdb5", - "requires": { - "mapnik-reference": "~6.0.2", - "optimist": "~0.6.0", - "underscore": "1.8.3" - } - }, "cartodb-query-tables": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/cartodb-query-tables/-/cartodb-query-tables-0.6.3.tgz", @@ -6628,11 +6644,6 @@ "requires": { "decimal.js": "10.2.0" } - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" } } }, diff --git a/package.json b/package.json index 2cb6087d..3ee5f8c1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "windshaft-cartodb", - "version": "8.1.2", + "version": "9.0.0", "description": "CARTO Maps API tiler", "keywords": [ "carto", @@ -60,10 +60,11 @@ "step-profiler": "0.3.0", "turbo-carto": "0.21.2", "underscore": "1.6.0", - "windshaft": "5.6.4", + "windshaft": "^6.0.0", "yargs": "11.1.0" }, "devDependencies": { + "@carto/mapnik": "^3.6.2-carto.16", "eslint": "^6.5.1", "eslint-config-standard": "^14.1.0", "eslint-plugin-import": "^2.18.2", @@ -75,9 +76,9 @@ "nock": "9.2.6", "nyc": "^14.1.1", "redis": "2.8.0", + "sinon": "^9.0.0", "step": "1.0.0", - "strftime": "0.10.0", - "sinon": "^9.0.0" + "strftime": "0.10.0" }, "scripts": { "lint:fix": "eslint --fix app.js \"lib/**/*.js\" \"test/**/*.js\"", diff --git a/test/acceptance/auth/authorization-test.js b/test/acceptance/auth/authorization-test.js index cd277153..7b53a9e5 100644 --- a/test/acceptance/auth/authorization-test.js +++ b/test/acceptance/auth/authorization-test.js @@ -4,7 +4,7 @@ require('../../support/test-helper'); const assert = require('../../support/assert'); const TestClient = require('../../support/test-client'); -const mapnik = require('windshaft').mapnik; +const mapnik = require('@carto/mapnik'); const PERMISSION_DENIED_RESPONSE = { status: 403, diff --git a/test/acceptance/buffer-size-format-test.js b/test/acceptance/buffer-size-format-test.js index 1a5e653a..7e2efbe5 100644 --- a/test/acceptance/buffer-size-format-test.js +++ b/test/acceptance/buffer-size-format-test.js @@ -6,7 +6,7 @@ var fs = require('fs'); var assert = require('../support/assert'); var TestClient = require('../support/test-client'); var serverOptions = require('../../lib/server-options'); -var mapnik = require('windshaft').mapnik; +const mapnik = require('@carto/mapnik'); var IMAGE_TOLERANCE_PER_MIL = 5; var CARTOCSS_LABELS = [ diff --git a/test/acceptance/cache/cache-headers-test.js b/test/acceptance/cache/cache-headers-test.js index c77a3b50..d96bada7 100644 --- a/test/acceptance/cache/cache-headers-test.js +++ b/test/acceptance/cache/cache-headers-test.js @@ -302,15 +302,6 @@ describe('get requests with cache headers', function () { ); }); - it('/version', function (done) { - assert.response( - server, - getRequest('/version'), - statusOkResponse, - noCacheHeaders(done) - ); - }); - it('/health', function (done) { assert.response( server, diff --git a/test/acceptance/multilayer-test.js b/test/acceptance/multilayer-test.js index a91d5e99..91868751 100644 --- a/test/acceptance/multilayer-test.js +++ b/test/acceptance/multilayer-test.js @@ -8,7 +8,7 @@ var step = require('step'); var strftime = require('strftime'); var redisStatsDb = 5; -var mapnik = require('windshaft').mapnik; +const mapnik = require('@carto/mapnik'); var semver = require('semver'); var helper = require('../support/test-helper'); diff --git a/test/acceptance/named-layers-visibility-test.js b/test/acceptance/named-layers-visibility-test.js index 1a717cf8..a9b0624c 100644 --- a/test/acceptance/named-layers-visibility-test.js +++ b/test/acceptance/named-layers-visibility-test.js @@ -9,7 +9,7 @@ var serverOptions = require('../../lib/server-options'); var RedisPool = require('redis-mpool'); var TemplateMaps = require('../../lib/backends/template-maps'); -var mapnik = require('windshaft').mapnik; +const mapnik = require('@carto/mapnik'); var IMAGE_TOLERANCE = 20; diff --git a/test/acceptance/named-map-cache-regressions-test.js b/test/acceptance/named-map-cache-regressions-test.js index 8d6c72d5..1c3423fb 100644 --- a/test/acceptance/named-map-cache-regressions-test.js +++ b/test/acceptance/named-map-cache-regressions-test.js @@ -6,7 +6,7 @@ const request = require('request'); const assert = require('assert'); const Server = require('../../lib/server'); const serverOptions = require('../../lib/server-options'); -const { mapnik } = require('windshaft'); +const mapnik = require('@carto/mapnik'); const helper = require('../support/test-helper'); const namedTileUrlTemplate = (ctx) => { diff --git a/test/acceptance/named-maps-authentication-test.js b/test/acceptance/named-maps-authentication-test.js index 848983b2..cd1e20eb 100644 --- a/test/acceptance/named-maps-authentication-test.js +++ b/test/acceptance/named-maps-authentication-test.js @@ -5,7 +5,7 @@ var RedisPool = require('redis-mpool'); var querystring = require('querystring'); var assert = require('../support/assert'); -var mapnik = require('windshaft').mapnik; +const mapnik = require('@carto/mapnik'); var CartodbWindshaft = require('../../lib/server'); var serverOptions = require('../../lib/server-options'); var TemplateMaps = require('../../lib/backends/template-maps'); diff --git a/test/acceptance/named-maps-cache-test.js b/test/acceptance/named-maps-cache-test.js index 1c662991..4c036858 100644 --- a/test/acceptance/named-maps-cache-test.js +++ b/test/acceptance/named-maps-cache-test.js @@ -4,7 +4,7 @@ require('../support/test-helper'); const helper = require('../support/test-helper'); var assert = require('../support/assert'); -var mapnik = require('windshaft').mapnik; +const mapnik = require('@carto/mapnik'); var CartodbWindshaft = require('../../lib/server'); var serverOptions = require('../../lib/server-options'); diff --git a/test/acceptance/named-maps-static-view-test.js b/test/acceptance/named-maps-static-view-test.js index 370f9034..08d5ac82 100644 --- a/test/acceptance/named-maps-static-view-test.js +++ b/test/acceptance/named-maps-static-view-test.js @@ -5,7 +5,7 @@ var testHelper = require('../support/test-helper'); var RedisPool = require('redis-mpool'); var assert = require('../support/assert'); -var mapnik = require('windshaft').mapnik; +const mapnik = require('@carto/mapnik'); var CartodbWindshaft = require('../../lib/server'); var serverOptions = require('../../lib/server-options'); var TemplateMaps = require('../../lib/backends/template-maps'); diff --git a/test/acceptance/named-maps-stats-test.js b/test/acceptance/named-maps-stats-test.js index 6ccf112e..c7a1ded7 100644 --- a/test/acceptance/named-maps-stats-test.js +++ b/test/acceptance/named-maps-stats-test.js @@ -5,7 +5,7 @@ var RedisPool = require('redis-mpool'); var querystring = require('querystring'); var assert = require('../support/assert'); -var mapnik = require('windshaft').mapnik; +const mapnik = require('@carto/mapnik'); var CartodbWindshaft = require('../../lib/server'); var serverOptions = require('../../lib/server-options'); var TemplateMaps = require('../../lib/backends/template-maps'); diff --git a/test/acceptance/overviews-metadata-named-maps-test.js b/test/acceptance/overviews-metadata-named-maps-test.js index cbab9289..60712ec6 100644 --- a/test/acceptance/overviews-metadata-named-maps-test.js +++ b/test/acceptance/overviews-metadata-named-maps-test.js @@ -12,7 +12,7 @@ var RedisPool = require('redis-mpool'); var step = require('step'); -var windshaft = require('windshaft'); +const MapStore = require('../support/map-store'); describe('overviews metadata for named maps', function () { var server; @@ -127,10 +127,7 @@ describe('overviews metadata for named maps', function () { var next = this; - var mapStore = new windshaft.storage.MapStore({ - pool: redisPool, - expire_time: 500000 - }); + const mapStore = new MapStore(redisPool); mapStore.load(LayergroupToken.parse(layergroupId).token, function (err, mapConfig) { assert.ifError(err); assert.deepStrictEqual(nonOverviewsLayer, mapConfig._cfg.layers[1]); diff --git a/test/acceptance/overviews-metadata-test.js b/test/acceptance/overviews-metadata-test.js index b20e699c..d06b8cdf 100644 --- a/test/acceptance/overviews-metadata-test.js +++ b/test/acceptance/overviews-metadata-test.js @@ -12,7 +12,7 @@ var RedisPool = require('redis-mpool'); var step = require('step'); -var windshaft = require('windshaft'); +const MapStore = require('../support/map-store'); describe('overviews metadata', function () { var server; @@ -82,10 +82,8 @@ describe('overviews metadata', function () { assert.ifError(err); var next = this; - var mapStore = new windshaft.storage.MapStore({ - pool: redisPool, - expire_time: 500000 - }); + const mapStore = new MapStore(redisPool); + mapStore.load(LayergroupToken.parse(expectedToken).token, function (err, mapConfig) { assert.ifError(err); assert.deepStrictEqual(nonOverviewsLayer, mapConfig._cfg.layers[1]); @@ -275,10 +273,8 @@ describe('overviews metadata with filters', function () { assert.ifError(err); var next = this; - var mapStore = new windshaft.storage.MapStore({ - pool: redisPool, - expire_time: 500000 - }); + const mapStore = new MapStore(redisPool); + mapStore.load(LayergroupToken.parse(expectedToken).token, function (err, mapConfig) { assert.ifError(err); assert.strictEqual(mapConfig._cfg.layers[0].type, 'cartodb'); diff --git a/test/acceptance/ported/multilayer-test.js b/test/acceptance/ported/multilayer-test.js index db629f9a..8edb4fa9 100644 --- a/test/acceptance/ported/multilayer-test.js +++ b/test/acceptance/ported/multilayer-test.js @@ -6,7 +6,7 @@ var assert = require('../../support/assert'); var _ = require('underscore'); var querystring = require('querystring'); var step = require('step'); -var mapnik = require('windshaft').mapnik; +const mapnik = require('@carto/mapnik'); var cartodbServer = require('../../../lib/server'); var ServerOptions = require('./support/ported-server-options'); var LayergroupToken = require('../../../lib/models/layergroup-token'); diff --git a/test/acceptance/ported/retina-test.js b/test/acceptance/ported/retina-test.js index ac78b85b..5a54c664 100644 --- a/test/acceptance/ported/retina-test.js +++ b/test/acceptance/ported/retina-test.js @@ -3,7 +3,7 @@ var testHelper = require('../../support/test-helper'); var assert = require('../../support/assert'); -var mapnik = require('windshaft').mapnik; +const mapnik = require('@carto/mapnik'); var cartodbServer = require('../../../lib/server'); var ServerOptions = require('./support/ported-server-options'); diff --git a/test/acceptance/ported/server-gettile-test.js b/test/acceptance/ported/server-gettile-test.js index 52135197..2c7be80c 100644 --- a/test/acceptance/ported/server-gettile-test.js +++ b/test/acceptance/ported/server-gettile-test.js @@ -3,7 +3,7 @@ var testHelper = require('../../support/test-helper'); var assert = require('../../support/assert'); -var mapnik = require('windshaft').mapnik; +const mapnik = require('@carto/mapnik'); var semver = require('semver'); var cartodbServer = require('../../../lib/server'); var ServerOptions = require('./support/ported-server-options'); diff --git a/test/acceptance/ported/server-test.js b/test/acceptance/ported/server-test.js index 31c25101..be0a0944 100644 --- a/test/acceptance/ported/server-test.js +++ b/test/acceptance/ported/server-test.js @@ -35,29 +35,6 @@ describe('server', function () { }, function () { done(); }); }); - /// ///////////////////////////////////////////////////////////////// - // - // GET VERSION - // - /// ///////////////////////////////////////////////////////////////// - - it('get /version returns versions', function (done) { - assert.response(server, { - url: '/version', - method: 'GET' - }, { - status: 200 - }, function (res) { - var parsed = JSON.parse(res.body); - assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'windshaft'), "No 'windshaft' version in " + parsed); - assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'grainstore'), "No 'grainstore' version in " + parsed); - assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'node_mapnik'), "No 'node_mapnik' version in " + parsed); - assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'mapnik'), "No 'mapnik' version in " + parsed); - // TODO: check actual versions ? - done(); - }); - }); - /// ///////////////////////////////////////////////////////////////// // // GET GRID diff --git a/test/acceptance/ported/support/ported-server-options.js b/test/acceptance/ported/support/ported-server-options.js index 094cbfa6..cbaef299 100644 --- a/test/acceptance/ported/support/ported-server-options.js +++ b/test/acceptance/ported/support/ported-server-options.js @@ -2,7 +2,7 @@ var _ = require('underscore'); var serverOptions = require('../../../../lib/server-options'); -var mapnik = require('windshaft').mapnik; +const mapnik = require('@carto/mapnik'); var OverviewsQueryRewriter = require('../../../../lib/utils/overviews-query-rewriter'); var overviewsQueryRewriter = new OverviewsQueryRewriter({ zoom_level: 'CDB_ZoomFromScale(!scale_denominator!)' @@ -41,7 +41,7 @@ module.exports = _.extend({}, serverOptions, { whitelist: ['http://127.0.0.1:8033/{s}/{z}/{x}/{y}.png'], fallbackImage: { type: 'fs', - src: path.join(__dirname, '/../../test/fixtures/http/basemap.png') + src: path.join(__dirname, '/../../../fixtures/http/basemap.png') } } }, diff --git a/test/acceptance/ported/support/test-client.js b/test/acceptance/ported/support/test-client.js index 48a773cf..fce97eba 100644 --- a/test/acceptance/ported/support/test-client.js +++ b/test/acceptance/ported/support/test-client.js @@ -7,7 +7,7 @@ var step = require('step'); var assert = require('../../../support/assert'); var _ = require('underscore'); var querystring = require('querystring'); -var mapnik = require('windshaft').mapnik; +const mapnik = require('@carto/mapnik'); var CartodbServer = require('../../../../lib/server'); var PortedServerOptions = require('./ported-server-options'); diff --git a/test/acceptance/server-test.js b/test/acceptance/server-test.js index aa010b56..7fb16e4d 100644 --- a/test/acceptance/server-test.js +++ b/test/acceptance/server-test.js @@ -39,23 +39,6 @@ describe('server', function () { } ); }); - - it('get call to server returns 200', function (done) { - assert.response(server, { - url: '/version', - method: 'GET' - }, { - status: 200 - }, function (res) { - var parsed = JSON.parse(res.body); - assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'windshaft_cartodb'), "No 'windshaft_cartodb' version in " + parsed); - assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'windshaft'), "No 'windshaft' version in " + parsed); - assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'grainstore'), "No 'grainstore' version in " + parsed); - assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'node_mapnik'), "No 'node_mapnik' version in " + parsed); - assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'mapnik'), "No 'mapnik' version in " + parsed); - done(); - }); - }); }); describe('server old_api', function () { diff --git a/test/acceptance/turbo-carto/named-maps-test.js b/test/acceptance/turbo-carto/named-maps-test.js index f8d05532..5076b66f 100644 --- a/test/acceptance/turbo-carto/named-maps-test.js +++ b/test/acceptance/turbo-carto/named-maps-test.js @@ -6,7 +6,7 @@ var LayergroupToken = require('../../../lib/models/layergroup-token'); var testHelper = require('../../support/test-helper'); var CartodbWindshaft = require('../../../lib/server'); var serverOptions = require('../../../lib/server-options'); -var mapnik = require('windshaft').mapnik; +const mapnik = require('@carto/mapnik'); var IMAGE_TOLERANCE_PER_MIL = 10; describe('turbo-carto for named maps', function () { diff --git a/test/support/assert.js b/test/support/assert.js index a088a967..6bcee699 100644 --- a/test/support/assert.js +++ b/test/support/assert.js @@ -7,7 +7,7 @@ var fs = require('fs'); var path = require('path'); var util = require('util'); -var mapnik = require('windshaft').mapnik; +const mapnik = require('@carto/mapnik'); var request = require('request'); @@ -95,7 +95,6 @@ assert.response = function (server, req, res, callback) { var listener = server.listen(port, host); listener.on('error', callback); listener.on('listening', function onServerListening () { - // jshint maxcomplexity:9 const { address: host, port } = listener.address(); const address = `${host}:${port}`; @@ -186,7 +185,6 @@ function validateResponse (response, expected) { // @param tolerance number of tolerated grid cell differences assert.utfgridEqualsFile = function (buffer, fileB, tolerance, callback) { - // jshint maxcomplexity:9 fs.writeFileSync('/tmp/grid.json', buffer, 'binary'); // <-- to debug/update var expectedJson = JSON.parse(fs.readFileSync(fileB, 'utf8')); diff --git a/test/support/map-store.js b/test/support/map-store.js new file mode 100644 index 00000000..2d916c4b --- /dev/null +++ b/test/support/map-store.js @@ -0,0 +1,38 @@ +'use strict'; + +const { MapConfig } = require('windshaft').model; + +// Windshaft no longer provides the MapStore class to be used just for testing purposes +// This class provides just the method needed to load a map-config from redis +// It should be replaced by a new module @carto/map-config-storage (to be published) +module.exports = class MapStore { + constructor (pool) { + this.pool = pool; + } + + load (token, callback) { + const db = 0; + this.pool.acquire(db, (err, client) => { + if (err) { + return callback(err); + } + + client.get(`map_cfg|${token}`, (err, data) => { + this.pool.release(db, client); + + if (err) { + return callback(err); + } + + let mapConfig; + try { + mapConfig = MapConfig.create(JSON.parse(data)); + } catch (err) { + return callback(err); + } + + return callback(null, mapConfig); + }); + }); + } +}; diff --git a/test/support/test-client.js b/test/support/test-client.js index 4d482786..f0798dad 100644 --- a/test/support/test-client.js +++ b/test/support/test-client.js @@ -5,7 +5,7 @@ var step = require('step'); const { URL } = require('url'); var PSQL = require('cartodb-psql'); var _ = require('underscore'); -var mapnik = require('windshaft').mapnik; +const mapnik = require('@carto/mapnik'); var LayergroupToken = require('../../lib/models/layergroup-token'); @@ -821,7 +821,6 @@ TestClient.prototype.getTile = function (z, x, y, params, callback) { ); }, function getTileResult (err, layergroupId) { - // jshint maxcomplexity:13 assert.ifError(err); self.keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0; @@ -931,7 +930,6 @@ TestClient.prototype.getTile = function (z, x, y, params, callback) { }; TestClient.prototype.getLayergroup = function (params, callback) { - // jshint maxcomplexity: 7 var self = this; if (!callback) { diff --git a/test/unit/prepare-context-test.js b/test/unit/prepare-context-test.js index 928816d3..9d341515 100644 --- a/test/unit/prepare-context-test.js +++ b/test/unit/prepare-context-test.js @@ -8,14 +8,13 @@ var cartodbRedis = require('cartodb-redis'); var PgConnection = require('../../lib/backends/pg-connection'); var AuthBackend = require('../../lib/backends/auth'); var TemplateMaps = require('../../lib/backends/template-maps'); +const MapStore = require('../support/map-store'); const cleanUpQueryParamsMiddleware = require('../../lib/api/middlewares/clean-up-query-params'); const authorizeMiddleware = require('../../lib/api/middlewares/authorize'); const dbConnSetupMiddleware = require('../../lib/api/middlewares/db-conn-setup'); const credentialsMiddleware = require('../../lib/api/middlewares/credentials'); -var windshaft = require('windshaft'); - describe('prepare-context', function () { var testUser = _.template(global.environment.postgres_auth_user, { user_id: 1 }); var testPubuser = global.environment.postgres.user; @@ -28,7 +27,7 @@ describe('prepare-context', function () { before(function () { var redisPool = new RedisPool(global.environment.redis); - var mapStore = new windshaft.storage.MapStore(); + var mapStore = new MapStore(redisPool); var metadataBackend = cartodbRedis({ pool: redisPool }); var pgConnection = new PgConnection(metadataBackend); var templateMaps = new TemplateMaps(redisPool); diff --git a/test/unit/stats/reporter/named-map-provider-test.js b/test/unit/stats/reporter/named-map-provider-test.js index 0183b69b..3873e59f 100644 --- a/test/unit/stats/reporter/named-map-provider-test.js +++ b/test/unit/stats/reporter/named-map-provider-test.js @@ -1,7 +1,7 @@ 'use strict'; const assert = require('assert'); -const NamedMapProviderReporter = require('../../../../lib/stats/reporter/named-map-provider'); +const NamedMapProviderReporter = require('../../../../lib/stats/reporter/named-map-provider-cache'); describe('named-map-provider-reporter', function () { it('should report metrics every 100 ms', function (done) { diff --git a/test/unit/template-maps-test.js b/test/unit/template-maps-test.js index 57249be4..32bb0499 100644 --- a/test/unit/template-maps-test.js +++ b/test/unit/template-maps-test.js @@ -392,7 +392,6 @@ describe('template_maps', function () { }); it('instanciate templates', function () { - // jshint maxcomplexity:7 var tmap = new TemplateMaps(redisPool); assert.ok(tmap);