From 1016f5f26f858703e59d99d5401a30ab6e7a3764 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 2 Nov 2016 16:43:19 +0100 Subject: [PATCH 01/10] initial commit --- packages/xo-common/.editorconfig | 65 ++++++++++++++++++++++ packages/xo-common/.gitignore | 7 +++ packages/xo-common/.npmignore | 10 ++++ packages/xo-common/.travis.yml | 9 +++ packages/xo-common/README.md | 49 ++++++++++++++++ packages/xo-common/api-errors.js | 1 + packages/xo-common/package.json | 83 ++++++++++++++++++++++++++++ packages/xo-common/src/api-errors.js | 0 8 files changed, 224 insertions(+) create mode 100644 packages/xo-common/.editorconfig create mode 100644 packages/xo-common/.gitignore create mode 100644 packages/xo-common/.npmignore create mode 100644 packages/xo-common/.travis.yml create mode 100644 packages/xo-common/README.md create mode 100644 packages/xo-common/api-errors.js create mode 100644 packages/xo-common/package.json create mode 100644 packages/xo-common/src/api-errors.js diff --git a/packages/xo-common/.editorconfig b/packages/xo-common/.editorconfig new file mode 100644 index 000000000..b6db0112a --- /dev/null +++ b/packages/xo-common/.editorconfig @@ -0,0 +1,65 @@ +# http://EditorConfig.org +# +# Julien Fontanet's configuration +# https://gist.github.com/julien-f/8096213 + +# Top-most EditorConfig file. +root = true + +# Common config. +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespaces = true + +# CoffeeScript +# +# https://github.com/polarmobile/coffeescript-style-guide/blob/master/README.md +[*.{,lit}coffee] +indent_size = 2 +indent_style = space + +# Markdown +[*.{md,mdwn,mdown,markdown}] +indent_size = 4 +indent_style = space + +# Package.json +# +# This indentation style is the one used by npm. +[/package.json] +indent_size = 2 +indent_style = space + +# Jade +[*.jade] +indent_size = 2 +indent_style = space + +# JavaScript +# +# Two spaces seems to be the standard most common style, at least in +# Node.js (http://nodeguide.com/style.html#tabs-vs-spaces). +[*.{js,jsx,ts,tsx}] +indent_size = 2 +indent_style = space + +# Less +[*.less] +indent_size = 2 +indent_style = space + +# Sass +# +# Style used for http://libsass.com +[*.s[ac]ss] +indent_size = 2 +indent_style = space + +# YAML +# +# Only spaces are allowed. +[*.yaml] +indent_size = 2 +indent_style = space diff --git a/packages/xo-common/.gitignore b/packages/xo-common/.gitignore new file mode 100644 index 000000000..827e4e420 --- /dev/null +++ b/packages/xo-common/.gitignore @@ -0,0 +1,7 @@ +/dist/ +/node_modules/ + +npm-debug.log +npm-debug.log.* +pnpm-debug.log +pnpm-debug.log.* diff --git a/packages/xo-common/.npmignore b/packages/xo-common/.npmignore new file mode 100644 index 000000000..c31ee82cb --- /dev/null +++ b/packages/xo-common/.npmignore @@ -0,0 +1,10 @@ +/examples/ +example.js +example.js.map +*.example.js +*.example.js.map + +/test/ +/tests/ +*.spec.js +*.spec.js.map diff --git a/packages/xo-common/.travis.yml b/packages/xo-common/.travis.yml new file mode 100644 index 000000000..1a582c426 --- /dev/null +++ b/packages/xo-common/.travis.yml @@ -0,0 +1,9 @@ +language: node_js +node_js: + - stable + - 6 + - 4 + +# Use containers. +# http://docs.travis-ci.com/user/workers/container-based-infrastructure/ +sudo: false diff --git a/packages/xo-common/README.md b/packages/xo-common/README.md new file mode 100644 index 000000000..987ed83fd --- /dev/null +++ b/packages/xo-common/README.md @@ -0,0 +1,49 @@ +# xo-common [![Build Status](https://travis-ci.org/vatesfr/xo-common.png?branch=master)](https://travis-ci.org/vatesfr/xo-common) + +> Code shared between [XO](https://xen-orchestra.com) server and clients + +## Install + +Installation of the [npm package](https://npmjs.org/package/xo-common): + +``` +> npm install --save xo-common +``` + +## Usage + +**TODO** + +## Development + +``` +# Install dependencies +> npm install + +# Run the tests +> npm test + +# Continuously compile +> npm run dev + +# Continuously run the tests +> npm run dev-test + +# Build for production (automatically called by npm install) +> npm run build +``` + +## Contributions + +Contributions are *very* welcomed, either on the documentation or on +the code. + +You may: + +- report any [issue](https://github.com/vatesfr/xo-common/issues) + you've encountered; +- fork and create a pull request. + +## License + +AGPL3 © [Vates SAS](https://vates.fr) diff --git a/packages/xo-common/api-errors.js b/packages/xo-common/api-errors.js new file mode 100644 index 000000000..3b3e7974b --- /dev/null +++ b/packages/xo-common/api-errors.js @@ -0,0 +1 @@ +module.exports = require('./dist/api-errors') diff --git a/packages/xo-common/package.json b/packages/xo-common/package.json new file mode 100644 index 000000000..ab5d1cb2e --- /dev/null +++ b/packages/xo-common/package.json @@ -0,0 +1,83 @@ +{ + "name": "xo-common", + "version": "0.0.0", + "license": "AGPL-3.0", + "description": "Code shared between [XO](https://xen-orchestra.com) server and clients", + "keywords": [], + "homepage": "https://github.com/vatesfr/xo-common", + "bugs": "https://github.com/vatesfr/xo-common/issues", + "repository": { + "type": "git", + "url": "https://github.com/vatesfr/xo-common.git" + }, + "author": { + "name": "Julien Fontanet", + "email": "julien.fontanet@isonoe.net" + }, + "preferGlobal": false, + "main": "dist/", + "bin": {}, + "files": [ + "dist/", + "*.js" + ], + "engines": { + "node": ">=4" + }, + "dependencies": { + "babel-runtime": "^6.18.0", + "lodash": "^4.16.6" + }, + "devDependencies": { + "babel-cli": "^6.18.0", + "babel-eslint": "^7.1.0", + "babel-plugin-lodash": "^3.2.9", + "babel-plugin-transform-runtime": "^6.15.0", + "babel-preset-env": "^0.0.6", + "babel-preset-stage-0": "^6.16.0", + "cross-env": "^3.1.3", + "dependency-check": "^2.6.0", + "ghooks": "^1.3.2", + "rimraf": "^2.5.4", + "standard": "^8.5.0" + }, + "scripts": { + "build": "cross-env NODE_ENV=production babel --source-maps --out-dir=dist/ src/", + "clean": "rimraf dist/", + "depcheck": "dependency-check ./package.json", + "dev": "cross-env NODE_ENV=development babel --watch --source-maps --out-dir=dist/ src/", + "lint": "standard", + "posttest": "npm run lint && npm run depcheck", + "prebuild": "npm run clean", + "predev": "npm run clean", + "prepublish": "npm run build" + }, + "babel": { + "plugins": [ + "lodash" + ], + "presets": [ + [ + "env", + { + "targets": { + "browsers": "> 1% last 2 versions", + "node": 4 + } + } + ], + "stage-0" + ] + }, + "standard": { + "ignore": [ + "dist" + ], + "parser": "babel-eslint" + }, + "config": { + "ghooks": { + "commit-msg": "npm test" + } + } +} diff --git a/packages/xo-common/src/api-errors.js b/packages/xo-common/src/api-errors.js new file mode 100644 index 000000000..e69de29bb From 320d7a89ca08c5b943d41a1913bba7a95dd46756 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 2 Nov 2016 17:02:07 +0100 Subject: [PATCH 02/10] fix(package): fix build --- packages/xo-common/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-common/package.json b/packages/xo-common/package.json index ab5d1cb2e..8b6d6a32d 100644 --- a/packages/xo-common/package.json +++ b/packages/xo-common/package.json @@ -61,7 +61,7 @@ "env", { "targets": { - "browsers": "> 1% last 2 versions", + "browsers": "> 1%", "node": 4 } } From b4693019f727947d3b2d36f97f7e39ebae202037 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 2 Nov 2016 17:02:14 +0100 Subject: [PATCH 03/10] fix(package): fix depcheck --- packages/xo-common/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-common/package.json b/packages/xo-common/package.json index 8b6d6a32d..014966106 100644 --- a/packages/xo-common/package.json +++ b/packages/xo-common/package.json @@ -44,7 +44,7 @@ "scripts": { "build": "cross-env NODE_ENV=production babel --source-maps --out-dir=dist/ src/", "clean": "rimraf dist/", - "depcheck": "dependency-check ./package.json", + "depcheck": "dependency-check ./package.json --extra '*.js'", "dev": "cross-env NODE_ENV=development babel --watch --source-maps --out-dir=dist/ src/", "lint": "standard", "posttest": "npm run lint && npm run depcheck", From 59d6a516358e4ab1d756ddaa27d6784336122d2f Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 2 Nov 2016 17:23:33 +0100 Subject: [PATCH 04/10] fix(package): fix depcheck (again) --- packages/xo-common/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/xo-common/package.json b/packages/xo-common/package.json index 014966106..80738b77b 100644 --- a/packages/xo-common/package.json +++ b/packages/xo-common/package.json @@ -15,7 +15,6 @@ "email": "julien.fontanet@isonoe.net" }, "preferGlobal": false, - "main": "dist/", "bin": {}, "files": [ "dist/", @@ -44,7 +43,7 @@ "scripts": { "build": "cross-env NODE_ENV=production babel --source-maps --out-dir=dist/ src/", "clean": "rimraf dist/", - "depcheck": "dependency-check ./package.json --extra '*.js'", + "depcheck": "dependency-check ./package.json --entry api-errors.js", "dev": "cross-env NODE_ENV=development babel --watch --source-maps --out-dir=dist/ src/", "lint": "standard", "posttest": "npm run lint && npm run depcheck", From 0d6b7d6f0459e01b26ce851f614d3c9cac02b4bb Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Thu, 3 Nov 2016 08:59:51 +0100 Subject: [PATCH 05/10] chore(package): update babel-preset-env to version 0.0.7 (#2) https://greenkeeper.io/ --- packages/xo-common/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-common/package.json b/packages/xo-common/package.json index 80738b77b..5ac315af6 100644 --- a/packages/xo-common/package.json +++ b/packages/xo-common/package.json @@ -32,7 +32,7 @@ "babel-eslint": "^7.1.0", "babel-plugin-lodash": "^3.2.9", "babel-plugin-transform-runtime": "^6.15.0", - "babel-preset-env": "^0.0.6", + "babel-preset-env": "^0.0.7", "babel-preset-stage-0": "^6.16.0", "cross-env": "^3.1.3", "dependency-check": "^2.6.0", From e7b739bb3bccbcbfed41c57eefeebfcf3cb2a9ad Mon Sep 17 00:00:00 2001 From: Pierre Donias Date: Mon, 7 Nov 2016 12:30:29 +0100 Subject: [PATCH 06/10] feat(api-errors): error factories (#1) --- packages/xo-common/package.json | 3 +- packages/xo-common/src/api-errors.js | 79 ++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/packages/xo-common/package.json b/packages/xo-common/package.json index 5ac315af6..b0daf375e 100644 --- a/packages/xo-common/package.json +++ b/packages/xo-common/package.json @@ -25,7 +25,8 @@ }, "dependencies": { "babel-runtime": "^6.18.0", - "lodash": "^4.16.6" + "lodash": "^4.16.6", + "make-error": "^1.2.1" }, "devDependencies": { "babel-cli": "^6.18.0", diff --git a/packages/xo-common/src/api-errors.js b/packages/xo-common/src/api-errors.js index e69de29bb..c9dcb77ab 100644 --- a/packages/xo-common/src/api-errors.js +++ b/packages/xo-common/src/api-errors.js @@ -0,0 +1,79 @@ +import { BaseError } from 'make-error' +import { isArray, iteratee } from 'lodash' + +class XoError extends BaseError { + constructor ({ code, message, data }) { + super(message) + this.code = code + this.data = data + } + + toJsonRpcError () { + return { + message: this.message, + code: this.code, + data: this.data + } + } +} + +const create = (code, getProps) => { + const factory = args => new XoError({ ...getProps(args), code }) + factory.is = (error, predicate) => + error.code === code && iteratee(predicate)(error) + + return factory +} + +// ============================================================================= + +export const notImplemented = create(0, () => ({ + message: 'not implemented' +})) + +export const noSuchObject = create(1, (id, type) => ({ + data: { id, type }, + message: 'no such object' +})) + +export const unauthorized = create(2, () => ({ + message: 'not authenticated or not enough permissions' +})) + +export const invalidCredentials = create(3, () => ({ + message: 'invalid credentials' +})) + +// Deprecated alreadyAuthenticated (4) + +export const forbiddenOperation = create(5, (operation, reason) => ({ + data: { operation, reason }, + message: `forbidden operation: ${operation}` +})) + +// Deprecated GenericError (6) + +export const noHostsAvailable = create(7, () => ({ + message: 'no hosts available' +})) + +export const authenticationFailed = create(8, () => ({ + message: 'authentication failed' +})) + +export const hostUnreached = create(9, id => ({ + data: { id }, + message: 'host unreached' +})) + +export const invalidParameters = create(10, (message, errors) => { + if (isArray(message)) { + errors = message + message = undefined + } + + return { + data: { errors }, + message: message || 'invalid parameters' + } +}) From f4fc7acf4dbeb591cd6508c99bad27f3be3a6658 Mon Sep 17 00:00:00 2001 From: Pierre Donias Date: Wed, 16 Nov 2016 11:21:46 +0100 Subject: [PATCH 07/10] feat(api-errors): 10 new errors (#3) See vatesfr/xo-web#1481 --- packages/xo-common/src/api-errors.js | 93 +++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 3 deletions(-) diff --git a/packages/xo-common/src/api-errors.js b/packages/xo-common/src/api-errors.js index c9dcb77ab..abd57e3d7 100644 --- a/packages/xo-common/src/api-errors.js +++ b/packages/xo-common/src/api-errors.js @@ -61,9 +61,11 @@ export const authenticationFailed = create(8, () => ({ message: 'authentication failed' })) -export const hostUnreached = create(9, id => ({ - data: { id }, - message: 'host unreached' +export const serverUnreachable = create(9, objectId => ({ + data: { + objectId + }, + message: 'server unreachable' })) export const invalidParameters = create(10, (message, errors) => { @@ -77,3 +79,88 @@ export const invalidParameters = create(10, (message, errors) => { message: message || 'invalid parameters' } }) + +export const vmMissingPvDrivers = create(11, ({ vm }) => ({ + data: { + objectId: vm + }, + message: 'missing PV drivers' +})) + +export const vmIsTemplate = create(12, ({ vm }) => ({ + data: { + objectId: vm + }, + message: 'VM is a template' +})) + +// TODO: We should probably create a more generic error which gathers all incorrect state errors. +// e.g.: +// incorrectState { +// data: { +// objectId: 'af43e227-3deb-4822-a79b-968825de72eb', +// property: 'power_state', +// actual: 'Running', +// expected: 'Halted' +// }, +// message: 'incorrect state' +// } +export const vmBadPowerState = create(13, ({ vm, expected, actual }) => ({ + data: { + objectId: vm, + expected, + actual + }, + message: `VM state is ${actual} but should be ${expected}` +})) + +export const vmLacksFeature = create(14, ({ vm, feature }) => ({ + data: { + objectId: vm, + feature + }, + message: `VM lacks feature ${feature || ''}` +})) + +export const notSupportedDuringUpgrade = create(15, () => ({ + message: 'not supported during upgrade' +})) + +export const objectAlreadyExists = create(16, ({ objectId, objectType }) => ({ + data: { + objectId, + objectType + }, + message: `${objectType || 'object'} already exists` +})) + +export const vdiInUse = create(17, ({ vdi, operation }) => ({ + data: { + objectId: vdi, + operation + }, + message: 'VDI in use' +})) + +export const hostOffline = create(18, ({ host }) => ({ + data: { + objectId: host + }, + message: 'host offline' +})) + +export const operationBlocked = create(19, ({ objectId, code }) => ({ + data: { + objectId, + code + }, + message: 'operation blocked' +})) + +export const patchPrecheckFailed = create(20, ({ errorType, patch }) => ({ + data: { + objectId: patch, + errorType + }, + message: `patch precheck failed: ${errorType}` +})) From dd00d6581fd9b6f3ffe332bdc00573ae655de3fe Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 16 Nov 2016 11:52:36 +0100 Subject: [PATCH 08/10] 0.1.0 --- packages/xo-common/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-common/package.json b/packages/xo-common/package.json index b0daf375e..0e731b16b 100644 --- a/packages/xo-common/package.json +++ b/packages/xo-common/package.json @@ -1,6 +1,6 @@ { "name": "xo-common", - "version": "0.0.0", + "version": "0.1.0", "license": "AGPL-3.0", "description": "Code shared between [XO](https://xen-orchestra.com) server and clients", "keywords": [], From 8c9ed833c351959bb09de40cdff97bd6d1d8e3c1 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Thu, 24 Nov 2016 22:05:47 +0100 Subject: [PATCH 09/10] chore(package): update babel-preset-env to version 0.0.9 (#5) https://greenkeeper.io/ --- packages/xo-common/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-common/package.json b/packages/xo-common/package.json index 0e731b16b..fbac7b6e6 100644 --- a/packages/xo-common/package.json +++ b/packages/xo-common/package.json @@ -33,7 +33,7 @@ "babel-eslint": "^7.1.0", "babel-plugin-lodash": "^3.2.9", "babel-plugin-transform-runtime": "^6.15.0", - "babel-preset-env": "^0.0.7", + "babel-preset-env": "^0.0.9", "babel-preset-stage-0": "^6.16.0", "cross-env": "^3.1.3", "dependency-check": "^2.6.0", From 7e5131c4d2d42785c126294b2def63bb2c3348eb Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Fri, 9 Dec 2016 22:55:37 +0100 Subject: [PATCH 10/10] chore(package): update babel-preset-env to version 1.0.0 (#6) https://greenkeeper.io/ --- packages/xo-common/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-common/package.json b/packages/xo-common/package.json index fbac7b6e6..4baedd801 100644 --- a/packages/xo-common/package.json +++ b/packages/xo-common/package.json @@ -33,7 +33,7 @@ "babel-eslint": "^7.1.0", "babel-plugin-lodash": "^3.2.9", "babel-plugin-transform-runtime": "^6.15.0", - "babel-preset-env": "^0.0.9", + "babel-preset-env": "^1.0.0", "babel-preset-stage-0": "^6.16.0", "cross-env": "^3.1.3", "dependency-check": "^2.6.0",