etcd/mod/dashboard/app/module/etcd-api.js
2014-04-14 12:16:18 -07:00

145 lines
3.1 KiB
JavaScript

/**
* @fileoverview
*
*/
'use strict';
angular.module('etcd.module')
.factory('etcdApiSvc', function($http, $q, $, _, pathSvc) {
function createNode(node) {
var payload = {
ttl: node.ttl
};
if (node.dir) {
payload.dir = true;
} else {
payload.value = node.value;
}
return getLeaderUri()
.then(function(leaderUri) {
return $http({
url: leaderUri + pathSvc.getFullKeyPath(node.key),
data: $.param(payload),
method: 'PUT',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
});
}
function saveNode(node) {
var payload = {
ttl: node.ttl,
prevExist: true
};
if (node.dir) {
payload.dir = true;
} else {
payload.value = node.value;
}
return getLeaderUri()
.then(function(leaderUri) {
return $http({
url: leaderUri + pathSvc.getFullKeyPath(node.key),
data: $.param(payload),
method: 'PUT',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
});
}
function deleteNode(node) {
var params;
if (node.dir) {
params = {
dir: true,
recursive: true
};
}
return getLeaderUri()
.then(function(leaderUri) {
return $http({
url: leaderUri + pathSvc.getFullKeyPath(node.key),
method: 'DELETE',
params: params,
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
});
}
function fetchNode(key) {
return $http.get(pathSvc.getFullKeyPath(key), {
supressNotifications: true
})
.then(function(resp) {
return resp.data.node;
});
}
function fetchStat(name) {
return $http.get(pathSvc.getStatFullKeyPath(name), {
supressNotifications: true
});
}
function getPeerUri(peerName) {
return fetchNode('/_etcd/machines/' + peerName)
.then(function(peerInfo) {
var data = decodeURIComponent(peerInfo.value);
data = data.replace(/&/g, '\",\"').replace(/=/g,'\":\"');
data = JSON.parse('{"' + data + '"}');
return data.etcd;
});
}
function getLeaderUri() {
return fetchLeaderStats()
.then(function(stats) {
return getPeerUri(stats.leaderName);
});
}
function fetchPeerDetailStats(peerName) {
return getPeerUri(peerName).then(function(peerUri) {
return $http.get(peerUri + pathSvc.getStatFullKeyPath('self'))
.then(function(resp) {
return resp.data;
});
});
}
function fetchLeaderStats() {
return fetchStat('leader').then(function(resp) {
var result = {
followers: [],
leaderName: resp.data.leader
};
_.each(resp.data.followers, function(value, key) {
value.name = key;
result.followers.push(value);
});
return result;
});
}
return {
fetch: fetchNode,
fetchStat: fetchStat,
fetchLeaderStats: fetchLeaderStats,
fetchPeerDetailStats: fetchPeerDetailStats,
getLeaderUri: getLeaderUri,
create: createNode,
save: saveNode,
delete: deleteNode
};
});