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