http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariConfigurationService.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariConfigurationService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariConfigurationService.java deleted file mode 100644 index 38ae766..0000000 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariConfigurationService.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * 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.apache.ambari.server.api.services; - -import java.util.Collections; - -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; - -import org.apache.ambari.server.controller.spi.Resource; -import org.apache.http.HttpStatus; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; - -/** - * Rest endpoint for managing ambari configurations. Supports CRUD operations. - * Ambari configurations are resources that relate to the ambari server instance even before a cluster is provisioned. - * - * Ambari configuration resources may be shared with components and services in the cluster - * (by recommending them as default values) - * - * Eg. LDAP configuration is stored as ambariconfiguration. - * The request payload has the form: - * - * <pre> - * { - * "AmbariConfiguration": { - * "type": "ldap-configuration", - * "data": [ - * { - * "authentication.ldap.primaryUrl": "localhost:33389" - * "authentication.ldap.secondaryUrl": "localhost:333" - * "authentication.ldap.baseDn": "dc=ambari,dc=apache,dc=org" - * // ...... - * ] - * } - * </pre> - */ -@Path("/ambariconfigs/") -@Api(value = "Ambari Configurations", description = "Endpoint for Ambari configuration related operations") -public class AmbariConfigurationService extends BaseService { - - private static final String AMBARI_CONFIGURATION_REQUEST_TYPE = - "org.apache.ambari.server.api.services.AmbariConfigurationRequestSwagger"; - - /** - * Creates an ambari configuration resource. - * - * @param body the payload in json format - * @param headers http headers - * @param uri request uri information - * @return - */ - @POST - @Produces(MediaType.TEXT_PLAIN) - @ApiOperation(value = "Creates an ambari configuration resource", - nickname = "AmbariConfigurationService#createAmbariConfiguration") - @ApiImplicitParams({ - @ApiImplicitParam(dataType = AMBARI_CONFIGURATION_REQUEST_TYPE, paramType = PARAM_TYPE_BODY) - }) - @ApiResponses({ - @ApiResponse(code = HttpStatus.SC_CREATED, message = MSG_SUCCESSFUL_OPERATION), - @ApiResponse(code = HttpStatus.SC_ACCEPTED, message = MSG_REQUEST_ACCEPTED), - @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = MSG_INVALID_ARGUMENTS), - @ApiResponse(code = HttpStatus.SC_CONFLICT, message = MSG_RESOURCE_ALREADY_EXISTS), - @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED), - @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED), - @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR), - }) - public Response createAmbariConfiguration(String body, @Context HttpHeaders headers, @Context UriInfo uri) { - return handleRequest(headers, body, uri, Request.Type.POST, createResource(Resource.Type.AmbariConfiguration, - Collections.EMPTY_MAP)); - } - - @GET - @Produces(MediaType.TEXT_PLAIN) - @ApiOperation(value = "Retrieve all ambari configuration resources", - nickname = "AmbariConfigurationService#getAmbariConfigurations", - notes = "Returns all Ambari configurations.", - response = AmbariConfigurationResponseSwagger.class, - responseContainer = RESPONSE_CONTAINER_LIST) - @ApiImplicitParams({ - @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, - defaultValue = "AmbariConfiguration/data, AmbariConfiguration/id, AmbariConfiguration/type", - dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY), - @ApiImplicitParam(name = QUERY_SORT, value = QUERY_SORT_DESCRIPTION, - defaultValue = "AmbariConfiguration/id", - dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY), - @ApiImplicitParam(name = QUERY_PAGE_SIZE, value = QUERY_PAGE_SIZE_DESCRIPTION, defaultValue = DEFAULT_PAGE_SIZE, dataType = DATA_TYPE_INT, paramType = PARAM_TYPE_QUERY), - @ApiImplicitParam(name = QUERY_FROM, value = QUERY_FROM_DESCRIPTION, defaultValue = DEFAULT_FROM, dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY), - @ApiImplicitParam(name = QUERY_TO, value = QUERY_TO_DESCRIPTION, dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY) - }) - @ApiResponses(value = { - @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION), - @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR) - }) - public Response getAmbariConfigurations(String body, @Context HttpHeaders headers, @Context UriInfo uri) { - return handleRequest(headers, body, uri, Request.Type.GET, createResource(Resource.Type.AmbariConfiguration, - Collections.EMPTY_MAP)); - } - - @GET - @Path("{configurationId}") - @Produces(MediaType.TEXT_PLAIN) - @ApiOperation(value = "Retrieve the details of an ambari configuration resource", - nickname = "AmbariConfigurationService#getAmbariConfiguration", - response = AmbariConfigurationResponseSwagger.class) - @ApiImplicitParams({ - @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, defaultValue = "AmbariConfiguration/*", - dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY) - }) - @ApiResponses(value = { - @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION), - @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = MSG_RESOURCE_NOT_FOUND), - @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR) - }) - public Response getAmbariConfiguration(String body, @Context HttpHeaders headers, @Context UriInfo uri, - @PathParam("configurationId") String configurationId) { - return handleRequest(headers, body, uri, Request.Type.GET, createResource(Resource.Type.AmbariConfiguration, - Collections.singletonMap(Resource.Type.AmbariConfiguration, configurationId))); - } - - @PUT - @Path("{configurationId}") - @Produces(MediaType.TEXT_PLAIN) - @ApiOperation(value = "Updates ambari configuration resources ", - nickname = "AmbariConfigurationService#updateAmbariConfiguration") - @ApiImplicitParams({ - @ApiImplicitParam(dataType = AMBARI_CONFIGURATION_REQUEST_TYPE, paramType = PARAM_TYPE_BODY), - @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, defaultValue = "AmbariConfiguration/*", - dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY) - }) - @ApiResponses({ - @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION), - @ApiResponse(code = HttpStatus.SC_ACCEPTED, message = MSG_REQUEST_ACCEPTED), - @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = MSG_INVALID_ARGUMENTS), - @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = MSG_RESOURCE_NOT_FOUND), - @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED), - @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED), - @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR), - }) - public Response updateAmbariConfiguration(String body, @Context HttpHeaders headers, @Context UriInfo uri, - @PathParam("configurationId") String configurationId) { - return handleRequest(headers, body, uri, Request.Type.PUT, createResource(Resource.Type.AmbariConfiguration, - Collections.singletonMap(Resource.Type.AmbariConfiguration, configurationId))); - } - - @DELETE - @Path("{configurationId}") - @Produces(MediaType.TEXT_PLAIN) - @ApiOperation(value = "Deletes an ambari configuration resource", - nickname = "AmbariConfigurationService#deleteAmbariConfiguration") - @ApiResponses({ - @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION), - @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = MSG_RESOURCE_NOT_FOUND), - @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED), - @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED), - @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR), - }) - public Response deleteAmbariConfiguration(String body, @Context HttpHeaders headers, @Context UriInfo uri, - @PathParam("configurationId") String configurationId) { - return handleRequest(headers, body, uri, Request.Type.DELETE, createResource(Resource.Type.AmbariConfiguration, - Collections.singletonMap(Resource.Type.AmbariConfiguration, configurationId))); - } - -}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java index c410ce4..fd43edf 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java @@ -47,7 +47,7 @@ import org.apache.ambari.server.StackAccessException; import org.apache.ambari.server.configuration.Configuration; import org.apache.ambari.server.controller.MpackRequest; import org.apache.ambari.server.controller.MpackResponse; -import org.apache.ambari.server.controller.RootServiceResponseFactory.Services; +import org.apache.ambari.server.controller.RootService; import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException; import org.apache.ambari.server.controller.utilities.PropertyHelper; import org.apache.ambari.server.customactions.ActionDefinition; @@ -1331,7 +1331,7 @@ public class AmbariMetaInfo { String componentName = definition.getComponentName(); // the AMBARI service is special, skip it here - if (Services.AMBARI.name().equals(serviceName)) { + if (RootService.AMBARI.name().equals(serviceName)) { continue; } http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java index ce5f354..eedd415 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java @@ -90,10 +90,7 @@ public abstract class BaseService { protected static final String FIELDS_SEPARATOR = ", "; - /** - * Logger instance. - */ - protected final static Logger LOG = LoggerFactory.getLogger(BaseService.class); + private final static Logger LOG = LoggerFactory.getLogger(BaseService.class); /** * Factory for creating resource instances. http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/api/services/LoggingService.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/LoggingService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/LoggingService.java index c86b9a0..e830d3b 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/LoggingService.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/LoggingService.java @@ -51,6 +51,8 @@ import org.apache.ambari.server.security.authorization.RoleAuthorization; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.utils.RetryHelper; import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.inject.Inject; @@ -63,6 +65,8 @@ import com.google.inject.Inject; */ public class LoggingService extends BaseService { + private final static Logger LOG = LoggerFactory.getLogger(LoggingService.class); + /** * The user of authorizations for which a user must have one of in order to access LogSearch data */ http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceComponentConfigurationRequestSwagger.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceComponentConfigurationRequestSwagger.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceComponentConfigurationRequestSwagger.java new file mode 100644 index 0000000..dffa125 --- /dev/null +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceComponentConfigurationRequestSwagger.java @@ -0,0 +1,43 @@ +/* + * 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.apache.ambari.server.api.services; + +import java.util.Map; + +import org.apache.ambari.server.controller.ApiModel; + +import io.swagger.annotations.ApiModelProperty; + +/** + * Request data model for {@link org.apache.ambari.server.api.services.RootServiceComponentConfigurationService} + */ +public interface RootServiceComponentConfigurationRequestSwagger extends ApiModel { + + @ApiModelProperty(name = "Configuration") + RootServiceComponentConfigurationRequestInfo getRootServiceComponentConfigurationRequestInfo(); + + interface RootServiceComponentConfigurationRequestInfo { + @ApiModelProperty + String getServiceName(); + + @ApiModelProperty + String getComponentName(); + + @ApiModelProperty + String getCategoryName(); + + @ApiModelProperty + Map<String, String> getProperties(); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceComponentConfigurationResponseSwagger.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceComponentConfigurationResponseSwagger.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceComponentConfigurationResponseSwagger.java new file mode 100644 index 0000000..fb3c09d --- /dev/null +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceComponentConfigurationResponseSwagger.java @@ -0,0 +1,43 @@ +/* + * 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.apache.ambari.server.api.services; + +import java.util.Map; + +import org.apache.ambari.server.controller.ApiModel; + +import io.swagger.annotations.ApiModelProperty; + +/** + * Response data model for {@link org.apache.ambari.server.api.services.RootServiceComponentConfigurationService} + */ +public interface RootServiceComponentConfigurationResponseSwagger extends ApiModel { + + @ApiModelProperty(name = "Configuration") + RootServiceComponentConfigurationResponseInfo getRootServiceComponentConfigurationResponseInfo(); + + interface RootServiceComponentConfigurationResponseInfo { + @ApiModelProperty + String getServiceName(); + + @ApiModelProperty + String getComponentName(); + + @ApiModelProperty + String getCategoryName(); + + @ApiModelProperty + Map<String, Object> getProperties(); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceComponentConfigurationService.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceComponentConfigurationService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceComponentConfigurationService.java new file mode 100644 index 0000000..c7c37a6 --- /dev/null +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceComponentConfigurationService.java @@ -0,0 +1,226 @@ +/* + * 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. + */ + +/* + * 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.apache.ambari.server.api.services; + +import java.util.HashMap; +import java.util.Map; + +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; + +import org.apache.ambari.server.api.resources.ResourceInstance; +import org.apache.ambari.server.controller.spi.Resource; +import org.apache.http.HttpStatus; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; + +/** + * Rest endpoint for managing ambari root service component configurations. Supports CRUD operations. + * Ambari configurations are resources that relate to the ambari server instance even before a cluster is provisioned. + * <p> + * Ambari configuration resources may be shared with components and services in the cluster + * (by recommending them as default values) + * <p> + * Eg. LDAP configuration is stored as Configuration. + * The request payload has the form: + * <p> + * <pre> + * { + * "Configuration": { + * "service_name": "AMBARI", + * "component_name": "AMBARI_SERVER", + * "category": "ldap-configuration", + * "properties": { + * "authentication.ldap.primaryUrl": "localhost:33389" + * "authentication.ldap.secondaryUrl": "localhost:333" + * "authentication.ldap.baseDn": "dc=ambari,dc=apache,dc=org" + * // ...... + * } + * } + * } + * </pre> + */ +@Api(value = "Root Service Configurations", description = "Endpoint for Ambari root service component configuration related operations") +public class RootServiceComponentConfigurationService extends BaseService { + + private static final String REQUEST_TYPE = + "org.apache.ambari.server.api.services.RootServiceComponentConfigurationRequestSwagger"; + + private final String serviceName; + private final String componentName; + + public RootServiceComponentConfigurationService(String serviceName, String componentName) { + this.serviceName = serviceName; + this.componentName = componentName; + } + + /** + * Creates a root service component configuration resource. + * + * @param body the payload in json format + * @param headers http headers + * @param uri request uri information + * @return + */ + @POST + @Produces(MediaType.TEXT_PLAIN) + @ApiOperation(value = "Creates a root service component configuration resource", + nickname = "RootServiceComponentConfigurationService#createConfiguration") + @ApiImplicitParams({ + @ApiImplicitParam(dataType = REQUEST_TYPE, paramType = PARAM_TYPE_BODY) + }) + @ApiResponses({ + @ApiResponse(code = HttpStatus.SC_CREATED, message = MSG_SUCCESSFUL_OPERATION), + @ApiResponse(code = HttpStatus.SC_ACCEPTED, message = MSG_REQUEST_ACCEPTED), + @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = MSG_INVALID_ARGUMENTS), + @ApiResponse(code = HttpStatus.SC_CONFLICT, message = MSG_RESOURCE_ALREADY_EXISTS), + @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED), + @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED), + @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR), + }) + public Response createConfiguration(String body, @Context HttpHeaders headers, @Context UriInfo uri) { + return handleRequest(headers, body, uri, Request.Type.POST, createResource(null)); + } + + @GET + @Produces(MediaType.TEXT_PLAIN) + @ApiOperation(value = "Retrieve all root service component configuration resources", + nickname = "RootServiceComponentConfigurationService#getConfigurations", + notes = "Returns all root service component configurations.", + response = RootServiceComponentConfigurationResponseSwagger.class, + responseContainer = RESPONSE_CONTAINER_LIST) + @ApiImplicitParams({ + @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, + defaultValue = "Configuration/properties, Configuration/category, Configuration/component_name, Configuration/service_name", + dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY), + @ApiImplicitParam(name = QUERY_SORT, value = QUERY_SORT_DESCRIPTION, + defaultValue = "Configuration/category", + dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY), + @ApiImplicitParam(name = QUERY_PAGE_SIZE, value = QUERY_PAGE_SIZE_DESCRIPTION, defaultValue = DEFAULT_PAGE_SIZE, dataType = DATA_TYPE_INT, paramType = PARAM_TYPE_QUERY), + @ApiImplicitParam(name = QUERY_FROM, value = QUERY_FROM_DESCRIPTION, defaultValue = DEFAULT_FROM, dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY), + @ApiImplicitParam(name = QUERY_TO, value = QUERY_TO_DESCRIPTION, dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY) + }) + @ApiResponses(value = { + @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION), + @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR) + }) + public Response getConfigurations(String body, @Context HttpHeaders headers, @Context UriInfo uri) { + return handleRequest(headers, body, uri, Request.Type.GET, createResource(null)); + } + + @GET + @Path("{category}") + @Produces(MediaType.TEXT_PLAIN) + @ApiOperation(value = "Retrieve the details of a root service component configuration resource", + nickname = "RootServiceComponentConfigurationService#getConfiguration", + response = RootServiceComponentConfigurationResponseSwagger.class) + @ApiImplicitParams({ + @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, defaultValue = "Configuration/*", + dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY) + }) + @ApiResponses(value = { + @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION), + @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = MSG_RESOURCE_NOT_FOUND), + @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR) + }) + public Response getConfiguration(String body, @Context HttpHeaders headers, @Context UriInfo uri, + @PathParam("category") String category) { + return handleRequest(headers, body, uri, Request.Type.GET, createResource(category)); + } + + @PUT + @Path("{category}") + @Produces(MediaType.TEXT_PLAIN) + @ApiOperation(value = "Updates root service component configuration resources ", + nickname = "RootServiceComponentConfigurationService#updateConfiguration") + @ApiImplicitParams({ + @ApiImplicitParam(dataType = REQUEST_TYPE, paramType = PARAM_TYPE_BODY), + @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, defaultValue = "Configuration/*", + dataType = DATA_TYPE_STRING, paramType = PARAM_TYPE_QUERY) + }) + @ApiResponses({ + @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION), + @ApiResponse(code = HttpStatus.SC_ACCEPTED, message = MSG_REQUEST_ACCEPTED), + @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = MSG_INVALID_ARGUMENTS), + @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = MSG_RESOURCE_NOT_FOUND), + @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED), + @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED), + @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR), + }) + public Response updateConfiguration(String body, @Context HttpHeaders headers, @Context UriInfo uri, + @PathParam("category") String category) { + return handleRequest(headers, body, uri, Request.Type.PUT, createResource(category)); + } + + @DELETE + @Path("{category}") + @Produces(MediaType.TEXT_PLAIN) + @ApiOperation(value = "Deletes a root service component configuration resource", + nickname = "RootServiceComponentConfigurationService#deleteConfiguration") + @ApiResponses({ + @ApiResponse(code = HttpStatus.SC_OK, message = MSG_SUCCESSFUL_OPERATION), + @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = MSG_RESOURCE_NOT_FOUND), + @ApiResponse(code = HttpStatus.SC_UNAUTHORIZED, message = MSG_NOT_AUTHENTICATED), + @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = MSG_PERMISSION_DENIED), + @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = MSG_SERVER_ERROR), + }) + public Response deleteConfiguration(String body, @Context HttpHeaders headers, @Context UriInfo uri, + @PathParam("category") String category) { + return handleRequest(headers, body, uri, Request.Type.DELETE, createResource(category)); + } + + ResourceInstance createResource(String categoryName) { + Map<Resource.Type, String> mapIds = new HashMap<>(); + mapIds.put(Resource.Type.RootService, serviceName); + mapIds.put(Resource.Type.RootServiceComponent, componentName); + mapIds.put(Resource.Type.RootServiceComponentConfiguration, categoryName); + + return createResource(Resource.Type.RootServiceComponentConfiguration, mapIds); + } + +} http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceService.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceService.java index 5afb7dc..1ab2797 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceService.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceService.java @@ -297,6 +297,13 @@ public class RootServiceService extends BaseService { return handleRequest(headers, body, ui, Request.Type.GET, resource); } + @Path("{serviceName}/components/{componentName}/configurations") + public RootServiceComponentConfigurationService getAmbariServerConfigurationHandler(@Context javax.ws.rs.core.Request request, + @PathParam("serviceName") String serviceName, + @PathParam("componentName") String componentName) { + return new RootServiceComponentConfigurationService(serviceName, componentName); + } + protected ResourceInstance createServiceResource(String serviceName) { Map<Resource.Type, String> mapIds = Collections.singletonMap(Resource.Type.RootService, serviceName); return createResource(Resource.Type.RootService, mapIds); http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/api/services/ldap/AmbariConfiguration.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ldap/AmbariConfiguration.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ldap/AmbariConfiguration.java index b5cc921..7bac65e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ldap/AmbariConfiguration.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ldap/AmbariConfiguration.java @@ -14,9 +14,7 @@ package org.apache.ambari.server.api.services.ldap; -import java.util.Collections; import java.util.Map; -import java.util.Set; /** * Domain POJO representing generic ambari configuration data. @@ -28,22 +26,7 @@ public class AmbariConfiguration { */ private String type; - /** - * Version tag - */ - private String versionTag; - - /** - * Version number - */ - private Integer version; - - /** - * Created timestamp - */ - private long createdTs; - - private Set<Map<String, Object>> data = Collections.emptySet(); + private Map<String, String> properties = null; public String getType() { return type; @@ -53,35 +36,11 @@ public class AmbariConfiguration { this.type = type; } - public Set<Map<String, Object>> getData() { - return data; - } - - public void setData(Set<Map<String, Object>> data) { - this.data = data; - } - - public String getVersionTag() { - return versionTag; - } - - public void setVersionTag(String versionTag) { - this.versionTag = versionTag; - } - - public Integer getVersion() { - return version; - } - - public void setVersion(Integer version) { - this.version = version; - } - - public long getCreatedTs() { - return createdTs; + public Map<String, String> getProperties() { + return properties; } - public void setCreatedTs(long createdTs) { - this.createdTs = createdTs; + public void setProperties(Map<String, String> data) { + this.properties = data; } } http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/api/services/ldap/LdapConfigurationRequest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ldap/LdapConfigurationRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ldap/LdapConfigurationRequest.java index 2e478c4..0e065e5 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ldap/LdapConfigurationRequest.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ldap/LdapConfigurationRequest.java @@ -22,7 +22,7 @@ import com.google.gson.annotations.SerializedName; */ public class LdapConfigurationRequest { - @SerializedName("AmbariConfiguration") + @SerializedName("Configuration") private AmbariConfiguration ambariConfiguration; @SerializedName("RequestInfo") http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/api/services/ldap/LdapConfigurationService.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ldap/LdapConfigurationService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ldap/LdapConfigurationService.java index 13f8835..22784cd 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ldap/LdapConfigurationService.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ldap/LdapConfigurationService.java @@ -40,7 +40,7 @@ import javax.ws.rs.core.Response; import org.apache.ambari.annotations.ApiIgnore; import org.apache.ambari.server.StaticallyInject; -import org.apache.ambari.server.api.services.AmbariConfigurationService; +import org.apache.ambari.server.api.services.BaseService; import org.apache.ambari.server.api.services.Result; import org.apache.ambari.server.api.services.ResultImpl; import org.apache.ambari.server.api.services.ResultStatus; @@ -64,7 +64,7 @@ import com.google.common.collect.Sets; */ @StaticallyInject @Path("/ldapconfigs/") -public class LdapConfigurationService extends AmbariConfigurationService { +public class LdapConfigurationService extends BaseService { private static final Logger LOGGER = LoggerFactory.getLogger(LdapConfigurationService.class); @@ -94,7 +94,7 @@ public class LdapConfigurationService extends AmbariConfigurationService { validateRequest(ldapConfigurationRequest); AmbariLdapConfiguration ambariLdapConfiguration = ambariLdapConfigurationFactory.createLdapConfiguration( - ldapConfigurationRequest.getAmbariConfiguration().getData().iterator().next()); + ldapConfigurationRequest.getAmbariConfiguration().getProperties()); LdapConfigOperation action = LdapConfigOperation.fromAction(ldapConfigurationRequest.getRequestInfo().getAction()); switch (action) { @@ -133,7 +133,7 @@ public class LdapConfigurationService extends AmbariConfigurationService { } private void setResult(Set<String> groups, Result result) { - Resource resource = new ResourceImpl(Resource.Type.AmbariConfiguration); + Resource resource = new ResourceImpl(Resource.Type.RootServiceComponentConfiguration); resource.setProperty("groups", groups); result.getResultTree().addChild(resource, "payload"); } @@ -154,7 +154,7 @@ public class LdapConfigurationService extends AmbariConfigurationService { } if (null == ldapConfigurationRequest.getAmbariConfiguration() - || ldapConfigurationRequest.getAmbariConfiguration().getData().size() != 1) { + || ldapConfigurationRequest.getAmbariConfiguration().getProperties() != null) { errMsg = String.format("No / Invalid configuration data provided. Request: [%s]", ldapConfigurationRequest); LOGGER.error(errMsg); throw new IllegalArgumentException(errMsg); http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommand.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommand.java index 2dc45de..1b89c4f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommand.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommand.java @@ -45,6 +45,9 @@ import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorException; import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorRequest; import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorResponse; import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorRunner; +import org.apache.ambari.server.controller.RootComponent; +import org.apache.ambari.server.controller.RootService; +import org.apache.ambari.server.controller.internal.RootServiceComponentConfigurationResourceProvider; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.state.ServiceInfo; import org.apache.ambari.server.utils.DateUtils; @@ -71,10 +74,12 @@ public abstract class StackAdvisorCommand<T extends StackAdvisorResponse> extend */ private Class<T> type; - protected static Logger LOG = LoggerFactory.getLogger(StackAdvisorCommand.class); + private static final Logger LOG = LoggerFactory.getLogger(StackAdvisorCommand.class); private static final String GET_HOSTS_INFO_URI = "/api/v1/hosts" + "?fields=Hosts/*&Hosts/host_name.in(%s)"; + static final String LDAP_CONFIGURATION_PROPERTY = "ldap-configuration"; + private static final String GET_SERVICES_INFO_URI = "/api/v1/stacks/%s/versions/%s/" + "?fields=Versions/stack_name,Versions/stack_version,Versions/parent_stack_version" + ",services/StackServices/service_name,services/StackServices/service_version" @@ -84,7 +89,14 @@ public abstract class StackAdvisorCommand<T extends StackAdvisorResponse> extend + ",services/configurations/dependencies/StackConfigurationDependency/dependency_name" + ",services/configurations/dependencies/StackConfigurationDependency/dependency_type,services/configurations/StackConfigurations/type" + "&services/StackServices/service_name.in(%s)"; - private static final String GET_LDAP_CONFIG_URI = "/api/v1/configurations?AmbariConfiguration/type=ldap&fields=AmbariConfiguration/*"; + + private static final String GET_AMBARI_LDAP_CONFIG_URI = String.format("/api/v1/services/%s/components/%s/configurations?%s=%s&fields=%s", + RootService.AMBARI.name(), + RootComponent.AMBARI_SERVER.name(), + RootServiceComponentConfigurationResourceProvider.CONFIGURATION_CATEGORY_PROPERTY_ID, + LDAP_CONFIGURATION_PROPERTY, + RootServiceComponentConfigurationResourceProvider.CONFIGURATION_PROPERTIES_PROPERTY_ID); + private static final String SERVICES_PROPERTY = "services"; private static final String SERVICES_COMPONENTS_PROPERTY = "components"; private static final String CONFIG_GROUPS_PROPERTY = "config-groups"; @@ -96,7 +108,6 @@ public abstract class StackAdvisorCommand<T extends StackAdvisorResponse> extend private static final String CHANGED_CONFIGURATIONS_PROPERTY = "changed-configurations"; private static final String USER_CONTEXT_PROPERTY = "user-context"; private static final String AMBARI_SERVER_CONFIGURATIONS_PROPERTY = "ambari-server-properties"; - protected static final String LDAP_CONFIGURATION_PROPERTY = "ldap-configuration"; private File recommendationsDir; private String recommendationsArtifactsLifetime; @@ -176,17 +187,18 @@ public abstract class StackAdvisorCommand<T extends StackAdvisorResponse> extend /** * Retrieves the LDAP configuration if exists and adds it to services.json + * * @param root The JSON document that will become service.json when passed to the stack advisor engine * @throws StackAdvisorException * @throws IOException */ - protected void populateLdapConfiguration(ObjectNode root) throws StackAdvisorException, IOException { - Response response = handleRequest(null, null, new LocalUriInfo(GET_LDAP_CONFIG_URI), Request.Type.GET, + void populateLdapConfiguration(ObjectNode root) throws StackAdvisorException, IOException { + Response response = handleRequest(null, null, new LocalUriInfo(GET_AMBARI_LDAP_CONFIG_URI), Request.Type.GET, createConfigResource()); if (response.getStatus() != Status.OK.getStatusCode()) { String message = String.format( - "Error occured during retrieving ldap configuration, status=%s, response=%s", + "Error occurred during retrieving ldap configuration, status=%s, response=%s", response.getStatus(), (String) response.getEntity()); LOG.warn(message); throw new StackAdvisorException(message); @@ -198,25 +210,28 @@ public abstract class StackAdvisorCommand<T extends StackAdvisorResponse> extend } JsonNode ldapConfigRoot = mapper.readTree(ldapConfigJSON); - ArrayNode ldapConfigs = ((ArrayNode)ldapConfigRoot.get("items")); + ArrayNode ldapConfigs = ((ArrayNode) ldapConfigRoot.get("items")); int numConfigs = ldapConfigs.size(); - // Zero or one config may exist - switch (numConfigs) { - case 0: - LOG.debug("No LDAP config is stored in the DB"); - break; - case 1: - ArrayNode ldapConfigData = (ArrayNode)ldapConfigs.get(0).get("AmbariConfiguration").get("data"); - if (ldapConfigData.size() == 0) { - throw new StackAdvisorException("No configuration data for LDAP configuration."); - } - if (ldapConfigData.size() > 1) { - throw new StackAdvisorException("Ambigous configuration data for LDAP configuration."); - } - root.put(LDAP_CONFIGURATION_PROPERTY, ldapConfigData.get(0)); - break; - default: - throw new StackAdvisorException(String.format("Multiple (%s) LDAP configs are found in the DB.", numConfigs)); + + if (numConfigs == 1) { + JsonNode ldapConfigItem = ldapConfigs.get(0); + if (ldapConfigItem == null) { + throw new StackAdvisorException("Unexpected JSON document encountered: missing data"); + } + + JsonNode ldapConfiguration = ldapConfigItem.get("Configuration"); + if (ldapConfiguration == null) { + throw new StackAdvisorException("Unexpected JSON document encountered: missing the Configuration object"); + } + + JsonNode ldapConfigurationProperties = ldapConfiguration.get("properties"); + if (ldapConfigurationProperties == null) { + throw new StackAdvisorException("Unexpected JSON document encountered: missing the Configuration/properties object"); + } + + root.put(LDAP_CONFIGURATION_PROPERTY, ldapConfigurationProperties); + } else if (numConfigs > 1) { + throw new StackAdvisorException(String.format("Multiple (%s) LDAP configs are found in the DB.", numConfigs)); } } @@ -486,8 +501,12 @@ public abstract class StackAdvisorCommand<T extends StackAdvisorResponse> extend return createResource(Resource.Type.Host, mapIds); } - protected ResourceInstance createConfigResource() { - return createResource(Resource.Type.AmbariConfiguration, new HashMap<>()); + private ResourceInstance createConfigResource() { + Map<Resource.Type, String> mapIds = new HashMap<>(); + mapIds.put(Resource.Type.RootService, RootService.AMBARI.name()); + mapIds.put(Resource.Type.RootServiceComponent, RootComponent.AMBARI_SERVER.name()); + + return createResource(Resource.Type.RootServiceComponentConfiguration, mapIds); } http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java index 3caac14..20bb1b0 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java @@ -327,6 +327,15 @@ public class CheckDescription { "As Ranger is SSL enabled, Ranger SSL configurations will need to be changed from default value of /etc/ranger/*/conf folder to /etc/ranger/security. " + "Since the certificates/keystores/truststores in this path may affect the upgrade/downgrade process, it is recommended to manually move the certificates/keystores/truststores out of the conf folders and change the appropriate config values before proceeding.").build()); + public static CheckDescription LZO_CONFIG_CHECK = new CheckDescription("LZO_CONFIG_CHECK", + PrereqCheckType.CLUSTER, + "LZO Codec Check", + new ImmutableMap.Builder<String, String>() + .put(AbstractCheckDescriptor.DEFAULT, + "You have LZO codec enabled in the core-site config of your cluster. LZO is no longer installed automatically. " + + "If any hosts require LZO, it should be installed before starting the upgrade. " + + "Consult Ambari documentation for instructions on how to do this.").build()); + public static CheckDescription JAVA_VERSION = new CheckDescription("JAVA_VERSION", PrereqCheckType.CLUSTER, "Verify Java version requirement", http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java index 1f57996..0cd3d4b 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java @@ -81,7 +81,7 @@ import com.google.inject.persist.Transactional; public class DatabaseConsistencyCheckHelper { - static Logger LOG = LoggerFactory.getLogger(DatabaseConsistencyCheckHelper.class); + private static final Logger LOG = LoggerFactory.getLogger(DatabaseConsistencyCheckHelper.class); @Inject private static Injector injector; http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/checks/LZOCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/LZOCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/LZOCheck.java new file mode 100644 index 0000000..1eaacea --- /dev/null +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/LZOCheck.java @@ -0,0 +1,80 @@ +/* + * 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.checks; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.ambari.server.AmbariException; +import org.apache.ambari.server.controller.PrereqCheckRequest; +import org.apache.ambari.server.state.stack.PrereqCheckStatus; +import org.apache.ambari.server.state.stack.PrerequisiteCheck; +import org.apache.commons.lang.StringUtils; + +import com.google.inject.Singleton; + +/** + * The {@link LZOCheck} + * is used to check that the LZO codec enabled in the core-site config fnd warning if any hosts require LZO, it should be installed before starting the upgrade. + */ +@Singleton +@UpgradeCheck(group = UpgradeCheckGroup.INFORMATIONAL_WARNING) +public class LZOCheck extends AbstractCheckDescriptor { + + final static String IO_COMPRESSION_CODECS = "io.compression.codecs"; + final static String LZO_ENABLE_KEY = "io.compression.codec.lzo.class"; + final static String LZO_ENABLE_VALUE = "com.hadoop.compression.lzo.LzoCodec"; + + /** + * Constructor. + */ + public LZOCheck() { + super(CheckDescription.LZO_CONFIG_CHECK); + } + + /** + * {@inheritDoc} + */ + @Override + public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException { + if (config.getGplLicenseAccepted()){ + return; + } + List<String> errorMessages = new ArrayList<>(); + PrereqCheckStatus checkStatus = PrereqCheckStatus.WARNING; + + String codecs = getProperty(request, "core-site", IO_COMPRESSION_CODECS); + if (codecs!= null && codecs.contains(LZO_ENABLE_VALUE)) { + errorMessages.add(getFailReason(IO_COMPRESSION_CODECS, prerequisiteCheck, request)); + } + String classValue = getProperty(request, "core-site", LZO_ENABLE_KEY); + + if (LZO_ENABLE_VALUE.equals(classValue)) { + errorMessages.add(getFailReason(LZO_ENABLE_KEY, prerequisiteCheck, request)); + } + + if (!errorMessages.isEmpty()) { + prerequisiteCheck.setFailReason(StringUtils.join(errorMessages, "You have LZO codec enabled in the core-site config of your cluster. " + + "You have to accept GPL license during ambari-server setup to have LZO installed automatically. " + + "If any hosts require LZO, it should be installed before starting the upgrade. " + + "Consult Ambari documentation for instructions on how to do this.")); + prerequisiteCheck.getFailedOn().add("LZO"); + prerequisiteCheck.setStatus(checkStatus); + } + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java b/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java index 9af03c2..560f102 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java @@ -739,6 +739,14 @@ public class Configuration { "server.version.file", null); /** + * Whether user accepted GPL license + */ + @Markdown( + description = "Whether user accepted GPL license.") + public static final ConfigurationProperty<Boolean> GPL_LICENSE_ACCEPTED = new ConfigurationProperty<>( + "gpl.license.accepted", false); + + /** * The location of the JDK on the Ambari Agent hosts. */ @Markdown( @@ -2046,6 +2054,13 @@ public class Configuration { "server.task.timeout", 1200); /** + * A location of hooks folder relative to resources folder. + */ + @Markdown(description = "A location of hooks folder relative to resources folder.") + public static final ConfigurationProperty<String> HOOKS_FOLDER = new ConfigurationProperty<>( + "stack.hooks.folder", "stack-hooks"); + + /** * The location on the Ambari Server where custom actions are defined. */ @Markdown(description = "The location on the Ambari Server where custom actions are defined.") @@ -5454,6 +5469,10 @@ public class Configuration { return NumberUtils.toInt(getProperty(VERSION_DEFINITION_READ_TIMEOUT)); } + public Boolean getGplLicenseAccepted(){ + return Boolean.valueOf(getProperty(GPL_LICENSE_ACCEPTED)); + } + public String getAgentStackRetryOnInstallCount(){ return getProperty(AGENT_STACK_RETRY_COUNT); } http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java index 5d71869..e94defc 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java @@ -262,12 +262,12 @@ public class ActionExecutionContext { } /** + * * Interface that allows a final attempt to setting values on an {@link ExecutionCommand} - * @author ncole * */ - public static interface ExecutionCommandVisitor { - public void visit(ExecutionCommand command); + public interface ExecutionCommandVisitor { + void visit(ExecutionCommand command); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java index 1dad6cf..7c80b6e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java @@ -22,11 +22,8 @@ import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AGENT_STA import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AGENT_STACK_RETRY_ON_UNAVAILABILITY; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMMAND_TIMEOUT; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMPONENT_CATEGORY; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.REPO_INFO; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT_TYPE; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_NAME; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_VERSION; import java.util.HashSet; import java.util.List; @@ -47,9 +44,6 @@ import org.apache.ambari.server.api.services.AmbariMetaInfo; import org.apache.ambari.server.configuration.Configuration; import org.apache.ambari.server.controller.internal.RequestResourceFilter; import org.apache.ambari.server.customactions.ActionDefinition; -import org.apache.ambari.server.orm.entities.OperatingSystemEntity; -import org.apache.ambari.server.orm.entities.RepositoryEntity; -import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.ComponentInfo; @@ -58,6 +52,7 @@ import org.apache.ambari.server.state.ServiceComponent; import org.apache.ambari.server.state.ServiceComponentHost; import org.apache.ambari.server.state.ServiceInfo; import org.apache.ambari.server.state.StackId; +import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper; import org.apache.ambari.server.state.svccomphost.ServiceComponentHostOpInProgressEvent; import org.apache.ambari.server.utils.SecretReference; import org.apache.ambari.server.utils.StageUtils; @@ -65,8 +60,6 @@ import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -78,6 +71,7 @@ public class AmbariActionExecutionHelper { private final static Logger LOG = LoggerFactory.getLogger(AmbariActionExecutionHelper.class); private static final String TYPE_PYTHON = "PYTHON"; + private static final String ACTION_FILE_EXTENSION = "py"; private static final String ACTION_UPDATE_REPO = "update_repo"; private static final String SUCCESS_FACTOR_PARAMETER = "success_factor"; @@ -85,15 +79,23 @@ public class AmbariActionExecutionHelper { @Inject private Clusters clusters; + @Inject private AmbariManagementController managementController; + @Inject private AmbariMetaInfo ambariMetaInfo; + @Inject private MaintenanceStateHelper maintenanceStateHelper; + @Inject private Configuration configs; + @Inject + private RepositoryVersionHelper repoVersionHelper; + + /** * Validates the request to execute an action. * @param actionRequest @@ -417,7 +419,7 @@ public class AmbariActionExecutionHelper { commandParams.put(KeyNames.LOG_OUTPUT, requestParams.get(KeyNames.LOG_OUTPUT)); } - commandParams.put(SCRIPT, actionName + ".py"); + commandParams.put(SCRIPT, actionName + "." + ACTION_FILE_EXTENSION); commandParams.put(SCRIPT_TYPE, TYPE_PYTHON); StageUtils.useAmbariJdkInCommandParams(commandParams, configs); @@ -465,10 +467,10 @@ public class AmbariActionExecutionHelper { if (StringUtils.isNotBlank(serviceName)) { Service service = cluster.getService(serviceName); - addRepoInfoToHostLevelParams(actionContext, service.getDesiredRepositoryVersion(), + repoVersionHelper.addRepoInfoToHostLevelParams(cluster, actionContext, service.getDesiredRepositoryVersion(), hostLevelParams, hostName); } else { - addRepoInfoToHostLevelParams(actionContext, null, hostLevelParams, hostName); + repoVersionHelper.addRepoInfoToHostLevelParams(cluster, actionContext, null, hostLevelParams, hostName); } @@ -526,52 +528,4 @@ public class AmbariActionExecutionHelper { } } - /* - * This method builds and adds repo info - * to hostLevelParams of action - * - * */ - - private void addRepoInfoToHostLevelParams(ActionExecutionContext actionContext, - RepositoryVersionEntity repositoryVersion, Map<String, String> hostLevelParams, - String hostName) throws AmbariException { - - // if the repo is null, see if any values from the context should go on the - // host params and then return - if (null == repositoryVersion) { - // see if the action context has a repository set to use for the command - if (null != actionContext.getRepositoryVersion()) { - StackId stackId = actionContext.getRepositoryVersion().getStackId(); - hostLevelParams.put(STACK_NAME, stackId.getStackName()); - hostLevelParams.put(STACK_VERSION, stackId.getStackVersion()); - } - - return; - } else { - StackId stackId = repositoryVersion.getStackId(); - hostLevelParams.put(STACK_NAME, stackId.getStackName()); - hostLevelParams.put(STACK_VERSION, stackId.getStackVersion()); - } - - JsonObject rootJsonObject = new JsonObject(); - JsonArray repositories = new JsonArray(); - - String hostOsFamily = clusters.getHost(hostName).getOsFamily(); - for (OperatingSystemEntity operatingSystemEntity : repositoryVersion.getOperatingSystems()) { - // ostype in OperatingSystemEntity it's os family. That should be fixed - // in OperatingSystemEntity. - if (operatingSystemEntity.getOsType().equals(hostOsFamily)) { - for (RepositoryEntity repositoryEntity : operatingSystemEntity.getRepositories()) { - JsonObject repositoryInfo = new JsonObject(); - repositoryInfo.addProperty("base_url", repositoryEntity.getBaseUrl()); - repositoryInfo.addProperty("repo_name", repositoryEntity.getName()); - repositoryInfo.addProperty("repo_id", repositoryEntity.getRepositoryId()); - - repositories.add(repositoryInfo); - } - rootJsonObject.add("repositories", repositories); - } - } - hostLevelParams.put(REPO_INFO, rootJsonObject.toString()); - } } http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java index 5641df6..e7dea06 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java @@ -26,6 +26,7 @@ import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMPONENT import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.CUSTOM_COMMAND; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.DB_DRIVER_FILENAME; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.DB_NAME; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.GPL_LICENSE_ACCEPTED; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.GROUP_LIST; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.HOST_SYS_PREPPED; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JDK_LOCATION; @@ -53,8 +54,6 @@ import java.util.Random; import java.util.Set; import java.util.TreeMap; -import org.apache.ambari.annotations.Experimental; -import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.Role; import org.apache.ambari.server.RoleCommand; @@ -62,7 +61,6 @@ import org.apache.ambari.server.actionmanager.HostRoleCommand; import org.apache.ambari.server.actionmanager.HostRoleStatus; import org.apache.ambari.server.actionmanager.Stage; import org.apache.ambari.server.agent.AgentCommand.AgentCommandType; -import org.apache.ambari.server.agent.CommandRepository; import org.apache.ambari.server.agent.ExecutionCommand; import org.apache.ambari.server.agent.ExecutionCommand.KeyNames; import org.apache.ambari.server.api.services.AmbariMetaInfo; @@ -70,11 +68,9 @@ import org.apache.ambari.server.configuration.Configuration; import org.apache.ambari.server.controller.internal.RequestOperationLevel; import org.apache.ambari.server.controller.internal.RequestResourceFilter; import org.apache.ambari.server.controller.spi.Resource; +import org.apache.ambari.server.controller.spi.SystemException; import org.apache.ambari.server.metadata.ActionMetadata; import org.apache.ambari.server.orm.dao.HostRoleCommandDAO; -import org.apache.ambari.server.orm.entities.OperatingSystemEntity; -import org.apache.ambari.server.orm.entities.RepositoryEntity; -import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.CommandScriptDefinition; @@ -90,7 +86,6 @@ import org.apache.ambari.server.state.MaintenanceState; import org.apache.ambari.server.state.PropertyInfo; import org.apache.ambari.server.state.PropertyInfo.PropertyType; import org.apache.ambari.server.state.RefreshCommandConfiguration; -import org.apache.ambari.server.state.RepositoryInfo; import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.ServiceComponent; import org.apache.ambari.server.state.ServiceComponentHost; @@ -99,6 +94,7 @@ import org.apache.ambari.server.state.StackId; import org.apache.ambari.server.state.StackInfo; import org.apache.ambari.server.state.State; import org.apache.ambari.server.state.stack.OsFamily; +import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper; import org.apache.ambari.server.state.svccomphost.ServiceComponentHostOpInProgressEvent; import org.apache.ambari.server.utils.StageUtils; import org.apache.commons.lang.StringUtils; @@ -106,11 +102,7 @@ import org.apache.commons.lang.math.NumberUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Function; import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -175,6 +167,9 @@ public class AmbariCustomCommandExecutionHelper { @Inject private HostRoleCommandDAO hostRoleCommandDAO; + @Inject + private RepositoryVersionHelper repoVersionHelper; + private Map<String, Map<String, Map<String, String>>> configCredentialsForService = new HashMap<>(); protected static final String SERVICE_CHECK_COMMAND_NAME = "SERVICE_CHECK"; @@ -413,7 +408,11 @@ public class AmbariCustomCommandExecutionHelper { hostLevelParams.put(CUSTOM_COMMAND, commandName); // Set parameters required for re-installing clients on restart - hostLevelParams.put(REPO_INFO, getRepoInfo(cluster, component, host)); + try { + hostLevelParams.put(REPO_INFO, repoVersionHelper.getRepoInfo(cluster, component, host)); + } catch (SystemException e) { + throw new AmbariException("", e); + } hostLevelParams.put(STACK_NAME, stackId.getStackName()); hostLevelParams.put(STACK_VERSION, stackId.getStackVersion()); @@ -521,8 +520,6 @@ public class AmbariCustomCommandExecutionHelper { execCmd.setCommandParams(commandParams); execCmd.setRoleParams(roleParams); - execCmd.setRepositoryFile(getCommandRepository(cluster, component, host)); - // perform any server side command related logic - eg - set desired states on restart applyCustomCommandBackendLogic(cluster, serviceName, componentName, commandName, hostName); } @@ -848,7 +845,8 @@ public class AmbariCustomCommandExecutionHelper { * calls into the implementation of a custom command */ private void addDecommissionAction(final ActionExecutionContext actionExecutionContext, - final RequestResourceFilter resourceFilter, Stage stage, ExecuteCommandJson executeCommandJson) throws AmbariException { + final RequestResourceFilter resourceFilter, Stage stage, ExecuteCommandJson executeCommandJson) + throws AmbariException { String clusterName = actionExecutionContext.getClusterName(); final Cluster cluster = clusters.getCluster(clusterName); @@ -1145,7 +1143,8 @@ public class AmbariCustomCommandExecutionHelper { * @throws AmbariException if the commands can not be added */ public void addExecutionCommandsToStage(ActionExecutionContext actionExecutionContext, - Stage stage, Map<String, String> requestParams, ExecuteCommandJson executeCommandJson) throws AmbariException { + Stage stage, Map<String, String> requestParams, ExecuteCommandJson executeCommandJson) + throws AmbariException { List<RequestResourceFilter> resourceFilters = actionExecutionContext.getResourceFilters(); @@ -1209,243 +1208,29 @@ public class AmbariCustomCommandExecutionHelper { } } - /** - * Get repository info given a cluster and host. - * - * @param cluster the cluster - * @param host the host - * - * @return the repo info - * - * @deprecated use {@link #getCommandRepository(Cluster, ServiceComponent, Host)} instead. - * @throws AmbariException if the repository information can not be obtained - */ - @Deprecated - public String getRepoInfo(Cluster cluster, ServiceComponent component, Host host) throws AmbariException { - - Function<List<RepositoryInfo>, JsonArray> function = new Function<List<RepositoryInfo>, JsonArray>() { - @Override - public JsonArray apply(List<RepositoryInfo> input) { - return null == input ? null : (JsonArray) gson.toJsonTree(input); - } - }; - - final JsonArray gsonList = getBaseUrls(cluster, component, host, function); - - if (null == gsonList) { - return ""; - } - - BaseUrlUpdater<JsonArray> updater = new BaseUrlUpdater<JsonArray>(gsonList) { - @Override - public JsonArray apply(final RepositoryVersionEntity rve) { - - JsonArray result = new JsonArray(); - - for (JsonElement e : gsonList) { - JsonObject obj = e.getAsJsonObject(); - - String repoId = obj.has("repoId") ? obj.get("repoId").getAsString() : null; - String repoName = obj.has("repoName") ? obj.get("repoName").getAsString() : null; - String baseUrl = obj.has("baseUrl") ? obj.get("baseUrl").getAsString() : null; - String osType = obj.has("osType") ? obj.get("osType").getAsString() : null; - - if (null == repoId || null == baseUrl || null == osType || null == repoName) { - continue; - } - - for (OperatingSystemEntity ose : rve.getOperatingSystems()) { - if (ose.getOsType().equals(osType) && ose.isAmbariManagedRepos()) { - for (RepositoryEntity re : ose.getRepositories()) { - if (re.getName().equals(repoName) && - !re.getBaseUrl().equals(baseUrl)) { - obj.addProperty("baseUrl", re.getBaseUrl()); - } - } - result.add(e); - } - } - } - - return result; - } - }; - - return updateBaseUrls(cluster, component, updater).toString(); - } - - /** - * Builds repository information for inclusion in a command. This replaces escaping json on - * a command. - * - * @param cluster the cluster - * @param host the host - * @return the command repository - * @throws AmbariException - */ - @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES) - public CommandRepository getCommandRepository(final Cluster cluster, ServiceComponent component, final Host host) throws AmbariException { - - final CommandRepository command = new CommandRepository(); - boolean sysPreppedHost = configs.areHostsSysPrepped().equalsIgnoreCase("true"); - StackId stackId = component.getDesiredStackId(); - command.setRepositories(Collections.<RepositoryInfo>emptyList()); - command.setStackName(stackId.getStackName()); - command.getFeature().setPreInstalled(configs.areHostsSysPrepped()); - command.getFeature().setIsScoped(!sysPreppedHost); - - final BaseUrlUpdater<Void> updater = new BaseUrlUpdater<Void>(null) { - @Override - public Void apply(RepositoryVersionEntity rve) { - command.setRepositoryVersionId(rve.getId()); - command.setRepositoryVersion(rve.getVersion()); - command.setResolved(rve.isResolved()); - command.setStackName(rve.getStackName()); - - // !!! a repository version entity has all the repos worked out. We shouldn't use - // the stack at all. - for (OperatingSystemEntity osEntity : rve.getOperatingSystems()) { - String osEntityFamily = os_family.find(osEntity.getOsType()); - if (osEntityFamily.equals(host.getOsFamily())) { - command.setRepositories(osEntity.getOsType(), osEntity.getRepositories()); - - if (!osEntity.isAmbariManagedRepos()) { - command.setNonManaged(); - } else { - if (rve.isLegacy()){ - command.setLegacyRepoId(rve.getVersion()); - command.setLegacyRepoFileName(rve.getStackName(), rve.getVersion()); - command.getFeature().setIsScoped(false); - } else { - command.setRepoFileName(rve.getStackName(), rve.getId()); - command.setUniqueSuffix(String.format("-repo-%s", rve.getId())); - } - } - } - } - - return null; - } - }; - - updateBaseUrls(cluster, component, updater); - - if (configs.arePackagesLegacyOverridden()) { - LOG.warn("Legacy override option is turned on, disabling CommandRepositoryFeature.scoped feature"); - command.getFeature().setIsScoped(false); - } - - return command; - } - - /** - * Executed by two different representations of repos. When we are comfortable with the new - * implementation, this may be removed and called inline in {@link #getCommandRepository(Cluster, ServiceComponent, Host)} - * - * @param cluster the cluster to isolate the stack - * @param component the component - * @param host used to resolve the family for the repositories - * @param function function that will transform the supplied repositories for specific use. - * @return <T> the type as defined by the supplied {@code function}. - * @throws AmbariException - */ - @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES) - private <T> T getBaseUrls(Cluster cluster, ServiceComponent component, Host host, - Function<List<RepositoryInfo>, T> function) throws AmbariException { - - String hostOsType = host.getOsType(); - String hostOsFamily = host.getOsFamily(); - String hostName = host.getHostName(); - - StackId stackId = component.getDesiredStackId(); - - Map<String, List<RepositoryInfo>> repos = ambariMetaInfo.getRepository( - stackId.getStackName(), stackId.getStackVersion()); - - String family = os_family.find(hostOsType); - if (null == family) { - family = hostOsFamily; - } - - final List<RepositoryInfo> repoInfos; - - // !!! check for the most specific first - if (repos.containsKey(hostOsType)) { - repoInfos = repos.get(hostOsType); - } else if (null != family && repos.containsKey(family)) { - repoInfos = repos.get(family); - } else { - repoInfos = null; - LOG.warn("Could not retrieve repo information for host" - + ", hostname=" + hostName - + ", clusterName=" + cluster.getClusterName() - + ", stackInfo=" + stackId.getStackId()); - } - - // leave it to function implementation to handle null. - return function.apply(repoInfos); - } - - /** - * Checks repo URLs against the current version for the cluster and makes - * adjustments to the Base URL when the current is different. - * - * @param <T> the result after appling the repository version, if found. - */ - @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES) - private <T> T updateBaseUrls(Cluster cluster, ServiceComponent component, BaseUrlUpdater<T> function) throws AmbariException { - - RepositoryVersionEntity repositoryEntity = null; - - // !!! try to find the component repo first - if (null != component) { - repositoryEntity = component.getDesiredRepositoryVersion(); - } else { - LOG.info("Service component not passed in, attempt to resolve the repository for cluster {}", - cluster.getClusterName()); - } - - if (null == repositoryEntity && null != component) { - Service service = cluster.getService(component.getServiceName()); - - repositoryEntity = service.getDesiredRepositoryVersion(); - } - - if (null == repositoryEntity) { - LOG.info("Cluster {} has no specific Repository Versions. Using stack-defined values", cluster.getClusterName()); - return function.getDefault(); - } - - return function.apply(repositoryEntity); - } - /** * Helper method to fill execution command information. * * @param actionExecContext the context * @param cluster the cluster for the command + * @param stackId the stack id used to load service metainfo. * * @return a wrapper of the important JSON structures to add to a stage */ public ExecuteCommandJson getCommandJson(ActionExecutionContext actionExecContext, - Cluster cluster, RepositoryVersionEntity repositoryVersion, String requestContext) throws AmbariException { + Cluster cluster, StackId stackId, String requestContext) throws AmbariException { Map<String, String> commandParamsStage = StageUtils.getCommandParamsStage(actionExecContext, requestContext); Map<String, String> hostParamsStage = new HashMap<>(); Map<String, Set<String>> clusterHostInfo; String clusterHostInfoJson = "{}"; - StackId stackId = null; - if (null != repositoryVersion) { - stackId = repositoryVersion.getStackId(); - } - if (null != cluster) { clusterHostInfo = StageUtils.getClusterHostInfo(cluster); // Important, because this runs during Stack Uprade, it needs to use the effective Stack Id. - hostParamsStage = createDefaultHostParams(cluster, repositoryVersion); + hostParamsStage = createDefaultHostParams(cluster, stackId); String componentName = null; String serviceName = null; @@ -1454,7 +1239,7 @@ public class AmbariCustomCommandExecutionHelper { serviceName = actionExecContext.getOperationLevel().getServiceName(); } - if (serviceName != null && componentName != null && null != stackId) { + if (serviceName != null && componentName != null) { Service service = cluster.getService(serviceName); ServiceComponent component = service.getServiceComponent(componentName); stackId = component.getDesiredStackId(); @@ -1473,6 +1258,10 @@ public class AmbariCustomCommandExecutionHelper { clusterHostInfoJson = StageUtils.getGson().toJson(clusterHostInfo); + if (null == stackId && null != cluster) { + stackId = cluster.getDesiredStackVersion(); + } + //Propogate HCFS service type info to command params if (null != stackId) { Map<String, ServiceInfo> serviceInfos = ambariMetaInfo.getServices(stackId.getStackName(), @@ -1497,11 +1286,10 @@ public class AmbariCustomCommandExecutionHelper { hostParamsStageJson); } - Map<String, String> createDefaultHostParams(Cluster cluster, RepositoryVersionEntity repositoryVersion) throws AmbariException { - return createDefaultHostParams(cluster, repositoryVersion.getStackId()); - } - Map<String, String> createDefaultHostParams(Cluster cluster, StackId stackId) throws AmbariException { + if (null == stackId) { + stackId = cluster.getDesiredStackVersion(); + } TreeMap<String, String> hostLevelParams = new TreeMap<>(); StageUtils.useStackJdkIfExists(hostLevelParams, configs); @@ -1516,6 +1304,7 @@ public class AmbariCustomCommandExecutionHelper { hostLevelParams.put(HOST_SYS_PREPPED, configs.areHostsSysPrepped()); hostLevelParams.put(AGENT_STACK_RETRY_ON_UNAVAILABILITY, configs.isAgentStackRetryOnInstallEnabled()); hostLevelParams.put(AGENT_STACK_RETRY_COUNT, configs.getAgentStackRetryOnInstallCount()); + hostLevelParams.put(GPL_LICENSE_ACCEPTED, configs.getGplLicenseAccepted().toString()); Map<String, DesiredConfig> desiredConfigs = cluster.getDesiredConfigs(); Map<PropertyInfo, String> notManagedHdfsPathMap = configHelper.getPropertiesWithPropertyType(stackId, PropertyType.NOT_MANAGED_HDFS_PATH, cluster, desiredConfigs); @@ -1653,21 +1442,4 @@ public class AmbariCustomCommandExecutionHelper { return removedHosts; } - /** - * Class that is used to update base urls. There are two implementations of this - when we no - * longer are sure the deprecated repo info can be removed, so too can this class. - */ - @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES) - abstract static class BaseUrlUpdater<T> implements Function<RepositoryVersionEntity, T> { - private T m_default; - - private BaseUrlUpdater(T defaultValue) { - m_default = defaultValue; - } - - private T getDefault() { - return m_default; - } - - } } http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariHandlerList.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariHandlerList.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariHandlerList.java index e134f6d..23c9dee 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariHandlerList.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariHandlerList.java @@ -111,10 +111,7 @@ public class AmbariHandlerList extends HandlerCollection implements ViewInstance */ private final Collection<Handler> nonViewHandlers = new HashSet<>(); - /** - * The logger. - */ - protected final static Logger LOG = LoggerFactory.getLogger(AmbariHandlerList.class); + private static final Logger LOG = LoggerFactory.getLogger(AmbariHandlerList.class); // ----- Constructors ------------------------------------------------------
