Repository: ambari Updated Branches: refs/heads/trunk 4d8c8e375 -> 28c9d1821
AMBARI-20720. Create skeleton for Ambari Infra Manager (oleewere) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/28c9d182 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/28c9d182 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/28c9d182 Branch: refs/heads/trunk Commit: 28c9d18213ac4adeb6a2829998bc7de75701468a Parents: 4d8c8e3 Author: oleewere <oleew...@gmail.com> Authored: Wed Apr 26 12:53:09 2017 +0200 Committer: oleewere <oleew...@gmail.com> Committed: Wed Apr 26 12:53:09 2017 +0200 ---------------------------------------------------------------------- ambari-infra/ambari-infra-manager/README.md | 25 ++ ambari-infra/ambari-infra-manager/pom.xml | 375 +++++++++++++++++++ .../org/apache/ambari/infra/InfraManager.java | 186 +++++++++ .../infra/common/InfraManagerConstants.java | 29 ++ .../infra/conf/InfraManagerApiDocConfig.java | 54 +++ .../ambari/infra/conf/InfraManagerConfig.java | 36 ++ .../apache/ambari/infra/rest/JobResource.java | 43 +++ .../src/main/resources/infra-manager.properties | 14 + .../src/main/resources/log4j.xml | 31 ++ .../src/main/resources/swagger/swagger.html | 115 ++++++ .../src/main/resources/webapp/index.html | 24 ++ ambari-infra/pom.xml | 1 + 12 files changed, 933 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/28c9d182/ambari-infra/ambari-infra-manager/README.md ---------------------------------------------------------------------- diff --git a/ambari-infra/ambari-infra-manager/README.md b/ambari-infra/ambari-infra-manager/README.md new file mode 100644 index 0000000..033bbb2 --- /dev/null +++ b/ambari-infra/ambari-infra-manager/README.md @@ -0,0 +1,25 @@ +<!-- +{% comment %} +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to you 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. +{% endcomment %} +--> + +# Ambari Infra Manager +TODO +## Build & Run Application +```bash +mvn clean package exec:java +``` \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/28c9d182/ambari-infra/ambari-infra-manager/pom.xml ---------------------------------------------------------------------- diff --git a/ambari-infra/ambari-infra-manager/pom.xml b/ambari-infra/ambari-infra-manager/pom.xml new file mode 100644 index 0000000..c8c8094 --- /dev/null +++ b/ambari-infra/ambari-infra-manager/pom.xml @@ -0,0 +1,375 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>ambari-infra</artifactId> + <groupId>org.apache.ambari</groupId> + <version>2.0.0.0-SNAPSHOT</version> + </parent> + <name>Ambari Infra Manager</name> + <url>http://maven.apache.org</url> + <modelVersion>4.0.0</modelVersion> + + <artifactId>ambari-infra-manager</artifactId> + + <properties> + <spring.version>4.2.5.RELEASE</spring.version> + <spring.security.version>4.0.4.RELEASE</spring.security.version> + <jersey.version>2.23.2</jersey.version> + <jetty-version>9.2.11.v20150529</jetty-version> + <swagger.version>1.5.8</swagger.version> + <spring-data-solr.version>2.0.2.RELEASE</spring-data-solr.version> + <jjwt.version>0.6.0</jjwt.version> + <spring-batch.version>3.0.7.RELEASE</spring-batch.version> + <jdk.version>1.8</jdk.version> + </properties> + + <build> + <finalName>ambari-infra-manager</finalName> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.0</version> + <configuration> + <source>${jdk.version}</source> + <target>${jdk.version}</target> + </configuration> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <version>1.2.1</version> + <executions> + <execution> + <goals> + <goal>java</goal> + </goals> + </execution> + </executions> + <configuration> + <mainClass>org.apache.ambari.infra.InfraManager</mainClass> + </configuration> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.easymock</groupId> + <artifactId>easymock</artifactId> + <version>3.4</version> + <scope>test</scope> + </dependency> + <!-- Spring dependencies --> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-beans</artifactId> + <version>${spring.version}</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + <version>${spring.version}</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-test</artifactId> + <version>${spring.version}</version> + </dependency> + <!-- Spring Security --> + <dependency> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-web</artifactId> + <version>${spring.security.version}</version> + </dependency> + <dependency> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-core</artifactId> + <version>${spring.security.version}</version> + </dependency> + <dependency> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-config</artifactId> + <version>${spring.security.version}</version> + </dependency> + <dependency> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-ldap</artifactId> + <version>${spring.security.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.ext</groupId> + <artifactId>jersey-spring3</artifactId> + <version>2.23.2</version> + <exclusions> + <exclusion> + <groupId>org.springframework</groupId> + <artifactId>*</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.connectors</groupId> + <artifactId>jersey-apache-connector</artifactId> + <version>${jersey.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.core</groupId> + <artifactId>jersey-client</artifactId> + <version>${jersey.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.media</groupId> + <artifactId>jersey-media-json-jettison</artifactId> + <version>${jersey.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.media</groupId> + <artifactId>jersey-media-json-jackson</artifactId> + <version>${jersey.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.core</groupId> + <artifactId>jersey-common</artifactId> + <version>${jersey.version}</version> + </dependency> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + <version>3.1.0</version> + </dependency> + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <version>1.2.17</version> + </dependency> + <dependency> + <groupId>org.apache.solr</groupId> + <artifactId>solr-solrj</artifactId> + <version>${solr.version}</version> + </dependency> + <dependency> + <groupId>org.apache.solr</groupId> + <artifactId>solr-core</artifactId> + <version>${solr.version}</version> + <exclusions> + <exclusion> + <groupId>*</groupId> + <artifactId>*</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.apache.lucene</groupId> + <artifactId>lucene-core</artifactId> + <version>${solr.version}</version> + </dependency> + <dependency> + <groupId>org.apache.lucene</groupId> + <artifactId>lucene-analyzers-common</artifactId> + <version>${solr.version}</version> + </dependency> + <!-- Hadoop --> + <dependency> + <groupId>org.apache.hadoop</groupId> + <artifactId>hadoop-common</artifactId> + <version>2.7.0</version> + <exclusions> + <exclusion> + <groupId>javax.servlet</groupId> + <artifactId>servlet-api</artifactId> + </exclusion> + <exclusion> + <groupId>org.mortbay.jetty</groupId> + <artifactId>jetty</artifactId> + </exclusion> + <exclusion> + <groupId>org.mortbay.jetty</groupId> + <artifactId>jetty-util</artifactId> + </exclusion> + <exclusion> + <groupId>com.sun.jersey</groupId> + <artifactId>jetty-util</artifactId> + </exclusion> + <exclusion> + <groupId>com.sun.jersey</groupId> + <artifactId>jersey-core</artifactId> + </exclusion> + <exclusion> + <groupId>com.sun.jersey</groupId> + <artifactId>jersey-json</artifactId> + </exclusion> + <exclusion> + <groupId>com.sun.jersey</groupId> + <artifactId>jersey-server</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.4</version> + </dependency> + <dependency> + <groupId>commons-cli</groupId> + <artifactId>commons-cli</artifactId> + <version>1.3.1</version> + </dependency> + <dependency> + <groupId>commons-codec</groupId> + <artifactId>commons-codec</artifactId> + </dependency> + <dependency> + <groupId>commons-lang</groupId> + <artifactId>commons-lang</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.security.kerberos</groupId> + <artifactId>spring-security-kerberos-core</artifactId> + <version>1.0.1.RELEASE</version> + </dependency> + <dependency> + <groupId>org.springframework.security.kerberos</groupId> + <artifactId>spring-security-kerberos-web</artifactId> + <version>1.0.1.RELEASE</version> + </dependency> + <dependency> + <groupId>org.springframework.security.kerberos</groupId> + <artifactId>spring-security-kerberos-client</artifactId> + <version>1.0.1.RELEASE</version> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-security</artifactId> + <version>${jetty-version}</version> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-server</artifactId> + <version>${jetty-version}</version> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-servlet</artifactId> + <version>${jetty-version}</version> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-servlets</artifactId> + <version>${jetty-version}</version> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-util</artifactId> + <version>${jetty-version}</version> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-webapp</artifactId> + <version>${jetty-version}</version> + <exclusions> + <exclusion> + <groupId>org.springframework</groupId> + <artifactId>*</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-annotations</artifactId> + <version>${jetty-version}</version> + <exclusions> + <exclusion> + <groupId>org.springframework</groupId> + <artifactId>*</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>cglib</groupId> + <artifactId>cglib</artifactId> + <version>3.2.4</version> + </dependency> + <dependency> + <groupId>io.swagger</groupId> + <artifactId>swagger-annotations</artifactId> + <version>${swagger.version}</version> + </dependency> + <dependency> + <groupId>io.swagger</groupId> + <artifactId>swagger-core</artifactId> + <version>${swagger.version}</version> + </dependency> + <dependency> + <groupId>io.swagger</groupId> + <artifactId>swagger-jersey2-jaxrs</artifactId> + <version>${swagger.version}</version> + <exclusions> + <exclusion> + <groupId>javax.ws.rs</groupId> + <artifactId>jsr311-api</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>io.swagger</groupId> + <artifactId>swagger-models</artifactId> + <version>${swagger.version}</version> + </dependency> + <dependency> + <groupId>org.webjars</groupId> + <artifactId>swagger-ui</artifactId> + <version>2.1.0</version> + </dependency> + <dependency> + <groupId>org.springframework.data</groupId> + <artifactId>spring-data-solr</artifactId> + <version>${spring-data-solr.version}</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context-support</artifactId> + <version>${spring.version}</version> + </dependency> + <dependency> + <groupId>org.springframework.batch</groupId> + <artifactId>spring-batch-core</artifactId> + <version>${spring-batch.version}</version> + </dependency> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt</artifactId> + <version>${jjwt.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.ext</groupId> + <artifactId>jersey-bean-validation</artifactId> + <version>2.25</version> + </dependency> + </dependencies> + + +</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/28c9d182/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/InfraManager.java ---------------------------------------------------------------------- diff --git a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/InfraManager.java b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/InfraManager.java new file mode 100644 index 0000000..227bab4 --- /dev/null +++ b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/InfraManager.java @@ -0,0 +1,186 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.ambari.infra; + +import org.apache.ambari.infra.conf.InfraManagerConfig; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Option; +import org.apache.commons.cli.Options; +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.HttpConfiguration; +import org.eclipse.jetty.server.HttpConnectionFactory; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.server.handler.HandlerList; +import org.eclipse.jetty.server.handler.ResourceHandler; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.ResourceCollection; +import org.eclipse.jetty.webapp.WebAppContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.context.ContextLoaderListener; +import org.springframework.web.context.request.RequestContextListener; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; + +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; + +import static org.apache.ambari.infra.common.InfraManagerConstants.DEFAULT_PORT; +import static org.apache.ambari.infra.common.InfraManagerConstants.DEFAULT_PROTOCOL; +import static org.apache.ambari.infra.common.InfraManagerConstants.INFRA_MANAGER_SESSION_ID; +import static org.apache.ambari.infra.common.InfraManagerConstants.PROTOCOL_SSL; +import static org.apache.ambari.infra.common.InfraManagerConstants.ROOT_CONTEXT; +import static org.apache.ambari.infra.common.InfraManagerConstants.SESSION_TIMEOUT; +import static org.apache.ambari.infra.common.InfraManagerConstants.WEB_RESOURCE_FOLDER; + +public class InfraManager { + + private static final Logger LOG = LoggerFactory.getLogger(InfraManager.class); + + public static void main(String[] args) { + Options options = new Options(); + HelpFormatter helpFormatter = new HelpFormatter(); + helpFormatter.setDescPadding(10); + helpFormatter.setWidth(200); + + final Option helpOption = Option.builder("h") + .longOpt("help") + .desc("Print commands") + .build(); + + final Option portOption = Option.builder("p") + .longOpt("port") + .desc("Infra Manager port") + .numberOfArgs(1) + .argName("port_number") + .build(); + + final Option protocolOption = Option.builder("t") + .longOpt("tls-enabled") + .desc("TLS enabled for Infra Manager") + .build(); + + options.addOption(helpOption); + options.addOption(portOption); + options.addOption(protocolOption); + + try { + CommandLineParser cmdLineParser = new DefaultParser(); + CommandLine cli = cmdLineParser.parse(options, args); + int port = cli.hasOption('p') ? Integer.parseInt(cli.getOptionValue('p')) : DEFAULT_PORT; + String protocol = cli.hasOption("t") ? PROTOCOL_SSL : DEFAULT_PROTOCOL; + + Server server = buildServer(port, protocol); + HandlerList handlers = new HandlerList(); + handlers.addHandler(createSwaggerContext()); + handlers.addHandler(createBaseWebappContext()); + + server.setHandler(handlers); + server.start(); + + LOG.debug("============================Server Dump======================================="); + LOG.debug(server.dump()); + LOG.debug("=============================================================================="); + server.join(); + } catch (Exception e) { + // TODO + e.printStackTrace(); + } + } + + private static Server buildServer(int port, String protocol) { + Server server = new Server(); + HttpConfiguration httpConfiguration = new HttpConfiguration(); + httpConfiguration.setRequestHeaderSize(65535); + // TODO: tls + ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory(httpConfiguration)); + connector.setPort(port); + server.setConnectors(new Connector[]{connector}); + URI infraManagerURI = URI.create(String.format("%s://0.0.0.0:%s", protocol, String.valueOf(port))); + LOG.info("Starting infra manager URI=" + infraManagerURI); + return server; + } + + private static WebAppContext createBaseWebappContext() throws MalformedURLException { + URI webResourceBase = findWebResourceBase(); + WebAppContext context = new WebAppContext(); + context.setBaseResource(Resource.newResource(webResourceBase)); + context.setContextPath(ROOT_CONTEXT); + context.setParentLoaderPriority(true); + + // Configure Spring + context.addEventListener(new ContextLoaderListener()); + context.addEventListener(new RequestContextListener()); + // TODO: security, add: context.addFilter(new FilterHolder(new DelegatingFilterProxy("springSecurityFilterChain")), "/*", EnumSet.allOf(DispatcherType.class)); + context.setInitParameter("contextClass", AnnotationConfigWebApplicationContext.class.getName()); + context.setInitParameter("contextConfigLocation", InfraManagerConfig.class.getName()); + + // Configure Jersey + ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/api/v1/*"); + jerseyServlet.setInitOrder(1); + jerseyServlet.setInitParameter("jersey.config.server.provider.packages","org.apache.ambari.infra.rest,io.swagger.jaxrs.listing"); + + context.getSessionHandler().getSessionManager().setMaxInactiveInterval(SESSION_TIMEOUT); + context.getSessionHandler().getSessionManager().getSessionCookieConfig().setName(INFRA_MANAGER_SESSION_ID); + + return context; + } + + private static URI findWebResourceBase() { + URL fileCompleteUrl = Thread.currentThread().getContextClassLoader().getResource(WEB_RESOURCE_FOLDER); + String errorMessage = "Web Resource Folder " + WEB_RESOURCE_FOLDER + " not found in classpath"; + if (fileCompleteUrl != null) { + try { + return fileCompleteUrl.toURI().normalize(); + } catch (URISyntaxException e) { + LOG.error(errorMessage, e); + System.exit(1); + } + } else { + LOG.error(errorMessage); + System.exit(1); + } + throw new IllegalStateException(errorMessage); + } + + private static ServletContextHandler createSwaggerContext() throws URISyntaxException { + ResourceHandler resourceHandler = new ResourceHandler(); + ResourceCollection resources = new ResourceCollection(new String[] { + InfraManager.class.getClassLoader() + .getResource("META-INF/resources/webjars/swagger-ui/2.1.0") + .toURI().toString(), + InfraManager.class.getClassLoader() + .getResource("swagger") + .toURI().toString() + }); + resourceHandler.setBaseResource(resources); + resourceHandler.setWelcomeFiles(new String[]{"swagger.html"}); // rewrite index.html from swagger-ui webjar + ServletContextHandler context = new ServletContextHandler(); + context.setContextPath("/docs/"); + context.setHandler(resourceHandler); + return context; + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/28c9d182/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/common/InfraManagerConstants.java ---------------------------------------------------------------------- diff --git a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/common/InfraManagerConstants.java b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/common/InfraManagerConstants.java new file mode 100644 index 0000000..11714f3 --- /dev/null +++ b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/common/InfraManagerConstants.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.ambari.infra.common; + +public final class InfraManagerConstants { + public static final int DEFAULT_PORT = 61890; + public static final String DEFAULT_PROTOCOL = "http"; + public static final String INFRA_MANAGER_SESSION_ID = "INFRA_MANAGER_SESSIONID"; + public static final String PROTOCOL_SSL = "https"; + public static final String ROOT_CONTEXT = "/"; + public static final String WEB_RESOURCE_FOLDER = "webapp"; + public static final Integer SESSION_TIMEOUT = 60 * 30; +} http://git-wip-us.apache.org/repos/asf/ambari/blob/28c9d182/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerApiDocConfig.java ---------------------------------------------------------------------- diff --git a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerApiDocConfig.java b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerApiDocConfig.java new file mode 100644 index 0000000..22e2263 --- /dev/null +++ b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerApiDocConfig.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.ambari.infra.conf; + +import io.swagger.jaxrs.config.BeanConfig; +import io.swagger.jaxrs.listing.ApiListingResource; +import io.swagger.jaxrs.listing.SwaggerSerializers; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class InfraManagerApiDocConfig { + + @Bean + public ApiListingResource apiListingResource() { + return new ApiListingResource(); + } + + @Bean + public SwaggerSerializers swaggerSerializers() { + return new SwaggerSerializers(); + } + + @Bean + public BeanConfig swaggerConfig() { + BeanConfig beanConfig = new BeanConfig(); + beanConfig.setSchemes(new String[]{"http", "https"}); + beanConfig.setBasePath("/api/v1"); + beanConfig.setTitle("Infra Manager REST API"); + beanConfig.setDescription("Manager component for Ambari Infra"); + beanConfig.setLicense("Apache 2.0"); + beanConfig.setLicenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html"); + beanConfig.setScan(true); + beanConfig.setVersion("1.0.0"); + beanConfig.setResourcePackage("org.apache.ambari.infra.rest"); + return beanConfig; + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/28c9d182/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerConfig.java ---------------------------------------------------------------------- diff --git a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerConfig.java b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerConfig.java new file mode 100644 index 0000000..86059a2 --- /dev/null +++ b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/conf/InfraManagerConfig.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.ambari.infra.conf; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; + +@Configuration +@ComponentScan("org.apache.ambari.infra") +@PropertySource(value = {"classpath:infra-manager.properties"}) +public class InfraManagerConfig { + + @Bean + public static PropertySourcesPlaceholderConfigurer propertyConfigurer() { + return new PropertySourcesPlaceholderConfigurer(); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/28c9d182/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/rest/JobResource.java ---------------------------------------------------------------------- diff --git a/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/rest/JobResource.java b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/rest/JobResource.java new file mode 100644 index 0000000..45b1ca5 --- /dev/null +++ b/ambari-infra/ambari-infra-manager/src/main/java/org/apache/ambari/infra/rest/JobResource.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.ambari.infra.rest; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.context.annotation.Scope; + +import javax.inject.Named; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; + +@Api(value = "jobs", description = "Job operations") +@Path("jobs") +@Named +@Scope("request") +public class JobResource { + + @GET + @Produces({"application/json"}) + @ApiOperation("Get all jobs") + public String getAuditLogs() { + return "jobs..."; // TODO + } + +} http://git-wip-us.apache.org/repos/asf/ambari/blob/28c9d182/ambari-infra/ambari-infra-manager/src/main/resources/infra-manager.properties ---------------------------------------------------------------------- diff --git a/ambari-infra/ambari-infra-manager/src/main/resources/infra-manager.properties b/ambari-infra/ambari-infra-manager/src/main/resources/infra-manager.properties new file mode 100644 index 0000000..13878a1 --- /dev/null +++ b/ambari-infra/ambari-infra-manager/src/main/resources/infra-manager.properties @@ -0,0 +1,14 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/28c9d182/ambari-infra/ambari-infra-manager/src/main/resources/log4j.xml ---------------------------------------------------------------------- diff --git a/ambari-infra/ambari-infra-manager/src/main/resources/log4j.xml b/ambari-infra/ambari-infra-manager/src/main/resources/log4j.xml new file mode 100644 index 0000000..0450454 --- /dev/null +++ b/ambari-infra/ambari-infra-manager/src/main/resources/log4j.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +--> +<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> +<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> + <appender name="console" class="org.apache.log4j.ConsoleAppender"> + <param name="Target" value="System.out" /> + <layout class="org.apache.log4j.PatternLayout"> + <param name="ConversionPattern" value="%d [%t] %-5p %C{6} (%F:%L) - %m%n" /> + </layout> + </appender> + + <root> + <level value="INFO" /> + <appender-ref ref="console" /> + </root> +</log4j:configuration> http://git-wip-us.apache.org/repos/asf/ambari/blob/28c9d182/ambari-infra/ambari-infra-manager/src/main/resources/swagger/swagger.html ---------------------------------------------------------------------- diff --git a/ambari-infra/ambari-infra-manager/src/main/resources/swagger/swagger.html b/ambari-infra/ambari-infra-manager/src/main/resources/swagger/swagger.html new file mode 100644 index 0000000..8580e1a --- /dev/null +++ b/ambari-infra/ambari-infra-manager/src/main/resources/swagger/swagger.html @@ -0,0 +1,115 @@ +<!DOCTYPE html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +--> +<html> +<head> + <title>Infra Manager REST API</title> + <link rel="icon" type="image/png" href="images/favicon-32x32.png" sizes="32x32" /> + <link rel="icon" type="image/png" href="images/favicon-16x16.png" sizes="16x16" /> + <link href='css/typography.css' media='screen' rel='stylesheet' type='text/css'/> + <link href='css/reset.css' media='screen' rel='stylesheet' type='text/css'/> + <link href='css/screen.css' media='screen' rel='stylesheet' type='text/css'/> + <link href='css/reset.css' media='print' rel='stylesheet' type='text/css'/> + <link href='css/print.css' media='print' rel='stylesheet' type='text/css'/> + <script src='lib/jquery-1.8.0.min.js' type='text/javascript'></script> + <script src='lib/jquery.slideto.min.js' type='text/javascript'></script> + <script src='lib/jquery.wiggle.min.js' type='text/javascript'></script> + <script src='lib/jquery.ba-bbq.min.js' type='text/javascript'></script> + <script src='lib/handlebars-2.0.0.js' type='text/javascript'></script> + <script src='lib/underscore-min.js' type='text/javascript'></script> + <script src='lib/backbone-min.js' type='text/javascript'></script> + <script src='swagger-ui.js' type='text/javascript'></script> + <script src='lib/highlight.7.3.pack.js' type='text/javascript'></script> + <script src='lib/marked.js' type='text/javascript'></script> + <script src='lib/swagger-oauth.js' type='text/javascript'></script> + + <script type="text/javascript"> + $(function () { + var url = window.location.search.match(/url=([^&]+)/); + if (url && url.length > 1) { + url = decodeURIComponent(url[1]); + } else { + var urlPrefix = location.protocol +'//'+ location.hostname+(location.port ? ':'+location.port: ''); + url = urlPrefix + "/api/v1/swagger.yaml"; + } + window.swaggerUi = new SwaggerUi({ + url: url, + dom_id: "swagger-ui-container", + supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'], + onComplete: function(swaggerApi, swaggerUi){ + if(typeof initOAuth == "function") { + initOAuth({ + clientId: "your-client-id", + realm: "your-realms", + appName: "your-app-name" + }); + } + + $('pre code').each(function(i, e) { + hljs.highlightBlock(e) + }); + + addApiKeyAuthorization(); + }, + onFailure: function(data) { + log("Unable to Load SwaggerUI"); + }, + docExpansion: "none", + apisSorter: "alpha", + showRequestHeaders: false + }); + + function addApiKeyAuthorization(){ + var username = encodeURIComponent($('#input_username')[0].value); + var password = encodeURIComponent($('#input_password')[0].value); + if (username && username.trim() != "" && password && password != "") { + var apiKeyAuth = new SwaggerClient.PasswordAuthorization("Authorization", username, password); + window.swaggerUi.api.clientAuthorizations.add("key", apiKeyAuth); + log("added authorization header: " + 'Basic ' + btoa(username + ':' + password)); + } + } + + $('#input_username, #input_password').change(addApiKeyAuthorization); + + window.swaggerUi.load(); + + function log() { + if ('console' in window) { + console.log.apply(console, arguments); + } + } + }); + </script> +</head> + +<body class="swagger-section"> +<div id='header'> + <div class="swagger-ui-wrap"> + <a id="logo" href="http://swagger.io">swagger</a> + <form id='api_selector'> + <div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div> + <div class="input"><input placeholder="username" id="input_username" name="username" type="text" size="10"></div> + <div class="input"><input placeholder="password" id="input_password" name="password" type="password" size="10"></div> + <div class='input'><a id="explore" href="#">Explore</a></div> + </form> + </div> +</div> + +<div id="message-bar" class="swagger-ui-wrap"> </div> +<div id="swagger-ui-container" class="swagger-ui-wrap"></div> +</body> +</html> http://git-wip-us.apache.org/repos/asf/ambari/blob/28c9d182/ambari-infra/ambari-infra-manager/src/main/resources/webapp/index.html ---------------------------------------------------------------------- diff --git a/ambari-infra/ambari-infra-manager/src/main/resources/webapp/index.html b/ambari-infra/ambari-infra-manager/src/main/resources/webapp/index.html new file mode 100644 index 0000000..3e64867 --- /dev/null +++ b/ambari-infra/ambari-infra-manager/src/main/resources/webapp/index.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +--> +<html> + <head> + </head> + <body> + <h1>Welcome!</h1> + </body> +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/28c9d182/ambari-infra/pom.xml ---------------------------------------------------------------------- diff --git a/ambari-infra/pom.xml b/ambari-infra/pom.xml index a6a6961..a5a5b38 100644 --- a/ambari-infra/pom.xml +++ b/ambari-infra/pom.xml @@ -43,6 +43,7 @@ <module>ambari-infra-assembly</module> <module>ambari-infra-solr-client</module> <module>ambari-infra-solr-plugin</module> + <module>ambari-infra-manager</module> </modules> <build>