etcd.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. 'use strict';
  2. angular.module('etcd', [])
  3. .factory('EtcdV2', ['$http', '$q', function($http, $q) {
  4. var keyPrefix = '/v2/keys/'
  5. var statsPrefix = '/v2/stats/'
  6. var baseURL = '/v2/'
  7. var leaderURL = ''
  8. delete $http.defaults.headers.common['X-Requested-With'];
  9. function cleanupPath(path) {
  10. var parts = path.split('/');
  11. if (parts.length === 0) {
  12. return '';
  13. }
  14. parts = parts.filter(function(v){return v!=='';});
  15. parts = parts.join('/');
  16. return parts
  17. }
  18. function newKey(keyName) {
  19. var self = {};
  20. self.name = cleanupPath(keyName);
  21. self.getParent = function() {
  22. var parts = self.name.split('/');
  23. if (parts.length === 0) {
  24. return newKey('');
  25. }
  26. parts.pop();
  27. return newKey(parts.join('/'));
  28. };
  29. self.path = function() {
  30. var path = '/' + cleanupPath(keyPrefix + self.name);
  31. if (path === keyPrefix.substring(0, keyPrefix.length - 1)) {
  32. return keyPrefix
  33. }
  34. return path
  35. };
  36. self.get = function() {
  37. return $http.get(self.path());
  38. };
  39. self.set = function(keyValue) {
  40. return getLeader().then(function(leader) {
  41. return $http({
  42. url: leader + self.path(),
  43. data: $.param({value: keyValue}),
  44. method: 'PUT',
  45. headers: {'Content-Type': 'application/x-www-form-urlencoded'}
  46. });
  47. });
  48. };
  49. self.deleteKey = function(keyValue) {
  50. return getLeader().then(function(leader) {
  51. return $http({
  52. url: leader + self.path(),
  53. method: 'DELETE',
  54. headers: {'Content-Type': 'application/x-www-form-urlencoded'}
  55. });
  56. });
  57. };
  58. return self;
  59. }
  60. function newStat(statName) {
  61. var self = {};
  62. self.name = cleanupPath(statName);
  63. self.path = function() {
  64. return '/' + cleanupPath(statsPrefix + self.name);
  65. };
  66. self.get = function() {
  67. return $http.get(self.path());
  68. };
  69. return self
  70. }
  71. function getLeader() {
  72. return newStat('leader').get().then(function(response) {
  73. return newKey('/_etcd/machines/' + response.data.leader).get().then(function(response) {
  74. // TODO: do something better here p.s. I hate javascript
  75. var data = JSON.parse('{"' + decodeURI(response.data.value.replace(/&/g, "\",\"").replace(/=/g,"\":\"")) + '"}');
  76. return data.etcd;
  77. });
  78. });
  79. }
  80. return {
  81. getStat: newStat,
  82. getKey: newKey,
  83. }
  84. }]);