/** * 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.server.api.rest; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import org.apache.ambari.server.bootstrap.BSHostStatus; import org.apache.ambari.server.bootstrap.BSResponse; import org.apache.ambari.server.bootstrap.BootStrapImpl; import org.apache.ambari.server.bootstrap.BootStrapStatus; import org.apache.ambari.server.bootstrap.SshHostInfo; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.google.inject.Inject; @Path("/bootstrap") public class BootStrapResource { private static BootStrapImpl bsImpl; private static Log LOG = LogFactory.getLog(BootStrapResource.class); @Inject public static void init(BootStrapImpl instance) { bsImpl = instance; } /** * Run bootstrap on a list of hosts. * @response.representation.200.doc * * @response.representation.200.mediaType application/json * @response.representation.406.doc Error in format * @response.representation.408.doc Request Timed out * @throws Exception */ @POST @Consumes(MediaType.APPLICATION_JSON) @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) public BSResponse bootStrap(SshHostInfo sshInfo, @Context UriInfo uriInfo) { normalizeHosts(sshInfo); BSResponse resp = bsImpl.runBootStrap(sshInfo); return resp; } /** * Current BootStrap Information thats running. * @response.representation.200.doc * * @response.representation.200.mediaType application/json * @response.representation.406.doc Error in format * @response.representation.408.doc Request Timed out * @throws Exception */ @GET @Path("/{requestId}") @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) public BootStrapStatus getBootStrapStatus(@PathParam("requestId") long requestId, @Context UriInfo info) { BootStrapStatus status = bsImpl.getStatus(requestId); if (status == null) throw new WebApplicationException(Response.Status.NO_CONTENT); return status; } /** * Gets a list of bootstrapped hosts. * * @param uriInfo the host info, with no SSL key information */ @GET @Path("/hosts") @Produces(MediaType.APPLICATION_JSON) public List<BSHostStatus> getBootStrapHosts(@Context UriInfo uriInfo) { List<BSHostStatus> allStatus = bsImpl.getHostInfo(null); if (0 == allStatus.size()) throw new WebApplicationException(Response.Status.NO_CONTENT); return allStatus; } /** * Gets a list of bootstrapped hosts. * * @param info the host info, with no SSL key information required */ @POST @Path("/hosts") @Produces(MediaType.APPLICATION_JSON) public List<BSHostStatus> getBootStrapHosts(SshHostInfo info, @Context UriInfo uriInfo) { List<BSHostStatus> allStatus = bsImpl.getHostInfo(info.getHosts()); if (0 == allStatus.size()) throw new WebApplicationException(Response.Status.NO_CONTENT); return allStatus; } private void normalizeHosts(SshHostInfo info) { List<String> validHosts = new ArrayList<>(); List<String> newHosts = new ArrayList<>(); for (String host: info.getHosts()) { try { InetAddress addr = InetAddress.getByName(host); if (!validHosts.contains(addr.getHostAddress())) { validHosts.add(addr.getHostAddress()); newHosts.add(host); } else { LOG.warn("Host " + host + " has already been targeted to be bootstrapped."); } } catch (UnknownHostException e) { LOG.warn("Host " + host + " cannot be determined."); } } info.setHosts(newHosts); } }