AMBARI-21317. Config update API should not need to have a unique tag, BE can auto add the tag when it is missing.(vbrodetskyi)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/40e6352b Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/40e6352b Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/40e6352b Branch: refs/heads/branch-feature-logsearch-ui Commit: 40e6352b0e704ca1af7b0e88a267b03bde5cea59 Parents: 8634718 Author: Vitaly Brodetskyi <vbrodets...@hortonworks.com> Authored: Tue Jun 27 22:44:28 2017 +0300 Committer: Vitaly Brodetskyi <vbrodets...@hortonworks.com> Committed: Tue Jun 27 22:44:28 2017 +0300 ---------------------------------------------------------------------- .../controller/AmbariManagementController.java | 4 +++ .../AmbariManagementControllerImpl.java | 29 +++++++++++++++--- .../server/controller/ConfigGroupResponse.java | 10 +++++++ .../internal/ConfigGroupResourceProvider.java | 31 ++++++++++++++++++-- .../apache/ambari/server/state/ConfigImpl.java | 3 +- .../AmbariManagementControllerImplTest.java | 16 ++++++++-- .../ConfigGroupResourceProviderTest.java | 2 ++ 7 files changed, 85 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/40e6352b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java index bb1c95e..f0f13e1 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java @@ -911,5 +911,9 @@ public interface AmbariManagementController { */ QuickLinkVisibilityController getQuicklinkVisibilityController(); + ConfigGroupResponse getConfigGroupUpdateResults(ConfigGroupRequest configGroupRequest); + + void saveConfigGroupUpdate(ConfigGroupRequest configGroupRequest, ConfigGroupResponse configGroupResponse); + } http://git-wip-us.apache.org/repos/asf/ambari/blob/40e6352b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java index 6781f65..77883e3 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java @@ -65,6 +65,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; +import java.util.UUID; import java.util.concurrent.TimeUnit; import javax.persistence.RollbackException; @@ -346,6 +347,8 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle private Cache<ClusterRequest, ClusterResponse> clusterUpdateCache = CacheBuilder.newBuilder().expireAfterWrite(5, TimeUnit.MINUTES).build(); + private Cache<ConfigGroupRequest, ConfigGroupResponse> configGroupUpdateCache = + CacheBuilder.newBuilder().expireAfterWrite(5, TimeUnit.MINUTES).build(); @Inject private AmbariCustomCommandExecutionHelper customCommandExecutionHelper; @@ -1632,6 +1635,15 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle cluster = clusters.getClusterById(request.getClusterId()); } + List<ConfigurationRequest> desiredConfigs = request.getDesiredConfig(); + if (desiredConfigs != null) { + for (ConfigurationRequest configurationRequest : desiredConfigs) { + if (StringUtils.isEmpty(configurationRequest.getVersionTag())) { + configurationRequest.setVersionTag(UUID.randomUUID().toString()); + } + } + } + // Ensure the user has access to update this cluster AuthorizationHelper.verifyAuthorization(ResourceType.CLUSTER, cluster.getResourceId(), RoleAuthorization.AUTHORIZATIONS_UPDATE_CLUSTER); @@ -1640,7 +1652,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle new LinkedList<>(); ServiceConfigVersionResponse serviceConfigVersionResponse = null; - if (request.getDesiredConfig() != null && request.getServiceConfigVersionRequest() != null) { + if (desiredConfigs != null && request.getServiceConfigVersionRequest() != null) { String msg = "Unable to set desired configs and rollback at same time, request = " + request; LOG.error(msg); throw new IllegalArgumentException(msg); @@ -1661,8 +1673,8 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle //check if desired configs are available in request and they were changed boolean isConfigurationCreationNeeded = false; - if (request.getDesiredConfig() != null) { - for (ConfigurationRequest desiredConfig : request.getDesiredConfig()) { + if (desiredConfigs != null) { + for (ConfigurationRequest desiredConfig : desiredConfigs) { Map<String, String> requestConfigProperties = desiredConfig.getProperties(); Map<String,Map<String,String>> requestConfigAttributes = desiredConfig.getPropertiesAttributes(); @@ -1739,7 +1751,6 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle // set or create configuration mapping (and optionally create the map of properties) if (isConfigurationCreationNeeded) { - List<ConfigurationRequest> desiredConfigs = request.getDesiredConfig(); if (!desiredConfigs.isEmpty()) { Set<Config> configs = new HashSet<>(); @@ -2073,6 +2084,16 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle } @Override + public ConfigGroupResponse getConfigGroupUpdateResults(ConfigGroupRequest configGroupRequest) { + return configGroupUpdateCache.getIfPresent(configGroupRequest); + } + + @Override + public void saveConfigGroupUpdate(ConfigGroupRequest configGroupRequest, ConfigGroupResponse configGroupResponse) { + configGroupUpdateCache.put(configGroupRequest, configGroupResponse); + } + + @Override public String getJobTrackerHost(Cluster cluster) { try { Service svc = cluster.getService("MAPREDUCE"); http://git-wip-us.apache.org/repos/asf/ambari/blob/40e6352b/ambari-server/src/main/java/org/apache/ambari/server/controller/ConfigGroupResponse.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ConfigGroupResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ConfigGroupResponse.java index 58c680d..937df46 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ConfigGroupResponse.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ConfigGroupResponse.java @@ -17,6 +17,7 @@ */ package org.apache.ambari.server.controller; +import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -28,6 +29,7 @@ public class ConfigGroupResponse { private String description; private Set<Map<String, Object>> hosts; private Set<Map<String, Object>> configVersions; + private Set<Map<String, Object>> versionTags = new HashSet<Map<String, Object>>(); public ConfigGroupResponse(Long id, String clusterName, String groupName, String tag, String description, @@ -97,4 +99,12 @@ public class ConfigGroupResponse { public void setConfigurations(Set<Map<String, Object>> configurations) { this.configVersions = configurations; } + + public Set<Map<String, Object>> getVersionTags() { + return versionTags; + } + + public void setVersionTags(Set<Map<String, Object>> versionTags) { + this.versionTags = versionTags; + } } http://git-wip-us.apache.org/repos/asf/ambari/blob/40e6352b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java index c2b998c..25af9d2 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java @@ -96,6 +96,8 @@ public class ConfigGroupResourceProvider extends .getPropertyId("ConfigGroup", "hosts"); public static final String CONFIGGROUP_CONFIGS_PROPERTY_ID = PropertyHelper.getPropertyId("ConfigGroup", "desired_configs"); + public static final String CONFIGGROUP_VERSION_TAGS_PROPERTY_ID = + PropertyHelper.getPropertyId("ConfigGroup", "version_tags"); private static Set<String> pkPropertyIds = new HashSet<>(Arrays .asList(new String[]{CONFIGGROUP_ID_PROPERTY_ID})); @@ -217,9 +219,23 @@ public class ConfigGroupResourceProvider extends RequestStatus status = updateResources(requests); + Set<Resource> associatedResources = new HashSet<>(); + for (ConfigGroupRequest configGroupRequest : requests) { + ConfigGroupResponse configGroupResponse = getManagementController().getConfigGroupUpdateResults(configGroupRequest); + Resource resource = new ResourceImpl(Resource.Type.ConfigGroup); + + resource.setProperty(CONFIGGROUP_ID_PROPERTY_ID, configGroupResponse.getId()); + resource.setProperty(CONFIGGROUP_CLUSTER_NAME_PROPERTY_ID, configGroupResponse.getClusterName()); + resource.setProperty(CONFIGGROUP_NAME_PROPERTY_ID, configGroupResponse.getGroupName()); + resource.setProperty(CONFIGGROUP_TAG_PROPERTY_ID, configGroupResponse.getTag()); + resource.setProperty(CONFIGGROUP_VERSION_TAGS_PROPERTY_ID, configGroupResponse.getVersionTags()); + + associatedResources.add(resource); + } + notifyUpdate(Resource.Type.ConfigGroup, request, predicate); - return status; + return getRequestStatus(null, associatedResources); } @Override @@ -701,7 +717,18 @@ public class ConfigGroupResourceProvider extends if (serviceName != null) { cluster.createServiceConfigVersion(serviceName, getManagementController().getAuthName(), - request.getServiceConfigVersionNote(), configGroup); + request.getServiceConfigVersionNote(), configGroup); + + ConfigGroupResponse configGroupResponse = new ConfigGroupResponse(configGroup.getId(), cluster.getClusterName(), configGroup.getName(), + request.getTag(), "", new HashSet<Map<String, Object>>(), new HashSet<Map<String, Object>>()); + Set<Map<String, Object>> versionTags = new HashSet<Map<String, Object>>(); + Map<String, Object> tagsMap = new HashMap<String, Object>(); + for (Config config : configGroup.getConfigurations().values()) { + tagsMap.put(config.getType(), config.getTag()); + } + versionTags.add(tagsMap); + configGroupResponse.setVersionTags(versionTags); + getManagementController().saveConfigGroupUpdate(request, configGroupResponse); } else { LOG.warn("Could not determine service name for config group {}, service config version not created", configGroup.getId()); http://git-wip-us.apache.org/repos/asf/ambari/blob/40e6352b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java index 65b7863..cfcadd4 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java @@ -22,6 +22,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.locks.ReadWriteLock; @@ -133,7 +134,7 @@ public class ConfigImpl implements Config { version = cluster.getNextConfigVersion(type); // tag is nullable from factory but not in the DB, so ensure we generate something - tag = StringUtils.isBlank(tag) ? GENERATED_TAG_PREFIX + version : tag; + tag = StringUtils.isBlank(tag) ? UUID.randomUUID().toString() : tag; this.tag = tag; ClusterEntity clusterEntity = clusterDAO.findById(cluster.getClusterId()); http://git-wip-us.apache.org/repos/asf/ambari/blob/40e6352b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java index c0e3ef1..eadc678 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java @@ -561,9 +561,14 @@ public class AmbariManagementControllerImplTest { Cluster cluster = createNiceMock(Cluster.class); ActionManager actionManager = createNiceMock(ActionManager.class); ClusterRequest clusterRequest = createNiceMock(ClusterRequest.class); + ConfigurationRequest configurationRequest = createNiceMock(ConfigurationRequest.class); // requests - Set<ClusterRequest> setRequests = Collections.singleton(clusterRequest); + Set<ClusterRequest> setRequests = new HashSet<ClusterRequest>(); + setRequests.add(clusterRequest); + + List<ConfigurationRequest> configRequests = new ArrayList<>(); + configRequests.add(configurationRequest); KerberosHelper kerberosHelper = createStrictMock(KerberosHelper.class); // expectations @@ -573,6 +578,8 @@ public class AmbariManagementControllerImplTest { expect(injector.getInstance(KerberosHelper.class)).andReturn(kerberosHelper); expect(clusterRequest.getClusterName()).andReturn("clusterNew").times(3); expect(clusterRequest.getClusterId()).andReturn(1L).times(6); + expect(clusterRequest.getDesiredConfig()).andReturn(configRequests); + expect(configurationRequest.getVersionTag()).andReturn(null).times(1); expect(clusters.getClusterById(1L)).andReturn(cluster).times(2); expect(cluster.getClusterName()).andReturn("clusterOld").times(1); @@ -582,8 +589,11 @@ public class AmbariManagementControllerImplTest { cluster.setClusterName("clusterNew"); expectLastCall(); + configurationRequest.setVersionTag(EasyMock.anyObject(String.class)); + expectLastCall(); + // replay mocks - replay(actionManager, cluster, clusters, injector, clusterRequest, sessionManager); + replay(actionManager, cluster, clusters, injector, clusterRequest, sessionManager, configurationRequest); // test AmbariManagementController controller = new AmbariManagementControllerImpl(actionManager, clusters, injector); @@ -591,7 +601,7 @@ public class AmbariManagementControllerImplTest { // assert and verify assertSame(controller, controllerCapture.getValue()); - verify(actionManager, cluster, clusters, injector, clusterRequest, sessionManager); + verify(actionManager, cluster, clusters, injector, clusterRequest, sessionManager, configurationRequest); } /** http://git-wip-us.apache.org/repos/asf/ambari/blob/40e6352b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProviderTest.java index 12cbadf..6dd0748 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProviderTest.java @@ -495,6 +495,8 @@ public class ConfigGroupResourceProviderTest { expect(hostEntity2.getHostId()).andReturn(2L).atLeastOnce(); expect(h1.getHostId()).andReturn(1L).anyTimes(); expect(h2.getHostId()).andReturn(2L).anyTimes(); + expect(managementController.getConfigGroupUpdateResults((ConfigGroupRequest)anyObject())). + andReturn(new ConfigGroupResponse(1L, "", "", "", "", new HashSet<Map<String, Object>>(), new HashSet<Map<String, Object>>())).atLeastOnce(); expect(configGroup.getName()).andReturn("test-1").anyTimes(); expect(configGroup.getId()).andReturn(25L).anyTimes();