diff --git a/pom.xml b/pom.xml
index 92e0dc7a..2aa8a346 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,6 +38,7 @@
spring-cloud-consul-config
spring-cloud-consul-discovery
spring-cloud-consul-bus
+ spring-cloud-consul-ui
spring-cloud-consul-sample
spring-cloud-consul-tests
docs
@@ -93,6 +94,11 @@
spring-cloud-consul-discovery
1.0.0.BUILD-SNAPSHOT
+
+ org.springframework.cloud
+ spring-cloud-consul-ui
+ 1.0.0.BUILD-SNAPSHOT
+
org.springframework.cloud
spring-cloud-commons
@@ -161,21 +167,6 @@
spring-cloud-starter-zuul
${spring-cloud-netflix.version}
-
- org.springframework.cloud
- spring-cloud-netflix-sidecar
- ${spring-cloud-netflix.version}
-
-
- com.netflix.eureka
- eureka-client
-
-
- com.netflix.ribbon
- ribbon-eureka
-
-
-
org.springframework.cloud
spring-cloud-netflix-core
diff --git a/spring-cloud-consul-sample/pom.xml b/spring-cloud-consul-sample/pom.xml
index 3572d2c1..23c73822 100644
--- a/spring-cloud-consul-sample/pom.xml
+++ b/spring-cloud-consul-sample/pom.xml
@@ -57,6 +57,10 @@
org.springframework.cloud
spring-cloud-consul-bus
+
+ org.springframework.cloud
+ spring-cloud-consul-ui
+
org.projectlombok
lombok
diff --git a/spring-cloud-consul-sample/src/main/java/org/springframework/cloud/consul/sample/SampleApplication.java b/spring-cloud-consul-sample/src/main/java/org/springframework/cloud/consul/sample/SampleApplication.java
index f0eb43ac..ae170fd8 100644
--- a/spring-cloud-consul-sample/src/main/java/org/springframework/cloud/consul/sample/SampleApplication.java
+++ b/spring-cloud-consul-sample/src/main/java/org/springframework/cloud/consul/sample/SampleApplication.java
@@ -28,6 +28,7 @@ import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.cloud.consul.bus.SimpleRemoteEvent;
+import org.springframework.cloud.ui.EnableConsulUi;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -42,6 +43,7 @@ import org.springframework.web.bind.annotation.RestController;
@Configuration
@EnableAutoConfiguration
@EnableDiscoveryClient
+@EnableConsulUi
@RestController
@Slf4j
public class SampleApplication implements ApplicationListener {
diff --git a/spring-cloud-consul-ui/pom.xml b/spring-cloud-consul-ui/pom.xml
new file mode 100644
index 00000000..1a2a0114
--- /dev/null
+++ b/spring-cloud-consul-ui/pom.xml
@@ -0,0 +1,46 @@
+
+
+ 4.0.0
+
+ spring-cloud-consul-ui
+ jar
+ Spring Cloud Consul UI
+ Spring Cloud Consul UI
+
+
+ org.springframework.cloud
+ spring-cloud-consul
+ 1.0.0.BUILD-SNAPSHOT
+ ..
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-consul-core
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.cloud
+ spring-cloud-starter-zuul
+
+
+ org.projectlombok
+ lombok
+
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
diff --git a/spring-cloud-consul-ui/src/main/java/org/springframework/cloud/ui/ConsulUiConfiguration.java b/spring-cloud-consul-ui/src/main/java/org/springframework/cloud/ui/ConsulUiConfiguration.java
new file mode 100644
index 00000000..df0a6787
--- /dev/null
+++ b/spring-cloud-consul-ui/src/main/java/org/springframework/cloud/ui/ConsulUiConfiguration.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2013-2015 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.ui;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.consul.ConsulProperties;
+import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
+import org.springframework.cloud.netflix.zuul.filters.ZuulProperties;
+import org.springframework.cloud.netflix.zuul.web.ZuulHandlerMapping;
+import org.springframework.context.annotation.Bean;
+
+/**
+ * @author Spencer Gibb
+ */
+@EnableZuulProxy
+public class ConsulUiConfiguration {
+
+ @Autowired
+ private ZuulProperties zuulProperties;
+
+ @Autowired
+ private ConsulProperties consulProperties;
+
+ @Autowired
+ private ZuulHandlerMapping zuulHandlerMapping;
+
+ @PostConstruct
+ public void init() {
+ String url = String.format("http://%s:%s", consulProperties.getHost(),
+ consulProperties.getPort());
+ ZuulProperties.ZuulRoute route = new ZuulProperties.ZuulRoute("consulUi",
+ "/v1/**", null, url, false, false);
+ zuulProperties.getRoutes().put("consulUi", route);
+
+ zuulHandlerMapping.registerHandlers();
+ }
+
+ @Bean
+ public ConsulUiController consulUiController() {
+ return new ConsulUiController();
+ }
+}
diff --git a/spring-cloud-consul-ui/src/main/java/org/springframework/cloud/ui/ConsulUiController.java b/spring-cloud-consul-ui/src/main/java/org/springframework/cloud/ui/ConsulUiController.java
new file mode 100644
index 00000000..de559934
--- /dev/null
+++ b/spring-cloud-consul-ui/src/main/java/org/springframework/cloud/ui/ConsulUiController.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2013-2015 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.ui;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * @author Spencer Gibb
+ */
+@Controller
+@RequestMapping("${spring.cloud.consul.ui.path:/ui}")
+public class ConsulUiController {
+
+ @RequestMapping(method = RequestMethod.GET)
+ public String index() {
+ return "forward:index.html";
+ }
+}
diff --git a/spring-cloud-consul-ui/src/main/java/org/springframework/cloud/ui/EnableConsulUI.java b/spring-cloud-consul-ui/src/main/java/org/springframework/cloud/ui/EnableConsulUI.java
new file mode 100644
index 00000000..5204278d
--- /dev/null
+++ b/spring-cloud-consul-ui/src/main/java/org/springframework/cloud/ui/EnableConsulUI.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2013-2015 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.ui;
+
+import org.springframework.cloud.netflix.zuul.EnableZuulServer;
+import org.springframework.context.annotation.Import;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author Spencer Gibb
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+@Import(ConsulUiConfiguration.class)
+@EnableZuulServer
+public @interface EnableConsulUi {
+
+}
diff --git a/consul_ui/index.html b/spring-cloud-consul-ui/src/main/resources/public/index.html
similarity index 100%
rename from consul_ui/index.html
rename to spring-cloud-consul-ui/src/main/resources/public/index.html
diff --git a/consul_ui/static/application.min.js b/spring-cloud-consul-ui/src/main/resources/public/static/application.min.js
similarity index 100%
rename from consul_ui/static/application.min.js
rename to spring-cloud-consul-ui/src/main/resources/public/static/application.min.js
diff --git a/consul_ui/static/base.css b/spring-cloud-consul-ui/src/main/resources/public/static/base.css
similarity index 100%
rename from consul_ui/static/base.css
rename to spring-cloud-consul-ui/src/main/resources/public/static/base.css
diff --git a/consul_ui/static/base.css.map b/spring-cloud-consul-ui/src/main/resources/public/static/base.css.map
similarity index 100%
rename from consul_ui/static/base.css.map
rename to spring-cloud-consul-ui/src/main/resources/public/static/base.css.map
diff --git a/consul_ui/static/bootstrap.min.css b/spring-cloud-consul-ui/src/main/resources/public/static/bootstrap.min.css
similarity index 100%
rename from consul_ui/static/bootstrap.min.css
rename to spring-cloud-consul-ui/src/main/resources/public/static/bootstrap.min.css
diff --git a/consul_ui/static/consul-logo.png b/spring-cloud-consul-ui/src/main/resources/public/static/consul-logo.png
similarity index 100%
rename from consul_ui/static/consul-logo.png
rename to spring-cloud-consul-ui/src/main/resources/public/static/consul-logo.png
diff --git a/consul_ui/static/favicon.png b/spring-cloud-consul-ui/src/main/resources/public/static/favicon.png
similarity index 100%
rename from consul_ui/static/favicon.png
rename to spring-cloud-consul-ui/src/main/resources/public/static/favicon.png
diff --git a/consul_ui/static/loading-cylon-purple.svg b/spring-cloud-consul-ui/src/main/resources/public/static/loading-cylon-purple.svg
similarity index 100%
rename from consul_ui/static/loading-cylon-purple.svg
rename to spring-cloud-consul-ui/src/main/resources/public/static/loading-cylon-purple.svg
diff --git a/src/main/bash/local_run_consul.sh b/src/main/bash/local_run_consul.sh
index f3aac7f6..af5b5936 100755
--- a/src/main/bash/local_run_consul.sh
+++ b/src/main/bash/local_run_consul.sh
@@ -1,2 +1,2 @@
#!/bin/bash
-consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -ui-dir `dirname $0`/../../../consul_ui
+consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -ui-dir `dirname $0`/../../../spring-cloud-consul-ui/src/main/resources/public