etcd-api.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /**
  2. * @fileoverview
  3. *
  4. */
  5. 'use strict';
  6. angular.module('etcd.module')
  7. .factory('etcdApiSvc', function($http, $q, $, _, pathSvc) {
  8. function createNode(node) {
  9. var payload = {
  10. ttl: node.ttl
  11. };
  12. if (node.dir) {
  13. payload.dir = true;
  14. } else {
  15. payload.value = node.value;
  16. }
  17. return getLeaderUri()
  18. .then(function(leaderUri) {
  19. return $http({
  20. url: leaderUri + pathSvc.getFullKeyPath(node.key),
  21. data: $.param(payload),
  22. method: 'PUT',
  23. headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
  24. });
  25. });
  26. }
  27. function saveNode(node) {
  28. var payload = {
  29. ttl: node.ttl,
  30. prevExist: true
  31. };
  32. if (node.dir) {
  33. payload.dir = true;
  34. } else {
  35. payload.value = node.value;
  36. }
  37. return getLeaderUri()
  38. .then(function(leaderUri) {
  39. return $http({
  40. url: leaderUri + pathSvc.getFullKeyPath(node.key),
  41. data: $.param(payload),
  42. method: 'PUT',
  43. headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
  44. });
  45. });
  46. }
  47. function deleteNode(node) {
  48. var params;
  49. if (node.dir) {
  50. params = {
  51. dir: true,
  52. recursive: true
  53. };
  54. }
  55. return getLeaderUri()
  56. .then(function(leaderUri) {
  57. return $http({
  58. url: leaderUri + pathSvc.getFullKeyPath(node.key),
  59. method: 'DELETE',
  60. params: params,
  61. headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
  62. });
  63. });
  64. }
  65. function fetchNode(key) {
  66. return $http.get(pathSvc.getFullKeyPath(key), {
  67. supressNotifications: true
  68. })
  69. .then(function(resp) {
  70. return resp.data.node;
  71. });
  72. }
  73. function fetchStat(name) {
  74. return $http.get(pathSvc.getStatFullKeyPath(name), {
  75. supressNotifications: true
  76. });
  77. }
  78. function getPeerUri(peerName) {
  79. return fetchNode('/_etcd/machines/' + peerName)
  80. .then(function(peerInfo) {
  81. var data = decodeURIComponent(peerInfo.value);
  82. data = data.replace(/&/g, '\",\"').replace(/=/g,'\":\"');
  83. data = JSON.parse('{"' + data + '"}');
  84. return data.etcd;
  85. });
  86. }
  87. function getLeaderUri() {
  88. return fetchLeaderStats()
  89. .then(function(stats) {
  90. return getPeerUri(stats.leaderName);
  91. });
  92. }
  93. function fetchPeerDetailStats(peerName) {
  94. return getPeerUri(peerName).then(function(peerUri) {
  95. return $http.get(peerUri + pathSvc.getStatFullKeyPath('self'))
  96. .then(function(resp) {
  97. return resp.data;
  98. });
  99. });
  100. }
  101. function fetchLeaderStats() {
  102. return fetchStat('leader').then(function(resp) {
  103. var result = {
  104. followers: [],
  105. leaderName: resp.data.leader
  106. };
  107. _.each(resp.data.followers, function(value, key) {
  108. value.name = key;
  109. result.followers.push(value);
  110. });
  111. return result;
  112. });
  113. }
  114. return {
  115. fetch: fetchNode,
  116. fetchStat: fetchStat,
  117. fetchLeaderStats: fetchLeaderStats,
  118. fetchPeerDetailStats: fetchPeerDetailStats,
  119. getLeaderUri: getLeaderUri,
  120. create: createNode,
  121. save: saveNode,
  122. delete: deleteNode
  123. };
  124. });