http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/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 875d9b6..6cc4c04 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 @@ -68,6 +68,8 @@ import java.util.concurrent.TimeUnit; import javax.persistence.RollbackException; +import org.apache.ambari.annotations.Experimental; +import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.ClusterNotFoundException; import org.apache.ambari.server.DuplicateResourceException; @@ -107,6 +109,7 @@ import org.apache.ambari.server.controller.metrics.MetricsCollectorHAManager; import org.apache.ambari.server.controller.metrics.timeline.cache.TimelineMetricCacheProvider; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException; +import org.apache.ambari.server.controller.spi.SystemException; import org.apache.ambari.server.customactions.ActionDefinition; import org.apache.ambari.server.events.publishers.AmbariEventPublisher; import org.apache.ambari.server.metadata.ActionMetadata; @@ -198,9 +201,11 @@ import org.apache.ambari.server.state.quicklinksprofile.QuickLinksProfile; import org.apache.ambari.server.state.repository.VersionDefinitionXml; import org.apache.ambari.server.state.scheduler.RequestExecutionFactory; import org.apache.ambari.server.state.stack.OsFamily; +import org.apache.ambari.server.state.stack.RepoTag; import org.apache.ambari.server.state.stack.RepositoryXml; import org.apache.ambari.server.state.stack.WidgetLayout; import org.apache.ambari.server.state.stack.WidgetLayoutInfo; +import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper; import org.apache.ambari.server.state.svccomphost.ServiceComponentHostInstallEvent; import org.apache.ambari.server.state.svccomphost.ServiceComponentHostOpInProgressEvent; import org.apache.ambari.server.state.svccomphost.ServiceComponentHostOpSucceededEvent; @@ -336,6 +341,9 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle @Inject protected OsFamily osFamily; + @Inject + private RepositoryVersionHelper repoVersionHelper; + /** * The KerberosHelper to help setup for enabling for disabling Kerberos */ @@ -2612,7 +2620,12 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle } StageUtils.useAmbariJdkInCommandParams(commandParams, configs); - String repoInfo = customCommandExecutionHelper.getRepoInfo(cluster, component, host); + String repoInfo; + try { + repoInfo = repoVersionHelper.getRepoInfo(cluster, component, host); + } catch (SystemException e) { + throw new AmbariException("", e); + } if (LOG.isDebugEnabled()) { LOG.debug("Sending repo information to agent, hostname={}, clusterName={}, stackInfo={}, repoInfo={}", scHost.getHostName(), clusterName, stackId.getStackId(), repoInfo); @@ -2710,7 +2723,6 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle execCmd.setRoleParams(roleParams); execCmd.setCommandParams(commandParams); - execCmd.setRepositoryFile(customCommandExecutionHelper.getCommandRepository(cluster, component, host)); execCmdWrapper.setVersions(cluster); if (execCmd.getConfigurationTags().containsKey("cluster-env")) { @@ -2989,7 +3001,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle if (StringUtils.isBlank(stage.getHostParamsStage())) { RepositoryVersionEntity repositoryVersion = serviceComponent.getDesiredRepositoryVersion(); stage.setHostParamsStage(StageUtils.getGson().toJson( - customCommandExecutionHelper.createDefaultHostParams(cluster, repositoryVersion))); + customCommandExecutionHelper.createDefaultHostParams(cluster, repositoryVersion.getStackId()))); } @@ -3337,7 +3349,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle Map<String, String> hostParamsCmd = customCommandExecutionHelper.createDefaultHostParams( - cluster, scHost.getServiceComponent().getDesiredRepositoryVersion()); + cluster, scHost.getServiceComponent().getDesiredStackId()); Stage stage = createNewStage(0, cluster, 1, "", clusterHostInfoJson, "{}", ""); @@ -4321,56 +4333,10 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle actionManager, actionRequest); - RepositoryVersionEntity desiredRepositoryVersion = null; - - RequestOperationLevel operationLevel = actionExecContext.getOperationLevel(); - if (null != operationLevel && StringUtils.isNotBlank(operationLevel.getServiceName())) { - Service service = cluster.getService(operationLevel.getServiceName()); - if (null != service) { - desiredRepositoryVersion = service.getDesiredRepositoryVersion(); - } - } - - if (null == desiredRepositoryVersion && CollectionUtils.isNotEmpty(actionExecContext.getResourceFilters())) { - Set<RepositoryVersionEntity> versions = new HashSet<>(); - - for (RequestResourceFilter filter : actionExecContext.getResourceFilters()) { - RepositoryVersionEntity repoVersion = null; - - if (StringUtils.isNotBlank(filter.getServiceName())) { - Service service = cluster.getService(filter.getServiceName()); - - if (StringUtils.isNotBlank(filter.getComponentName())) { - ServiceComponent serviceComponent = service.getServiceComponent(filter.getComponentName()); - - repoVersion = serviceComponent.getDesiredRepositoryVersion(); - } - - if (null == repoVersion) { - repoVersion = service.getDesiredRepositoryVersion(); - } - } - - if (null != repoVersion) { - versions.add(repoVersion); - } - } - - if (1 == versions.size()) { - desiredRepositoryVersion = versions.iterator().next(); - } else if (versions.size() > 1) { - Set<String> errors = new HashSet<>(); - for (RepositoryVersionEntity version : versions) { - errors.add(String.format("%s/%s", version.getStackId(), version.getVersion())); - } - throw new IllegalArgumentException(String.format("More than one repository is resolved with this Action: %s", - StringUtils.join(errors, ';'))); - } - } - - - ExecuteCommandJson jsons = customCommandExecutionHelper.getCommandJson(actionExecContext, - cluster, desiredRepositoryVersion, requestContext); + @Experimental(feature=ExperimentalFeature.MULTI_SERVICE, + comment = "This must change with Multi-Service since the cluster won't have a desired stack version") + ExecuteCommandJson jsons = customCommandExecutionHelper.getCommandJson(actionExecContext, cluster, + null == cluster ? null : cluster.getDesiredStackVersion(), requestContext); String commandParamsForStage = jsons.getCommandParamsForStage(); @@ -4649,8 +4615,10 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle for (OperatingSystemEntity operatingSystem: repositoryVersion.getOperatingSystems()) { if (operatingSystem.getOsType().equals(osType)) { for (RepositoryEntity repository: operatingSystem.getRepositories()) { + final RepositoryResponse response = new RepositoryResponse(repository.getBaseUrl(), osType, repository.getRepositoryId(), - repository.getName(), repository.getDistribution(), repository.getComponents(), "", ""); + repository.getName(), repository.getDistribution(), repository.getComponents(), "", "", + repository.getTags()); if (null != versionDefinitionId) { response.setVersionDefinitionId(versionDefinitionId); } else { @@ -4658,6 +4626,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle } response.setStackName(repositoryVersion.getStackName()); response.setStackVersion(repositoryVersion.getStackVersion()); + responses.add(response); } break; @@ -4679,7 +4648,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle for (RepositoryXml.Repo repo : os.getRepos()) { RepositoryResponse resp = new RepositoryResponse(repo.getBaseUrl(), os.getFamily(), repo.getRepoId(), repo.getRepoName(), repo.getDistribution(), repo.getComponents(), repo.getMirrorsList(), - repo.getBaseUrl()); + repo.getBaseUrl(), Collections.<RepoTag>emptySet()); resp.setVersionDefinitionId(versionDefinitionId); resp.setStackName(stackId.getStackName());
http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java index eff1e77..f2ff181 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java @@ -63,7 +63,6 @@ import org.apache.ambari.server.configuration.Configuration; import org.apache.ambari.server.configuration.Configuration.ConnectionPoolType; import org.apache.ambari.server.configuration.Configuration.DatabaseType; import org.apache.ambari.server.controller.internal.AlertTargetResourceProvider; -import org.apache.ambari.server.controller.internal.AmbariConfigurationResourceProvider; import org.apache.ambari.server.controller.internal.ClusterSettingResourceProvider; import org.apache.ambari.server.controller.internal.ClusterStackVersionResourceProvider; import org.apache.ambari.server.controller.internal.ComponentResourceProvider; @@ -74,6 +73,7 @@ import org.apache.ambari.server.controller.internal.HostResourceProvider; import org.apache.ambari.server.controller.internal.KerberosDescriptorResourceProvider; import org.apache.ambari.server.controller.internal.MemberResourceProvider; import org.apache.ambari.server.controller.internal.RepositoryVersionResourceProvider; +import org.apache.ambari.server.controller.internal.RootServiceComponentConfigurationResourceProvider; import org.apache.ambari.server.controller.internal.ServiceDependencyResourceProvider; import org.apache.ambari.server.controller.internal.ServiceGroupDependencyResourceProvider; import org.apache.ambari.server.controller.internal.ServiceGroupResourceProvider; @@ -495,10 +495,10 @@ public class ControllerModule extends AbstractModule { .implement(ResourceProvider.class, Names.named("credential"), CredentialResourceProvider.class) .implement(ResourceProvider.class, Names.named("kerberosDescriptor"), KerberosDescriptorResourceProvider.class) .implement(ResourceProvider.class, Names.named("upgrade"), UpgradeResourceProvider.class) - .implement(ResourceProvider.class, Names.named("ambariConfiguration"), AmbariConfigurationResourceProvider.class) .implement(ResourceProvider.class, Names.named("clusterStackVersion"), ClusterStackVersionResourceProvider.class) .implement(ResourceProvider.class, Names.named("alertTarget"), AlertTargetResourceProvider.class) .implement(ResourceProvider.class, Names.named("viewInstance"), ViewInstanceResourceProvider.class) + .implement(ResourceProvider.class, Names.named("rootServiceHostComponentConfiguration"), RootServiceComponentConfigurationResourceProvider.class) .build(ResourceProviderFactory.class)); install(new FactoryModuleBuilder().implement( http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/DeleteIdentityHandler.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/DeleteIdentityHandler.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/DeleteIdentityHandler.java index f5d51c3..cc84ce2 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/DeleteIdentityHandler.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/DeleteIdentityHandler.java @@ -228,8 +228,7 @@ class DeleteIdentityHandler { calculateConfig(kerberosDescriptor, serviceNames()), new HashMap<>(), false, - new HashMap<>(), - false); + new HashMap<>()); return createCommandReport(0, HostRoleStatus.COMPLETED, "{}", actionLog.getStdOut(), actionLog.getStdErr()); } http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java index b8e1be1..749943d 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java @@ -33,6 +33,7 @@ import org.apache.ambari.server.serveraction.kerberos.KerberosIdentityDataFileWr import org.apache.ambari.server.serveraction.kerberos.KerberosInvalidConfigurationException; import org.apache.ambari.server.serveraction.kerberos.KerberosMissingAdminCredentialsException; import org.apache.ambari.server.serveraction.kerberos.KerberosOperationException; +import org.apache.ambari.server.serveraction.kerberos.stageutils.ResolvedKerberosKeytab; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.SecurityType; import org.apache.ambari.server.state.ServiceComponentHost; @@ -588,15 +589,15 @@ public interface KerberosHelper { * values * @param configurations a Map of configurations to use a replacements for variables * in identity fields - * @param ignoreHeadless boolean value to specify if headless principals must not be processed * @return an integer indicating the number of identities added to the data file * @throws java.io.IOException if an error occurs while writing a record to the data file */ int addIdentities(KerberosIdentityDataFileWriter kerberosIdentityDataFileWriter, Collection<KerberosIdentityDescriptor> identities, - Collection<String> identityFilter, String hostname, String serviceName, + Collection<String> identityFilter, String hostname, Long hostId, String serviceName, String componentName, Map<String, Map<String, String>> kerberosConfigurations, - Map<String, Map<String, String>> configurations, boolean ignoreHeadless) + Map<String, Map<String, String>> configurations, + Map<String, ResolvedKerberosKeytab> resolvedKeytabs, String realm) throws IOException; /** * Calculates the map of configurations relative to the cluster and host. @@ -735,6 +736,20 @@ public interface KerberosHelper { PrincipalKeyCredential getKDCAdministratorCredentials(String clusterName) throws AmbariException; /** + * Saves underlying entities in persistent storage. + * + * @param resolvedKerberosKeytab kerberos keytab to be persisted + */ + void processResolvedKeytab(ResolvedKerberosKeytab resolvedKerberosKeytab); + + /** + * Removes existent persisted keytabs if they are not in {@code expectedKeytabs} collection. + * + * @param expectedKeytabs collection to compare existent keytabs + */ + void removeStaleKeytabs(Collection<ResolvedKerberosKeytab> expectedKeytabs); + + /** * Translates a collection of configuration specifications (<code>config-type/property-name</code>) * to a map of configuration types to a set of property names. * <p> http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java index 4f14614..ab85aa1 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java @@ -60,8 +60,11 @@ import org.apache.ambari.server.controller.internal.RequestStageContainer; import org.apache.ambari.server.controller.utilities.KerberosChecker; import org.apache.ambari.server.metadata.RoleCommandOrder; import org.apache.ambari.server.orm.dao.ArtifactDAO; +import org.apache.ambari.server.orm.dao.KerberosKeytabDAO; import org.apache.ambari.server.orm.dao.KerberosPrincipalDAO; +import org.apache.ambari.server.orm.dao.KerberosPrincipalHostDAO; import org.apache.ambari.server.orm.entities.ArtifactEntity; +import org.apache.ambari.server.orm.entities.KerberosKeytabEntity; import org.apache.ambari.server.security.credential.Credential; import org.apache.ambari.server.security.credential.PrincipalKeyCredential; import org.apache.ambari.server.security.encryption.CredentialStoreService; @@ -91,6 +94,7 @@ import org.apache.ambari.server.serveraction.kerberos.PrepareDisableKerberosServ import org.apache.ambari.server.serveraction.kerberos.PrepareEnableKerberosServerAction; import org.apache.ambari.server.serveraction.kerberos.PrepareKerberosIdentitiesServerAction; import org.apache.ambari.server.serveraction.kerberos.UpdateKerberosConfigsServerAction; +import org.apache.ambari.server.serveraction.kerberos.stageutils.ResolvedKerberosKeytab; import org.apache.ambari.server.stageplanner.RoleGraph; import org.apache.ambari.server.stageplanner.RoleGraphFactory; import org.apache.ambari.server.state.Cluster; @@ -125,12 +129,14 @@ import org.apache.ambari.server.utils.StageUtils; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import org.apache.directory.server.kerberos.shared.keytab.Keytab; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Singleton; @@ -202,6 +208,12 @@ public class KerberosHelperImpl implements KerberosHelper { @Inject private ArtifactDAO artifactDAO; + @Inject + private KerberosKeytabDAO kerberosKeytabDAO; + + @Inject + KerberosPrincipalHostDAO kerberosPrincipalHostDAO; + /** * The injector used to create new instances of helper classes like CreatePrincipalsServerAction * and CreateKeytabFilesServerAction. @@ -455,8 +467,8 @@ public class KerberosHelperImpl implements KerberosHelper { // If Ambari is managing it own identities then add AMBARI to the set of installed service so // that its Kerberos descriptor entries will be included. if (createAmbariIdentities(existingConfigurations.get(KERBEROS_ENV))) { - installedServices = new HashMap<String, Set<String>>(installedServices); - installedServices.put("AMBARI", Collections.singleton("AMBARI_SERVER")); + installedServices = new HashMap<>(installedServices); + installedServices.put(RootService.AMBARI.name(), Collections.singleton(RootComponent.AMBARI_SERVER.name())); } // Create the context to use for filtering Kerberos Identities based on the state of the cluster @@ -1484,9 +1496,10 @@ public class KerberosHelperImpl implements KerberosHelper { @Override public int addIdentities(KerberosIdentityDataFileWriter kerberosIdentityDataFileWriter, Collection<KerberosIdentityDescriptor> identities, - Collection<String> identityFilter, String hostname, String serviceName, + Collection<String> identityFilter, String hostname, Long hostId, String serviceName, String componentName, Map<String, Map<String, String>> kerberosConfigurations, - Map<String, Map<String, String>> configurations, boolean ignoreHeadless) + Map<String, Map<String, String>> configurations, + Map<String, ResolvedKerberosKeytab> resolvedKeytabs, String realm) throws IOException { int identitiesAdded = 0; @@ -1514,7 +1527,6 @@ public class KerberosHelperImpl implements KerberosHelper { String keytabFileGroupName = null; String keytabFileGroupAccess = null; String keytabFileConfiguration = null; - boolean keytabIsCachable = false; if (keytabDescriptor != null) { keytabFilePath = variableReplacementHelper.replaceVariables(keytabDescriptor.getFile(), configurations); @@ -1523,24 +1535,109 @@ public class KerberosHelperImpl implements KerberosHelper { keytabFileGroupName = variableReplacementHelper.replaceVariables(keytabDescriptor.getGroupName(), configurations); keytabFileGroupAccess = variableReplacementHelper.replaceVariables(keytabDescriptor.getGroupAccess(), configurations); keytabFileConfiguration = variableReplacementHelper.replaceVariables(keytabDescriptor.getConfiguration(), configurations); - keytabIsCachable = keytabDescriptor.isCachable(); + } + // Evaluate the principal "pattern" found in the record to generate the "evaluated principal" + // by replacing the _HOST and _REALM variables. + String evaluatedPrincipal = principal.replace("_HOST", hostname).replace("_REALM", realm); + + ResolvedKerberosKeytab resolvedKeytab = new ResolvedKerberosKeytab( + keytabFilePath, + keytabFileOwnerName, + keytabFileOwnerAccess, + keytabFileGroupName, + keytabFileGroupAccess, + Sets.newHashSet(Pair.of(hostId, Pair.of(evaluatedPrincipal, principalType))), + serviceName.equalsIgnoreCase(RootService.AMBARI.name()), + componentName.equalsIgnoreCase("AMBARI_SERVER_SELF") + ); + if (resolvedKeytabs.containsKey(keytabFilePath)) { + ResolvedKerberosKeytab sameKeytab = resolvedKeytabs.get(keytabFilePath); + // validating owner and group + boolean differentOwners = false; + String warnTemplate = "Keytab '{}' on host '{}' has different {}, originally set to '{}' and '{}:{}' has '{}', using '{}'"; + if (!resolvedKeytab.getOwnerName().equals(sameKeytab.getOwnerName())) { + LOG.warn(warnTemplate, + keytabFilePath, hostname, "owners", sameKeytab.getOwnerName(), + serviceName, componentName, resolvedKeytab.getOwnerName(), + sameKeytab.getOwnerName()); + differentOwners = true; + } + if (!resolvedKeytab.getOwnerAccess().equals(sameKeytab.getOwnerAccess())) { + LOG.warn(warnTemplate, + keytabFilePath, hostname, "owner access", sameKeytab.getOwnerAccess(), + serviceName, componentName, resolvedKeytab.getOwnerAccess(), + sameKeytab.getOwnerAccess()); + } + // TODO probably fail on group difference. Some services can inject its principals to same keytab, but + // TODO with different owners, so make sure that keytabs are accessible through group acls + // TODO this includes same group name and group 'r' mode + if (!resolvedKeytab.getGroupName().equals(sameKeytab.getGroupName())) { + if(differentOwners) { + LOG.error(warnTemplate, + keytabFilePath, hostname, "groups", sameKeytab.getGroupName(), + serviceName, componentName, resolvedKeytab.getGroupName(), + sameKeytab.getGroupName()); + } else { + LOG.warn(warnTemplate, + keytabFilePath, hostname, "groups", sameKeytab.getGroupName(), + serviceName, componentName, resolvedKeytab.getGroupName(), + sameKeytab.getGroupName()); + } + } + if (!resolvedKeytab.getGroupAccess().equals(sameKeytab.getGroupAccess())) { + if(differentOwners) { + if (!sameKeytab.getGroupAccess().contains("r")) { + LOG.error("Keytab '{}' on host '{}' referenced by multiple identities which have different owners," + + "but 'r' attribute missing for group. Make sure all users (that need this keytab) are in '{}' +" + + "group and keytab can be read by this group", + keytabFilePath, + hostname, + sameKeytab.getGroupName() + ); + } + LOG.error(warnTemplate, + keytabFilePath, hostname, "group access", sameKeytab.getGroupAccess(), + serviceName, componentName, resolvedKeytab.getGroupAccess(), + sameKeytab.getGroupAccess()); + } else { + LOG.warn(warnTemplate, + keytabFilePath, hostname, "group access", sameKeytab.getGroupAccess(), + serviceName, componentName, resolvedKeytab.getGroupAccess(), + sameKeytab.getGroupAccess()); + } + } + // end validating + // merge principal to keytab + sameKeytab.getMappedPrincipals().addAll(resolvedKeytab.getMappedPrincipals()); + // ensure that keytab file on ambari-server host creating jass file + if (sameKeytab.isMustWriteAmbariJaasFile() || resolvedKeytab.isMustWriteAmbariJaasFile()) { + sameKeytab.setMustWriteAmbariJaasFile(true); + } + // ensure that this keytab is ambari-keytab, server will distribute it manually + if (sameKeytab.isAmbariServerKeytab() || resolvedKeytab.isAmbariServerKeytab()) { + sameKeytab.setAmbariServerKeytab(true); + } + } else { + resolvedKeytabs.put(keytabFilePath, resolvedKeytab); + LOG.info("Keytab {} owner:'{}:{}', group:'{}:{}' is defined", keytabFilePath, + keytabFileOwnerName, keytabFileOwnerAccess, keytabFileGroupName, keytabFileGroupAccess); } // Append an entry to the action data file builder... + // TODO obsolete, move to ResolvedKerberosKeytab if(kerberosIdentityDataFileWriter != null) { kerberosIdentityDataFileWriter.writeRecord( hostname, serviceName, componentName, - principal, + evaluatedPrincipal, principalType, keytabFilePath, keytabFileOwnerName, keytabFileOwnerAccess, keytabFileGroupName, keytabFileGroupAccess, - (keytabIsCachable) ? "true" : "false", - (ignoreHeadless && principalDescriptor.getType() == KerberosPrincipalType.USER) ? "true" : "false"); + "true"); } // Add the principal-related configuration to the map of configurations @@ -1793,6 +1890,48 @@ public class KerberosHelperImpl implements KerberosHelper { } } + /** + * Creates and saves underlying {@link org.apache.ambari.server.orm.entities.KerberosPrincipalEntity}, + * {@link org.apache.ambari.server.orm.entities.KerberosKeytabEntity} and + * {@link org.apache.ambari.server.orm.entities.KerberosPrincipalHostEntity} entities in JPA storage. + * + * @param resolvedKerberosKeytab kerberos keytab to be persisted + */ + @Override + public void processResolvedKeytab(ResolvedKerberosKeytab resolvedKerberosKeytab) { + if (kerberosKeytabDAO.find(resolvedKerberosKeytab.getFile()) == null) { + kerberosKeytabDAO.create(resolvedKerberosKeytab.getFile()); + } + for (Pair<Long, Pair<String, String>> principalPair : resolvedKerberosKeytab.getMappedPrincipals()) { + Pair<String, String> principal = principalPair.getRight(); + String principalName = principal.getLeft(); + String principalType = principal.getRight(); + Long hostId = principalPair.getLeft(); + if (!kerberosPrincipalDAO.exists(principalName)) { + kerberosPrincipalDAO.create(principalName, "service".equalsIgnoreCase(principalType)); + } + if (hostId != null) { + if(!kerberosPrincipalHostDAO.exists(principalName, hostId, resolvedKerberosKeytab.getFile())) { + kerberosPrincipalHostDAO.create(principalName, hostId, resolvedKerberosKeytab.getFile()); + } + } + } + } + + @Override + public void removeStaleKeytabs(Collection<ResolvedKerberosKeytab> expectedKeytabs) { + List<KerberosKeytabEntity> allKeytabs = kerberosKeytabDAO.findAll(); + Set<KerberosKeytabEntity> staleKeytabs; + staleKeytabs = allKeytabs != null ? new HashSet<>(allKeytabs) : Collections.emptySet(); + for (ResolvedKerberosKeytab keytab : expectedKeytabs) { + staleKeytabs.remove(new KerberosKeytabEntity(keytab.getFile())); + } + for (KerberosKeytabEntity staleKeytab: staleKeytabs) { + kerberosPrincipalHostDAO.removeByKeytabPath(staleKeytab.getKeytabPath()); + kerberosKeytabDAO.remove(staleKeytab); + } + } + @Override public Map<String, Set<String>> translateConfigurationSpecifications(Collection<String> configurationSpecifications) { Map<String, Set<String>> translation = null; @@ -2181,6 +2320,17 @@ public class KerberosHelperImpl implements KerberosHelper { if (sch.getState() == State.INSTALLED) { String hostname = sch.getHostName(); + if(kerberosKeytabDAO.find(keytabFilePath) == null) { + kerberosKeytabDAO.create(keytabFilePath); + } + // create principals + if (!kerberosPrincipalDAO.exists(principal)) { + kerberosPrincipalDAO.create(principal, false); + } + if (!kerberosPrincipalHostDAO.exists(principal, sch.getHost().getHostId(), keytabFilePath)) { + kerberosPrincipalHostDAO.create(principal, sch.getHost().getHostId(), keytabFilePath); + } + kerberosIdentityDataFileWriter.writeRecord( hostname, Service.Type.KERBEROS.name(), @@ -2192,7 +2342,6 @@ public class KerberosHelperImpl implements KerberosHelper { keytabFileOwnerAccess, keytabFileGroupName, keytabFileGroupAccess, - "false", "false"); hostsWithValidKerberosClient.add(hostname); http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/MaintenanceStateHelper.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/MaintenanceStateHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/MaintenanceStateHelper.java index d9a585f..1ffe841 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/MaintenanceStateHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/MaintenanceStateHelper.java @@ -24,7 +24,6 @@ import java.util.Set; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.HostNotFoundException; -import org.apache.ambari.server.controller.RootServiceResponseFactory.Services; import org.apache.ambari.server.controller.internal.RequestOperationLevel; import org.apache.ambari.server.controller.internal.RequestResourceFilter; import org.apache.ambari.server.controller.spi.Resource; @@ -265,7 +264,7 @@ public class MaintenanceStateHelper { } // the AMBARI service is not a real service; it's never in MM - if( StringUtils.equals(Services.AMBARI.name(), serviceName)){ + if( StringUtils.equals(RootService.AMBARI.name(), serviceName)){ return MaintenanceState.OFF; } http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java index 8c68f41..6d0f3fb 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java @@ -18,6 +18,10 @@ package org.apache.ambari.server.controller; +import java.util.Set; + +import org.apache.ambari.server.state.stack.RepoTag; + public class RepositoryResponse { private String stackName; @@ -34,10 +38,11 @@ public class RepositoryResponse { private String versionDefinitionId; private Long clusterVersionId; private boolean unique; + private Set<RepoTag> tags; public RepositoryResponse(String baseUrl, String osType, String repoId, String repoName, String distribution, String components, - String mirrorsList, String defaultBaseUrl) { + String mirrorsList, String defaultBaseUrl, Set<RepoTag> repoTags) { setBaseUrl(baseUrl); setOsType(osType); setRepoId(repoId); @@ -46,6 +51,7 @@ public class RepositoryResponse { setComponents(components); setMirrorsList(mirrorsList); setDefaultBaseUrl(defaultBaseUrl); + setTags(repoTags); } public String getStackName() { @@ -177,4 +183,19 @@ public class RepositoryResponse { public void setUnique(boolean unique) { this.unique = unique; } + + + /** + * @return the repo tags + */ + public Set<RepoTag> getTags() { + return tags; + } + + /** + * @param repoTags the repo tags + */ + public void setTags(Set<RepoTag> repoTags) { + tags = repoTags; + } } http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java index a6c69af..8504d07 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java @@ -79,8 +79,8 @@ public interface ResourceProviderFactory { @Named("upgrade") UpgradeResourceProvider getUpgradeResourceProvider(AmbariManagementController managementController); - @Named("ambariConfiguration") - ResourceProvider getAmbariConfigurationResourceProvider(); + @Named("rootServiceHostComponentConfiguration") + ResourceProvider getRootServiceHostComponentConfigurationResourceProvider(); @Named("clusterStackVersion") ClusterStackVersionResourceProvider getClusterStackVersionResourceProvider(AmbariManagementController managementController); http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/RootComponent.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootComponent.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootComponent.java new file mode 100644 index 0000000..74cdfcf --- /dev/null +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootComponent.java @@ -0,0 +1,27 @@ +/* + * 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.controller; + +/** + * RootComponent is an enumeration of root-level components. + */ +public enum RootComponent { + AMBARI_SERVER, + AMBARI_AGENT +} http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/RootService.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootService.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootService.java new file mode 100644 index 0000000..22f571d --- /dev/null +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootService.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ambari.server.controller; + +/** + * RootService is an enumeration of root-level services. + */ +public enum RootService { + AMBARI(RootComponent.values()); + + private final RootComponent[] components; + + RootService(RootComponent[] components) { + this.components = components; + } + + public RootComponent[] getComponents() { + return components; + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceResponseFactory.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceResponseFactory.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceResponseFactory.java index ad9ed20..63d41fd 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceResponseFactory.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceResponseFactory.java @@ -62,9 +62,9 @@ public class RootServiceResponseFactory extends serviceName = request.getServiceName(); if (serviceName != null) { - Services service; + RootService service; try { - service = Services.valueOf(serviceName); + service = RootService.valueOf(serviceName); } catch (IllegalArgumentException ex) { throw new ObjectNotFoundException("Root service name: " + serviceName); @@ -74,7 +74,7 @@ public class RootServiceResponseFactory extends } else { response = new HashSet<>(); - for (Services service: Services.values()) + for (RootService service: RootService.values()) response.add(new RootServiceResponse(service.toString())); } return response; @@ -87,10 +87,10 @@ public class RootServiceResponseFactory extends String serviceName = request.getServiceName(); String componentName = request.getComponentName(); - Services service; + RootService service; try { - service = Services.valueOf(serviceName); + service = RootService.valueOf(serviceName); } catch (IllegalArgumentException ex) { throw new ObjectNotFoundException("Root service name: " + serviceName); @@ -100,9 +100,9 @@ public class RootServiceResponseFactory extends } if (componentName != null) { - Components component; + RootComponent component; try { - component = Components.valueOf(componentName); + component = RootComponent.valueOf(componentName); if (!ArrayUtils.contains(service.getComponents(), component)) throw new ObjectNotFoundException("No component name: " + componentName + "in service: " + serviceName); } @@ -114,7 +114,7 @@ public class RootServiceResponseFactory extends getComponentProperties(componentName))); } else { - for (Components component: service.getComponents()) + for (RootComponent component: service.getComponents()) response.add(new RootServiceComponentResponse(serviceName, component.toString(), getComponentVersion(component.name(), null), getComponentProperties(component.name()))); @@ -123,7 +123,7 @@ public class RootServiceResponseFactory extends } private String getComponentVersion(String componentName, HostResponse host) { - Components component = Components.valueOf(componentName); + RootComponent component = RootComponent.valueOf(componentName); String componentVersion; switch (component) { @@ -150,10 +150,10 @@ public class RootServiceResponseFactory extends Map<String, String> response; Set<String> propertiesToHideInResponse; - Components component = null; + RootComponent component = null; if (componentName != null) { - component = Components.valueOf(componentName); + component = RootComponent.valueOf(componentName); switch (component) { case AMBARI_SERVER: @@ -176,24 +176,6 @@ public class RootServiceResponseFactory extends return response; } - - public enum Services { - AMBARI(Components.values()); - private Components[] components; - - Services(Components[] components) { - this.components = components; - } - - public Components[] getComponents() { - return components; - } - } - - public enum Components { - AMBARI_SERVER, AMBARI_AGENT - } - @Override public Set<RootServiceHostComponentResponse> getRootServiceHostComponent(RootServiceHostComponentRequest request, Set<HostResponse> hosts) throws AmbariException { Set<RootServiceHostComponentResponse> response = new HashSet<>(); @@ -208,7 +190,7 @@ public class RootServiceResponseFactory extends Set<HostResponse> filteredHosts = new HashSet<>(hosts); //Make some filtering of hosts if need - if (component.getComponentName().equals(Components.AMBARI_SERVER.name())) { + if (component.getComponentName().equals(RootComponent.AMBARI_SERVER.name())) { CollectionUtils.filter(filteredHosts, new Predicate() { @Override public boolean evaluate(Object arg0) { @@ -220,7 +202,7 @@ public class RootServiceResponseFactory extends for (HostResponse host : filteredHosts) { String state; - if (component.getComponentName().equals(Components.AMBARI_SERVER.name())) { + if (component.getComponentName().equals(RootComponent.AMBARI_SERVER.name())) { state = RUNNING_STATE; } else { state = host.getHostState().toString(); http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java index 5cc2116..5104354 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java @@ -232,6 +232,8 @@ public abstract class AbstractControllerResourceProvider extends AbstractAuthori return new RootServiceResourceProvider(propertyIds, keyPropertyIds, managementController); case RootServiceComponent: return new RootServiceComponentResourceProvider(propertyIds, keyPropertyIds, managementController); + case RootServiceComponentConfiguration: + return resourceProviderFactory.getRootServiceHostComponentConfigurationResourceProvider(); case RootServiceHostComponent: return new RootServiceHostComponentResourceProvider(propertyIds, keyPropertyIds, managementController); case ConfigGroup: @@ -280,8 +282,6 @@ public abstract class AbstractControllerResourceProvider extends AbstractAuthori return new ClusterKerberosDescriptorResourceProvider(managementController); case LoggingQuery: return new LoggingResourceProvider(propertyIds, keyPropertyIds, managementController); - case AmbariConfiguration: - return resourceProviderFactory.getAmbariConfigurationResourceProvider(); case AlertTarget: return resourceProviderFactory.getAlertTargetResourceProvider(); case ViewInstance: http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractPropertyProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractPropertyProvider.java index 322596e..05b0eaa 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractPropertyProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractPropertyProvider.java @@ -45,12 +45,16 @@ import org.apache.ambari.server.security.authorization.AuthorizationHelper; import org.apache.ambari.server.security.authorization.ResourceType; import org.apache.ambari.server.security.authorization.RoleAuthorization; import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Abstract property provider implementation. */ public abstract class AbstractPropertyProvider extends BaseProvider implements PropertyProvider { + private static final Logger LOG = LoggerFactory.getLogger(AbstractPropertyProvider.class); + /** * The property/metric information for this provider keyed by component name / property id. */ http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java index 0c32da6..f385f7e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java @@ -267,7 +267,7 @@ public abstract class AbstractProviderModule implements ProviderModule, private volatile boolean initialized = false; - protected final static Logger LOG = + private static final Logger LOG = LoggerFactory.getLogger(AbstractProviderModule.class); http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java index 5598650..21a70ca 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java @@ -68,7 +68,7 @@ public abstract class AbstractResourceProvider extends BaseProvider implements R */ private final Set<ResourceProviderObserver> observers = new HashSet<>(); - protected final static Logger LOG = LoggerFactory.getLogger(AbstractResourceProvider.class); + protected static final Logger LOG = LoggerFactory.getLogger(AbstractResourceProvider.class); protected final static String PROPERTIES_ATTRIBUTES_REGEX = "properties_attributes/[a-zA-Z][a-zA-Z._-]*$"; public static Pattern propertiesAttributesPattern = Pattern.compile(".*/" + PROPERTIES_ATTRIBUTES_REGEX); http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java index 4e618e7..290931555 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java @@ -43,9 +43,13 @@ import org.apache.ambari.server.controller.spi.SystemException; import org.apache.ambari.server.controller.spi.UnsupportedPropertyException; import org.apache.ambari.server.controller.utilities.PropertyHelper; import org.apache.ambari.server.customactions.ActionDefinition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ActionResourceProvider extends AbstractControllerResourceProvider { + private static final Logger LOG = LoggerFactory.getLogger(ActionResourceProvider.class); + public static final String ACTION_NAME_PROPERTY_ID = PropertyHelper .getPropertyId("Actions", "action_name"); public static final String ACTION_TYPE_PROPERTY_ID = PropertyHelper http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertDefinitionResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertDefinitionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertDefinitionResourceProvider.java index 32f1fd8..9579dca 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertDefinitionResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertDefinitionResourceProvider.java @@ -61,6 +61,8 @@ import org.apache.ambari.server.state.alert.Scope; import org.apache.ambari.server.state.alert.SourceType; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.gson.Gson; import com.google.gson.JsonElement; @@ -73,6 +75,8 @@ import com.google.inject.Inject; @StaticallyInject public class AlertDefinitionResourceProvider extends AbstractControllerResourceProvider { + private static final Logger LOG = LoggerFactory.getLogger(AlertDefinitionResourceProvider.class); + protected static final String ALERT_DEF = "AlertDefinition"; protected static final String ALERT_DEF_CLUSTER_NAME = "AlertDefinition/cluster_name"; http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertGroupResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertGroupResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertGroupResourceProvider.java index cf4e747..0898bc3 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertGroupResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertGroupResourceProvider.java @@ -49,6 +49,8 @@ import org.apache.ambari.server.security.authorization.AuthorizationException; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.alert.AlertTarget; import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.inject.Inject; @@ -61,6 +63,8 @@ import com.google.inject.Inject; public class AlertGroupResourceProvider extends AbstractControllerResourceProvider { + private static final Logger LOG = LoggerFactory.getLogger(AlertGroupResourceProvider.class); + public static final String ALERT_GROUP = "AlertGroup"; public static final String ALERT_GROUP_ID = "AlertGroup/id"; public static final String ALERT_GROUP_CLUSTER_NAME = "AlertGroup/cluster_name"; http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertResourceProvider.java index c71651e..4ab78b7 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertResourceProvider.java @@ -50,6 +50,8 @@ import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.ConfigHelper; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.inject.Inject; import com.google.inject.Provider; @@ -61,6 +63,8 @@ import com.google.inject.Provider; public class AlertResourceProvider extends ReadOnlyResourceProvider implements ExtendedResourceProvider { + private static final Logger LOG = LoggerFactory.getLogger(AlertResourceProvider.class); + public static final String ALERT_ID = "Alert/id"; public static final String ALERT_STATE = "Alert/state"; public static final String ALERT_ORIGINAL_TIMESTAMP = "Alert/original_timestamp"; http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java index 43ee7fe..c1e9eb4 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java @@ -53,6 +53,8 @@ import org.apache.ambari.server.state.AlertState; import org.apache.ambari.server.state.alert.AlertGroup; import org.apache.ambari.server.state.alert.AlertTarget; import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.gson.Gson; import com.google.inject.Inject; @@ -67,6 +69,8 @@ import com.google.inject.persist.Transactional; public class AlertTargetResourceProvider extends AbstractAuthorizedResourceProvider { + private static final Logger LOG = LoggerFactory.getLogger(AlertTargetResourceProvider.class); + public static final String ALERT_TARGET = "AlertTarget"; public static final String ALERT_TARGET_ID = "AlertTarget/id"; public static final String ALERT_TARGET_NAME = "AlertTarget/name"; http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariConfigurationResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariConfigurationResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariConfigurationResourceProvider.java deleted file mode 100644 index 4f4cc70..0000000 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariConfigurationResourceProvider.java +++ /dev/null @@ -1,328 +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.controller.internal; - -import java.util.Calendar; -import java.util.Collections; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.inject.Inject; - -import org.apache.ambari.server.AmbariException; -import org.apache.ambari.server.controller.spi.NoSuchParentResourceException; -import org.apache.ambari.server.controller.spi.NoSuchResourceException; -import org.apache.ambari.server.controller.spi.Predicate; -import org.apache.ambari.server.controller.spi.Request; -import org.apache.ambari.server.controller.spi.RequestStatus; -import org.apache.ambari.server.controller.spi.Resource; -import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException; -import org.apache.ambari.server.controller.spi.SystemException; -import org.apache.ambari.server.controller.spi.UnsupportedPropertyException; -import org.apache.ambari.server.controller.utilities.PredicateHelper; -import org.apache.ambari.server.events.AmbariEvent; -import org.apache.ambari.server.events.AmbariLdapConfigChangedEvent; -import org.apache.ambari.server.events.publishers.AmbariEventPublisher; -import org.apache.ambari.server.orm.dao.AmbariConfigurationDAO; -import org.apache.ambari.server.orm.entities.AmbariConfigurationEntity; -import org.apache.ambari.server.orm.entities.ConfigurationBaseEntity; -import org.apache.ambari.server.security.authorization.RoleAuthorization; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.collect.Sets; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.inject.assistedinject.AssistedInject; - -/** - * Resource provider for AmbariConfiguration resources. - */ -public class AmbariConfigurationResourceProvider extends AbstractAuthorizedResourceProvider { - - private static final Logger LOGGER = LoggerFactory.getLogger(AmbariConfigurationResourceProvider.class); - private static final String DEFAULT_VERSION_TAG = "Default version"; - private static final Integer DEFAULT_VERSION = 1; - - /** - * Resource property id constants. - */ - public enum ResourcePropertyId { - - ID("AmbariConfiguration/id"), - TYPE("AmbariConfiguration/type"), - VERSION("AmbariConfiguration/version"), - VERSION_TAG("AmbariConfiguration/version_tag"), - DATA("AmbariConfiguration/data"); - - private String propertyId; - - ResourcePropertyId(String propertyId) { - this.propertyId = propertyId; - } - - String getPropertyId() { - return this.propertyId; - } - - public static ResourcePropertyId fromString(String propertyIdStr) { - ResourcePropertyId propertyIdFromStr = null; - - for (ResourcePropertyId id : ResourcePropertyId.values()) { - if (id.getPropertyId().equals(propertyIdStr)) { - propertyIdFromStr = id; - break; - } - } - - if (propertyIdFromStr == null) { - throw new IllegalArgumentException("Unsupported property type: " + propertyIdStr); - } - - return propertyIdFromStr; - - } - } - - private static Set<String> PROPERTIES = Sets.newHashSet( - ResourcePropertyId.ID.getPropertyId(), - ResourcePropertyId.TYPE.getPropertyId(), - ResourcePropertyId.VERSION.getPropertyId(), - ResourcePropertyId.VERSION_TAG.getPropertyId(), - ResourcePropertyId.DATA.getPropertyId()); - - private static Map<Resource.Type, String> PK_PROPERTY_MAP = Collections.unmodifiableMap( - new HashMap<Resource.Type, String>() {{ - put(Resource.Type.AmbariConfiguration, ResourcePropertyId.ID.getPropertyId()); - }} - ); - - - @Inject - private AmbariConfigurationDAO ambariConfigurationDAO; - - @Inject - private AmbariEventPublisher publisher; - - - private Gson gson; - - @AssistedInject - public AmbariConfigurationResourceProvider() { - super(PROPERTIES, PK_PROPERTY_MAP); - setRequiredCreateAuthorizations(EnumSet.of(RoleAuthorization.AMBARI_MANAGE_CONFIGURATION)); - setRequiredDeleteAuthorizations(EnumSet.of(RoleAuthorization.AMBARI_MANAGE_CONFIGURATION)); - - gson = new GsonBuilder().create(); - } - - @Override - protected Set<String> getPKPropertyIds() { - return Sets.newHashSet(ResourcePropertyId.ID.getPropertyId()); - } - - @Override - public RequestStatus createResourcesAuthorized(Request request) throws SystemException, UnsupportedPropertyException, - ResourceAlreadyExistsException, NoSuchParentResourceException { - - LOGGER.info("Creating new ambari configuration resource ..."); - AmbariConfigurationEntity ambariConfigurationEntity = null; - try { - ambariConfigurationEntity = getEntityFromRequest(request); - } catch (AmbariException e) { - throw new NoSuchParentResourceException(e.getMessage()); - } - - LOGGER.info("Persisting new ambari configuration: {} ", ambariConfigurationEntity); - - try { - ambariConfigurationDAO.create(ambariConfigurationEntity); - } catch (Exception e) { - LOGGER.error("Failed to create resource", e); - throw new ResourceAlreadyExistsException(e.getMessage()); - } - - // todo filter by configuration type - // notify subscribers about the configuration changes - publisher.publish(new AmbariLdapConfigChangedEvent(AmbariEvent.AmbariEventType.LDAP_CONFIG_CHANGED, - ambariConfigurationEntity.getId())); - - return getRequestStatus(null); - } - - - @Override - protected Set<Resource> getResourcesAuthorized(Request request, Predicate predicate) throws SystemException, - UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException { - Set<Resource> resources = Sets.newHashSet(); - - // retrieves allconfigurations, filtering is done at a higher level - List<AmbariConfigurationEntity> ambariConfigurationEntities = ambariConfigurationDAO.findAll(); - for (AmbariConfigurationEntity ambariConfigurationEntity : ambariConfigurationEntities) { - try { - resources.add(toResource(ambariConfigurationEntity, getPropertyIds())); - } catch (AmbariException e) { - LOGGER.error("Error while retrieving ambari configuration", e); - } - } - return resources; - } - - @Override - protected RequestStatus deleteResourcesAuthorized(Request request, Predicate predicate) throws SystemException, - UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException { - - Long idFromRequest = Long.valueOf((String) PredicateHelper.getProperties(predicate).get(ResourcePropertyId.ID.getPropertyId())); - - if (null == idFromRequest) { - LOGGER.debug("No resource id provided in the request"); - } else { - LOGGER.debug("Deleting amari configuration with id: {}", idFromRequest); - try { - ambariConfigurationDAO.removeByPK(idFromRequest); - } catch (IllegalStateException e) { - throw new NoSuchResourceException(e.getMessage()); - } - - } - - // notify subscribers about the configuration changes - publisher.publish(new AmbariLdapConfigChangedEvent(AmbariEvent.AmbariEventType.LDAP_CONFIG_CHANGED, idFromRequest)); - - - return getRequestStatus(null); - - } - - @Override - protected RequestStatus updateResourcesAuthorized(Request request, Predicate predicate) throws SystemException, - UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException { - Long idFromRequest = Long.valueOf((String) PredicateHelper.getProperties(predicate).get(ResourcePropertyId.ID.getPropertyId())); - - AmbariConfigurationEntity persistedEntity = ambariConfigurationDAO.findByPK(idFromRequest); - if (persistedEntity == null) { - String errorMsg = String.format("Entity with primary key [ %s ] not found in the database.", idFromRequest); - LOGGER.error(errorMsg); - throw new NoSuchResourceException(errorMsg); - } - - try { - - AmbariConfigurationEntity entityFromRequest = getEntityFromRequest(request); - persistedEntity.getConfigurationBaseEntity().setVersionTag(entityFromRequest.getConfigurationBaseEntity().getVersionTag()); - persistedEntity.getConfigurationBaseEntity().setVersion(entityFromRequest.getConfigurationBaseEntity().getVersion()); - persistedEntity.getConfigurationBaseEntity().setType(entityFromRequest.getConfigurationBaseEntity().getType()); - persistedEntity.getConfigurationBaseEntity().setConfigurationData(entityFromRequest.getConfigurationBaseEntity().getConfigurationData()); - persistedEntity.getConfigurationBaseEntity().setConfigurationAttributes(entityFromRequest.getConfigurationBaseEntity().getConfigurationAttributes()); - - - ambariConfigurationDAO.update(persistedEntity); - } catch (AmbariException e) { - throw new NoSuchParentResourceException(e.getMessage()); - } - - publisher.publish(new AmbariLdapConfigChangedEvent(AmbariEvent.AmbariEventType.LDAP_CONFIG_CHANGED, - persistedEntity.getId())); - - - return getRequestStatus(null); - - } - - private Resource toResource(AmbariConfigurationEntity entity, Set<String> requestedIds) throws AmbariException { - - if (null == entity) { - throw new IllegalArgumentException("Null entity can't be transformed into a resource"); - } - - if (null == entity.getConfigurationBaseEntity()) { - throw new IllegalArgumentException("Invalid configuration entity can't be transformed into a resource"); - } - Resource resource = new ResourceImpl(Resource.Type.AmbariConfiguration); - Set<Map<String, String>> configurationSet = gson.fromJson(entity.getConfigurationBaseEntity().getConfigurationData(), Set.class); - - setResourceProperty(resource, ResourcePropertyId.ID.getPropertyId(), entity.getId(), requestedIds); - setResourceProperty(resource, ResourcePropertyId.TYPE.getPropertyId(), entity.getConfigurationBaseEntity().getType(), requestedIds); - setResourceProperty(resource, ResourcePropertyId.DATA.getPropertyId(), configurationSet, requestedIds); - setResourceProperty(resource, ResourcePropertyId.VERSION.getPropertyId(), entity.getConfigurationBaseEntity().getVersion(), requestedIds); - setResourceProperty(resource, ResourcePropertyId.VERSION_TAG.getPropertyId(), entity.getConfigurationBaseEntity().getVersionTag(), requestedIds); - - return resource; - } - - private AmbariConfigurationEntity getEntityFromRequest(Request request) throws AmbariException { - - AmbariConfigurationEntity ambariConfigurationEntity = new AmbariConfigurationEntity(); - ambariConfigurationEntity.setConfigurationBaseEntity(new ConfigurationBaseEntity()); - - // set of resource properties (eache entry in the set belongs to a different resource) - Set<Map<String, Object>> resourcePropertiesSet = request.getProperties(); - - if (resourcePropertiesSet.size() != 1) { - throw new AmbariException("There must be only one resource specified in the request"); - } - - // the configuration type must be set - if (getValueFromResourceProperties(ResourcePropertyId.TYPE, resourcePropertiesSet.iterator().next()) == null) { - throw new AmbariException("The configuration type must be set"); - } - - - for (ResourcePropertyId resourcePropertyId : ResourcePropertyId.values()) { - Object requestValue = getValueFromResourceProperties(resourcePropertyId, resourcePropertiesSet.iterator().next()); - - switch (resourcePropertyId) { - case DATA: - if (requestValue == null) { - throw new IllegalArgumentException("No configuration data is provided in the request"); - } - ambariConfigurationEntity.getConfigurationBaseEntity().setConfigurationData(gson.toJson(requestValue)); - break; - case TYPE: - ambariConfigurationEntity.getConfigurationBaseEntity().setType((String) requestValue); - break; - case VERSION: - Integer version = (requestValue == null) ? DEFAULT_VERSION : Integer.valueOf((String) requestValue); - ambariConfigurationEntity.getConfigurationBaseEntity().setVersion((version)); - break; - case VERSION_TAG: - String versionTag = requestValue == null ? DEFAULT_VERSION_TAG : (String) requestValue; - ambariConfigurationEntity.getConfigurationBaseEntity().setVersionTag(versionTag); - break; - default: - LOGGER.debug("Ignored property in the request: {}", resourcePropertyId); - break; - } - } - ambariConfigurationEntity.getConfigurationBaseEntity().setCreateTimestamp(Calendar.getInstance().getTimeInMillis()); - return ambariConfigurationEntity; - - } - - private Object getValueFromResourceProperties(ResourcePropertyId resourcePropertyIdEnum, Map<String, Object> resourceProperties) { - LOGGER.debug("Locating resource property [{}] in the resource properties map ...", resourcePropertyIdEnum); - Object requestValue = null; - - if (resourceProperties.containsKey(resourcePropertyIdEnum.getPropertyId())) { - requestValue = resourceProperties.get(resourcePropertyIdEnum.getPropertyId()); - LOGGER.debug("Found resource property {} in the resource properties map, value: {}", resourcePropertyIdEnum, requestValue); - } - return requestValue; - } - -} http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ArtifactResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ArtifactResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ArtifactResourceProvider.java index c5c02cf..567cfa9 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ArtifactResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ArtifactResourceProvider.java @@ -47,6 +47,8 @@ import org.apache.ambari.server.controller.utilities.PropertyHelper; import org.apache.ambari.server.orm.dao.ArtifactDAO; import org.apache.ambari.server.orm.entities.ArtifactEntity; import org.apache.ambari.server.state.Cluster; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.gson.Gson; import com.google.inject.Inject; @@ -62,6 +64,8 @@ import com.google.inject.Inject; @StaticallyInject public class ArtifactResourceProvider extends AbstractResourceProvider { + private static final Logger LOG = LoggerFactory.getLogger(ArtifactResourceProvider.class); + public static final String RESPONSE_KEY = "Artifacts"; public static final String ARTIFACT_NAME = "artifact_name"; public static final String CLUSTER_NAME = "cluster_name"; http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BaseProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BaseProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BaseProvider.java index 135eefe..c9fee7d 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BaseProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BaseProvider.java @@ -61,11 +61,7 @@ public abstract class BaseProvider { */ private final Map<String, Pattern> patterns; - /** - * The logger. - */ - protected final static Logger LOG = - LoggerFactory.getLogger(BaseProvider.class); + private static final Logger LOG = LoggerFactory.getLogger(BaseProvider.class); /** * The regex pattern that will match on all $1, $2.method(0), and http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java index 939b4a1..d2f24d9 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java @@ -67,7 +67,7 @@ import com.google.common.collect.Sets; */ public class BlueprintConfigurationProcessor { - protected final static Logger LOG = LoggerFactory.getLogger(BlueprintConfigurationProcessor.class); + private static final Logger LOG = LoggerFactory.getLogger(BlueprintConfigurationProcessor.class); private final static String COMMAND_RETRY_ENABLED_PROPERTY_NAME = "command_retry_enabled"; http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java index 73d2490..67f5448 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java @@ -60,6 +60,8 @@ import org.apache.ambari.server.topology.InvalidTopologyException; import org.apache.ambari.server.topology.SecurityConfiguration; import org.apache.ambari.server.topology.SecurityConfigurationFactory; import org.apache.ambari.server.utils.SecretReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.common.base.Preconditions; import com.google.common.base.Strings; @@ -71,6 +73,8 @@ import com.google.gson.Gson; */ public class BlueprintResourceProvider extends AbstractControllerResourceProvider { + private static final Logger LOG = LoggerFactory.getLogger(BlueprintResourceProvider.class); + // ----- Property ID constants --------------------------------------------- // Blueprints http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java index 28acdb3..9043297 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java @@ -21,6 +21,7 @@ package org.apache.ambari.server.controller.internal; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AGENT_STACK_RETRY_COUNT; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AGENT_STACK_RETRY_ON_UNAVAILABILITY; 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; @@ -368,6 +369,7 @@ public class ClientConfigResourceProvider extends AbstractControllerResourceProv hostLevelParams.putAll(managementController.getRcaParameters()); 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()); // Write down os specific info for the service ServiceOsSpecific anyOs = null; http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java index 61e0f99..cc0cea3 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java @@ -56,6 +56,8 @@ import org.apache.ambari.server.topology.SecurityConfiguration; import org.apache.ambari.server.topology.SecurityConfigurationFactory; import org.apache.ambari.server.topology.TopologyManager; import org.apache.ambari.server.topology.TopologyRequestFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.security.core.Authentication; import com.google.gson.Gson; @@ -66,6 +68,8 @@ import com.google.gson.Gson; */ public class ClusterResourceProvider extends AbstractControllerResourceProvider { + private static final Logger LOG = LoggerFactory.getLogger(ClusterResourceProvider.class); + // ----- Property ID constants --------------------------------------------- // Clusters http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java index 1ef1854..6b1acf3 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java @@ -88,7 +88,8 @@ import org.apache.ambari.server.utils.StageUtils; import org.apache.ambari.server.utils.VersionUtils; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.math.NumberUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; @@ -104,6 +105,8 @@ import com.google.inject.persist.Transactional; @StaticallyInject public class ClusterStackVersionResourceProvider extends AbstractControllerResourceProvider { + private static final Logger LOG = LoggerFactory.getLogger(ClusterStackVersionResourceProvider.class); + // ----- Property ID constants --------------------------------------------- protected static final String CLUSTER_STACK_VERSION_ID_PROPERTY_ID = PropertyHelper.getPropertyId("ClusterStackVersions", "id"); @@ -258,7 +261,7 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou Collections.sort(entities, new Comparator<RepositoryVersionEntity>() { @Override public int compare(RepositoryVersionEntity o1, RepositoryVersionEntity o2) { - return compareVersions(o1.getVersion(), o2.getVersion()); + return VersionUtils.compareVersionsWithBuild(o1.getVersion(), o2.getVersion(), 4); } }); @@ -502,7 +505,7 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou continue; } - int compare = compareVersions(hostRepoVersion.getVersion(), desiredRepoVersion); + int compare = VersionUtils.compareVersionsWithBuild(hostRepoVersion.getVersion(), desiredRepoVersion, 4); // ignore earlier versions if (compare <= 0) { @@ -702,18 +705,10 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou // Determine repositories for host String osFamily = host.getOsFamily(); + OperatingSystemEntity osEntity = repoVersionHelper.getOSEntityForHost(host, repoVersion); - OperatingSystemEntity osEntity = null; - for (OperatingSystemEntity os : repoVersion.getOperatingSystems()) { - if (os.getOsType().equals(osFamily)) { - osEntity = os; - break; - } - } - - if (null == osEntity || CollectionUtils.isEmpty(osEntity.getRepositories())) { - throw new SystemException(String.format("Repositories for os type %s are " + - "not defined for version %s of Stack %s.", + if (CollectionUtils.isEmpty(osEntity.getRepositories())) { + throw new SystemException(String.format("Repositories for os type %s are not defined for version %s of Stack %s.", osFamily, repoVersion.getVersion(), stackId)); } @@ -732,7 +727,6 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou return null; } - Map<String, String> roleParams = repoVersionHelper.buildRoleParams(managementController, repoVersion, osFamily, servicesOnHost); @@ -746,7 +740,7 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou actionContext.setRepositoryVersion(repoVersion); actionContext.setTimeout(Short.valueOf(configuration.getDefaultAgentTaskTimeout(true))); - repoVersionHelper.addCommandRepository(actionContext, repoVersion, osEntity); + repoVersionHelper.addCommandRepositoryToContext(actionContext, osEntity); return actionContext; } @@ -807,39 +801,6 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou } /** - * Additional check over {@link VersionUtils#compareVersions(String, String)} that - * compares build numbers - */ - private static int compareVersions(String version1, String version2) { - version1 = (null == version1) ? "0" : version1; - version2 = (null == version2) ? "0" : version2; - - // check _exact_ equality - if (StringUtils.equals(version1, version2)) { - return 0; - } - - int compare = VersionUtils.compareVersions(version1, version2); - if (0 != compare) { - return compare; - } - - int v1 = 0; - int v2 = 0; - if (version1.indexOf('-') > -1) { - v1 = NumberUtils.toInt(version1.substring(version1.indexOf('-')), 0); - } - - if (version2.indexOf('-') > -1) { - v2 = NumberUtils.toInt(version2.substring(version2.indexOf('-')), 0); - } - - compare = v2 - v1; - - return Integer.compare(compare, 0); - } - - /** * Ensures that the stack tools and stack features are set on * {@link ConfigHelper#CLUSTER_ENV} for the stack of the repository being * distributed. This step ensures that the new repository can be distributed http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java index f05ffbe..fa963c6 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java @@ -51,6 +51,8 @@ import org.apache.ambari.server.state.StackInfo; import org.apache.ambari.server.state.repository.ManifestServiceInfo; import org.apache.ambari.server.state.repository.VersionDefinitionXml; import org.apache.ambari.server.state.stack.UpgradePack; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; @@ -64,6 +66,8 @@ import com.google.inject.Provider; @StaticallyInject public class CompatibleRepositoryVersionResourceProvider extends ReadOnlyResourceProvider { + private static final Logger LOG = LoggerFactory.getLogger(CompatibleRepositoryVersionResourceProvider.class); + // ----- Property ID constants --------------------------------------------- public static final String REPOSITORY_VERSION_ID_PROPERTY_ID = "CompatibleRepositoryVersions/id";
