diff --git a/repose-aggregator/commons/commons-utilities/build.gradle b/repose-aggregator/commons/commons-utilities/build.gradle
index 552cc675215..d6cc668045d 100644
--- a/repose-aggregator/commons/commons-utilities/build.gradle
+++ b/repose-aggregator/commons/commons-utilities/build.gradle
@@ -31,6 +31,7 @@ dependencies {
testCompile "org.apache.logging.log4j:log4j-core"
testCompile group: 'org.apache.logging.log4j', name: 'log4j-core', classifier: 'tests'
testCompile "org.springframework:spring-test"
+ testCompile "org.springframework:spring-web"
testCompile "org.slf4j:jcl-over-slf4j"
}
diff --git a/repose-aggregator/commons/commons-utilities/src/test/scala/org/openrepose/commons/utils/servlet/http/HttpServletRequestWrapperTest.scala b/repose-aggregator/commons/commons-utilities/src/test/scala/org/openrepose/commons/utils/servlet/http/HttpServletRequestWrapperTest.scala
index 37510556c46..61342ca56a9 100644
--- a/repose-aggregator/commons/commons-utilities/src/test/scala/org/openrepose/commons/utils/servlet/http/HttpServletRequestWrapperTest.scala
+++ b/repose-aggregator/commons/commons-utilities/src/test/scala/org/openrepose/commons/utils/servlet/http/HttpServletRequestWrapperTest.scala
@@ -55,7 +55,7 @@ class HttpServletRequestWrapperTest extends FunSpec with BeforeAndAfterEach with
val mockRequest = new MockHttpServletRequest
mockRequest.setRequestURI("/foo/bar")
queryParamMap foreach { case (parameterKey, parameterValues) =>
- mockRequest.addParameter(parameterKey, parameterValues)
+ mockRequest.addParameter(parameterKey, parameterValues: _*)
mockRequest.setQueryString(Option(mockRequest.getQueryString).map(_ + "&").getOrElse("") + parameterValues.map(value => parameterKey + "=" + value).mkString("&"))
}
headerMap foreach { case (headerName, headerValues) =>
diff --git a/repose-aggregator/components/filters/body-extractor-to-header-filter/build.gradle b/repose-aggregator/components/filters/body-extractor-to-header-filter/build.gradle
index 6604d0945aa..96367d7aecd 100644
--- a/repose-aggregator/components/filters/body-extractor-to-header-filter/build.gradle
+++ b/repose-aggregator/components/filters/body-extractor-to-header-filter/build.gradle
@@ -13,5 +13,6 @@ dependencies {
testCompile "org.scalatest:scalatest_$scalaMajDotMin"
testCompile "org.mockito:mockito-all"
testCompile "org.springframework:spring-test"
+ testCompile "org.springframework:spring-web"
testCompile "org.slf4j:jcl-over-slf4j"
}
diff --git a/repose-aggregator/components/filters/body-patcher-filter/build.gradle b/repose-aggregator/components/filters/body-patcher-filter/build.gradle
index 837802f2207..3b4445d1a2f 100644
--- a/repose-aggregator/components/filters/body-patcher-filter/build.gradle
+++ b/repose-aggregator/components/filters/body-patcher-filter/build.gradle
@@ -19,6 +19,7 @@ dependencies {
testCompile "org.scalatest:scalatest_$scalaMajDotMin"
testCompile "xerces:xerces-xsd11"
testCompile "org.springframework:spring-test"
+ testCompile "org.springframework:spring-web"
testCompile "org.slf4j:jcl-over-slf4j"
testCompile "org.hamcrest:hamcrest-all"
testCompile "org.mockito:mockito-all"
diff --git a/repose-aggregator/components/filters/content-type-stripper-filter/build.gradle b/repose-aggregator/components/filters/content-type-stripper-filter/build.gradle
index 313bd2464e8..ce36261185e 100644
--- a/repose-aggregator/components/filters/content-type-stripper-filter/build.gradle
+++ b/repose-aggregator/components/filters/content-type-stripper-filter/build.gradle
@@ -10,6 +10,7 @@ dependencies {
testCompile "org.scalatest:scalatest_$scalaMajDotMin"
testCompile "org.mockito:mockito-all"
testCompile "org.springframework:spring-test"
+ testCompile "org.springframework:spring-web"
testCompile "commons-io:commons-io"
testCompile "org.slf4j:jcl-over-slf4j"
}
diff --git a/repose-aggregator/components/filters/rackspace-auth-user-filter/build.gradle b/repose-aggregator/components/filters/rackspace-auth-user-filter/build.gradle
index 60c56fc5f73..b63c9ecba4c 100644
--- a/repose-aggregator/components/filters/rackspace-auth-user-filter/build.gradle
+++ b/repose-aggregator/components/filters/rackspace-auth-user-filter/build.gradle
@@ -16,6 +16,7 @@ dependencies {
testCompile "org.scalatest:scalatest_$scalaMajDotMin"
testCompile "org.mockito:mockito-all"
testCompile "org.springframework:spring-test"
+ testCompile "org.springframework:spring-web"
testCompile "org.slf4j:jcl-over-slf4j"
testCompile "javax.ws.rs:javax.ws.rs-api"
testCompile "org.apache.logging.log4j:log4j-core"
diff --git a/repose-aggregator/components/filters/uri-stripper-filter/build.gradle b/repose-aggregator/components/filters/uri-stripper-filter/build.gradle
index be9cd7dac7c..20faff74639 100644
--- a/repose-aggregator/components/filters/uri-stripper-filter/build.gradle
+++ b/repose-aggregator/components/filters/uri-stripper-filter/build.gradle
@@ -21,6 +21,7 @@ dependencies {
testCompile "org.scalatest:scalatest_$scalaMajDotMin"
testCompile "org.mockito:mockito-all"
testCompile "org.springframework:spring-test"
+ testCompile "org.springframework:spring-web"
testCompile "org.slf4j:jcl-over-slf4j"
testCompile "xerces:xerces-xsd11"
}
diff --git a/repose-aggregator/components/filters/valkyrie-authorization-filter/build.gradle b/repose-aggregator/components/filters/valkyrie-authorization-filter/build.gradle
index eb53c0ba32a..a7a7eeb639d 100644
--- a/repose-aggregator/components/filters/valkyrie-authorization-filter/build.gradle
+++ b/repose-aggregator/components/filters/valkyrie-authorization-filter/build.gradle
@@ -22,6 +22,7 @@ dependencies {
testCompile "org.scalatest:scalatest_$scalaMajDotMin"
testCompile "org.mockito:mockito-all"
testCompile "org.springframework:spring-test"
+ testCompile "org.springframework:spring-web"
testCompile "org.slf4j:jcl-over-slf4j"
}
diff --git a/repose-aggregator/components/filters/versioning-filter/build.gradle b/repose-aggregator/components/filters/versioning-filter/build.gradle
index f4d4e4016d2..a0fc6cfeba2 100644
--- a/repose-aggregator/components/filters/versioning-filter/build.gradle
+++ b/repose-aggregator/components/filters/versioning-filter/build.gradle
@@ -22,6 +22,7 @@ dependencies {
testCompile "org.mockito:mockito-all"
testCompile "org.scalatest:scalatest_$scalaMajDotMin"
testCompile "org.springframework:spring-test"
+ testCompile "org.springframework:spring-web"
testCompile "org.slf4j:jcl-over-slf4j"
testCompile "org.xmlunit:xmlunit-matchers"
}
diff --git a/repose-aggregator/components/services/admin-service/admin-service-api/src/main/java/org/openrepose/core/services/admin/AdminService.java b/repose-aggregator/components/services/admin-service/admin-service-api/src/main/java/org/openrepose/core/services/admin/AdminService.java
new file mode 100644
index 00000000000..e6aa461d6c4
--- /dev/null
+++ b/repose-aggregator/components/services/admin-service/admin-service-api/src/main/java/org/openrepose/core/services/admin/AdminService.java
@@ -0,0 +1,26 @@
+/*
+ * _=_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_=
+ * Repose
+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+ * Copyright (C) 2010 - 2015 Rackspace US, Inc.
+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+ * 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.openrepose.core.services.admin;
+
+/**
+ * Created by adrian on 9/12/17.
+ */
+public interface AdminService {
+}
diff --git a/repose-aggregator/components/services/admin-service/admin-service-api/src/main/resources/META-INF/schema/config/admin-service.xsd b/repose-aggregator/components/services/admin-service/admin-service-api/src/main/resources/META-INF/schema/config/admin-service.xsd
new file mode 100644
index 00000000000..fc75a7da010
--- /dev/null
+++ b/repose-aggregator/components/services/admin-service/admin-service-api/src/main/resources/META-INF/schema/config/admin-service.xsd
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/repose-aggregator/components/services/admin-service/admin-service-api/src/main/resources/META-INF/schema/config/bindings.xjb b/repose-aggregator/components/services/admin-service/admin-service-api/src/main/resources/META-INF/schema/config/bindings.xjb
new file mode 100644
index 00000000000..84e826fbafd
--- /dev/null
+++ b/repose-aggregator/components/services/admin-service/admin-service-api/src/main/resources/META-INF/schema/config/bindings.xjb
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/repose-aggregator/components/services/admin-service/admin-service-api/src/main/resources/META-INF/schema/examples/admin-service.cfg.xml b/repose-aggregator/components/services/admin-service/admin-service-api/src/main/resources/META-INF/schema/examples/admin-service.cfg.xml
new file mode 100644
index 00000000000..c22b0a9e6b4
--- /dev/null
+++ b/repose-aggregator/components/services/admin-service/admin-service-api/src/main/resources/META-INF/schema/examples/admin-service.cfg.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/repose-aggregator/components/services/admin-service/admin-service-impl/build.gradle b/repose-aggregator/components/services/admin-service/admin-service-impl/build.gradle
new file mode 100644
index 00000000000..d3f7184bd9c
--- /dev/null
+++ b/repose-aggregator/components/services/admin-service/admin-service-impl/build.gradle
@@ -0,0 +1,20 @@
+configurations {
+ compile.exclude module: "spring-boot-starter-tomcat"
+}
+
+dependencies {
+ compile project(":repose-aggregator:components:services:admin-service:admin-service-api")
+ compile project(":repose-aggregator:components:services:health-check-service:health-check-service-api")
+ compile project(":repose-aggregator:components:services:akka-http-client-service:akka-http-client-service-api")
+ compile project(":repose-aggregator:commons:commons-utilities")
+ compile project(":repose-aggregator:core:repose-core-api")
+ compile "org.scala-lang:scala-library"
+ compile "org.slf4j:slf4j-api"
+ compile "com.typesafe.scala-logging:scala-logging-slf4j_$scalaMajDotMin"
+ compile "org.springframework:spring-context"
+ compile "org.springframework.boot:spring-boot-starter-web"
+ compile "org.springframework.boot:spring-boot-starter-jetty"
+ compile "org.springframework.boot:spring-boot-starter-jersey"
+
+ compileOnly "javax.inject:javax.inject"
+}
diff --git a/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/java/org/openrepose/adminservice/AdminServiceConfiguration.java b/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/java/org/openrepose/adminservice/AdminServiceConfiguration.java
new file mode 100644
index 00000000000..d1e54466e5f
--- /dev/null
+++ b/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/java/org/openrepose/adminservice/AdminServiceConfiguration.java
@@ -0,0 +1,34 @@
+/*
+ * _=_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_=
+ * Repose
+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+ * Copyright (C) 2010 - 2015 Rackspace US, Inc.
+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+ * 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.openrepose.adminservice;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Created by adrian on 9/12/17.
+ */
+@SpringBootApplication(exclude = JmxAutoConfiguration.class)
+@Configuration
+@ComponentScan
+public class AdminServiceConfiguration {
+}
diff --git a/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/java/org/openrepose/adminservice/AdminWebInterface.java b/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/java/org/openrepose/adminservice/AdminWebInterface.java
new file mode 100644
index 00000000000..30d0f706f16
--- /dev/null
+++ b/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/java/org/openrepose/adminservice/AdminWebInterface.java
@@ -0,0 +1,33 @@
+/*
+ * _=_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_=
+ * Repose
+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+ * Copyright (C) 2010 - 2015 Rackspace US, Inc.
+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+ * 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.openrepose.adminservice;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import java.util.Map;
+
+public interface AdminWebInterface {
+ @Produces( {MediaType.APPLICATION_JSON} )
+ @GET
+ @Path("/health")
+ Map healthCheck();
+}
diff --git a/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/scala/org/openrepose/adminservice/AdminJaxRs.scala b/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/scala/org/openrepose/adminservice/AdminJaxRs.scala
new file mode 100644
index 00000000000..e6b54ac327d
--- /dev/null
+++ b/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/scala/org/openrepose/adminservice/AdminJaxRs.scala
@@ -0,0 +1,36 @@
+/*
+ * _=_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_=
+ * Repose
+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+ * Copyright (C) 2010 - 2015 Rackspace US, Inc.
+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+ * 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.openrepose.adminservice
+
+import javax.inject.{Inject, Named}
+import javax.ws.rs.Path
+import org.openrepose.adminservice.AdminJaxRs.MyPath
+
+import scala.annotation.meta.beanGetter
+import scala.beans.BeanProperty
+
+@Named
+@Path("/")
+class AdminJaxRs @Inject()(@MyPath("/node") @BeanProperty val nodeJaxRs: NodeJaxRs, @MyPath("/cluster") @BeanProperty val clusterJaxRs: ClusterJaxRs) {
+}
+
+object AdminJaxRs {
+ type MyPath = Path @beanGetter
+}
diff --git a/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/scala/org/openrepose/adminservice/ClusterJaxRs.scala b/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/scala/org/openrepose/adminservice/ClusterJaxRs.scala
new file mode 100644
index 00000000000..0e2ed430eeb
--- /dev/null
+++ b/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/scala/org/openrepose/adminservice/ClusterJaxRs.scala
@@ -0,0 +1,85 @@
+/*
+ * _=_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_=
+ * Repose
+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+ * Copyright (C) 2010 - 2015 Rackspace US, Inc.
+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+ * 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.openrepose.adminservice
+
+import java.util
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import javax.annotation.{PostConstruct, PreDestroy}
+import javax.inject.{Inject, Named}
+import org.openrepose.commons.config.manager.UpdateListener
+import org.openrepose.core.services.config.ConfigurationService
+import org.openrepose.core.services.serviceclient.akka.{AkkaServiceClient, AkkaServiceClientFactory}
+import org.openrepose.core.systemmodel.config.SystemModel
+import org.springframework.beans.factory.annotation.Value
+
+import scala.collection.JavaConverters._
+import scala.io.Source
+
+@Named
+class ClusterJaxRs @Inject() (configurationService: ConfigurationService, akkaServiceClientFactory: AkkaServiceClientFactory, @Value("${server.port}") port: String) extends AdminWebInterface {
+ private var nodes: Map[String, String] = _
+ private var akkaServiceClient: AkkaServiceClient = _
+
+ @PostConstruct
+ def init(): Unit = {
+ akkaServiceClient = akkaServiceClientFactory.newAkkaServiceClient()
+
+ configurationService.subscribeTo(
+ "system-model.cfg.xml",
+ SystemModelConfigurationListener,
+ classOf[SystemModel]
+ )
+ }
+
+ @PreDestroy
+ def destroy(): Unit = {
+ configurationService.unsubscribeFrom("system-model.cfg.xml", SystemModelConfigurationListener)
+
+ akkaServiceClient.destroy()
+ }
+
+ override def healthCheck(): util.Map[String, Object] = {
+ val mapper = new ObjectMapper()
+
+ val responses = nodes.mapValues { host => akkaServiceClient.get(s"admin-$host", s"http://$host:$port/node/health", Map[String, String]().asJava) }
+
+ responses.mapValues({ response =>
+ response.getStatus match {
+ case 200 => mapper.readValue(Source.fromInputStream(response.getData).mkString, classOf[util.Map[String, String]])
+ case statusCode => Map("unknown_error" -> s"$statusCode").asJava
+ }
+ }).asJava.asInstanceOf[util.Map[String, Object]]
+// Map("greeting" -> "Hello from the cluster").asJava
+ }
+
+ private object SystemModelConfigurationListener extends UpdateListener[SystemModel] {
+ private var initialized = false
+
+ override def configurationUpdated(configurationObject: SystemModel): Unit = {
+
+ initialized = true
+
+ nodes = configurationObject.getReposeCluster.asScala.flatMap({ cluster => cluster.getNodes.getNode.asScala}).map(node => (node.getId -> node.getHostname)).toMap
+ }
+
+ override def isInitialized: Boolean = initialized
+ }
+}
diff --git a/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/scala/org/openrepose/adminservice/JerseyConfig.scala b/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/scala/org/openrepose/adminservice/JerseyConfig.scala
new file mode 100644
index 00000000000..7d26efb9900
--- /dev/null
+++ b/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/scala/org/openrepose/adminservice/JerseyConfig.scala
@@ -0,0 +1,28 @@
+/*
+ * _=_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_=
+ * Repose
+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+ * Copyright (C) 2010 - 2015 Rackspace US, Inc.
+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+ * 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.openrepose.adminservice
+
+import javax.inject.Named
+import org.glassfish.jersey.server.ResourceConfig
+
+@Named
+class JerseyConfig extends ResourceConfig {
+ register(classOf[AdminJaxRs])
+}
diff --git a/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/scala/org/openrepose/adminservice/NodeJaxRs.scala b/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/scala/org/openrepose/adminservice/NodeJaxRs.scala
new file mode 100644
index 00000000000..8a4b0707339
--- /dev/null
+++ b/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/scala/org/openrepose/adminservice/NodeJaxRs.scala
@@ -0,0 +1,32 @@
+/*
+ * _=_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_=
+ * Repose
+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+ * Copyright (C) 2010 - 2015 Rackspace US, Inc.
+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+ * 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.openrepose.adminservice
+
+import java.util
+
+import javax.inject.{Inject, Named}
+import org.openrepose.core.services.healthcheck.HealthCheckService
+
+import scala.collection.JavaConverters._
+
+@Named
+class NodeJaxRs @Inject()(healthCheckService: HealthCheckService) extends AdminWebInterface {
+ override def healthCheck(): util.Map[String, Object] = Map("isHealthy" -> healthCheckService.isHealthy.toString).asJava.asInstanceOf[util.Map[String, Object]]
+}
diff --git a/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/scala/org/openrepose/core/services/admin/AdminServiceImpl.scala b/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/scala/org/openrepose/core/services/admin/AdminServiceImpl.scala
new file mode 100644
index 00000000000..da79cfa8355
--- /dev/null
+++ b/repose-aggregator/components/services/admin-service/admin-service-impl/src/main/scala/org/openrepose/core/services/admin/AdminServiceImpl.scala
@@ -0,0 +1,84 @@
+/*
+ * _=_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_=
+ * Repose
+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+ * Copyright (C) 2010 - 2015 Rackspace US, Inc.
+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+ * 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.openrepose.core.services.admin
+
+import com.typesafe.scalalogging.slf4j.LazyLogging
+import javax.annotation.PostConstruct
+import javax.inject.{Inject, Named}
+import org.openrepose.adminservice.AdminServiceConfiguration
+import org.openrepose.commons.config.manager.UpdateListener
+import org.openrepose.core.services.admin.config.AdminServiceConfigType
+import org.openrepose.core.services.config.ConfigurationService
+import org.springframework.boot.builder.SpringApplicationBuilder
+import org.springframework.context.{ApplicationContext, ConfigurableApplicationContext}
+
+/**
+ * Created by adrian on 9/12/17.
+ */
+@Named
+class AdminServiceImpl @Inject()(configurationService: ConfigurationService, applicationContext: ApplicationContext)
+ extends AdminService
+ with LazyLogging {
+
+ var adminContext: Option[ConfigurableApplicationContext] = None
+
+ @PostConstruct
+ def init(): Unit = {
+ logger.error("Initializing and registering configuration listeners")
+ val xsdURL = getClass.getResource("/META-INF/schema/config/admin-service.xsd")
+
+ configurationService.subscribeTo(
+ AdminServiceImpl.ConfigName,
+ xsdURL,
+ AdminServiceConfigurationListener,
+ classOf[AdminServiceConfigType]
+ )
+ }
+
+ private object AdminServiceConfigurationListener extends UpdateListener[AdminServiceConfigType] {
+ import scala.collection.JavaConverters._
+
+ override def configurationUpdated(configuration: AdminServiceConfigType): Unit = {
+ adminContext match {
+ case Some(context) =>
+ context.close()
+ adminContext = Option(buildContext())
+ case None =>
+ adminContext = Option(buildContext())
+ }
+
+ def buildContext(): ConfigurableApplicationContext = {
+ logger.error("trying to build the context")
+ val properties = Map("server.port" -> configuration.getPort).asJava.asInstanceOf[java.util.Map[String, AnyRef]]
+ val appBuilder = new SpringApplicationBuilder()
+ .parent(applicationContext.asInstanceOf[ConfigurableApplicationContext])
+ .sources(classOf[AdminServiceConfiguration])
+ .properties(properties)
+ appBuilder.run()
+ }
+ }
+
+ override def isInitialized: Boolean = adminContext.isDefined
+ }
+}
+
+object AdminServiceImpl {
+ private final val ConfigName = "admin-service.cfg.xml"
+}
diff --git a/repose-aggregator/core/repose-core/build.gradle b/repose-aggregator/core/repose-core/build.gradle
index a7aea0dd010..1b58b011667 100644
--- a/repose-aggregator/core/repose-core/build.gradle
+++ b/repose-aggregator/core/repose-core/build.gradle
@@ -20,6 +20,7 @@ dependencies {
compile project(":repose-aggregator:components:services:uri-redaction-service:uri-redaction-service-api")
compile project(":repose-aggregator:components:services:uri-redaction-service:uri-redaction-service-impl")
compile project(":repose-aggregator:core:repose-core-api")
+ compile project(":repose-aggregator:components:services:admin-service:admin-service-impl")
compile project(":repose-aggregator:external:jee6-schemas")
compile "org.apache.logging.log4j:log4j-flume-ng"
compile "javax.inject:javax.inject"
diff --git a/repose-aggregator/external/pjl-compressing-filter/build.gradle b/repose-aggregator/external/pjl-compressing-filter/build.gradle
index 5d075301012..2bad3f28cee 100644
--- a/repose-aggregator/external/pjl-compressing-filter/build.gradle
+++ b/repose-aggregator/external/pjl-compressing-filter/build.gradle
@@ -10,6 +10,7 @@ dependencies {
testCompile "org.hamcrest:hamcrest-all"
testCompile "org.mockito:mockito-all"
testCompile "org.springframework:spring-test"
+ testCompile "org.springframework:spring-web"
testCompile "org.slf4j:jcl-over-slf4j"
}
diff --git a/repose-aggregator/tests/functional-tests/src/integrationTest/configs/common/admin-service.cfg.xml b/repose-aggregator/tests/functional-tests/src/integrationTest/configs/common/admin-service.cfg.xml
new file mode 100644
index 00000000000..c22b0a9e6b4
--- /dev/null
+++ b/repose-aggregator/tests/functional-tests/src/integrationTest/configs/common/admin-service.cfg.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/settings.gradle b/settings.gradle
index f328f7fb639..65ce09b9621 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -53,6 +53,8 @@ include 'repose-aggregator',
'repose-aggregator:components:filters:url-extractor-to-header-filter',
'repose-aggregator:components:filters:valkyrie-authorization-filter',
'repose-aggregator:components:filters:versioning-filter',
+ 'repose-aggregator:components:services:admin-service:admin-service-api',
+ 'repose-aggregator:components:services:admin-service:admin-service-impl',
'repose-aggregator:components:services:akka-http-client-service:akka-http-client-service-api',
'repose-aggregator:components:services:akka-http-client-service:akka-http-client-service-impl',
'repose-aggregator:components:services:atom-feed-service:atom-feed-service-api',
diff --git a/versions.properties b/versions.properties
index d176ad664e3..152ad9fde31 100644
--- a/versions.properties
+++ b/versions.properties
@@ -129,12 +129,16 @@ slf4jVersion=1.7.7
org.slf4j:slf4j-api=$slf4jVersion
org.slf4j:jcl-over-slf4j=$slf4jVersion
org.spockframework:spock-core=0.7-groovy-2.0
-springVersion=4.1.4.RELEASE
+springVersion=4.3.11.RELEASE
org.springframework:spring-beans=$springVersion
org.springframework:spring-context=$springVersion
org.springframework:spring-core=$springVersion
org.springframework:spring-test=$springVersion
org.springframework:spring-web=$springVersion
+springBootVersion=1.5.7.RELEASE
+org.springframework.boot:spring-boot-starter-jersey=$springBootVersion
+org.springframework.boot:spring-boot-starter-jetty=$springBootVersion
+org.springframework.boot:spring-boot-starter-web=$springBootVersion
xalan:xalan=2.7.1
xerces:xerces-xsd11=2.12.0-rax
xmlUnitVersion=2.3.0