AMBARI-21756. Use latest-vdf for default when version is unspecified (ncole)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/15aa0375 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/15aa0375 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/15aa0375 Branch: refs/heads/branch-feature-logsearch-ui Commit: 15aa0375e8c79bbaab237a28c1f0b78275f551f6 Parents: 28a4223 Author: Nate Cole <nc...@hortonworks.com> Authored: Mon Aug 21 13:01:34 2017 -0400 Committer: Nate Cole <nc...@hortonworks.com> Committed: Mon Aug 21 13:01:34 2017 -0400 ---------------------------------------------------------------------- .../server/api/services/AmbariMetaInfo.java | 9 ++- .../VersionDefinitionResourceProvider.java | 6 +- .../apache/ambari/server/state/StackInfo.java | 17 +++++ .../state/repository/VersionDefinitionXml.java | 7 ++ .../server/state/stack/LatestRepoCallable.java | 80 +++++++++++++++----- .../ambari/server/topology/AmbariContext.java | 50 +++++++++++- .../server/api/services/AmbariMetaInfoTest.java | 30 ++++++++ .../AmbariManagementControllerTest.java | 2 +- .../VersionDefinitionResourceProviderTest.java | 14 +--- .../ambari/server/stack/StackManagerTest.java | 5 +- .../server/topology/AmbariContextTest.java | 40 ++++++++-- .../resources/stacks/HDP/2.2.0/repos/hdp.json | 4 + .../stacks/HDP/2.2.0/repos/repoinfo.xml | 8 ++ .../stacks/HDP/2.2.0/repos/version-2.2.0.5.xml | 51 +++++++++++++ .../resources/stacks/HDP/2.2.1/metainfo.xml | 24 ++++++ .../resources/stacks/HDP/2.2.1/repos/hdp.json | 7 ++ .../stacks/HDP/2.2.1/repos/repoinfo.xml | 36 +++++++++ .../HDP/2.2.1/services/RANGER/alerts.json | 74 ++++++++++++++++++ 18 files changed, 418 insertions(+), 46 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java index eb97ee3..7eb82e4 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java @@ -1381,7 +1381,14 @@ public class AmbariMetaInfo { if (stack.isActive() && stack.isValid()) { try { - VersionDefinitionXml xml = VersionDefinitionXml.build(stack); + // !!! check for a "latest-vdf" one. This will be used for the default if one is not found. + VersionDefinitionXml xml = stack.getLatestVersionDefinition(); + + if (null == xml) { + // !!! "latest-vdf" was not found, use the stack. this is the last-ditch effort + xml = VersionDefinitionXml.build(stack); + } + versionDefinitions.put(String.format("%s-%s", stack.getName(), stack.getVersion()), xml); } catch (Exception e) { LOG.warn("Could not make a stack VDF for {}-{}: {}", http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java index c789096..162c8df 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java @@ -91,10 +91,10 @@ public class VersionDefinitionResourceProvider extends AbstractAuthorizedResourc public static final String VERSION_DEF_STACK_NAME = "VersionDefinition/stack_name"; public static final String VERSION_DEF_STACK_VERSION = "VersionDefinition/stack_version"; - protected static final String VERSION_DEF_ID = "VersionDefinition/id"; + public static final String VERSION_DEF_ID = "VersionDefinition/id"; protected static final String VERSION_DEF_TYPE_PROPERTY_ID = "VersionDefinition/type"; protected static final String VERSION_DEF_DEFINITION_URL = "VersionDefinition/version_url"; - protected static final String VERSION_DEF_AVAILABLE_DEFINITION = "VersionDefinition/available"; + public static final String VERSION_DEF_AVAILABLE_DEFINITION = "VersionDefinition/available"; protected static final String VERSION_DEF_DEFINITION_BASE64 = PropertyHelper.getPropertyId(VERSION_DEF, VERSION_DEF_BASE64_PROPERTY); protected static final String VERSION_DEF_FULL_VERSION = "VersionDefinition/repository_version"; @@ -378,6 +378,8 @@ public class VersionDefinitionResourceProvider extends AbstractAuthorizedResourc String id = (String) propertyMap.get(VERSION_DEF_ID); if (null != id) { + // id is either the repo version id from the db, or it's a phantom id from + // the stack if (NumberUtils.isDigits(id)) { RepositoryVersionEntity entity = s_repoVersionDAO.findByPK(Long.parseLong(id)); http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java index 149579f..350611d 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java @@ -33,6 +33,7 @@ import org.apache.ambari.server.controller.StackVersionResponse; import org.apache.ambari.server.stack.Validable; import org.apache.ambari.server.state.repository.VersionDefinitionXml; import org.apache.ambari.server.state.stack.ConfigUpgradePack; +import org.apache.ambari.server.state.stack.LatestRepoCallable; import org.apache.ambari.server.state.stack.RepositoryXml; import org.apache.ambari.server.state.stack.StackRoleCommandOrder; import org.apache.ambari.server.state.stack.UpgradePack; @@ -77,6 +78,8 @@ public class StackInfo implements Comparable<StackInfo>, Validable { private Set<String> errorSet = new HashSet<>(); private RepositoryXml repoXml = null; + private VersionDefinitionXml latestVersion = null; + /** * List of services removed from current stack * */ @@ -607,4 +610,18 @@ public class StackInfo implements Comparable<StackInfo>, Validable { public void setServicesWithNoConfigs(List<String> servicesWithNoConfigs) { this.servicesWithNoConfigs = servicesWithNoConfigs; } + + /** + * @param xml the version definition parsed from {@link LatestRepoCallable} + */ + public void setLatestVersionDefinition(VersionDefinitionXml xml) { + latestVersion = xml; + } + + /** + * @param xml the version definition parsed from {@link LatestRepoCallable} + */ + public VersionDefinitionXml getLatestVersionDefinition() { + return latestVersion; + } } http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/main/java/org/apache/ambari/server/state/repository/VersionDefinitionXml.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/repository/VersionDefinitionXml.java b/ambari-server/src/main/java/org/apache/ambari/server/state/repository/VersionDefinitionXml.java index 3ef3991..96bf668 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/repository/VersionDefinitionXml.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/repository/VersionDefinitionXml.java @@ -167,6 +167,13 @@ public class VersionDefinitionXml { } } + /** + * Sets if the version definition is a stack default. This can only be true + * when parsing "latest-vdf" for a stack. + */ + public void setStackDefault(boolean stackDefault) { + m_stackDefault = stackDefault; + } /** * Gets if the version definition was built as the default for a stack http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/main/java/org/apache/ambari/server/state/stack/LatestRepoCallable.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/LatestRepoCallable.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/LatestRepoCallable.java index 0472bc1..90d562f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/LatestRepoCallable.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/LatestRepoCallable.java @@ -22,6 +22,7 @@ import java.io.FileReader; import java.io.InputStreamReader; import java.lang.reflect.Type; import java.net.URI; +import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; @@ -46,7 +47,7 @@ import com.google.gson.reflect.TypeToken; */ public class LatestRepoCallable implements Callable<Void> { private static final int LOOKUP_CONNECTION_TIMEOUT = 2000; - private static final int LOOKUP_READ_TIMEOUT = 1000; + private static final int LOOKUP_READ_TIMEOUT = 3000; private final static Logger LOG = LoggerFactory.getLogger(LatestRepoCallable.class); @@ -70,6 +71,7 @@ public class LatestRepoCallable implements Callable<Void> { Map<String, Map<String, Object>> latestUrlMap = null; + Long time = System.currentTimeMillis(); try { if (sourceUri.startsWith("http")) { @@ -79,6 +81,7 @@ public class LatestRepoCallable implements Callable<Void> { LOG.info("Loading latest URL info for stack {}-{} from {}", stack.getName(), stack.getVersion(), sourceUri); + latestUrlMap = gson.fromJson(new InputStreamReader( streamProvider.readFrom(sourceUri)), type); } else { @@ -90,7 +93,7 @@ public class LatestRepoCallable implements Callable<Void> { } if (jsonFile.exists()) { - LOG.info("Loading latest URL info for stack{}-{} from {}", stack.getName(), + LOG.info("Loading latest URL info for stack {}-{} from {}", stack.getName(), stack.getVersion(), jsonFile); latestUrlMap = gson.fromJson(new FileReader(jsonFile), type); } @@ -99,6 +102,8 @@ public class LatestRepoCallable implements Callable<Void> { LOG.info("Could not load the URI for stack {}-{} from {}, ({}). Using default repository values", stack.getName(), stack.getVersion(), sourceUri, e.getMessage()); throw e; + } finally { + LOG.info("Loaded uri {} in {}ms", sourceUri, System.currentTimeMillis() - time); } StackId stackId = new StackId(stack); @@ -107,32 +112,50 @@ public class LatestRepoCallable implements Callable<Void> { } Map<String, Object> map = latestUrlMap.get(stackId.toString()); - if (null == map || !map.containsKey("manifests")) { + if (null == map) { return null; } - @SuppressWarnings("unchecked") - Map<String, Object> versionMap = (Map<String, Object>) map.get("manifests"); + // !!! use this to prevent double loading of VDF. + Map<URI, VersionDefinitionXml> parsedMap = new HashMap<>(); - // EACH VDF is for ONLY ONE repository. We must provide a merged view. - // there is no good way around this, so we have to make some concessions + if (map.containsKey("manifests")) { - // !!! each key is a version number, and the value is a map containing - // os_family -> VDF link + @SuppressWarnings("unchecked") + Map<String, Object> versionMap = (Map<String, Object>) map.get("manifests"); - for (Entry<String, Object> entry : versionMap.entrySet()) { - String version = entry.getKey(); + // EACH VDF is for ONLY ONE repository. We must provide a merged view. + // there is no good way around this, so we have to make some concessions - @SuppressWarnings("unchecked") - Map<String, String> osMap = (Map<String, String>) entry.getValue(); + // !!! each key is a version number, and the value is a map containing + // os_family -> VDF link - VersionDefinitionXml xml = mergeDefinitions(stackId, version, osMap); + for (Entry<String, Object> entry : versionMap.entrySet()) { + String version = entry.getKey(); - if (null != xml) { - stack.addVersionDefinition(version, xml); + @SuppressWarnings("unchecked") + Map<String, String> osMap = (Map<String, String>) entry.getValue(); + + VersionDefinitionXml xml = mergeDefinitions(stackId, version, osMap, parsedMap); + + if (null != xml) { + stack.addVersionDefinition(version, xml); + } } } + if (map.containsKey("latest-vdf")) { + // !!! this is an os_family -> VDF link. It's identical to the version entry in the 'manifests' + // structure. This is the source of truth for the default, unspecified version when + // doing a bluerpint install + @SuppressWarnings("unchecked") + Map<String, String> osMap = (Map<String, String>) map.get("latest-vdf"); + + VersionDefinitionXml xml = mergeDefinitions(stackId, null, osMap, parsedMap); + xml.setStackDefault(true); + stack.setLatestVersionDefinition(xml); + } + return null; } @@ -144,7 +167,8 @@ public class LatestRepoCallable implements Callable<Void> { * @return the merged version definition * @throws Exception */ - private VersionDefinitionXml mergeDefinitions(StackId stackId, String version, Map<String, String> osMap) throws Exception { + private VersionDefinitionXml mergeDefinitions(StackId stackId, String version, + Map<String, String> osMap, Map<URI, VersionDefinitionXml> parsedMap) throws Exception { Set<String> oses = new HashSet<>(); for (RepositoryInfo ri : stack.getRepositories()) { @@ -183,9 +207,16 @@ public class LatestRepoCallable implements Callable<Void> { try { URI uri = new URI(uriString); - VersionDefinitionXml xml = VersionDefinitionXml.load(uri.toURL()); + VersionDefinitionXml xml = parsedMap.containsKey(uri) ? parsedMap.get(uri) : + timedVDFLoad(uri); + version = (null == version) ? xml.release.version : version; merger.add(version, xml); + + if (!parsedMap.containsKey(uri)) { + parsedMap.put(uri, xml); + } + } catch (Exception e) { LOG.warn("Could not load version definition for {} identified by {}. {}", stackId, uriString, e.getMessage(), e); @@ -195,8 +226,6 @@ public class LatestRepoCallable implements Callable<Void> { return merger.merge(); } - - /** * Resolves a base url given that certain OS types can be used interchangeably. * @param os the target os to find @@ -220,4 +249,15 @@ public class LatestRepoCallable implements Callable<Void> { return null; } + private VersionDefinitionXml timedVDFLoad(URI uri) throws Exception { + long time = System.currentTimeMillis(); + + try { + return VersionDefinitionXml.load(uri.toURL()); + } finally { + LOG.info("Loaded VDF {} in {}ms", uri, System.currentTimeMillis() - time); + } + + } + } http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java index fa703ed..75435a3 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java @@ -61,9 +61,12 @@ import org.apache.ambari.server.controller.internal.ProvisionClusterRequest; import org.apache.ambari.server.controller.internal.RequestImpl; import org.apache.ambari.server.controller.internal.ServiceResourceProvider; import org.apache.ambari.server.controller.internal.Stack; +import org.apache.ambari.server.controller.internal.VersionDefinitionResourceProvider; import org.apache.ambari.server.controller.predicate.EqualsPredicate; import org.apache.ambari.server.controller.spi.ClusterController; 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.utilities.ClusterControllerHelper; import org.apache.ambari.server.orm.dao.RepositoryVersionDAO; @@ -130,6 +133,7 @@ public class AmbariContext { private static ServiceResourceProvider serviceResourceProvider; private static ComponentResourceProvider componentResourceProvider; private static HostComponentResourceProvider hostComponentResourceProvider; + private static VersionDefinitionResourceProvider versionDefinitionResourceProvider; private final static Logger LOG = LoggerFactory.getLogger(AmbariContext.class); @@ -205,7 +209,39 @@ public class AmbariContext { List<RepositoryVersionEntity> stackRepoVersions = repositoryVersionDAO.findByStack(stackId); if (stackRepoVersions.isEmpty()) { - throw new IllegalArgumentException(String.format("No repositories were found for %s", stackId)); + // !!! no repos, try to get the version for the stack + VersionDefinitionResourceProvider vdfProvider = getVersionDefinitionResourceProvider(); + + Map<String, Object> properties = new HashMap<>(); + properties.put(VersionDefinitionResourceProvider.VERSION_DEF_AVAILABLE_DEFINITION, stackId.toString()); + + Request request = new RequestImpl(Collections.<String>emptySet(), + Collections.singleton(properties), Collections.<String, String>emptyMap(), null); + + Long repoVersionId = null; + + try { + RequestStatus requestStatus = vdfProvider.createResources(request); + if (!requestStatus.getAssociatedResources().isEmpty()) { + Resource resource = requestStatus.getAssociatedResources().iterator().next(); + repoVersionId = (Long) resource.getPropertyValue(VersionDefinitionResourceProvider.VERSION_DEF_ID); + } + } catch (Exception e) { + throw new IllegalArgumentException(String.format( + "Failed to create a default repository version definition for stack %s. " + + "This typically is a result of not loading the stack correctly or being able " + + "to load information about released versions. Create a repository version " + + " and try again.", stackId), e); + } + + repoVersion = repositoryVersionDAO.findByPK(repoVersionId); + // !!! better not! + if (null == repoVersion) { + throw new IllegalArgumentException(String.format( + "Failed to load the default repository version definition for stack %s. " + + "Check for a valid repository version and try again.", stackId)); + } + } else if (stackRepoVersions.size() > 1) { Function<RepositoryVersionEntity, String> function = new Function<RepositoryVersionEntity, String>() { @@ -794,4 +830,14 @@ public class AmbariContext { } return componentResourceProvider; } -} + + private synchronized VersionDefinitionResourceProvider getVersionDefinitionResourceProvider() { + if (versionDefinitionResourceProvider == null) { + versionDefinitionResourceProvider = (VersionDefinitionResourceProvider) ClusterControllerHelper. + getClusterController().ensureResourceProvider(Resource.Type.VersionDefinition); + } + return versionDefinitionResourceProvider; + + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java index 5afe87e..9ea0ae1 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java @@ -84,6 +84,7 @@ import org.apache.ambari.server.state.alert.SourceType; import org.apache.ambari.server.state.kerberos.KerberosDescriptor; import org.apache.ambari.server.state.kerberos.KerberosDescriptorFactory; import org.apache.ambari.server.state.kerberos.KerberosServiceDescriptorFactory; +import org.apache.ambari.server.state.repository.VersionDefinitionXml; import org.apache.ambari.server.state.stack.Metric; import org.apache.ambari.server.state.stack.MetricDefinition; import org.apache.ambari.server.state.stack.OsFamily; @@ -1519,6 +1520,35 @@ public class AmbariMetaInfoTest { } } + + @Test + public void testLatestVdf() throws Exception { + // ensure that all of the latest repo retrieval tasks have completed + StackManager sm = metaInfo.getStackManager(); + int maxWait = 45000; + int waitTime = 0; + while (waitTime < maxWait && ! sm.haveAllRepoUrlsBeenResolved()) { + Thread.sleep(5); + waitTime += 5; + } + + if (waitTime >= maxWait) { + fail("Latest Repo tasks did not complete"); + } + + // !!! default stack version is from latest-vdf. 2.2.0 only has one entry + VersionDefinitionXml vdf = metaInfo.getVersionDefinition("HDP-2.2.0"); + assertNotNull(vdf); + assertEquals(1, vdf.repositoryInfo.getOses().size()); + + // !!! this stack has no "manifests" and no "latest-vdf". So the default VDF should contain + // information from repoinfo.xml and the "latest" structure + vdf = metaInfo.getVersionDefinition("HDP-2.2.1"); + assertNotNull(vdf); + + assertEquals(2, vdf.repositoryInfo.getOses().size()); + } + @Test public void testGetComponentDependency() throws AmbariException { DependencyInfo dependency = metaInfo.getComponentDependency("HDP", "1.3.4", "HIVE", "HIVE_SERVER", "ZOOKEEPER_SERVER"); http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java index 85ad36d..9309abe 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java @@ -192,7 +192,7 @@ public class AmbariManagementControllerTest { private static final String PROPERTY_NAME = "hbase.regionserver.msginterval"; private static final String SERVICE_NAME = "HDFS"; private static final String FAKE_SERVICE_NAME = "FAKENAGIOS"; - private static final int STACK_VERSIONS_CNT = 16; + private static final int STACK_VERSIONS_CNT = 17; private static final int REPOS_CNT = 3; private static final int STACK_PROPERTIES_CNT = 103; private static final int STACK_COMPONENTS_CNT = 4; http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProviderTest.java index 7e1db0d..402a8f8 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProviderTest.java @@ -60,7 +60,6 @@ import org.junit.Test; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; -import com.google.common.collect.Sets; import com.google.inject.Guice; import com.google.inject.Injector; @@ -277,7 +276,7 @@ public class VersionDefinitionResourceProviderTest { VersionDefinitionResourceProvider.SHOW_AVAILABLE).equals("true").toPredicate(); Set<Resource> results = versionProvider.getResources(getRequest, predicate); - Assert.assertEquals(2, results.size()); + Assert.assertEquals(3, results.size()); boolean found1 = false; boolean found2 = false; @@ -291,17 +290,10 @@ public class VersionDefinitionResourceProviderTest { VersionDefinitionXml vdf = ami.getVersionDefinition("HDP-2.2.0"); Assert.assertNotNull(vdf); - Assert.assertEquals(2, vdf.repositoryInfo.getOses().size()); + Assert.assertEquals(1, vdf.repositoryInfo.getOses().size()); String family1 = vdf.repositoryInfo.getOses().get(0).getFamily(); - String family2 = vdf.repositoryInfo.getOses().get(1).getFamily(); - - Assert.assertFalse(family1.equals(family2)); - Assert.assertTrue(Sets.newHashSet("suse11", "redhat6").contains(family1)); - Assert.assertTrue(Sets.newHashSet("suse11", "redhat6").contains(family2)); - - - + Assert.assertEquals("redhat6", family1); found2 = true; } } http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/test/java/org/apache/ambari/server/stack/StackManagerTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/stack/StackManagerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/stack/StackManagerTest.java index 869441f..f53e111 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/stack/StackManagerTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/stack/StackManagerTest.java @@ -133,13 +133,13 @@ public class StackManagerTest { @Test public void testGetsStacks() throws Exception { Collection<StackInfo> stacks = stackManager.getStacks(); - assertEquals(20, stacks.size()); + assertEquals(21, stacks.size()); } @Test public void testGetStacksByName() { Collection<StackInfo> stacks = stackManager.getStacks("HDP"); - assertEquals(16, stacks.size()); + assertEquals(17, stacks.size()); stacks = stackManager.getStacks("OTHER"); assertEquals(2, stacks.size()); @@ -289,6 +289,7 @@ public class StackManagerTest { //should include all stacks in hierarchy assertEquals(18, services.size()); + HashSet<String> expectedServices = new HashSet<>(); expectedServices.add("GANGLIA"); expectedServices.add("HBASE"); http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java index bef0a45..f8ed815 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java @@ -55,10 +55,12 @@ import org.apache.ambari.server.controller.internal.HostComponentResourceProvide import org.apache.ambari.server.controller.internal.HostResourceProvider; import org.apache.ambari.server.controller.internal.ServiceResourceProvider; import org.apache.ambari.server.controller.internal.Stack; +import org.apache.ambari.server.controller.internal.VersionDefinitionResourceProvider; import org.apache.ambari.server.controller.predicate.EqualsPredicate; import org.apache.ambari.server.controller.spi.ClusterController; 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.orm.dao.RepositoryVersionDAO; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; @@ -699,26 +701,50 @@ public class AmbariContextTest { @Test public void testCreateAmbariResourcesNoVersions() throws Exception { + VersionDefinitionResourceProvider vdfResourceProvider = createNiceMock(VersionDefinitionResourceProvider.class); + Class<AmbariContext> clazz = AmbariContext.class; + Field f = clazz.getDeclaredField("versionDefinitionResourceProvider"); + f.setAccessible(true); + f.set(null, vdfResourceProvider); + + Resource resource = createNiceMock(Resource.class); + expect(resource.getPropertyValue(VersionDefinitionResourceProvider.VERSION_DEF_ID)).andReturn(1L).atLeastOnce(); + + RequestStatus requestStatus = createNiceMock(RequestStatus.class); + expect(requestStatus.getAssociatedResources()).andReturn(Collections.singleton(resource)).atLeastOnce(); + + expect(vdfResourceProvider.createResources(EasyMock.anyObject(Request.class))).andReturn(requestStatus); + RepositoryVersionDAO repositoryVersionDAO = createNiceMock(RepositoryVersionDAO.class); RepositoryVersionEntity repositoryVersion = createNiceMock(RepositoryVersionEntity.class); expect(repositoryVersion.getId()).andReturn(1L).atLeastOnce(); expect(repositoryVersion.getVersion()).andReturn("1.1.1.1").atLeastOnce(); + expect(repositoryVersion.getType()).andReturn(RepositoryType.STANDARD).atLeastOnce(); expect(repositoryVersionDAO.findByStack(EasyMock.anyObject(StackId.class))).andReturn( Collections.<RepositoryVersionEntity>emptyList()).atLeastOnce(); - replay(repositoryVersionDAO, repositoryVersion); + expect(repositoryVersionDAO.findByPK(EasyMock.anyLong())).andReturn(repositoryVersion); + + replay(repositoryVersionDAO, repositoryVersion, resource, requestStatus, vdfResourceProvider); context.repositoryVersionDAO = repositoryVersionDAO; + controller.createCluster(capture(Capture.<ClusterRequest>newInstance())); + expectLastCall().once(); + expect(cluster.getServices()).andReturn(clusterServices).anyTimes(); + + serviceResourceProvider.createServices(capture(Capture.<Set<ServiceRequest>>newInstance())); + expectLastCall().once(); + componentResourceProvider.createComponents(capture(Capture.<Set<ServiceComponentRequest>>newInstance())); + expectLastCall().once(); + + expect(serviceResourceProvider.updateResources( + capture(Capture.<Request>newInstance()), capture(Capture.<Predicate>newInstance()))).andReturn(null).atLeastOnce(); + replayAll(); // test - try { - context.createAmbariResources(topology, CLUSTER_NAME, null, null); - fail("Expected failure when no versions are found"); - } catch (IllegalArgumentException e) { - assertEquals("No repositories were found for testStack-testVersion", e.getMessage()); - } + context.createAmbariResources(topology, CLUSTER_NAME, null, null); } @Test http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/test/resources/stacks/HDP/2.2.0/repos/hdp.json ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/resources/stacks/HDP/2.2.0/repos/hdp.json b/ambari-server/src/test/resources/stacks/HDP/2.2.0/repos/hdp.json index 708d757..fed67c1 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.2.0/repos/hdp.json +++ b/ambari-server/src/test/resources/stacks/HDP/2.2.0/repos/hdp.json @@ -10,8 +10,12 @@ "2.2.1.0": { "centos6": "./version-2.2.0.4-123.xml", "debian6": "./version-2.2.0.4-123.xml", + "ubuntu14": "./version-2.2.0.4-123.xml", "suse11sp3": "./version-2.2.0.4-123-suse11.xml" } + }, + "latest-vdf": { + "centos6": "./version-2.2.0.5.xml" } } } http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/test/resources/stacks/HDP/2.2.0/repos/repoinfo.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/resources/stacks/HDP/2.2.0/repos/repoinfo.xml b/ambari-server/src/test/resources/stacks/HDP/2.2.0/repos/repoinfo.xml index 031f5fd..b8bf342 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.2.0/repos/repoinfo.xml +++ b/ambari-server/src/test/resources/stacks/HDP/2.2.0/repos/repoinfo.xml @@ -33,4 +33,12 @@ <unique>true</unique> </repo> </os> + <os family="ubuntu14"> + <repo> + <baseurl>http://public-repo-1.hortonworks.com/HDP/ubuntu14/2.x/updates/2.2.0.0</baseurl> + <repoid>HDP-2.2.0</repoid> + <reponame>HDP</reponame> + <unique>true</unique> + </repo> + </os> </reposinfo> http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/test/resources/stacks/HDP/2.2.0/repos/version-2.2.0.5.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/resources/stacks/HDP/2.2.0/repos/version-2.2.0.5.xml b/ambari-server/src/test/resources/stacks/HDP/2.2.0/repos/version-2.2.0.5.xml new file mode 100644 index 0000000..8c1c982 --- /dev/null +++ b/ambari-server/src/test/resources/stacks/HDP/2.2.0/repos/version-2.2.0.5.xml @@ -0,0 +1,51 @@ +<?xml version="1.0"?> +<!-- + 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. +--> +<repository-version xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="version_definition.xsd"> + <release> + <type>STANDARD</type> + <stack-id>HDP-2.2.0</stack-id> + <version>2.2.0.5</version> + <build>123</build> + <release-notes>http://example.com</release-notes> + <display>HDP-2.2.0.4-1234</display> + <compatible-with>2.2.0.0</compatible-with> + </release> + <manifest> + <service id="HDFS-271" name="HDFS" version="2.7.1.2.4"/> + <service id="HBASE-132" name="HBASE" version="1.3.2.4.3"/> + </manifest> + <available-services> + <service idref="HDFS-271"/> + </available-services> + <repository-info> + <os family="redhat6"> + <repo> + <baseurl>http://baseurl1-2205</baseurl> + <repoid>HDP-2.4</repoid> + <reponame>HDP</reponame> + <unique>true</unique> + </repo> + <repo> + <baseurl>http://baseurl2-2205</baseurl> + <repoid>HDP-UTILS-1.1.0.20</repoid> + <reponame>HDP-UTILS</reponame> + <unique>false</unique> + </repo> + </os> + </repository-info> +</repository-version> http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/test/resources/stacks/HDP/2.2.1/metainfo.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/resources/stacks/HDP/2.2.1/metainfo.xml b/ambari-server/src/test/resources/stacks/HDP/2.2.1/metainfo.xml new file mode 100644 index 0000000..43bcda5 --- /dev/null +++ b/ambari-server/src/test/resources/stacks/HDP/2.2.1/metainfo.xml @@ -0,0 +1,24 @@ +<?xml version="1.0"?> +<!-- + 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. +--> +<metainfo> + <versions> + <active>true</active> + </versions> + <extends>2.2.0</extends> +</metainfo> + http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/test/resources/stacks/HDP/2.2.1/repos/hdp.json ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/resources/stacks/HDP/2.2.1/repos/hdp.json b/ambari-server/src/test/resources/stacks/HDP/2.2.1/repos/hdp.json new file mode 100644 index 0000000..88cdc2a --- /dev/null +++ b/ambari-server/src/test/resources/stacks/HDP/2.2.1/repos/hdp.json @@ -0,0 +1,7 @@ +{ + "HDP-2.1.1": { + "latest": { + "redhat6": "http://link/centos6/2.x/BUILDS/2.2.1.0-9999" + } + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/test/resources/stacks/HDP/2.2.1/repos/repoinfo.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/resources/stacks/HDP/2.2.1/repos/repoinfo.xml b/ambari-server/src/test/resources/stacks/HDP/2.2.1/repos/repoinfo.xml new file mode 100644 index 0000000..5877d96 --- /dev/null +++ b/ambari-server/src/test/resources/stacks/HDP/2.2.1/repos/repoinfo.xml @@ -0,0 +1,36 @@ +<?xml version="1.0"?> +<!-- + 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. +--> +<reposinfo> + <latest>./hdp.json</latest> + <os family="redhat6"> + <repo> + <baseurl>http://link/centos6/2.x/updates/2.5.1.1</baseurl> + <repoid>HDP-2.5.0</repoid> + <reponame>HDP</reponame> + <unique>true</unique> + </repo> + </os> + <os family="ubuntu14"> + <repo> + <baseurl>http://link/ubuntu14/2.x/updates/2.5.0.0</baseurl> + <repoid>HDP-2.5.0</repoid> + <reponame>HDP</reponame> + <unique>true</unique> + </repo> + </os> +</reposinfo> http://git-wip-us.apache.org/repos/asf/ambari/blob/15aa0375/ambari-server/src/test/resources/stacks/HDP/2.2.1/services/RANGER/alerts.json ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/resources/stacks/HDP/2.2.1/services/RANGER/alerts.json b/ambari-server/src/test/resources/stacks/HDP/2.2.1/services/RANGER/alerts.json new file mode 100644 index 0000000..182a06c --- /dev/null +++ b/ambari-server/src/test/resources/stacks/HDP/2.2.1/services/RANGER/alerts.json @@ -0,0 +1,74 @@ +{ + "RANGER": { + "service": [], + "RANGER_ADMIN": [ + { + "name": "ranger_admin_process", + "label": "Ranger Admin Process", + "description": "This host-level alert is triggered if the Ranger Admin Web UI is unreachable.", + "interval": 1, + "scope": "ANY", + "source": { + "type": "WEB", + "uri": { + "http": "{{admin-properties/policymgr_external_url}}", + "https": "{{admin-properties/policymgr_external_url}}", + "https_property": "{{ranger-admin-site/ranger.service.https.attrib.ssl.enabled}}", + "https_property_value": "true", + "connection_timeout": 5.0 + }, + "reporting": { + "ok": { + "text": "HTTP {0} response in {2:.3f}s" + }, + "warning": { + "text": "HTTP {0} response from {1} in {2:.3f}s ({3})" + }, + "critical": { + "text": "Connection failed to {1} ({3})" + } + } + } + }, + { + "name": "ranger_admin_password_check", + "label": "Ranger Admin password check", + "description": "This alert is used to ensure that the Ranger Admin password in Ambari is correct.", + "interval": 30, + "scope": "ANY", + "source": { + "type": "SCRIPT", + "path": "RANGER/0.4.0/package/alerts/alert_ranger_admin_passwd_check.py", + "parameters": [] + } + } + ], + "RANGER_USERSYNC": [ + { + "name": "ranger_usersync_process", + "label": "Ranger Usersync Process", + "description": "This host-level alert is triggered if the Ranger Usersync cannot be determined to be up.", + "interval": 1, + "scope": "HOST", + "source": { + "type": "PORT", + "uri": "{{ranger-ugsync-site/ranger.usersync.port}}", + "default_port": 5151, + "reporting": { + "ok": { + "text": "TCP OK - {0:.3f}s response on port {1}" + }, + "warning": { + "text": "TCP OK - {0:.3f}s response on port {1}", + "value": 1.5 + }, + "critical": { + "text": "Connection failed: {0} to {1}:{2}", + "value": 5.0 + } + } + } + } + ] + } +} \ No newline at end of file