From 69240b99f5dea5d6a5e1a3f849ce4da7ee3557ea Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Mon, 1 Dec 2014 15:52:48 -0700 Subject: [PATCH] initial commit --- .gitignore | 13 + .settings.xml | 60 + .travis.yml | 19 + README.md | 12 + consul_ui/index.html | 748 + consul_ui/static/application.min.js | 23010 ++++++++++++++++ consul_ui/static/base.css | 1118 + consul_ui/static/bootstrap.min.css | 7 + consul_ui/static/consul-logo.png | Bin 0 -> 38387 bytes consul_ui/static/favicon.png | Bin 0 -> 3657 bytes consul_ui/static/loading-cylon-purple.svg | 11 + pom.xml | 148 + run_consul.sh | 2 + spring-cloud-consul-bus/pom.xml | 45 + .../bus/ConsulBusAutoConfiguration.java | 68 + .../bus/ConsulInboundChannelAdapter.java | 65 + .../consul/bus/ConsulOutboundEndpoint.java | 27 + .../cloud/consul/bus/SimpleRemoteEvent.java | 27 + .../main/resources/META-INF/spring.factories | 3 + .../cloud/consul/bus/ConsulBusIT.java | 108 + spring-cloud-consul-config/pom.xml | 45 + .../ConsulConfigBootstrapConfiguration.java | 18 + .../consul/config/ConsulPropertySource.java | 53 + .../config/ConsulPropertySourceLocator.java | 64 + .../main/resources/META-INF/spring.factories | 3 + spring-cloud-consul-core/pom.xml | 57 + .../cloud/consul/ConsulAutoConfiguration.java | 72 + .../cloud/consul/ConsulEndpoint.java | 63 + .../cloud/consul/ConsulHealthIndicator.java | 28 + .../cloud/consul/ConsulProperties.java | 27 + .../cloud/consul/client/AgentClient.java | 25 + .../cloud/consul/client/CatalogClient.java | 19 + .../consul/client/ConsulErrorDecoder.java | 17 + .../cloud/consul/client/EventClient.java | 28 + .../cloud/consul/client/EventService.java | 131 + .../cloud/consul/client/KeyValueClient.java | 33 + .../consul/client/NotFoundException.java | 12 + .../cloud/consul/model/Check.java | 19 + .../cloud/consul/model/Event.java | 70 + .../cloud/consul/model/KeyValue.java | 52 + .../cloud/consul/model/Service.java | 29 + .../cloud/consul/model/ServiceNode.java | 32 + .../main/resources/META-INF/spring.factories | 3 + .../cloud/consul/client/AgentClientIT.java | 62 + .../cloud/consul/client/CatalogClientIT.java | 48 + .../cloud/consul/client/EventClientIT.java | 47 + .../cloud/consul/client/EventServiceIT.java | 49 + .../cloud/consul/client/KeyValueClientIT.java | 75 + .../client/TestClientConfiguration.java | 13 + spring-cloud-consul-discovery/pom.xml | 48 + .../ConsulDiscoveryAutoConfiguration.java | 25 + .../discovery/ConsulDiscoveryClient.java | 90 + .../consul/discovery/ConsulLifecycle.java | 76 + .../discovery/ConsulLoadBalancerClient.java | 56 + .../cloud/consul/discovery/ConsulServer.java | 42 + .../consul/discovery/ConsulServerList.java | 62 + .../main/resources/META-INF/spring.factories | 3 + spring-cloud-consul-sample/pom.xml | 51 + .../consul/sample/SampleApplication.java | 64 + .../src/test/resources/application.yml | 20 + .../src/test/resources/bootstrap.yml | 7 + 61 files changed, 27229 insertions(+) create mode 100644 .gitignore create mode 100644 .settings.xml create mode 100644 .travis.yml create mode 100644 README.md create mode 100644 consul_ui/index.html create mode 100644 consul_ui/static/application.min.js create mode 100644 consul_ui/static/base.css create mode 100644 consul_ui/static/bootstrap.min.css create mode 100644 consul_ui/static/consul-logo.png create mode 100644 consul_ui/static/favicon.png create mode 100644 consul_ui/static/loading-cylon-purple.svg create mode 100644 pom.xml create mode 100755 run_consul.sh create mode 100644 spring-cloud-consul-bus/pom.xml create mode 100644 spring-cloud-consul-bus/src/main/java/org/springframework/cloud/consul/bus/ConsulBusAutoConfiguration.java create mode 100644 spring-cloud-consul-bus/src/main/java/org/springframework/cloud/consul/bus/ConsulInboundChannelAdapter.java create mode 100644 spring-cloud-consul-bus/src/main/java/org/springframework/cloud/consul/bus/ConsulOutboundEndpoint.java create mode 100644 spring-cloud-consul-bus/src/main/java/org/springframework/cloud/consul/bus/SimpleRemoteEvent.java create mode 100644 spring-cloud-consul-bus/src/main/resources/META-INF/spring.factories create mode 100644 spring-cloud-consul-bus/src/test/java/org/springframework/cloud/consul/bus/ConsulBusIT.java create mode 100644 spring-cloud-consul-config/pom.xml create mode 100644 spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigBootstrapConfiguration.java create mode 100644 spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulPropertySource.java create mode 100644 spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulPropertySourceLocator.java create mode 100644 spring-cloud-consul-config/src/main/resources/META-INF/spring.factories create mode 100644 spring-cloud-consul-core/pom.xml create mode 100644 spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/ConsulAutoConfiguration.java create mode 100644 spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/ConsulEndpoint.java create mode 100644 spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/ConsulHealthIndicator.java create mode 100644 spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/ConsulProperties.java create mode 100644 spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/client/AgentClient.java create mode 100644 spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/client/CatalogClient.java create mode 100644 spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/client/ConsulErrorDecoder.java create mode 100644 spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/client/EventClient.java create mode 100644 spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/client/EventService.java create mode 100644 spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/client/KeyValueClient.java create mode 100644 spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/client/NotFoundException.java create mode 100644 spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/model/Check.java create mode 100644 spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/model/Event.java create mode 100644 spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/model/KeyValue.java create mode 100644 spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/model/Service.java create mode 100644 spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/model/ServiceNode.java create mode 100644 spring-cloud-consul-core/src/main/resources/META-INF/spring.factories create mode 100644 spring-cloud-consul-core/src/test/java/org/springframework/cloud/consul/client/AgentClientIT.java create mode 100644 spring-cloud-consul-core/src/test/java/org/springframework/cloud/consul/client/CatalogClientIT.java create mode 100644 spring-cloud-consul-core/src/test/java/org/springframework/cloud/consul/client/EventClientIT.java create mode 100644 spring-cloud-consul-core/src/test/java/org/springframework/cloud/consul/client/EventServiceIT.java create mode 100644 spring-cloud-consul-core/src/test/java/org/springframework/cloud/consul/client/KeyValueClientIT.java create mode 100644 spring-cloud-consul-core/src/test/java/org/springframework/cloud/consul/client/TestClientConfiguration.java create mode 100644 spring-cloud-consul-discovery/pom.xml create mode 100644 spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryAutoConfiguration.java create mode 100644 spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClient.java create mode 100644 spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulLifecycle.java create mode 100644 spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulLoadBalancerClient.java create mode 100644 spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServer.java create mode 100644 spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServerList.java create mode 100644 spring-cloud-consul-discovery/src/main/resources/META-INF/spring.factories create mode 100644 spring-cloud-consul-sample/pom.xml create mode 100644 spring-cloud-consul-sample/src/test/java/org/springframework/cloud/consul/sample/SampleApplication.java create mode 100644 spring-cloud-consul-sample/src/test/resources/application.yml create mode 100644 spring-cloud-consul-sample/src/test/resources/bootstrap.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..8c5133e4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +*~ +#* +*# +.#* +.classpath +.project +.settings/ +.springBeans +target/ +_site/ +.idea +*.iml +*.swp diff --git a/.settings.xml b/.settings.xml new file mode 100644 index 00000000..006f51ef --- /dev/null +++ b/.settings.xml @@ -0,0 +1,60 @@ + + + + + repo.spring.io + ${env.CI_DEPLOY_USERNAME} + ${env.CI_DEPLOY_PASSWORD} + + + + + spring + true + + + spring-snapshots + Spring Snapshots + http://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + http://repo.spring.io/libs-milestone-local + + false + + + + spring-releases + Spring Releases + http://repo.spring.io/release + + false + + + + + + spring-snapshots + Spring Snapshots + http://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + http://repo.spring.io/libs-milestone-local + + false + + + + + + diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..c538a813 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,19 @@ +language: java +before_install: + - git config user.name "$GIT_NAME" + - git config user.email "$GIT_EMAIL" + - git config credential.helper "store --file=.git/credentials" + - echo "https://$GH_TOKEN:@github.com" > .git/credentials + - gem install asciidoctor +install: +- mvn --settings .settings.xml install -P docs -q -U -DskipTests=true -Dmaven.test.redirectTestOutputToFile=true +- ./docs/src/main/asciidoc/ghpages.sh +script: +- '[ "${TRAVIS_PULL_REQUEST}" != "false" ] || mvn --settings .settings.xml deploy -nsu -Dmaven.test.redirectTestOutputToFile=true' +- '[ "${TRAVIS_PULL_REQUEST}" = "false" ] || mvn --settings .settings.xml install -nsu -Dmaven.test.redirectTestOutputToFile=true' +env: + global: + - GIT_NAME="Dave Syer" + - GIT_EMAIL=dsyer@pivotal.io + - CI_DEPLOY_USERNAME=buildmaster + - secure: aeLXRC5oFSddwnZt1/7G2/OHr7jDbxz0ET7sej3I+eSbe3N5vbzQ6FC08es4l89l54ciXd90I1g2BMw7DTYKOO373FP78XPdAEbifJTU4DGd6fCELmoTtUPhjunBIk7E49hisPbv82892IYYA7qi/hzG548cPyZ1IgiJjq0NCsc= diff --git a/README.md b/README.md new file mode 100644 index 00000000..9892dbf0 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +spring-cloud-consul +=================== +- [X] consul config +- [X] consul service discovery +- [X] consul ribbon load balancer +- [X] consul ui (on the sample agent) +- [X] consul property source +- [X] consul event bus + - [X] send messages + - [X] receive messages +- [ ] consul locks +- [ ] consul leader election diff --git a/consul_ui/index.html b/consul_ui/index.html new file mode 100644 index 00000000..3fb85f9a --- /dev/null +++ b/consul_ui/index.html @@ -0,0 +1,748 @@ + + + + + + + Consul + + + + + + +
+
+
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/consul_ui/static/application.min.js b/consul_ui/static/application.min.js new file mode 100644 index 00000000..06e2f8b4 --- /dev/null +++ b/consul_ui/static/application.min.js @@ -0,0 +1,23010 @@ +/*! + * jQuery JavaScript Library v1.10.2 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2013-07-03T13:48Z + */ +!function (e, t) { + function n(e) { + var t = e.length, n = ct.type(e); + return ct.isWindow(e) ? !1 : 1 === e.nodeType && t ? !0 : "array" === n || "function" !== n && (0 === t || "number" == typeof t && t > 0 && t - 1 in e) + } + + function r(e) { + var t = kt[e] = {}; + return ct.each(e.match(pt) || [], function (e, n) { + t[n] = !0 + }), t + } + + function i(e, n, r, i) { + if (ct.acceptData(e)) { + var o, a, s = ct.expando, u = e.nodeType, l = u ? ct.cache : e, c = u ? e[s] : e[s] && s; + if (c && l[c] && (i || l[c].data) || r !== t || "string" != typeof n)return c || (c = u ? e[s] = tt.pop() || ct.guid++ : s), l[c] || (l[c] = u ? {} : {toJSON: ct.noop}), ("object" == typeof n || "function" == typeof n) && (i ? l[c] = ct.extend(l[c], n) : l[c].data = ct.extend(l[c].data, n)), a = l[c], i || (a.data || (a.data = {}), a = a.data), r !== t && (a[ct.camelCase(n)] = r), "string" == typeof n ? (o = a[n], null == o && (o = a[ct.camelCase(n)])) : o = a, o + } + } + + function o(e, t, n) { + if (ct.acceptData(e)) { + var r, i, o = e.nodeType, a = o ? ct.cache : e, u = o ? e[ct.expando] : ct.expando; + if (a[u]) { + if (t && (r = n ? a[u] : a[u].data)) { + ct.isArray(t) ? t = t.concat(ct.map(t, ct.camelCase)) : t in r ? t = [t] : (t = ct.camelCase(t), t = t in r ? [t] : t.split(" ")), i = t.length; + for (; i--;)delete r[t[i]]; + if (n ? !s(r) : !ct.isEmptyObject(r))return + } + (n || (delete a[u].data, s(a[u]))) && (o ? ct.cleanData([e], !0) : ct.support.deleteExpando || a != a.window ? delete a[u] : a[u] = null) + } + } + } + + function a(e, n, r) { + if (r === t && 1 === e.nodeType) { + var i = "data-" + n.replace(St, "-$1").toLowerCase(); + if (r = e.getAttribute(i), "string" == typeof r) { + try { + r = "true" === r ? !0 : "false" === r ? !1 : "null" === r ? null : +r + "" === r ? +r : Et.test(r) ? ct.parseJSON(r) : r + } catch (o) { + } + ct.data(e, n, r) + } else r = t + } + return r + } + + function s(e) { + var t; + for (t in e)if (("data" !== t || !ct.isEmptyObject(e[t])) && "toJSON" !== t)return!1; + return!0 + } + + function u() { + return!0 + } + + function l() { + return!1 + } + + function c() { + try { + return G.activeElement + } catch (e) { + } + } + + function f(e, t) { + do e = e[t]; while (e && 1 !== e.nodeType); + return e + } + + function p(e, t, n) { + if (ct.isFunction(t))return ct.grep(e, function (e, r) { + return!!t.call(e, r, e) !== n + }); + if (t.nodeType)return ct.grep(e, function (e) { + return e === t !== n + }); + if ("string" == typeof t) { + if ($t.test(t))return ct.filter(t, e, n); + t = ct.filter(t, e) + } + return ct.grep(e, function (e) { + return ct.inArray(e, t) >= 0 !== n + }) + } + + function d(e) { + var t = Ut.split("|"), n = e.createDocumentFragment(); + if (n.createElement)for (; t.length;)n.createElement(t.pop()); + return n + } + + function h(e, t) { + return ct.nodeName(e, "table") && ct.nodeName(1 === t.nodeType ? t : t.firstChild, "tr") ? e.getElementsByTagName("tbody")[0] || e.appendChild(e.ownerDocument.createElement("tbody")) : e + } + + function g(e) { + return e.type = (null !== ct.find.attr(e, "type")) + "/" + e.type, e + } + + function m(e) { + var t = on.exec(e.type); + return t ? e.type = t[1] : e.removeAttribute("type"), e + } + + function y(e, t) { + for (var n, r = 0; null != (n = e[r]); r++)ct._data(n, "globalEval", !t || ct._data(t[r], "globalEval")) + } + + function v(e, t) { + if (1 === t.nodeType && ct.hasData(e)) { + var n, r, i, o = ct._data(e), a = ct._data(t, o), s = o.events; + if (s) { + delete a.handle, a.events = {}; + for (n in s)for (r = 0, i = s[n].length; i > r; r++)ct.event.add(t, n, s[n][r]) + } + a.data && (a.data = ct.extend({}, a.data)) + } + } + + function b(e, t) { + var n, r, i; + if (1 === t.nodeType) { + if (n = t.nodeName.toLowerCase(), !ct.support.noCloneEvent && t[ct.expando]) { + i = ct._data(t); + for (r in i.events)ct.removeEvent(t, r, i.handle); + t.removeAttribute(ct.expando) + } + "script" === n && t.text !== e.text ? (g(t).text = e.text, m(t)) : "object" === n ? (t.parentNode && (t.outerHTML = e.outerHTML), ct.support.html5Clone && e.innerHTML && !ct.trim(t.innerHTML) && (t.innerHTML = e.innerHTML)) : "input" === n && tn.test(e.type) ? (t.defaultChecked = t.checked = e.checked, t.value !== e.value && (t.value = e.value)) : "option" === n ? t.defaultSelected = t.selected = e.defaultSelected : ("input" === n || "textarea" === n) && (t.defaultValue = e.defaultValue) + } + } + + function x(e, n) { + var r, i, o = 0, a = typeof e.getElementsByTagName !== Y ? e.getElementsByTagName(n || "*") : typeof e.querySelectorAll !== Y ? e.querySelectorAll(n || "*") : t; + if (!a)for (a = [], r = e.childNodes || e; null != (i = r[o]); o++)!n || ct.nodeName(i, n) ? a.push(i) : ct.merge(a, x(i, n)); + return n === t || n && ct.nodeName(e, n) ? ct.merge([e], a) : a + } + + function w(e) { + tn.test(e.type) && (e.defaultChecked = e.checked) + } + + function T(e, t) { + if (t in e)return t; + for (var n = t.charAt(0).toUpperCase() + t.slice(1), r = t, i = kn.length; i--;)if (t = kn[i] + n, t in e)return t; + return r + } + + function C(e, t) { + return e = t || e, "none" === ct.css(e, "display") || !ct.contains(e.ownerDocument, e) + } + + function N(e, t) { + for (var n, r, i, o = [], a = 0, s = e.length; s > a; a++)r = e[a], r.style && (o[a] = ct._data(r, "olddisplay"), n = r.style.display, t ? (o[a] || "none" !== n || (r.style.display = ""), "" === r.style.display && C(r) && (o[a] = ct._data(r, "olddisplay", A(r.nodeName)))) : o[a] || (i = C(r), (n && "none" !== n || !i) && ct._data(r, "olddisplay", i ? n : ct.css(r, "display")))); + for (a = 0; s > a; a++)r = e[a], r.style && (t && "none" !== r.style.display && "" !== r.style.display || (r.style.display = t ? o[a] || "" : "none")); + return e + } + + function k(e, t, n) { + var r = vn.exec(t); + return r ? Math.max(0, r[1] - (n || 0)) + (r[2] || "px") : t + } + + function E(e, t, n, r, i) { + for (var o = n === (r ? "border" : "content") ? 4 : "width" === t ? 1 : 0, a = 0; 4 > o; o += 2)"margin" === n && (a += ct.css(e, n + Nn[o], !0, i)), r ? ("content" === n && (a -= ct.css(e, "padding" + Nn[o], !0, i)), "margin" !== n && (a -= ct.css(e, "border" + Nn[o] + "Width", !0, i))) : (a += ct.css(e, "padding" + Nn[o], !0, i), "padding" !== n && (a += ct.css(e, "border" + Nn[o] + "Width", !0, i))); + return a + } + + function S(e, t, n) { + var r = !0, i = "width" === t ? e.offsetWidth : e.offsetHeight, o = fn(e), a = ct.support.boxSizing && "border-box" === ct.css(e, "boxSizing", !1, o); + if (0 >= i || null == i) { + if (i = pn(e, t, o), (0 > i || null == i) && (i = e.style[t]), bn.test(i))return i; + r = a && (ct.support.boxSizingReliable || i === e.style[t]), i = parseFloat(i) || 0 + } + return i + E(e, t, n || (a ? "border" : "content"), r, o) + "px" + } + + function A(e) { + var t = G, n = wn[e]; + return n || (n = j(e, t), "none" !== n && n || (cn = (cn || ct("