You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by mr...@apache.org on 2017/11/27 23:29:28 UTC
[16/30] ambari git commit: Merge trunk with feature branch and fix
some UT compilation issues (mradhakrishnan)
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 ------------------------------------------------------