Merge remote-tracking branch 'Superalgos/develop' into develop

This commit is contained in:
Unknown committed 2019-03-23 14:12:07 +01:00
commit 8656d25616
20 files changed
+1931 -1623

No files matched your search

+155 -155
View File
@@ -1,6 +1,6 @@
{
"name": "@superalgos/operations-client",
"version": "0.0.14",
"version": "0.0.18",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -9,7 +9,7 @@
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz",
"integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==",
"requires": {
"regenerator-runtime": "0.12.1"
"regenerator-runtime": "^0.12.0"
},
"dependencies": {
"regenerator-runtime": {
@@ -25,31 +25,31 @@
"integrity": "sha512-wDTJyR76+OBdlltiPs3lc1gD6zR+dSA6nITtgkBeLf1NvWfNotMWdvldIDnF3bu24ySAX9imfzDfkBu4Edtqww==",
"requires": {
"@babel/runtime": "7.1.2",
"@types/jss": "9.5.6",
"@types/react-transition-group": "2.0.14",
"brcast": "3.0.1",
"classnames": "2.2.6",
"csstype": "2.5.7",
"debounce": "1.2.0",
"deepmerge": "2.2.1",
"dom-helpers": "3.3.1",
"hoist-non-react-statics": "2.5.5",
"is-plain-object": "2.0.4",
"jss": "9.8.7",
"jss-camel-case": "6.1.0",
"jss-default-unit": "8.0.2",
"jss-global": "3.0.0",
"jss-nested": "6.0.1",
"jss-props-sort": "6.0.0",
"jss-vendor-prefixer": "7.0.0",
"keycode": "2.2.0",
"normalize-scroll-left": "0.1.2",
"popper.js": "1.14.4",
"prop-types": "15.6.2",
"react-event-listener": "0.6.4",
"react-transition-group": "2.5.0",
"recompose": "0.30.0",
"warning": "4.0.2"
"@types/jss": "^9.5.6",
"@types/react-transition-group": "^2.0.8",
"brcast": "^3.0.1",
"classnames": "^2.2.5",
"csstype": "^2.5.2",
"debounce": "^1.1.0",
"deepmerge": "^2.0.1",
"dom-helpers": "^3.2.1",
"hoist-non-react-statics": "^2.5.0",
"is-plain-object": "^2.0.4",
"jss": "^9.3.3",
"jss-camel-case": "^6.0.0",
"jss-default-unit": "^8.0.2",
"jss-global": "^3.0.0",
"jss-nested": "^6.0.1",
"jss-props-sort": "^6.0.0",
"jss-vendor-prefixer": "^7.0.0",
"keycode": "^2.1.9",
"normalize-scroll-left": "^0.1.2",
"popper.js": "^1.14.1",
"prop-types": "^15.6.0",
"react-event-listener": "^0.6.2",
"react-transition-group": "^2.2.1",
"recompose": "0.28.0 - 0.30.0",
"warning": "^4.0.1"
},
"dependencies": {
"@babel/runtime": {
@@ -57,7 +57,7 @@
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.2.tgz",
"integrity": "sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==",
"requires": {
"regenerator-runtime": "0.12.1"
"regenerator-runtime": "^0.12.0"
}
}
}
@@ -68,7 +68,7 @@
"integrity": "sha512-1kNcxYiIT1x8iDPEAlgmKrfRTIV8UyK6fLVcZ9kMHIKGWft9I451V5mvSrbCjbf7MX1TbLWzZjph0aVCRf9MqQ==",
"requires": {
"@babel/runtime": "7.0.0",
"recompose": "0.29.0"
"recompose": "^0.29.0"
},
"dependencies": {
"recompose": {
@@ -76,12 +76,12 @@
"resolved": "https://registry.npmjs.org/recompose/-/recompose-0.29.0.tgz",
"integrity": "sha512-J/qLXNU4W+AeHCDR70ajW8eMd1uroqZaECTj6qqDLPMILz3y0EzpYlvrnxKB9DnqcngWrtGwjXY9JeXaW9kS1A==",
"requires": {
"@babel/runtime": "7.0.0",
"change-emitter": "0.1.6",
"fbjs": "0.8.17",
"hoist-non-react-statics": "2.5.5",
"react-lifecycles-compat": "3.0.4",
"symbol-observable": "1.2.0"
"@babel/runtime": "^7.0.0",
"change-emitter": "^0.1.2",
"fbjs": "^0.8.1",
"hoist-non-react-statics": "^2.3.1",
"react-lifecycles-compat": "^3.0.2",
"symbol-observable": "^1.0.4"
}
}
}
@@ -97,8 +97,8 @@
"resolved": "https://registry.npmjs.org/@types/jss/-/jss-9.5.6.tgz",
"integrity": "sha512-7TWmR5y1jYG4ka4wTZt65RR0kw4WgALFUWktQIWbLnDd6/z/0SQZ/4+UeH0rhdp+HEdIfmzPBH0VwE/4Z9Evzw==",
"requires": {
"csstype": "2.5.7",
"indefinite-observable": "1.0.1"
"csstype": "^2.0.0",
"indefinite-observable": "^1.0.1"
}
},
"@types/prop-types": {
@@ -111,8 +111,8 @@
"resolved": "https://registry.npmjs.org/@types/react/-/react-16.4.16.tgz",
"integrity": "sha512-lxyoipLWweAnLnSsV4Ho2NAZTKKmxeYgkTQ6PaDiPDU9JJBUY2zJVVGiK1smzYv8+ZgbqEmcm5xM74GCpunSEA==",
"requires": {
"@types/prop-types": "15.5.6",
"csstype": "2.5.7"
"@types/prop-types": "*",
"csstype": "^2.2.0"
}
},
"@types/react-transition-group": {
@@ -120,7 +120,7 @@
"resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-2.0.14.tgz",
"integrity": "sha512-pa7qB0/mkhwWMBFoXhX8BcntK8G4eQl4sIfSrJCxnivTYRQWjOWf2ClR9bWdm0EUFBDHzMbKYS+QYfDtBzkY4w==",
"requires": {
"@types/react": "16.4.16"
"@types/react": "*"
}
},
"@types/zen-observable": {
@@ -133,7 +133,7 @@
"resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.1.17.tgz",
"integrity": "sha512-7sp24n2HZO4vXgTaKNomLyIfGxG4gDdDkBB0jkRzRi7HhnKmfwhiF/RCiKNbgLdrPX151INdls0KwIVliD0dHQ==",
"requires": {
"apollo-utilities": "1.0.21"
"apollo-utilities": "^1.0.21"
}
},
"apollo-client": {
@@ -142,13 +142,13 @@
"integrity": "sha512-g1z23umaVSoKLj9xNl0aAnk2KBF4JeBi7MeKFc9CGTixH7TkqeQUQtxcjrC7j2h4KmDbuhOAHOFUGf8YshN+ag==",
"requires": {
"@types/async": "2.0.49",
"@types/zen-observable": "0.8.0",
"@types/zen-observable": "^0.8.0",
"apollo-cache": "1.1.17",
"apollo-link": "1.2.3",
"apollo-link-dedup": "1.0.10",
"apollo-link": "^1.0.0",
"apollo-link-dedup": "^1.0.0",
"apollo-utilities": "1.0.21",
"symbol-observable": "1.2.0",
"zen-observable": "0.8.9"
"symbol-observable": "^1.0.2",
"zen-observable": "^0.8.0"
}
},
"apollo-link": {
@@ -156,8 +156,8 @@
"resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.3.tgz",
"integrity": "sha512-iL9yS2OfxYhigme5bpTbmRyC+Htt6tyo2fRMHT3K1XRL/C5IQDDz37OjpPy4ndx7WInSvfSZaaOTKFja9VWqSw==",
"requires": {
"apollo-utilities": "1.0.21",
"zen-observable-ts": "0.8.10"
"apollo-utilities": "^1.0.0",
"zen-observable-ts": "^0.8.10"
}
},
"apollo-link-dedup": {
@@ -165,7 +165,7 @@
"resolved": "https://registry.npmjs.org/apollo-link-dedup/-/apollo-link-dedup-1.0.10.tgz",
"integrity": "sha512-tpUI9lMZsidxdNygSY1FxflXEkUZnvKRkMUsXXuQUNoSLeNtEvUX7QtKRAl4k9ubLl8JKKc9X3L3onAFeGTK8w==",
"requires": {
"apollo-link": "1.2.3"
"apollo-link": "^1.2.3"
}
},
"apollo-utilities": {
@@ -173,8 +173,8 @@
"resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.21.tgz",
"integrity": "sha512-ZcxELlEl+sDCYBgEMdNXJAsZtRVm8wk4HIA58bMsqYfd1DSAJQEtZ93F0GZgYNAGy3QyaoBeZtbb0/01++G8JQ==",
"requires": {
"fast-json-stable-stringify": "2.0.0",
"fclone": "1.0.11"
"fast-json-stable-stringify": "^2.0.0",
"fclone": "^1.0.11"
}
},
"asap": {
@@ -207,7 +207,7 @@
"resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz",
"integrity": "sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo=",
"requires": {
"is-in-browser": "1.1.3"
"is-in-browser": "^1.0.2"
}
},
"csstype": {
@@ -241,7 +241,7 @@
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
"integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
"requires": {
"iconv-lite": "0.4.24"
"iconv-lite": "~0.4.13"
}
},
"fast-json-stable-stringify": {
@@ -260,13 +260,13 @@
"resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz",
"integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=",
"requires": {
"core-js": "1.2.7",
"isomorphic-fetch": "2.2.1",
"loose-envify": "1.4.0",
"object-assign": "4.1.1",
"promise": "7.3.1",
"setimmediate": "1.0.5",
"ua-parser-js": "0.7.18"
"core-js": "^1.0.0",
"isomorphic-fetch": "^2.1.1",
"loose-envify": "^1.0.0",
"object-assign": "^4.1.0",
"promise": "^7.1.1",
"setimmediate": "^1.0.5",
"ua-parser-js": "^0.7.18"
}
},
"fbjs-css-vars": {
@@ -285,8 +285,8 @@
"integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=",
"dev": true,
"requires": {
"min-document": "2.19.0",
"process": "0.5.2"
"min-document": "^2.19.0",
"process": "~0.5.1"
}
},
"graphql": {
@@ -294,7 +294,7 @@
"resolved": "https://registry.npmjs.org/graphql/-/graphql-14.0.2.tgz",
"integrity": "sha512-gUC4YYsaiSJT1h40krG3J+USGlwhzNTXSb4IOZljn9ag5Tj+RkoXrWp+Kh7WyE3t1NCfab5kzCuxBIvOMERMXw==",
"requires": {
"iterall": "1.2.2"
"iterall": "^1.2.2"
}
},
"graphql-tag": {
@@ -307,11 +307,11 @@
"resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz",
"integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==",
"requires": {
"invariant": "2.2.4",
"loose-envify": "1.4.0",
"resolve-pathname": "2.2.0",
"value-equal": "0.4.0",
"warning": "3.0.0"
"invariant": "^2.2.1",
"loose-envify": "^1.2.0",
"resolve-pathname": "^2.2.0",
"value-equal": "^0.4.0",
"warning": "^3.0.0"
},
"dependencies": {
"warning": {
@@ -319,7 +319,7 @@
"resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
"integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
"requires": {
"loose-envify": "1.4.0"
"loose-envify": "^1.0.0"
}
}
}
@@ -339,7 +339,7 @@
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires": {
"safer-buffer": "2.1.2"
"safer-buffer": ">= 2.1.2 < 3"
}
},
"indefinite-observable": {
@@ -362,7 +362,7 @@
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
"requires": {
"loose-envify": "1.4.0"
"loose-envify": "^1.0.0"
}
},
"is-in-browser": {
@@ -375,7 +375,7 @@
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
"requires": {
"isobject": "3.0.1"
"isobject": "^3.0.1"
},
"dependencies": {
"isobject": {
@@ -395,8 +395,8 @@
"resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
"integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
"requires": {
"node-fetch": "1.7.3",
"whatwg-fetch": "2.0.4"
"node-fetch": "^1.0.1",
"whatwg-fetch": ">=0.10.0"
}
},
"iterall": {
@@ -414,9 +414,9 @@
"resolved": "https://registry.npmjs.org/jss/-/jss-9.8.7.tgz",
"integrity": "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ==",
"requires": {
"is-in-browser": "1.1.3",
"symbol-observable": "1.2.0",
"warning": "3.0.0"
"is-in-browser": "^1.1.3",
"symbol-observable": "^1.1.0",
"warning": "^3.0.0"
},
"dependencies": {
"warning": {
@@ -424,7 +424,7 @@
"resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
"integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
"requires": {
"loose-envify": "1.4.0"
"loose-envify": "^1.0.0"
}
}
}
@@ -434,7 +434,7 @@
"resolved": "https://registry.npmjs.org/jss-camel-case/-/jss-camel-case-6.1.0.tgz",
"integrity": "sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ==",
"requires": {
"hyphenate-style-name": "1.0.2"
"hyphenate-style-name": "^1.0.2"
}
},
"jss-default-unit": {
@@ -452,7 +452,7 @@
"resolved": "https://registry.npmjs.org/jss-nested/-/jss-nested-6.0.1.tgz",
"integrity": "sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA==",
"requires": {
"warning": "3.0.0"
"warning": "^3.0.0"
},
"dependencies": {
"warning": {
@@ -460,7 +460,7 @@
"resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
"integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
"requires": {
"loose-envify": "1.4.0"
"loose-envify": "^1.0.0"
}
}
}
@@ -475,7 +475,7 @@
"resolved": "https://registry.npmjs.org/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz",
"integrity": "sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA==",
"requires": {
"css-vendor": "0.3.8"
"css-vendor": "^0.3.8"
}
},
"keycode": {
@@ -498,7 +498,7 @@
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"requires": {
"js-tokens": "4.0.0"
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
"luxon": {
@@ -511,12 +511,12 @@
"resolved": "https://registry.npmjs.org/material-ui-pickers/-/material-ui-pickers-1.0.1.tgz",
"integrity": "sha512-FRJwgeFUQdQxzNAybZvf11204KFBxqKS6sg4JvAO0cWmHULXJhrc9kuEDT8F7Pomwnv6+AyfxygsoMgIRcBMNg==",
"requires": {
"classnames": "2.2.6",
"keycode": "2.2.0",
"react-event-listener": "0.6.4",
"react-text-mask": "5.4.1",
"react-transition-group": "2.5.0",
"tslib": "1.9.3"
"classnames": "^2.2.6",
"keycode": "^2.2.0",
"react-event-listener": "^0.6.4",
"react-text-mask": "=5.4.1",
"react-transition-group": "^2.5.0",
"tslib": "^1.9.3"
}
},
"min-document": {
@@ -525,7 +525,7 @@
"integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
"dev": true,
"requires": {
"dom-walk": "0.1.1"
"dom-walk": "^0.1.0"
}
},
"node-fetch": {
@@ -533,8 +533,8 @@
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
"integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
"requires": {
"encoding": "0.1.12",
"is-stream": "1.1.0"
"encoding": "^0.1.11",
"is-stream": "^1.0.1"
}
},
"normalize-scroll-left": {
@@ -578,7 +578,7 @@
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
"integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
"requires": {
"asap": "2.0.6"
"asap": "~2.0.3"
}
},
"prop-types": {
@@ -586,8 +586,8 @@
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz",
"integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==",
"requires": {
"loose-envify": "1.4.0",
"object-assign": "4.1.1"
"loose-envify": "^1.3.1",
"object-assign": "^4.1.1"
}
},
"react": {
@@ -595,10 +595,10 @@
"resolved": "https://registry.npmjs.org/react/-/react-16.6.1.tgz",
"integrity": "sha512-OtawJThYlvRgm9BXK+xTL7BIlDx8vv21j+fbQDjRRUyok6y7NyjlweGorielTahLZHYIdKUoK2Dp9ByVWuMqxw==",
"requires": {
"loose-envify": "1.4.0",
"object-assign": "4.1.1",
"prop-types": "15.6.2",
"scheduler": "0.11.0"
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1",
"prop-types": "^15.6.2",
"scheduler": "^0.11.0"
}
},
"react-apollo": {
@@ -606,12 +606,12 @@
"resolved": "https://registry.npmjs.org/react-apollo/-/react-apollo-2.2.4.tgz",
"integrity": "sha512-haS5R30Qvteb65ZLfWomUZQh47VU4ld4Kof3zlqdbLOrYPt3/DdVZC8ZFPZSxd5zPeIJtZqpUfAxD1WHVoMPIA==",
"requires": {
"fbjs": "1.0.0",
"hoist-non-react-statics": "3.0.1",
"invariant": "2.2.4",
"lodash.flowright": "3.5.0",
"lodash.isequal": "4.5.0",
"prop-types": "15.6.2"
"fbjs": "^1.0.0",
"hoist-non-react-statics": "^3.0.0",
"invariant": "^2.2.2",
"lodash.flowright": "^3.5.0",
"lodash.isequal": "^4.5.0",
"prop-types": "^15.6.0"
},
"dependencies": {
"core-js": {
@@ -624,14 +624,14 @@
"resolved": "https://registry.npmjs.org/fbjs/-/fbjs-1.0.0.tgz",
"integrity": "sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA==",
"requires": {
"core-js": "2.5.7",
"fbjs-css-vars": "1.0.1",
"isomorphic-fetch": "2.2.1",
"loose-envify": "1.4.0",
"object-assign": "4.1.1",
"promise": "7.3.1",
"setimmediate": "1.0.5",
"ua-parser-js": "0.7.18"
"core-js": "^2.4.1",
"fbjs-css-vars": "^1.0.0",
"isomorphic-fetch": "^2.1.1",
"loose-envify": "^1.0.0",
"object-assign": "^4.1.0",
"promise": "^7.1.1",
"setimmediate": "^1.0.5",
"ua-parser-js": "^0.7.18"
}
},
"hoist-non-react-statics": {
@@ -639,7 +639,7 @@
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.0.1.tgz",
"integrity": "sha512-1kXwPsOi0OGQIZNVMPvgWJ9tSnGMiMfJdihqEzrPEXlHOBh9AAHXX/QYmAJTXztnz/K+PQ8ryCb4eGaN6HlGbQ==",
"requires": {
"react-is": "16.5.2"
"react-is": "^16.3.2"
}
}
}
@@ -649,10 +649,10 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.6.1.tgz",
"integrity": "sha512-zm+wBuEMGm009Wt1uE4Zw5KcXOW7qC4E/xW/fpJsCsbOco4U/R84u+DzzO/S4SYSdNBcqcaulcp4w3FXl8pImw==",
"requires": {
"loose-envify": "1.4.0",
"object-assign": "4.1.1",
"prop-types": "15.6.2",
"scheduler": "0.11.0"
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1",
"prop-types": "^15.6.2",
"scheduler": "^0.11.0"
}
},
"react-event-listener": {
@@ -661,8 +661,8 @@
"integrity": "sha512-t7VSjIuUFmN+GeyKb+wm025YLeojVB85kJL6sSs0wEBJddfmKBEQz+CNBZ2zBLKVWkPy/fZXM6U5yvojjYBVYQ==",
"requires": {
"@babel/runtime": "7.0.0",
"prop-types": "15.6.2",
"warning": "4.0.2"
"prop-types": "^15.6.0",
"warning": "^4.0.1"
}
},
"react-hot-loader": {
@@ -671,12 +671,12 @@
"integrity": "sha512-T0G5jURyTsFLoiW6MTr5Q35UHC/B2pmYJ7+VBjk8yMDCEABRmCGy4g6QwxoB4pWg4/xYvVTa/Pbqnsgx/+NLuA==",
"dev": true,
"requires": {
"fast-levenshtein": "2.0.6",
"global": "4.3.2",
"hoist-non-react-statics": "2.5.5",
"prop-types": "15.6.2",
"react-lifecycles-compat": "3.0.4",
"shallowequal": "1.1.0"
"fast-levenshtein": "^2.0.6",
"global": "^4.3.0",
"hoist-non-react-statics": "^2.5.0",
"prop-types": "^15.6.1",
"react-lifecycles-compat": "^3.0.4",
"shallowequal": "^1.0.2"
}
},
"react-is": {
@@ -694,7 +694,7 @@
"resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-4.0.6.tgz",
"integrity": "sha512-WfBlqYRD0fGZpQxRy1apxsPeaqtxhzo7CnUVFKBoGDsQbc89+DQNhjG/D3IxgGYM47oKB+W/Su9ol/vVS6Wc2Q==",
"requires": {
"prop-types": "15.6.2"
"prop-types": "^15.6.0"
}
},
"react-router": {
@@ -702,13 +702,13 @@
"resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz",
"integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==",
"requires": {
"history": "4.7.2",
"hoist-non-react-statics": "2.5.5",
"invariant": "2.2.4",
"loose-envify": "1.4.0",
"path-to-regexp": "1.7.0",
"prop-types": "15.6.2",
"warning": "4.0.2"
"history": "^4.7.2",
"hoist-non-react-statics": "^2.5.0",
"invariant": "^2.2.4",
"loose-envify": "^1.3.1",
"path-to-regexp": "^1.7.0",
"prop-types": "^15.6.1",
"warning": "^4.0.1"
}
},
"react-router-dom": {
@@ -716,12 +716,12 @@
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz",
"integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==",
"requires": {
"history": "4.7.2",
"invariant": "2.2.4",
"loose-envify": "1.4.0",
"prop-types": "15.6.2",
"react-router": "4.3.1",
"warning": "4.0.2"
"history": "^4.7.2",
"invariant": "^2.2.4",
"loose-envify": "^1.3.1",
"prop-types": "^15.6.1",
"react-router": "^4.3.1",
"warning": "^4.0.1"
}
},
"react-text-mask": {
@@ -729,7 +729,7 @@
"resolved": "https://registry.npmjs.org/react-text-mask/-/react-text-mask-5.4.1.tgz",
"integrity": "sha512-mGx1n0x0skktwsKcpgAGnrgExFlXDflbWEHh8PC1UaQP8+EdHkW7JYczTghsBo2rnVwU9/4A9x/2bVt3HY46/w==",
"requires": {
"prop-types": "15.6.2"
"prop-types": "^15.5.6"
}
},
"react-transition-group": {
@@ -737,10 +737,10 @@
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.5.0.tgz",
"integrity": "sha512-qYB3JBF+9Y4sE4/Mg/9O6WFpdoYjeeYqx0AFb64PTazVy8RPMiE3A47CG9QmM4WJ/mzDiZYslV+Uly6O1Erlgw==",
"requires": {
"dom-helpers": "3.3.1",
"loose-envify": "1.4.0",
"prop-types": "15.6.2",
"react-lifecycles-compat": "3.0.4"
"dom-helpers": "^3.3.1",
"loose-envify": "^1.4.0",
"prop-types": "^15.6.2",
"react-lifecycles-compat": "^3.0.4"
}
},
"recompose": {
@@ -748,12 +748,12 @@
"resolved": "https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz",
"integrity": "sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==",
"requires": {
"@babel/runtime": "7.0.0",
"change-emitter": "0.1.6",
"fbjs": "0.8.17",
"hoist-non-react-statics": "2.5.5",
"react-lifecycles-compat": "3.0.4",
"symbol-observable": "1.2.0"
"@babel/runtime": "^7.0.0",
"change-emitter": "^0.1.2",
"fbjs": "^0.8.1",
"hoist-non-react-statics": "^2.3.1",
"react-lifecycles-compat": "^3.0.2",
"symbol-observable": "^1.0.4"
}
},
"regenerator-runtime": {
@@ -776,8 +776,8 @@
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.11.0.tgz",
"integrity": "sha512-MAYbBfmiEHxF0W+c4CxMpEqMYK+rYF584VP/qMKSiHM6lTkBKKYOJaDiSILpJHla6hBOsVd6GucPL46o2Uq3sg==",
"requires": {
"loose-envify": "1.4.0",
"object-assign": "4.1.1"
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1"
}
},
"setimmediate": {
@@ -816,7 +816,7 @@
"resolved": "https://registry.npmjs.org/warning/-/warning-4.0.2.tgz",
"integrity": "sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug==",
"requires": {
"loose-envify": "1.4.0"
"loose-envify": "^1.0.0"
}
},
"whatwg-fetch": {
@@ -834,7 +834,7 @@
"resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.10.tgz",
"integrity": "sha512-5vqMtRggU/2GhePC9OU4sYEWOdvmayp2k3gjPf4F0mXwB3CSbbNznfDUvDJx9O2ZTa1EIXdJhPchQveFKwNXPQ==",
"requires": {
"zen-observable": "0.8.9"
"zen-observable": "^0.8.0"
}
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@superalgos/operations-client",
"version": "0.0.15",
"version": "0.0.21",
"description": "Superalgos Operations client-side web app",
"main": "src/index.js",
"dependencies": {
+1
View File
@@ -31,5 +31,6 @@ export const clone = gql`
teamAvatar
processName
keyId
botSlug
}
`
+31 -3
View File
@@ -1,17 +1,45 @@
const availableMonths = ['January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December']
const availableMonths = [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
]
const availableTimePeriods = ["24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs", "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min"]
const tradingStartModes = {
live: 'Live',
backtest: 'Backtest'
}
const tradingStartModesList = {
live: 'Live',
backtest: 'Backtest',
competition: 'Competition'
}
const indicatorStartModes = {
allMonths: 'All Months',
oneMonth: 'One Month',
noTime: 'No Time'
}
const processNames = {
Daily: 'Multi-Period-Daily',
Market: 'Multi-Period-Market',
Min: "One-Min-Daily-Candles-Volumes",
Live: "Poloniex-Live-Trades",
HoleFixing: "Poloniex-Hole-Fixing"
}
const exchanges = [
{
id: '1',
@@ -19,4 +47,4 @@ const exchanges = [
}
]
export { tradingStartModes, exchanges, indicatorStartModes, availableMonths }
export { tradingStartModes, tradingStartModesList, exchanges, indicatorStartModes, availableMonths, processNames, availableTimePeriods }
+70 -45
View File
@@ -6,7 +6,7 @@ import TopBar from '../../BannerTopBar'
import { withStyles } from '@material-ui/core/styles'
import classNames from 'classnames'
import styles from './styles'
import { tradingStartModes, indicatorStartModes, availableMonths } from '../../../GraphQL/models'
import { tradingStartModes, indicatorStartModes, availableMonths, processNames, availableTimePeriods } from '../../../GraphQL/models'
import { isDefined, getIndicatorYears } from '../../../utils'
import {
MenuItem, Button, TextField, FormControl, InputLabel, Input, Typography,
@@ -32,7 +32,7 @@ class AddClone extends Component {
state: '',
stateDatetime: 0,
createDatetime: 0,
runAsTeam: true,
runAsTeam: false,
teams: [],
teamId: '',
keyId: '',
@@ -43,6 +43,9 @@ class AddClone extends Component {
month: 1,
processName: '',
//TradingBot
timePeriod: '01-hs',
//Error handlers
nameError: false,
teamError: false,
@@ -152,7 +155,7 @@ class AddClone extends Component {
<FormHelperText>{this.state.selectedBot.kind}</FormHelperText>
</FormControl>
{ this.state.selectedBot.kind === "TRADER" &&
{ this.state.selectedBot.kind === "Trading" &&
<React.Fragment>
<Typography className={classes.typography} variant='subtitle1' align='justify'>
Available Running Modes are Backtest and Live.
@@ -215,19 +218,6 @@ class AddClone extends Component {
className={classNames(classes.form, classes.textField)}
fullWidth
/>
<Typography className={classes.typography} variant='subtitle1' align='justify'>
The Wait Time represent the number of miliseconds the bot will wait between executions.
</Typography>
<TextField
id="waitTime"
label="Wait Time"
className={classNames(classes.form, classes.textField)}
value={this.state.waitTime}
onChange={(e)=>this.setState({waitTime:e.target.value})}
fullWidth
/>
</React.Fragment>
}
@@ -290,31 +280,58 @@ class AddClone extends Component {
</React.Fragment>
}
<Typography className={classes.typography} variant='subtitle1' align='justify'>
If Run as Team is selected, the clone will be taken from the
team respository instead of your own team member folder.
Competitions runs from the team respository.
</Typography>
<FormControlLabel
control={
<Checkbox
checked={this.state.runAsTeam}
onChange={(e)=>this.setState({runAsTeam:e.target.checked })}
value="runAsTeam"
color="primary"
<Typography className={classes.typography} variant='subtitle1' align='justify'>
The Time Period in which the bot will operate.
</Typography>
<TextField
select
label="Time Period"
className={classNames(classes.margin, classes.textField, classes.form)}
value={this.state.timePeriod}
onChange={(e)=> this.setState({timePeriod:e.target.value})}
fullWidth
>
{availableTimePeriods.map((option, index) => (
<MenuItem key={index} value={option}>
{option}
</MenuItem>
))}
</TextField>
{ false &&
<React.Fragment>
<Typography className={classes.typography} variant='subtitle1' align='justify'>
If Run as Team is selected, the clone will be taken from the
team respository instead of your own team member folder.
Competitions runs from the team respository.
</Typography>
<FormControlLabel
control={
<Checkbox
checked={this.state.runAsTeam}
onChange={(e)=>this.setState({runAsTeam:e.target.checked })}
value="runAsTeam"
color="primary"
/>
}
label="Run as Team"
className={classNames(classes.form, classes.textField)}
/>
}
label="Run as Team"
className={classNames(classes.form, classes.textField)}
/>
</React.Fragment>
}
</React.Fragment>
}
{ (this.state.selectedBot.kind === "INDICATOR"
|| this.state.selectedBot.kind === "EXTRACTOR") &&
{ (this.state.selectedBot.kind === "Indicator"
|| this.state.selectedBot.kind === "Sensor") &&
<React.Fragment>
<TextField
select
label="Process Name"
className={classNames(classes.textField, classes.form)}
value={this.state.processName}
@@ -322,7 +339,14 @@ class AddClone extends Component {
onBlur={(e)=>this.setState({processNameError:false})}
error={this.state.processNameError}
fullWidth
/>
>
{Object.keys(processNames).map(option => (
<MenuItem key={option} value={processNames[option]}>
{processNames[option]}
</MenuItem>
))}
</TextField>
<TextField
select
@@ -389,14 +413,14 @@ class AddClone extends Component {
fullWidth
>
{getIndicatorYears().map((option, index) => (
<MenuItem key={option} value={index}>
<MenuItem key={index} value={option}>
{option}
</MenuItem>
))}
</TextField>
<TextField
id="endYearInput"
id="endMonthInput"
select
label="Month"
className={classNames(classes.textField, classes.form)}
@@ -404,8 +428,8 @@ class AddClone extends Component {
onChange={(e)=> this.setState({month:e.target.value})}
fullWidth
>
{availableMonths.map(option => (
<MenuItem key={option} value={option}>
{availableMonths.map((option, index) => (
<MenuItem key={index} value={index+1}>
{option}
</MenuItem>
))}
@@ -498,9 +522,10 @@ class AddClone extends Component {
}
}
if(this.state.selectedBot.kind === "TRADER"){
if(this.state.selectedBot.kind === "Trading"){
variables.clone.runAsTeam = this.state.runAsTeam
variables.clone.processName = 'Trading-Process'
variables.clone.timePeriod = this.state.timePeriod
if(this.state.mode === "backtest"){
variables.clone.beginDatetime = this.state.beginDatetime.valueOf() / 1000|0
variables.clone.endDatetime = this.state.endDatetime.valueOf() / 1000|0
@@ -522,11 +547,11 @@ class AddClone extends Component {
}
getBotTypeFromKind(kind){
if(kind === 'TRADER')
if(kind === 'Trading')
return 'Trading'
else if(kind === 'INDICATOR')
else if(kind === 'Indicator')
return 'Indicator'
else if(kind === 'EXTRACTOR')
else if(kind === 'Sensor')
return 'Extraction'
}
@@ -550,7 +575,7 @@ class AddClone extends Component {
state : '',
stateDatetime: 0,
createDatetime: 0,
runAsTeam: true,
runAsTeam: false,
processName: '',
teams: [],
teamId: '',
@@ -582,7 +607,7 @@ class AddClone extends Component {
this.setState(state => ({ modeError: true }));
}
if(this.state.selectedBot.kind !== "TRADER"
if(this.state.selectedBot.kind !== "Trading"
&& this.state.processName.length < 1 ) {
isError = true
this.setState(state => ({ processNameError: true }));
+17 -5
View File
@@ -1,5 +1,6 @@
import React, { Component } from 'react'
import { graphql, compose } from 'react-apollo'
import {withRouter} from "react-router-dom";
import { clones } from '../../../GraphQL/Calls'
import {
Typography, Button, TextField, Dialog, DialogContent,
@@ -10,7 +11,7 @@ import {
} from '@material-ui/core'
import Avatar from '@material-ui/core/Avatar';
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
import { tradingStartModes, indicatorStartModes } from '../../../GraphQL/models'
import { tradingStartModesList, indicatorStartModes } from '../../../GraphQL/models'
import { isDefined, toLocalTime } from '../../../utils'
import classNames from 'classnames'
import { withStyles } from '@material-ui/core/styles'
@@ -43,7 +44,7 @@ class ListClones extends Component {
</div>
<div className={classes.heading}>
<Typography className={classes.heading}>
{ clone.processName } / { clone.botType === 'TRADER' ? tradingStartModes[clone.mode] : indicatorStartModes[clone.mode] }
{ clone.processName } / { clone.botType === 'Trading' ? tradingStartModesList[clone.mode] : indicatorStartModes[clone.mode] }
</Typography>
</div>
</ExpansionPanelSummary>
@@ -89,7 +90,7 @@ class ListClones extends Component {
<div className={classes.details}>
<div className={classes.column4}>
<Typography className={classes.cloneInfoBold}>Last Execution:</Typography>
{ (clone.botType === 'TRADER' && isDefined(clone.assetA) ) &&
{ (clone.botType === 'Trading' && isDefined(clone.assetA) ) &&
<React.Fragment>
<Typography className={classes.cloneInfoBold}>Buy Average:</Typography>
<Typography className={classes.cloneInfoBold}>Sell Average:</Typography>
@@ -101,7 +102,7 @@ class ListClones extends Component {
</div>
<div className={classes.column4}>
<Typography className={classes.cloneInfoNormal}>{ toLocalTime(clone.summaryDate) }</Typography>
{ (clone.botType === 'TRADER' && isDefined(clone.assetA) ) &&
{ (clone.botType === 'Trading' && isDefined(clone.assetA) ) &&
<React.Fragment>
<Typography className={classes.cloneInfoNormal}>{clone.buyAverage}</Typography>
<Typography className={classes.cloneInfoNormal}>{clone.sellAverage}</Typography>
@@ -144,6 +145,12 @@ class ListClones extends Component {
className={classes.buttonList}
variant='contained' color='secondary' size='small'
onClick={() => this.setState({ isLogsDialogOpen: true })}>
View Process Output
</Button>
<Button
className={classes.buttonList}
variant='contained' color='secondary' size='small'
onClick={() => this.showCloneLogs(clone)}>
View Logs
</Button>
<Button
@@ -226,6 +233,10 @@ class ListClones extends Component {
)
}
showCloneLogs(clone) {
this.props.history.push("/logs/show/"+clone.botSlug+"-"+clone.id+".1.0");
}
canStopClone(){
const state = JSON.parse(this.props.currentClone.state)
if(isDefined(state) && state.hasOwnProperty("running")){
@@ -277,5 +288,6 @@ class ListClones extends Component {
export default compose(
graphql(clones.OPERATIONS_REMOVE_CLONE),
withStyles(styles)
withStyles(styles),
withRouter
)(ListClones)
+1494 -1368
View File
File diff suppressed because it is too large. Load diff
+13 -13
View File
@@ -10,20 +10,20 @@
"author": "",
"license": "ISC",
"devDependencies": {
"babel-cli": "^6.26.0",
"babel-preset-env": "^1.7.0",
"babel-preset-stage-2": "^6.24.1",
"nodemon": "^1.18.10"
"babel-cli": "6.26.0",
"babel-preset-env": "1.7.0",
"babel-preset-stage-2": "6.24.1",
"nodemon": "1.18.10"
},
"dependencies": {
"axios": "^0.18.0",
"cors": "^2.8.4",
"dotenv": "^6.0.0",
"express": "^4.16.3",
"express-graphql": "^0.6.12",
"graphql": "^14.0.0",
"kubernetes-client": "^6.5.1",
"mongoose": "^5.2.12",
"winston": "^3.1.0"
"axios": "0.18.0",
"cors": "2.8.4",
"dotenv": "6.0.0",
"express": "4.16.3",
"express-graphql": "0.6.12",
"graphql": "14.0.0",
"kubernetes-client": "6.5.1",
"mongoose": "5.2.12",
"winston": "3.1.0"
}
}
+6 -6
View File
@@ -1,11 +1,11 @@
export const TRADER = 'Trading'
export const INDICATOR = 'Indicator'
export const EXTRACTION = 'Extraction'
export const Trading = 'Trading'
export const Indicator = 'Indicator'
export const Sensor = 'Extraction'
export const BotTypesEnum = [
TRADER,
INDICATOR,
EXTRACTION
Trading,
Indicator,
Sensor
]
export default BotTypesEnum
+54 -5
View File
@@ -3,8 +3,8 @@ import { toPlatformDatetime, isDefined } from '../config/utils'
import { KubernateError } from '../errors'
import { Client, config } from 'kubernetes-client'
import deploymentManifest from '../config/clone-deployment.json'
import { BACKTEST, NO_TIME } from '../enums/CloneMode'
import { TRADER, INDICATOR, EXTRACTION } from '../enums/BotTypes'
import { BACKTEST, COMPETITION, LIVE, NO_TIME } from '../enums/CloneMode'
import { Trading, Indicator, Sensor } from '../enums/BotTypes'
const createClone = async (clone) => {
try {
@@ -82,12 +82,22 @@ const createClone = async (clone) => {
})
logger.debug('createClone Trading Configuration.')
if (clone.botType === TRADER) {
if (clone.botType === Trading) {
env.push({
'name': 'RESUME_EXECUTION',
'value': clone.resumeExecution.toString()
})
env.push({
'name': 'TIME_PERIOD',
'value': clone.timePeriod
})
env.push({
'name': 'DATA_SET',
'value': datasetNames().get(clone.timePeriod)
})
if (clone.mode === BACKTEST) {
env.push({
'name': 'BEGIN_DATE_TIME',
@@ -101,13 +111,26 @@ const createClone = async (clone) => {
'name': 'WAIT_TIME',
'value': clone.waitTime.toString()
})
} else {
} else if (clone.mode === COMPETITION) {
env.push({
'name': 'BEGIN_DATE_TIME',
'value': toPlatformDatetime(clone.beginDatetime)
})
env.push({
'name': 'END_DATE_TIME',
'value': toPlatformDatetime(clone.endDatetime)
})
env.push({
'name': 'KEY_ID',
'value': clone.keyId
})
} else if (clone.mode === LIVE) {
env.push({
'name': 'KEY_ID',
'value': clone.keyId
})
}
} else if (clone.botType === INDICATOR || clone.botType === EXTRACTION) {
} else if (clone.botType === Indicator || clone.botType === Sensor) {
if (clone.mode !== NO_TIME) {
env.push({
'name': 'MIN_YEAR',
@@ -129,6 +152,7 @@ const createClone = async (clone) => {
}
deploymentManifest.spec.template.spec.containers[0].env = env
logger.debug('createClone env: %s', JSON.stringify(env))
await client.apis.batch.v1.namespaces('default').jobs.post(
{ body: deploymentManifest })
@@ -138,4 +162,29 @@ const createClone = async (clone) => {
throw new KubernateError(err)
}
}
function datasetNames(){
let dataSetMap = new Map()
dataSetMap.set("24-hs","Multi-Period-Market")
dataSetMap.set("12-hs","Multi-Period-Market")
dataSetMap.set("08-hs","Multi-Period-Market")
dataSetMap.set("06-hs","Multi-Period-Market")
dataSetMap.set("04-hs","Multi-Period-Market")
dataSetMap.set("03-hs","Multi-Period-Market")
dataSetMap.set("02-hs","Multi-Period-Market")
dataSetMap.set("01-hs","Multi-Period-Market")
dataSetMap.set("45-min","Multi-Period-Daily")
dataSetMap.set("40-min","Multi-Period-Daily")
dataSetMap.set("30-min","Multi-Period-Daily")
dataSetMap.set("20-min","Multi-Period-Daily")
dataSetMap.set("15-min","Multi-Period-Daily")
dataSetMap.set("10-min","Multi-Period-Daily")
dataSetMap.set("05-min","Multi-Period-Daily")
dataSetMap.set("04-min","Multi-Period-Daily")
dataSetMap.set("03-min","Multi-Period-Daily")
dataSetMap.set("02-min","Multi-Period-Daily")
dataSetMap.set("01-min","Multi-Period-Daily")
return dataSetMap
}
export default createClone
+12 -6
View File
@@ -20,15 +20,21 @@ const getClonePodLogs = async (cloneName) => {
'tailLines': '20'
}
}
const logs = await client.api.v1.namespaces('default')
.pods(pod.body.items[0].metadata.name).log.get(queryLogs)
let logsArray = logs.body.split('\n')
if(pod.body.items[0] !== undefined){
const logs = await client.api.v1.namespaces('default')
.pods(pod.body.items[0].metadata.name).log.get(queryLogs)
let logsArray = logs.body.split('\n')
logger.debug('getClonePodLogs on kubernates successful.')
logger.debug('getClonePodLogs on kubernates successful.')
return JSON.stringify(logsArray, null, 2)
return JSON.stringify(logsArray, null, 2)
} else {
logger.warn('getClonePodStatus pod not found %s: ', cloneName)
return "Logs not available."
}
} catch (err) {
throw new KubernateError(err)
logger.error('There was an error getting the pod logs %s: ', err)
return "Logs not available."
}
}
export default getClonePodLogs
+15 -8
View File
@@ -5,7 +5,7 @@ import { Client, config } from 'kubernetes-client'
const getClonePodStatus = async (cloneName) => {
try {
logger.debug('getClonePodStatus on kubernates started. ')
const client = new Client({config: config.fromKubeconfig(), version: '1.9'})
const client = new Client({ config: config.fromKubeconfig(), version: '1.9' })
let query = {
'qs': {
@@ -15,16 +15,23 @@ const getClonePodStatus = async (cloneName) => {
const pod = await client.api.v1.namespaces('default').pods.get(query)
let clonePodStatus = pod.body.items[0].status.containerStatuses[0].state
if (pod.body.items[0] !== undefined) {
let clonePodStatus = pod.body.items[0].status.containerStatuses[0].state
if (clonePodStatus.hasOwnProperty('terminated')
&& clonePodStatus.terminated.hasOwnProperty('containerID')) {
delete clonePodStatus.terminated.containerID
if (clonePodStatus.hasOwnProperty('terminated')
&& clonePodStatus.terminated.hasOwnProperty('containerID')) {
delete clonePodStatus.terminated.containerID
}
logger.debug('getClonePodStatus %s on kubernates successful', cloneName)
return JSON.stringify(clonePodStatus, null, 2)
} else {
logger.warn('getClonePodStatus pod not found %s: ', cloneName)
return " Clone not found on the server. "
}
logger.debug('getClonePodStatus %s on kubernates successful', cloneName)
return JSON.stringify(clonePodStatus, null, 2)
} catch (err) {
throw new KubernateError(err)
logger.error('There was an error getting the pod status %s: ', err)
return "Status not available."
}
}
export default getClonePodStatus
+1 -1
View File
@@ -20,7 +20,7 @@ const removeClone = async (clone) => {
logger.debug('removeClone %s on kubernates succesful', clone.id)
} catch (err) {
throw new KubernateError(err)
logger.warn('removeClone %s on kubernates failed, the job was not found on the server.', clone.id)
}
}
export default removeClone
@@ -21,7 +21,7 @@ const args = {
clone: { type: CloneInputType }
}
const resolve = async(parent, { clone }, context) => {
const resolve = async (parent, { clone }, context) => {
logger.debug('addClone -> Entering Fuction.')
if (!context.userId) {
@@ -36,7 +36,7 @@ const resolve = async(parent, { clone }, context) => {
throw new WrongArgumentsError('The bot type selected is not valid.')
}
if ( (clone.mode === LIVE || clone.mode === COMPETITION) && !isDefined(clone.keyId)) {
if ((clone.mode === LIVE || clone.mode === COMPETITION) && !isDefined(clone.keyId)) {
throw new WrongArgumentsError('The key was not provided to run the clone.')
}
@@ -62,7 +62,7 @@ const resolve = async(parent, { clone }, context) => {
} else {
throw new AutorizationError()
}
}else{
} else {
await createKubernetesClone(clone)
}
@@ -33,7 +33,7 @@ const resolve = async (parent, { id }, context) => {
let team = await teamQuery(context.authorization, clone.teamId)
clone = await cloneDetails(context.userId, team.data.data.teams_TeamById, clone)
if ( (clone.mode === LIVE || clone.mode === COMPETITION) && !isDefined(clone.keyId)) {
if ((clone.mode === LIVE || clone.mode === COMPETITION) && isDefined(clone.keyId)) {
logger.debug('removeClone -> Release the clone key.')
await authorizeClone(context.authorization, clone.keyId, clone.id, true)
}
+49
View File
@@ -0,0 +1,49 @@
import { GraphQLNonNull, GraphQLID } from 'graphql'
import { OperationsError } from '../../errors'
import { GetClonesType } from '../types'
import { Clone } from '../../models'
import logger from '../../config/logger'
import mongoose from 'mongoose'
import { isDefined } from '../../config/utils'
const args = {
cloneId: { type: new GraphQLNonNull(GraphQLID) }
}
const resolve = async(parent, { cloneId }, context) => {
logger.debug('Get Clone -> Entering Fuction.')
try {
if (mongoose.Types.ObjectId.isValid(cloneId)) {
let existingClone = await Clone.findOne({
_id: cloneId
})
if (isDefined(existingClone)) {
return {
id: cloneId,
teamId: existingClone.teamId,
botId: existingClone.botId
}
} else {
throw new Error('Clone not found.')
}
} else {
throw new Error('Invalid Clone ID.')
}
return clones
} catch (err) {
logger.error('Get Clone error: %s', err.stack)
throw new OperationsError('There has been an error getting the clone. ' + err.message)
}
}
const GetClones = {
getClone: {
type: GetClonesType,
args,
resolve
}
}
export default GetClones
+1
View File
@@ -30,6 +30,7 @@ const resolve = async(parent, args, context) => {
let lastLogs = await getCloneLogs(clones[i].id)
clones[i].lastLogs = lastLogs.substring(1, lastLogs.length - 1)
clones[i].botType = clones[i].kind // Only for listing we show the teams value
clones[i].botSlug = clones[i].botSlug
}
return clones
} catch (err) {
+3 -1
View File
@@ -2,13 +2,15 @@ import { GraphQLObjectType } from 'graphql'
import ListClones from './ListClones'
import HistoryClones from './HistoryClones'
import GetClones from './GetClones'
import GetClone from './GetClone'
const RootQuery = new GraphQLObjectType({
name: 'RootQueryType',
fields: Object.assign(
ListClones,
HistoryClones,
GetClones
GetClones,
GetClone
)
})
+2 -1
View File
@@ -38,7 +38,8 @@ const CloneType = new GraphQLObjectType({
botName: {type: GraphQLString},
botAvatar: {type: GraphQLString},
teamAvatar: {type: GraphQLString},
keyId: {type: GraphQLString}
keyId: {type: GraphQLString},
botSlug: {type: GraphQLString}
})
})
export default CloneType
+2 -1
View File
@@ -24,7 +24,8 @@ const Type = new GraphQLInputObjectType({
interval: { type: GraphQLInt },
processName: { type: new GraphQLNonNull(GraphQLString) },
botType: { type: new GraphQLNonNull(GraphQLString) },
keyId: { type: GraphQLString }
keyId: { type: GraphQLString },
timePeriod: { type: GraphQLString }
})
})