server.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Quick and dirty provisioning service.
  2. const util = require("util");
  3. const express = require("express");
  4. const morgan = require('morgan');
  5. const bodyParser = require("body-parser");
  6. const validator = require("swagger-express-validator");
  7. const yaml = require("js-yaml");
  8. const fs = require("fs");
  9. const model = require("./model");
  10. const Prometheus = require('prom-client');
  11. // Get api spec, or throw exception on error
  12. let schema = null;
  13. try {
  14. schema = yaml.safeLoad(fs.readFileSync("provisioner.yaml", "utf8"));
  15. } catch (e) {
  16. console.error(e);
  17. process.exit(1);
  18. }
  19. const app = express();
  20. app.use(bodyParser.json());
  21. app.use(morgan('tiny'));
  22. const opts = {
  23. schema,
  24. validateRequest: true,
  25. validateResponse: true,
  26. requestValidationFn: (req, data, errors) => {
  27. console.error(
  28. `failed request validation: ${req.method} ${
  29. req.originalUrl
  30. }\n ${util.inspect(errors)}`
  31. );
  32. },
  33. responseValidationFn: (req, data, errors) => {
  34. console.error(
  35. `failed response validation: ${req.method} ${
  36. req.originalUrl
  37. }\n ${util.inspect(errors)}`
  38. );
  39. }
  40. };
  41. app.use(validator(opts));
  42. app.post("/dw/createCluster", async (req, res) => {
  43. res.json(await model.createCluster(req.body));
  44. });
  45. app.post("/dw/describeCluster", async (req, res) => {
  46. res.json(await model.describeCluster(req.body));
  47. });
  48. app.post("/dw/listClusters", async (req, res) => {
  49. res.json({
  50. clusters: await model.listClusters(req.body)
  51. });
  52. });
  53. app.post("/dw/updateCluster", async (req, res) => {
  54. res.json(await model.updateCluster(req.body));
  55. });
  56. app.post("/dw/deleteCluster", async (req, res) => {
  57. res.json(await model.deleteCluster(req.body));
  58. });
  59. app.get("/", async (req, res) => {
  60. res.json({app: "cloudera-dw-provisioner", version: "0.1"});
  61. });
  62. // Proxying metrics until natively supported by Impala
  63. app.get('/metrics', async (req, res) => {
  64. await model.getClusterMetrics(req.body);
  65. res.set('Content-Type', Prometheus.register.contentType)
  66. res.end(Prometheus.register.metrics())
  67. })
  68. return app.listen(4747, "0.0.0.0", () =>
  69. console.log("provisioning service listening on 0.0.0.0:4747")
  70. );