You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2015/04/14 21:17:37 UTC
[1/2] ambari git commit: AMBARI-10472. RU: add compatible stacks for
upgrade purposes (ncole)
Repository: ambari
Updated Branches:
refs/heads/trunk 0944ad66a -> 43550a78d
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProviderTest.java
new file mode 100644
index 0000000..1ee282a
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProviderTest.java
@@ -0,0 +1,189 @@
+/**
+ * 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.internal;
+
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.Assert;
+
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
+import org.apache.ambari.server.controller.ResourceProviderFactory;
+import org.apache.ambari.server.controller.predicate.AndPredicate;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.ResourceProvider;
+import org.apache.ambari.server.controller.utilities.PredicateBuilder;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.apache.ambari.server.orm.GuiceJpaInitializer;
+import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+import org.apache.ambari.server.orm.dao.ClusterVersionDAO;
+import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
+import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+import org.apache.ambari.server.state.StackInfo;
+import org.apache.ambari.server.state.stack.UpgradePack;
+import org.easymock.EasyMock;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.persist.PersistService;
+
+/**
+ * CompatibleRepositoryVersionResourceProvider tests.
+ */
+public class CompatibleRepositoryVersionResourceProviderTest {
+
+ private static Injector injector;
+
+ private static String jsonStringRedhat6 = "[{\"OperatingSystems\":{\"os_type\":\"redhat6\"},\"repositories\":[]}]";
+
+ @Before
+ public void before() throws Exception {
+ final AmbariMetaInfo ambariMetaInfo = EasyMock.createMock(AmbariMetaInfo.class);
+ final ClusterVersionDAO clusterVersionDAO = EasyMock.createMock(ClusterVersionDAO.class);
+
+ RepositoryVersionEntity entity1 = new RepositoryVersionEntity();
+ entity1.setDisplayName("name1");
+ entity1.setOperatingSystems(jsonStringRedhat6);
+ entity1.setStack("HDP-1.1");
+ entity1.setVersion("1.1.1.1");
+
+ RepositoryVersionEntity entity2 = new RepositoryVersionEntity();
+ entity2.setDisplayName("name2");
+ entity2.setOperatingSystems(jsonStringRedhat6);
+ entity2.setStack("HDP-2.2");
+ entity2.setVersion("2.2.2.2");
+
+ final RepositoryVersionDAO repoVersionDAO = EasyMock.createMock(RepositoryVersionDAO.class);
+
+ expect(repoVersionDAO.findByStack("HDP-1.1")).andReturn(Collections.singletonList(entity1)).atLeastOnce();
+ expect(repoVersionDAO.findByStack("HDP-2.2")).andReturn(Collections.singletonList(entity2)).atLeastOnce();
+ replay(repoVersionDAO);
+
+ final StackInfo stack1 = new StackInfo() {
+ @Override
+ public Map<String, UpgradePack> getUpgradePacks() {
+ Map<String, UpgradePack> map = new HashMap<String, UpgradePack>();
+
+ UpgradePack pack1 = new UpgradePack() {
+ @Override
+ public String getTarget() {
+ return "1.1.*.*";
+ }
+ };
+
+ final UpgradePack pack2 = new UpgradePack() {
+ @Override
+ public String getTarget() {
+ return "2.2.*.*";
+ }
+
+ @Override
+ public String getTargetStack() {
+ return "HDP-2.2";
+ }
+ };
+
+ map.put("pack1", pack1);
+ map.put("pack2", pack2);
+ return map;
+ }
+ };
+
+ final StackInfo stack2 = new StackInfo() {
+ @Override
+ public Map<String, UpgradePack> getUpgradePacks() {
+ Map<String, UpgradePack> map = new HashMap<String, UpgradePack>();
+
+ UpgradePack pack = new UpgradePack() {
+ @Override
+ public String getTarget() {
+ return "2.2.*.*";
+ }
+ };
+
+ map.put("pack2", pack);
+ return map;
+ }
+ };
+
+
+
+ InMemoryDefaultTestModule injectorModule = new InMemoryDefaultTestModule() {
+ @Override
+ protected void configure() {
+ super.configure();
+ bind(AmbariMetaInfo.class).toInstance(ambariMetaInfo);
+ bind(ClusterVersionDAO.class).toInstance(clusterVersionDAO);
+ bind(RepositoryVersionDAO.class).toInstance(repoVersionDAO);
+ requestStaticInjection(CompatibleRepositoryVersionResourceProvider.class);
+ };
+ };
+ injector = Guice.createInjector(injectorModule);
+
+ expect(ambariMetaInfo.getUpgradePacks("HDP", "1.1")).andReturn(stack1.getUpgradePacks());
+ expect(ambariMetaInfo.getUpgradePacks("HDP", "2.2")).andReturn(stack2.getUpgradePacks());
+
+ replay(ambariMetaInfo);
+
+ injector.getInstance(GuiceJpaInitializer.class);
+ }
+
+ @After
+ public void after() {
+ injector.getInstance(PersistService.class).stop();
+ injector = null;
+ }
+
+ @Test
+ public void testGetResources() throws Exception {
+ final ResourceProvider provider = injector.getInstance(ResourceProviderFactory.class).getRepositoryVersionResourceProvider();
+
+ Request getRequest = PropertyHelper.getReadRequest(
+ RepositoryVersionResourceProvider.REPOSITORY_VERSION_ID_PROPERTY_ID,
+ RepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID,
+ RepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID);
+ Predicate predicateStackName = new PredicateBuilder().property(RepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID).equals("HDP").toPredicate();
+ Predicate predicateStackVersion = new PredicateBuilder().property(RepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID).equals("1.1").toPredicate();
+
+ // !!! non-compatible, within stack
+ Assert.assertEquals(1, provider.getResources(getRequest, new AndPredicate(predicateStackName, predicateStackVersion)).size());
+
+ CompatibleRepositoryVersionResourceProvider compatibleProvider = new CompatibleRepositoryVersionResourceProvider(null);
+
+ getRequest = PropertyHelper.getReadRequest(
+ CompatibleRepositoryVersionResourceProvider.REPOSITORY_VERSION_ID_PROPERTY_ID,
+ CompatibleRepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID,
+ CompatibleRepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID);
+ predicateStackName = new PredicateBuilder().property(CompatibleRepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID).equals("HDP").toPredicate();
+ predicateStackVersion = new PredicateBuilder().property(CompatibleRepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID).equals("1.1").toPredicate();
+
+ // !!! compatible, across stack
+ Assert.assertEquals(2, compatibleProvider.getResources(getRequest, new AndPredicate(predicateStackName, predicateStackVersion)).size());
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_to_new_stack.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_to_new_stack.xml b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_to_new_stack.xml
new file mode 100644
index 0000000..61b74dd
--- /dev/null
+++ b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_to_new_stack.xml
@@ -0,0 +1,215 @@
+<?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.
+-->
+<upgrade xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <target>2.2.*</target>
+ <target-stack>HDP-2.2.0</target-stack>
+
+ <order>
+ <group xsi:type="cluster" name="PRE_CLUSTER" title="Pre {{direction.text.proper}}">
+ <execute-stage title="Confirm 1">
+ <task xsi:type="manual">
+ <message>Foo</message>
+ </task>
+ </execute-stage>
+ <execute-stage service="HDFS" component="NAMENODE" title="Pre Upgrade HIVE">
+ <task xsi:type="manual">
+ <message>Back stuff up.</message>
+ </task>
+ </execute-stage>
+ <execute-stage service="HDFS" component="NAMENODE" title="Finalize HDFS">
+ <task xsi:type="execute">
+ <command>ls</command>
+ </task>
+ </execute-stage>
+ <execute-stage title="Confirm 2">
+ <task xsi:type="manual">
+ <message>Foo</message>
+ </task>
+ </execute-stage>
+ </group>
+
+ <group name="ZOOKEEPER" title="Zookeeper">
+ <skippable>true</skippable>
+ <allow-retry>false</allow-retry>
+ <service name="ZOOKEEPER">
+ <component>ZOOKEEPER_SERVER</component>
+ <component>ZOOKEEPER_CLIENT</component>
+ </service>
+ </group>
+
+ <group name="CORE_MASTER" title="Core Masters">
+ <service name="HDFS">
+ <component>JOURNALNODE</component>
+ <component>NAMENODE</component>
+ </service>
+ <service name="YARN">
+ <component>RESOURCEMANAGER</component>
+ </service>
+ </group>
+
+ <group name="CORE_SLAVES" title="Core Slaves" xsi:type="colocated">
+ <skippable>true</skippable> <!-- set skippable for test -->
+ <allow-retry>false</allow-retry> <!-- set no retry for test -->
+ <service name="HDFS">
+ <component>DATANODE</component>
+ </service>
+ <service name="HBASE">
+ <component>REGIONSERVER</component>
+ </service>
+ <service name="YARN">
+ <component>NODEMANAGER</component>
+ </service>
+
+ <batch>
+ <percent>20</percent>
+ <message>Please run additional tests on {{components}}</message>
+ </batch>
+ </group>
+
+ <group name="HIVE" title="Hive">
+ <skippable>true</skippable>
+ <service name="HIVE">
+ <component>HIVE_METASTORE</component>
+ <component>HIVE_SERVER</component>
+ <component>WEBHCAT_SERVER</component>
+ </service>
+ </group>
+
+ <group xsi:type="cluster" name="POST_CLUSTER" title="Finalize {{direction.text.proper}}">
+ <execute-stage title="Check Unhealthy Hosts" id="unhealthy-hosts">
+ <task xsi:type="manual">
+ <message>The following hosts were unhealthy and should be resolved before finalizing can be completed:
+ {{host-detail-list}}</message>
+ </task>
+ </execute-stage>
+ <execute-stage title="Confirm Finalize">
+ <task xsi:type="manual">
+ <message>Please confirm you are ready to finalize</message>
+ </task>
+ </execute-stage>
+ <execute-stage service="HDFS" component="NAMENODE" title="Execute HDFS Finalize">
+ <task xsi:type="execute">
+ <command>ls</command>
+ </task>
+ </execute-stage>
+ <execute-stage title="Save Cluster State" service="" component="">
+ <task xsi:type="server_action" class="org.apache.ambari.server.serveraction.upgrades.FinalizeUpgradeAction">
+ </task>
+ </execute-stage>
+ </group>
+
+ </order>
+
+
+ <processing>
+ <service name="ZOOKEEPER">
+ <component name="ZOOKEEPER_SERVER">
+ <pre-upgrade>
+ <task xsi:type="manual">
+ <summary>SUMMARY OF PREPARE</summary>
+ <message>This is a manual task with a placeholder of {{foo/bar}}</message>
+ </task>
+ </pre-upgrade>
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ <post-upgrade>
+ <task xsi:type="configure" />
+ </post-upgrade>
+ </component>
+ </service>
+
+ <service name="HDFS">
+ <component name="NAMENODE">
+ <pre-upgrade>
+ <task xsi:type="execute" hosts="master">
+ <command>su - {hdfs-user} -c 'dosomething'</command>
+ </task>
+ <task xsi:type="configure">
+ <type>hdfs-site</type>
+ <key>myproperty</key>
+ <value>mynewvalue</value>
+ </task>
+ <task xsi:type="manual">
+ <message>{{direction.verb.proper}} your database</message>
+ </task>
+ </pre-upgrade>
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ <post-upgrade>
+ <task xsi:type="execute">
+ <command>ls</command>
+ </task>
+ </post-upgrade>
+ </component>
+ <component name="DATANODE">
+ <pre-downgrade />
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ <post-downgrade>
+ <task xsi:type="manual">
+ <message>Manual Downgrade</message>
+ </task>
+ </post-downgrade>
+ </component>
+ </service>
+
+ <service name="YARN">
+ <component name="RESOURCEMANAGER">
+ <pre-upgrade>
+ <task xsi:type="execute">
+ <command>ls</command>
+ </task>
+ </pre-upgrade>
+ </component>
+ <component name="NODEMANAGER">
+ <pre-upgrade>
+ <task xsi:type="execute">
+ <command>ls</command>
+ </task>
+ </pre-upgrade>
+ </component>
+ </service>
+
+ <service name="HIVE">
+ <component name="HIVE_SERVER">
+ <pre-upgrade>
+ <task xsi:type="manual">
+ <summary>HiveServer Port Availability</summary>
+ <message>The HiveServer port will now change to 10010 if hive is using a binary transfer mode or 10011 if hive is using an http transport mode. You can use "netstat -anp | grep 1001[01]" to determine if the port is available on each of following HiveServer host(s): {{hosts.all}}. If the port is not available, the process using it must be terminated.</message>
+ </task>
+
+ <task xsi:type="configure">
+ <condition type="hive-site" key="hive.server2.transport.mode" value="binary">
+ <type>hive-site</type>
+ <key>hive.server2.thrift.port</key>
+ <value>10010</value>
+ </condition>
+ <condition type="hive-site" key="hive.server2.transport.mode" value="http">
+ <type>hive-site</type>
+ <key>hive.server2.http.port</key>
+ <value>10011</value>
+ </condition>
+ </task>
+ </pre-upgrade>
+ </component>
+ </service>
+ </processing>
+</upgrade>
[2/2] ambari git commit: AMBARI-10472. RU: add compatible stacks for
upgrade purposes (ncole)
Posted by nc...@apache.org.
AMBARI-10472. RU: add compatible stacks for upgrade purposes (ncole)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/43550a78
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/43550a78
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/43550a78
Branch: refs/heads/trunk
Commit: 43550a78dcffeec00888141995fa8103539dad43
Parents: 0944ad6
Author: Nate Cole <nc...@hortonworks.com>
Authored: Tue Apr 14 12:52:32 2015 -0400
Committer: Nate Cole <nc...@hortonworks.com>
Committed: Tue Apr 14 15:17:27 2015 -0400
----------------------------------------------------------------------
.../resources/ResourceInstanceFactoryImpl.java | 6 +
.../StackVersionResourceDefinition.java | 21 +-
.../CompatibleRepositoryVersionService.java | 114 ++++
.../server/api/services/StacksService.java | 30 +-
.../AbstractControllerResourceProvider.java | 2 +
...atibleRepositoryVersionResourceProvider.java | 182 ++++++
.../OperatingSystemResourceProvider.java | 1 +
.../RepositoryVersionResourceProvider.java | 2 +-
.../ambari/server/controller/spi/Resource.java | 2 +
.../DistributeRepositoriesActionListener.java | 4 +-
.../orm/entities/RepositoryVersionEntity.java | 17 +-
.../org/apache/ambari/server/state/Cluster.java | 10 +-
.../server/state/cluster/ClusterImpl.java | 20 +-
.../ambari/server/state/stack/UpgradePack.java | 10 +
.../stacks/HDP/2.2/upgrades/upgrade-2.3.xml | 616 +++++++++++++++++++
.../stacks/HDP/2.3/upgrades/upgrade-2.3.xml | 616 +++++++++++++++++++
.../ambari/server/api/query/QueryImplTest.java | 2 +-
.../StackVersionResourceDefinitionTest.java | 18 +-
.../AmbariManagementControllerTest.java | 86 +--
.../internal/ClusterControllerImplTest.java | 25 +-
...leRepositoryVersionResourceProviderTest.java | 189 ++++++
.../HDP/2.1.1/upgrades/upgrade_to_new_stack.xml | 215 +++++++
22 files changed, 2090 insertions(+), 98 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
index 07e70ab..e3af507 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
@@ -309,6 +309,12 @@ public class ResourceInstanceFactoryImpl implements ResourceInstanceFactory {
resourceDefinition = new RepositoryVersionResourceDefinition();
break;
+ case CompatibleRepositoryVersion:
+ resourceDefinition = new SimpleResourceDefinition(Resource.Type.CompatibleRepositoryVersion,
+ "compatible_repository_version", "compatible_repository_versions",
+ Resource.Type.OperatingSystem);
+ break;
+
case HostStackVersion:
resourceDefinition = new ComponentStackVersionResourceDefinition(Resource.Type.HostStackVersion);
break;
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
index 0b26308..55470b9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
@@ -22,14 +22,9 @@ import java.util.HashSet;
import java.util.Set;
import org.apache.ambari.server.controller.spi.Resource;
-import org.apache.ambari.server.controller.spi.Resource.Type;
public class StackVersionResourceDefinition extends BaseResourceDefinition {
- public StackVersionResourceDefinition(Type resourceType) {
- super(Resource.Type.StackVersion);
- }
-
public StackVersionResourceDefinition() {
super(Resource.Type.StackVersion);
}
@@ -47,15 +42,15 @@ public class StackVersionResourceDefinition extends BaseResourceDefinition {
@Override
public Set<SubResourceDefinition> getSubResourceDefinitions() {
- Set<SubResourceDefinition> setChildren = new HashSet<SubResourceDefinition>();
-
- setChildren.add(new SubResourceDefinition(Resource.Type.OperatingSystem));
- setChildren.add(new SubResourceDefinition(Resource.Type.StackService));
- setChildren.add(new SubResourceDefinition(Resource.Type.StackLevelConfiguration));
- setChildren.add(new SubResourceDefinition(Resource.Type.RepositoryVersion));
- setChildren.add(new SubResourceDefinition(Type.StackArtifact));
+ Set<SubResourceDefinition> children = new HashSet<SubResourceDefinition>();
- return setChildren;
+ children.add(new SubResourceDefinition(Resource.Type.OperatingSystem));
+ children.add(new SubResourceDefinition(Resource.Type.StackService));
+ children.add(new SubResourceDefinition(Resource.Type.StackLevelConfiguration));
+ children.add(new SubResourceDefinition(Resource.Type.RepositoryVersion));
+ children.add(new SubResourceDefinition(Resource.Type.StackArtifact));
+ children.add(new SubResourceDefinition(Resource.Type.CompatibleRepositoryVersion));
+ return children;
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/main/java/org/apache/ambari/server/api/services/CompatibleRepositoryVersionService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/CompatibleRepositoryVersionService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/CompatibleRepositoryVersionService.java
new file mode 100644
index 0000000..12d6433
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/CompatibleRepositoryVersionService.java
@@ -0,0 +1,114 @@
+/**
+ * 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.api.services;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.controller.spi.Resource;
+
+/**
+ * Service responsible for compatible repository versions requests for a stack.
+ */
+public class CompatibleRepositoryVersionService extends BaseService {
+
+ /**
+ * Extra properties to be inserted into created resource.
+ */
+ private Map<Resource.Type, String> parentKeyProperties;
+
+ /**
+ * Constructor.
+ *
+ * @param parentProperties extra properties to be inserted into created resource
+ */
+ public CompatibleRepositoryVersionService(Map<Resource.Type, String> parentProperties) {
+ parentKeyProperties = parentProperties;
+ }
+
+ /**
+ * Gets all repository versions.
+ * Handles: GET /compatible_repository_versions requests.
+ *
+ * @param headers http headers
+ * @param ui uri info
+ */
+ @GET
+ @Produces("text/plain")
+ public Response getRepositoryVersions(@Context HttpHeaders headers, @Context UriInfo ui) {
+ return handleRequest(headers, null, ui, Request.Type.GET, createResource(null));
+ }
+
+ /**
+ * Gets a single repository version.
+ * Handles: GET /compatible_repository_versions/{repositoryVersionId} requests.
+ *
+ * @param headers http headers
+ * @param ui uri info
+ * @param repositoryVersionId the repository version id
+ * @return information regarding the specified repository
+ */
+ @GET
+ @Path("{repositoryVersionId}")
+ @Produces("text/plain")
+ public Response getRepositoryVersion(@Context HttpHeaders headers,
+ @Context UriInfo ui,
+ @PathParam("repositoryVersionId") String repositoryVersionId) {
+ return handleRequest(headers, null, ui, Request.Type.GET, createResource(repositoryVersionId));
+ }
+
+ /**
+ * Handles ANY /{repositoryVersionId}/operating_systems requests.
+ *
+ * @param repositoryVersionId the repository version id
+ * @return operating systems service
+ */
+ @Path("{repositoryVersionId}/operating_systems")
+ public OperatingSystemService getOperatingSystemsHandler(@PathParam("repositoryVersionId") String repositoryVersionId) {
+ Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+ mapIds.putAll(parentKeyProperties);
+ mapIds.put(Resource.Type.CompatibleRepositoryVersion, repositoryVersionId);
+
+ return new OperatingSystemService(mapIds);
+ }
+
+ /**
+ * Create a repository version resource instance.
+ *
+ * @param repositoryVersionId repository version id
+ *
+ * @return a repository resource instance
+ */
+ private ResourceInstance createResource(String repositoryVersionId) {
+ Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+ mapIds.putAll(parentKeyProperties);
+ mapIds.put(Resource.Type.CompatibleRepositoryVersion, repositoryVersionId);
+
+ return createResource(Resource.Type.CompatibleRepositoryVersion, mapIds);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java
index dd7ec10..c467f44 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java
@@ -18,14 +18,8 @@
package org.apache.ambari.server.api.services;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLDecoder;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import javax.ws.rs.GET;
@@ -34,18 +28,11 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.PathSegment;
import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
-import org.apache.ambari.server.api.predicate.QueryLexer;
import org.apache.ambari.server.api.resources.ResourceInstance;
import org.apache.ambari.server.controller.spi.Resource;
-import org.apache.http.NameValuePair;
-import org.apache.http.client.utils.URLEncodedUtils;
-import org.apache.http.message.BasicNameValuePair;
/**
* Service for stacks management.
@@ -326,6 +313,23 @@ public class StacksService extends BaseService {
return new RepositoryVersionService(stackProperties);
}
+ /**
+ * Handles ANY /{stackName}/versions/{stackVersion}/compatible_repository_versions.
+ *
+ * @param stackName stack name
+ * @param stackVersion stack version
+ * @return repository version service
+ */
+ @Path("{stackName}/versions/{stackVersion}/compatible_repository_versions")
+ public CompatibleRepositoryVersionService getCompatibleRepositoryVersionHandler(
+ @PathParam("stackName") String stackName,
+ @PathParam("stackVersion") String stackVersion) {
+ final Map<Resource.Type, String> stackProperties = new HashMap<Resource.Type, String>();
+ stackProperties.put(Resource.Type.Stack, stackName);
+ stackProperties.put(Resource.Type.StackVersion, stackVersion);
+ return new CompatibleRepositoryVersionService(stackProperties);
+ }
+
ResourceInstance createStackServiceComponentResource(
String stackName, String stackVersion, String serviceName, String componentName) {
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/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 eb1a818..0cff452 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
@@ -153,6 +153,8 @@ public abstract class AbstractControllerResourceProvider extends AbstractResourc
return new ClientConfigResourceProvider(propertyIds, keyPropertyIds, managementController);
case RepositoryVersion:
return resourceProviderFactory.getRepositoryVersionResourceProvider();
+ case CompatibleRepositoryVersion:
+ return new CompatibleRepositoryVersionResourceProvider(managementController);
case StackArtifact:
return new StackArtifactResourceProvider(managementController);
case Theme:
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/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
new file mode 100644
index 0000000..ec8d495
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java
@@ -0,0 +1,182 @@
+/**
+ * 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.internal;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.ambari.server.StaticallyInject;
+import org.apache.ambari.server.api.resources.OperatingSystemResourceDefinition;
+import org.apache.ambari.server.api.resources.RepositoryResourceDefinition;
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
+import org.apache.ambari.server.controller.AmbariManagementController;
+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.Resource;
+import org.apache.ambari.server.controller.spi.Resource.Type;
+import org.apache.ambari.server.controller.spi.SystemException;
+import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
+import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
+import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+import org.apache.ambari.server.state.StackId;
+import org.apache.ambari.server.state.stack.UpgradePack;
+import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
+
+import com.google.common.collect.Sets;
+import com.google.gson.Gson;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+/**
+ * Resource provider for repository versions resources.
+ */
+@StaticallyInject
+public class CompatibleRepositoryVersionResourceProvider extends ReadOnlyResourceProvider {
+
+ // ----- Property ID constants ---------------------------------------------
+
+ public static final String REPOSITORY_VERSION_ID_PROPERTY_ID = "CompatibleRepositoryVersions/id";
+ public static final String REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID = "CompatibleRepositoryVersions/stack_name";
+ public static final String REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID = "CompatibleRepositoryVersions/stack_version";
+ public static final String REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID = "CompatibleRepositoryVersions/repository_version";
+ public static final String REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID = "CompatibleRepositoryVersions/display_name";
+ public static final String REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID = "CompatibleRepositoryVersions/upgrade_pack";
+ public static final String SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID = new OperatingSystemResourceDefinition().getPluralName();
+ public static final String SUBRESOURCE_REPOSITORIES_PROPERTY_ID = new RepositoryResourceDefinition().getPluralName();
+
+ private static Set<String> pkPropertyIds = Collections.singleton(REPOSITORY_VERSION_ID_PROPERTY_ID);
+
+ static Set<String> propertyIds = Sets.newHashSet(
+ REPOSITORY_VERSION_ID_PROPERTY_ID,
+ REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID,
+ REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID,
+ REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID,
+ REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID,
+ REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID,
+ SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID);
+
+ static Map<Type, String> keyPropertyIds = new HashMap<Type, String>() {
+ {
+ put(Type.Stack, REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID);
+ put(Type.StackVersion, REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID);
+ put(Type.CompatibleRepositoryVersion, REPOSITORY_VERSION_ID_PROPERTY_ID);
+ }
+ };
+
+ @Inject
+ private static Gson s_gson;
+
+ @Inject
+ private static RepositoryVersionDAO s_repositoryVersionDAO;
+
+ @Inject
+ private static Provider<AmbariMetaInfo> s_ambariMetaInfo;
+
+ @Inject
+ private static Provider<RepositoryVersionHelper> s_repositoryVersionHelper;
+
+ /**
+ * Create a new resource provider.
+ *
+ */
+ public CompatibleRepositoryVersionResourceProvider(AmbariManagementController amc) {
+ super(propertyIds, keyPropertyIds, amc);
+ }
+
+ @Override
+ public Set<Resource> getResources(Request request, Predicate predicate)
+ throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+ final Set<Resource> resources = new HashSet<Resource>();
+ final Set<String> requestedIds = getRequestPropertyIds(request, predicate);
+ final Set<Map<String, Object>> propertyMaps = getPropertyMaps(predicate);
+
+
+ List<RepositoryVersionEntity> requestedEntities = new ArrayList<RepositoryVersionEntity>();
+ for (Map<String, Object> propertyMap: propertyMaps) {
+
+ final StackId stackId = getStackInformationFromUrl(propertyMap);
+
+ if (propertyMaps.size() == 1 && propertyMap.get(REPOSITORY_VERSION_ID_PROPERTY_ID) == null) {
+ requestedEntities.addAll(s_repositoryVersionDAO.findByStack(stackId.getStackId()));
+
+ Map<String, UpgradePack> packs = s_ambariMetaInfo.get().getUpgradePacks(
+ stackId.getStackName(), stackId.getStackVersion());
+
+ for (UpgradePack up : packs.values()) {
+ if (null != up.getTargetStack()) {
+ requestedEntities.addAll(s_repositoryVersionDAO.findByStack(up.getTargetStack()));
+ }
+ }
+
+ } else {
+ final Long id;
+ try {
+ id = Long.parseLong(propertyMap.get(REPOSITORY_VERSION_ID_PROPERTY_ID).toString());
+ } catch (Exception ex) {
+ throw new SystemException("Repository version should have numerical id");
+ }
+ final RepositoryVersionEntity entity = s_repositoryVersionDAO.findByPK(id);
+ if (entity == null) {
+ throw new NoSuchResourceException("There is no repository version with id " + id);
+ } else {
+ requestedEntities.add(entity);
+ }
+ }
+ }
+
+ for (RepositoryVersionEntity entity: requestedEntities) {
+
+ final Resource resource = new ResourceImpl(Resource.Type.CompatibleRepositoryVersion);
+
+ setResourceProperty(resource, REPOSITORY_VERSION_ID_PROPERTY_ID, entity.getId(), requestedIds);
+ setResourceProperty(resource, REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID, entity.getStackName(), requestedIds);
+ setResourceProperty(resource, REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID, entity.getStackVersion(), requestedIds);
+ setResourceProperty(resource, REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID, entity.getDisplayName(), requestedIds);
+ setResourceProperty(resource, REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID, entity.getUpgradePackage(), requestedIds);
+ setResourceProperty(resource, REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID, entity.getVersion(), requestedIds);
+
+ resources.add(resource);
+ }
+ return resources;
+ }
+
+ @Override
+ protected Set<String> getPKPropertyIds() {
+ return pkPropertyIds;
+ }
+
+ /**
+ * Gets the stack id from the request map
+ * @param propertyMap the request map
+ * @return the StackId, or {@code null} if not found.
+ */
+ protected StackId getStackInformationFromUrl(Map<String, Object> propertyMap) {
+ if (propertyMap.containsKey(REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID) && propertyMap.containsKey(REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID)) {
+ return new StackId(propertyMap.get(REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID).toString(), propertyMap.get(REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID).toString());
+ }
+ return null;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/OperatingSystemResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/OperatingSystemResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/OperatingSystemResourceProvider.java
index b656def..b982583 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/OperatingSystemResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/OperatingSystemResourceProvider.java
@@ -71,6 +71,7 @@ public class OperatingSystemResourceProvider extends ReadOnlyResourceProvider {
put(Resource.Type.Stack, OPERATING_SYSTEM_STACK_NAME_PROPERTY_ID);
put(Resource.Type.StackVersion, OPERATING_SYSTEM_STACK_VERSION_PROPERTY_ID);
put(Resource.Type.RepositoryVersion, OPERATING_SYSTEM_REPOSITORY_VERSION_ID_PROPERTY_ID);
+ put(Resource.Type.CompatibleRepositoryVersion, OPERATING_SYSTEM_REPOSITORY_VERSION_ID_PROPERTY_ID);
}
};
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
index ada207a..9a80ad8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
@@ -50,7 +50,6 @@ import org.apache.ambari.server.state.OperatingSystemInfo;
import org.apache.ambari.server.state.RepositoryVersionState;
import org.apache.ambari.server.state.StackId;
import org.apache.ambari.server.state.StackInfo;
-import org.apache.ambari.server.state.stack.UpgradePack;
import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
@@ -180,6 +179,7 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider
List<RepositoryVersionEntity> requestedEntities = new ArrayList<RepositoryVersionEntity>();
for (Map<String, Object> propertyMap: propertyMaps) {
final StackId stackId = getStackInformationFromUrl(propertyMap);
+
if (propertyMaps.size() == 1 && propertyMap.get(REPOSITORY_VERSION_ID_PROPERTY_ID) == null) {
requestedEntities.addAll(repositoryVersionDAO.findByStack(stackId.getStackId()));
} else {
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
index e928e8e..035f96f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
@@ -129,6 +129,7 @@ public interface Resource {
LdapSyncEvent,
UserPrivilege,
RepositoryVersion,
+ CompatibleRepositoryVersion,
ClusterStackVersion,
HostStackVersion,
Upgrade,
@@ -230,6 +231,7 @@ public interface Resource {
public static final Type LdapSyncEvent = InternalType.LdapSyncEvent.getType();
public static final Type UserPrivilege = InternalType.UserPrivilege.getType();
public static final Type RepositoryVersion = InternalType.RepositoryVersion.getType();
+ public static final Type CompatibleRepositoryVersion = InternalType.CompatibleRepositoryVersion.getType();
public static final Type ClusterStackVersion = InternalType.ClusterStackVersion.getType();
public static final Type HostStackVersion = InternalType.HostStackVersion.getType();
public static final Type Upgrade = InternalType.Upgrade.getType();
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
index 19c1aad..85e92af 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
@@ -165,7 +165,9 @@ public class DistributeRepositoriesActionListener {
// Update state of a cluster stack version
try {
Cluster cluster = clusters.get().getClusterById(clusterId);
- cluster.recalculateClusterVersionState(hostVersion.getRepositoryVersion().getVersion());
+ cluster.recalculateClusterVersionState(
+ hostVersion.getRepositoryVersion().getStackId(),
+ hostVersion.getRepositoryVersion().getVersion());
} catch (AmbariException e) {
LOG.error("Cannot get cluster with Id " + clusterId.toString(), e);
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
index 23c121e..e536f02 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
@@ -17,13 +17,13 @@
*/
package org.apache.ambari.server.orm.entities;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
-import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@@ -44,9 +44,6 @@ import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
import com.google.inject.Provider;
-import java.util.Collection;
-import javax.persistence.CascadeType;
-import javax.persistence.OneToMany;
@Entity
@Table(name = "repo_version", uniqueConstraints = {
@@ -94,10 +91,10 @@ public class RepositoryVersionEntity {
@Lob
@Column(name = "repositories")
private String operatingSystems;
-
+
@OneToMany(cascade = CascadeType.REMOVE, mappedBy = "repositoryVersion")
private Collection<ClusterVersionEntity> clusterVersionEntities;
-
+
@OneToMany(cascade = CascadeType.REMOVE, mappedBy = "repositoryVersion")
private Collection<HostVersionEntity> hostVersionEntities;
@@ -181,11 +178,15 @@ public class RepositoryVersionEntity {
}
public String getStackName() {
- return new StackId(stack).getStackName();
+ return getStackId().getStackName();
}
public String getStackVersion() {
- return new StackId(stack).getStackVersion();
+ return getStackId().getStackVersion();
+ }
+
+ public StackId getStackId() {
+ return new StackId(stack);
}
@Override
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java b/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
index 787f5d6..b10157a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
@@ -152,7 +152,7 @@ public interface Cluster {
* @throws AmbariException
*/
public void inferHostVersions(ClusterVersionEntity sourceClusterVersion) throws AmbariException;
-
+
/**
* For a given host, will either either update an existing Host Version Entity for the given version, or create
* one if it doesn't exist
@@ -173,6 +173,14 @@ public interface Cluster {
void recalculateClusterVersionState(String repositoryVersion) throws AmbariException;
/**
+ * Update state of a cluster stack version for cluster based on states of host versions and stackids.
+ * @param stackId the stack id with the version
+ * @param repositoryVersion the repository version (e.g. 2.2.1.0-100)
+ * @throws AmbariException
+ */
+ void recalculateClusterVersionState(StackId stackId, String repositoryVersion) throws AmbariException;
+
+ /**
* Update state of all cluster stack versions for cluster based on states of host versions.
* @throws AmbariException
*/
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
index 8e89cad..1a8bf43 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
@@ -1181,23 +1181,26 @@ public class ClusterImpl implements Cluster {
return RepositoryVersionState.OUT_OF_SYNC;
}
- /**
- * Recalculate what the Cluster Version state should be, depending on the individual Host Versions.
- * @param repositoryVersion Repository version (e.g., 2.2.0.0-1234)
- * @throws AmbariException
- */
@Override
public void recalculateClusterVersionState(String repositoryVersion) throws AmbariException {
+ recalculateClusterVersionState(null, repositoryVersion);
+ }
+
+ @Override
+ public void recalculateClusterVersionState(StackId stackId, String repositoryVersion) throws AmbariException {
if (repositoryVersion == null) {
return;
}
Map<String, Host> hosts = clusters.getHostsForCluster(getClusterName());
+ if (null == stackId) {
+ stackId = getCurrentStackVersion();
+ }
+
clusterGlobalLock.writeLock().lock();
try {
// Part 1, bootstrap cluster version if necessary.
- StackId stackId = getCurrentStackVersion();
ClusterVersionEntity clusterVersion = clusterVersionDAO.findByClusterAndStackAndVersion(
getClusterName(), stackId.getStackId(), repositoryVersion);
@@ -1318,6 +1321,7 @@ public class ClusterImpl implements Cluster {
* @param stack Stack information
* @throws AmbariException
*/
+ @Override
@Transactional
public HostVersionEntity transitionHostVersionState(HostEntity host, final RepositoryVersionEntity repositoryVersion, final StackId stack) throws AmbariException {
HostVersionEntity hostVersionEntity = hostVersionDAO.findByClusterStackVersionAndHost(getClusterName(), repositoryVersion.getStack(), repositoryVersion.getVersion(), host.getHostName());
@@ -1372,7 +1376,9 @@ public class ClusterImpl implements Cluster {
if (clusterVersionEntity.getRepositoryVersion().getStack().equals(
currentStackId.getStackId())
&& clusterVersionEntity.getState() != RepositoryVersionState.CURRENT) {
- recalculateClusterVersionState(clusterVersionEntity.getRepositoryVersion().getVersion());
+ recalculateClusterVersionState(
+ clusterVersionEntity.getRepositoryVersion().getStackId(),
+ clusterVersionEntity.getRepositoryVersion().getVersion());
}
}
} finally {
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
index b10f3f7..9691292 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
@@ -47,6 +47,9 @@ public class UpgradePack {
@XmlElement(name="target")
private String target;
+ @XmlElement(name="target-stack")
+ private String targetStack;
+
@XmlElementWrapper(name="order")
@XmlElement(name="group")
@@ -71,6 +74,13 @@ public class UpgradePack {
}
/**
+ * @return the target stack, or {@code null} if the upgrade is within the same stack
+ */
+ public String getTargetStack() {
+ return targetStack;
+ }
+
+ /**
* Gets the groups defined for the upgrade pack. If a direction is defined
* for a group, it must match the supplied direction to be returned
* @param direction the direction to return the ordered groups
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml
new file mode 100644
index 0000000..8dccf65
--- /dev/null
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml
@@ -0,0 +1,616 @@
+<?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.
+-->
+
+
+<upgrade xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <target>2.3.*.*</target>
+ <target-stack>HDP-2.3</target-stack>
+ <order>
+
+ <group xsi:type="cluster" name="PRE_CLUSTER" title="Prepare Backups">
+ <direction>UPGRADE</direction>
+ <execute-stage service="HDFS" component="NAMENODE" title="Pre Upgrade HDFS">
+ <task xsi:type="execute" hosts="master">
+ <script>scripts/namenode.py</script>
+ <function>prepare_rolling_upgrade</function>
+ </task>
+ </execute-stage>
+
+ <execute-stage service="HBASE" component="HBASE_MASTER" title="Pre Upgrade HBase">
+ <task xsi:type="execute" hosts="master">
+ <script>scripts/hbase_upgrade.py</script>
+ <function>snapshot</function>
+ </task>
+ </execute-stage>
+
+ <execute-stage service="HIVE" component="HIVE_METASTORE" title="Pre Upgrade Hive">
+ <task xsi:type="manual">
+ <message>Before continuing, please backup the Hive Metastore database located on the following host(s): {{hosts.all}}.</message>
+ </task>
+ </execute-stage>
+
+ <execute-stage service="OOZIE" component="OOZIE_SERVER" title="Pre Upgrade Oozie">
+ <task xsi:type="manual">
+ <message>Before continuing, please backup the Oozie Server database on {{oozie-env/oozie_hostname}}.</message>
+ </task>
+ </execute-stage>
+
+ </group>
+
+ <group name="ZOOKEEPER" title="ZooKeeper">
+ <service name="ZOOKEEPER">
+ <component>ZOOKEEPER_SERVER</component>
+ </service>
+ </group>
+
+ <group name="RANGER" title="Ranger">
+ <skippable>true</skippable>
+ <service name="RANGER">
+ <component>RANGER_ADMIN</component>
+ <component>RANGER_USERSYNC</component>
+ </service>
+ </group>
+
+ <group name="CORE_MASTER" title="Core Masters">
+ <service-check>false</service-check>
+ <service name="HDFS">
+ <component>JOURNALNODE</component>
+ <component>NAMENODE</component>
+ </service>
+
+ <service name="MAPREDUCE2">
+ <component>HISTORYSERVER</component>
+ </service>
+
+ <service name="YARN">
+ <component>APP_TIMELINE_SERVER</component>
+ <component>RESOURCEMANAGER</component>
+ </service>
+
+ <service name="HBASE">
+ <component>HBASE_MASTER</component>
+ </service>
+
+ </group>
+
+ <group name="SERVICE_CHECK" title="All Service Checks" xsi:type="service-check">
+ <skippable>true</skippable>
+ <direction>UPGRADE</direction>
+ <priority>
+ <service>HDFS</service>
+ <service>MAPREDUCE2</service>
+ <service>YARN</service>
+ <service>HBASE</service>
+ </priority>
+ <exclude>
+ <service>AMBARI_METRICS</service>
+ </exclude>
+ </group>
+
+ <group name="CORE_SLAVES" title="Core Slaves" xsi:type="colocated">
+ <service-check>false</service-check>
+ <service name="HDFS">
+ <component>DATANODE</component>
+ </service>
+
+ <service name="HBASE">
+ <component>HBASE_REGIONSERVER</component>
+ </service>
+
+ <service name="YARN">
+ <component>NODEMANAGER</component>
+ </service>
+
+ <batch>
+ <percent>20</percent>
+ <summary>Verification Required</summary>
+ <message>The initial batch of {{components}} hosts have been {{direction.past}}. You are advised to check the hosts and perform cluster/workload-specific tests against your cluster to ensure proper operation before proceeding with {{direction.text}} of the remaining services.</message>
+ </batch>
+ </group>
+
+ <group name="SERVICE_CHECK" title="All Service Checks" xsi:type="service-check">
+ <skippable>true</skippable>
+ <direction>UPGRADE</direction>
+ <priority>
+ <service>HDFS</service>
+ <service>YARN</service>
+ <service>HBASE</service>
+ </priority>
+ <exclude>
+ <service>AMBARI_METRICS</service>
+ </exclude>
+ </group>
+
+ <group name="HIVE" title="Hive">
+ <skippable>true</skippable>
+ <service name="HIVE">
+ <component>HIVE_METASTORE</component>
+ <component>HIVE_SERVER</component>
+ <component>WEBHCAT_SERVER</component>
+ </service>
+ </group>
+
+ <group name="SPARK" title="Spark">
+ <skippable>true</skippable>
+ <service name="SPARK">
+ <component>SPARK_JOBHISTORYSERVER</component>
+ <component>SPARK_CLIENT</component>
+ </service>
+ </group>
+
+ <group name="OOZIE" title="Oozie">
+ <skippable>true</skippable>
+ <service name="OOZIE">
+ <component>OOZIE_SERVER</component>
+ <component>OOZIE_CLIENT</component>
+ </service>
+ </group>
+
+ <group name="FALCON" title="Falcon">
+ <skippable>true</skippable>
+ <service name="FALCON">
+ <component>FALCON_SERVER</component>
+ <component>FALCON_CLIENT</component>
+ </service>
+ </group>
+
+ <group name="CLIENTS" title="Client Components">
+ <service-check>false</service-check>
+ <service name="ZOOKEEPER">
+ <component>ZOOKEEPER_CLIENT</component>
+ </service>
+ <service name="HDFS">
+ <component>HDFS_CLIENT</component>
+ </service>
+
+ <service name="YARN">
+ <component>YARN_CLIENT</component>
+ </service>
+
+ <service name="MAPREDUCE2">
+ <component>MAPREDUCE2_CLIENT</component>
+ </service>
+
+ <service name="TEZ">
+ <component>TEZ_CLIENT</component>
+ </service>
+
+ <service name="HBASE">
+ <component>HBASE_CLIENT</component>
+ </service>
+
+ <service name="PIG">
+ <component>PIG</component>
+ </service>
+
+ <service name="SQOOP">
+ <component>SQOOP</component>
+ </service>
+
+ <service name="HIVE">
+ <component>HIVE_CLIENT</component>
+ <component>HCAT</component>
+ </service>
+ </group>
+
+ <group name="SERVICE_CHECK" title="All Service Checks" xsi:type="service-check">
+ <skippable>true</skippable>
+ <direction>UPGRADE</direction>
+ <priority>
+ <service>HDFS</service>
+ <service>YARN</service>
+ <service>HBASE</service>
+ </priority>
+ <exclude>
+ <service>AMBARI_METRICS</service>
+ </exclude>
+ </group>
+
+ <group name="KAFKA" title="Kafka">
+ <skippable>true</skippable>
+ <service name="KAFKA">
+ <component>KAFKA_BROKER</component>
+ </service>
+ </group>
+
+ <group name="KNOX" title="Knox">
+ <skippable>true</skippable>
+ <service name="KNOX">
+ <component>KNOX_GATEWAY</component>
+ </service>
+ </group>
+
+ <group name="STORM" title="Storm">
+ <skippable>true</skippable>
+ <service name="STORM">
+ <component>NIMBUS</component>
+ <component>STORM_REST_API</component>
+ <component>SUPERVISOR</component>
+ <component>STORM_UI_SERVER</component>
+ <component>DRPC_SERVER</component>
+ </service>
+ </group>
+
+ <group name="SLIDER" title="Slider">
+ <skippable>true</skippable>
+ <service name="SLIDER">
+ <component>SLIDER</component>
+ </service>
+ </group>
+
+ <group name="FLUME" title="Flume">
+ <skippable>true</skippable>
+ <service name="FLUME">
+ <component>FLUME_HANDLER</component>
+ </service>
+ </group>
+
+
+ <group xsi:type="cluster" name="POST_CLUSTER" title="Finalize {{direction.text.proper}}">
+ <skippable>true</skippable>
+ <execute-stage title="Check Unhealthy Hosts" id="unhealthy-hosts">
+ <task xsi:type="manual">
+ <message>The following hosts were unhealthy and should be resolved before finalizing can be completed: {{hosts.unhealthy}}</message>
+ </task>
+ </execute-stage>
+
+ <execute-stage title="Confirm Finalize">
+ <direction>UPGRADE</direction>
+ <task xsi:type="manual">
+ <message>Please confirm you are ready to finalize.</message>
+ </task>
+ </execute-stage>
+
+ <execute-stage service="HDFS" component="NAMENODE" title="Execute HDFS Finalize">
+ <task xsi:type="execute" hosts="master">
+ <script>scripts/namenode.py</script>
+ <function>finalize_rolling_upgrade</function>
+ </task>
+ </execute-stage>
+ <execute-stage title="Save Cluster State" service="" component="">
+ <task xsi:type="server_action" class="org.apache.ambari.server.serveraction.upgrades.FinalizeUpgradeAction">
+ </task>
+ </execute-stage>
+ </group>
+ </order>
+
+ <processing>
+ <service name="ZOOKEEPER">
+ <component name="ZOOKEEPER_SERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="ZOOKEEPER_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="RANGER">
+ <component name="RANGER_ADMIN">
+ <pre-upgrade>
+ <task xsi:type="manual">
+ <message>Before continuing, please backup the Ranger Admin database and Ranger Audit database</message>
+ </task>
+ </pre-upgrade>
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="RANGER_USERSYNC">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="HDFS">
+ <component name="NAMENODE">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="DATANODE">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="HDFS_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="JOURNALNODE">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="MAPREDUCE2">
+ <component name="HISTORYSERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="MAPREDUCE2_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="YARN">
+ <component name="APP_TIMELINE_SERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="RESOURCEMANAGER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="NODEMANAGER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="YARN_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+ <service name="HBASE">
+ <component name="HBASE_MASTER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="HBASE_REGIONSERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="HBASE_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="TEZ">
+ <component name="TEZ_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="PIG">
+ <component name="PIG">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="SQOOP">
+ <component name="SQOOP">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="HIVE">
+ <component name="HIVE_METASTORE">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="HIVE_SERVER">
+ <pre-upgrade>
+ <task xsi:type="manual">
+ <summary>HiveServer Port Availability</summary>
+ <message>Please note that the HiveServer port will now change to 10010 if hive is using a binary transfer mode or 10011 if hive is using an http transport mode. You can use "netstat -anp | grep 1001[01]" to determine if the port is available on each of following HiveServer host(s): {{hosts.all}}. If the port is not available, the process using it must be terminated.</message>
+ </task>
+
+ <task xsi:type="configure">
+ <condition type="hive-site" key="hive.server2.transport.mode" value="binary">
+ <type>hive-site</type>
+ <key>hive.server2.thrift.port</key>
+ <value>10010</value>
+ </condition>
+ <condition type="hive-site" key="hive.server2.transport.mode" value="http">
+ <type>hive-site</type>
+ <key>hive.server2.http.port</key>
+ <value>10011</value>
+ </condition>
+ </task>
+ </pre-upgrade>
+
+ <pre-downgrade>
+ <task xsi:type="manual">
+ <summary>HiveServer Port Availability</summary>
+ <message>Please note that the HiveServer port will now change to 10000 if hive is using a binary transfer mode or 10001 if hive is using an http transport mode. You can use "netstat -anp | grep 1000[01]" to determine if the port is available on each of following HiveServer host(s): {{hosts.all}}. If the port is not available, the process using it must be terminated.</message>
+ </task>
+
+ <task xsi:type="configure">
+ <condition type="hive-site" key="hive.server2.transport.mode" value="binary">
+ <type>hive-site</type>
+ <key>hive.server2.thrift.port</key>
+ <value>10000</value>
+ </condition>
+ <condition type="hive-site" key="hive.server2.transport.mode" value="http">
+ <type>hive-site</type>
+ <key>hive.server2.http.port</key>
+ <value>10001</value>
+ </condition>
+ </task>
+ </pre-downgrade>
+
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="WEBHCAT_SERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="HIVE_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="HCAT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="SLIDER">
+ <component name="SLIDER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="SPARK">
+ <component name="SPARK_JOBHISTORYSERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ <component name="SPARK_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="OOZIE">
+ <component name="OOZIE_SERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ <component name="OOZIE_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="FALCON">
+ <component name="FALCON_SERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ <component name="FALCON_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="KAFKA">
+ <component name="KAFKA_BROKER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="KNOX">
+ <component name="KNOX_GATEWAY">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="STORM">
+ <component name="NIMBUS">
+ <pre-upgrade>
+ <task xsi:type="manual">
+ <message>Before continuing, please deactivate and kill any currently running topologies.</message>
+ </task>
+ </pre-upgrade>
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ <component name="STORM_REST_API">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ <component name="SUPERVISOR">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ <component name="STORM_UI_SERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ <component name="DRPC_SERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ <post-upgrade>
+ <task xsi:type="manual">
+ <message>Please rebuild your topology using the new Storm version dependencies and resubmit it using the newly created jar.</message>
+ </task>
+ </post-upgrade>
+ </component>
+ </service>
+
+ <service name="FLUME">
+ <component name="FLUME_HANDLER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+ </processing>
+</upgrade>
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
new file mode 100644
index 0000000..65549dd
--- /dev/null
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
@@ -0,0 +1,616 @@
+<?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.
+-->
+
+
+<upgrade xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <target>2.3.*.*</target>
+
+ <order>
+
+ <group xsi:type="cluster" name="PRE_CLUSTER" title="Prepare Backups">
+ <direction>UPGRADE</direction>
+ <execute-stage service="HDFS" component="NAMENODE" title="Pre Upgrade HDFS">
+ <task xsi:type="execute" hosts="master">
+ <script>scripts/namenode.py</script>
+ <function>prepare_rolling_upgrade</function>
+ </task>
+ </execute-stage>
+
+ <execute-stage service="HBASE" component="HBASE_MASTER" title="Pre Upgrade HBase">
+ <task xsi:type="execute" hosts="master">
+ <script>scripts/hbase_upgrade.py</script>
+ <function>snapshot</function>
+ </task>
+ </execute-stage>
+
+ <execute-stage service="HIVE" component="HIVE_METASTORE" title="Pre Upgrade Hive">
+ <task xsi:type="manual">
+ <message>Before continuing, please backup the Hive Metastore database located on the following host(s): {{hosts.all}}.</message>
+ </task>
+ </execute-stage>
+
+ <execute-stage service="OOZIE" component="OOZIE_SERVER" title="Pre Upgrade Oozie">
+ <task xsi:type="manual">
+ <message>Before continuing, please backup the Oozie Server database on {{oozie-env/oozie_hostname}}.</message>
+ </task>
+ </execute-stage>
+
+ </group>
+
+ <group name="ZOOKEEPER" title="ZooKeeper">
+ <service name="ZOOKEEPER">
+ <component>ZOOKEEPER_SERVER</component>
+ </service>
+ </group>
+
+ <group name="RANGER" title="Ranger">
+ <skippable>true</skippable>
+ <service name="RANGER">
+ <component>RANGER_ADMIN</component>
+ <component>RANGER_USERSYNC</component>
+ </service>
+ </group>
+
+ <group name="CORE_MASTER" title="Core Masters">
+ <service-check>false</service-check>
+ <service name="HDFS">
+ <component>JOURNALNODE</component>
+ <component>NAMENODE</component>
+ </service>
+
+ <service name="MAPREDUCE2">
+ <component>HISTORYSERVER</component>
+ </service>
+
+ <service name="YARN">
+ <component>APP_TIMELINE_SERVER</component>
+ <component>RESOURCEMANAGER</component>
+ </service>
+
+ <service name="HBASE">
+ <component>HBASE_MASTER</component>
+ </service>
+
+ </group>
+
+ <group name="SERVICE_CHECK" title="All Service Checks" xsi:type="service-check">
+ <skippable>true</skippable>
+ <direction>UPGRADE</direction>
+ <priority>
+ <service>HDFS</service>
+ <service>MAPREDUCE2</service>
+ <service>YARN</service>
+ <service>HBASE</service>
+ </priority>
+ <exclude>
+ <service>AMBARI_METRICS</service>
+ </exclude>
+ </group>
+
+ <group name="CORE_SLAVES" title="Core Slaves" xsi:type="colocated">
+ <service-check>false</service-check>
+ <service name="HDFS">
+ <component>DATANODE</component>
+ </service>
+
+ <service name="HBASE">
+ <component>HBASE_REGIONSERVER</component>
+ </service>
+
+ <service name="YARN">
+ <component>NODEMANAGER</component>
+ </service>
+
+ <batch>
+ <percent>20</percent>
+ <summary>Verification Required</summary>
+ <message>The initial batch of {{components}} hosts have been {{direction.past}}. You are advised to check the hosts and perform cluster/workload-specific tests against your cluster to ensure proper operation before proceeding with {{direction.text}} of the remaining services.</message>
+ </batch>
+ </group>
+
+ <group name="SERVICE_CHECK" title="All Service Checks" xsi:type="service-check">
+ <skippable>true</skippable>
+ <direction>UPGRADE</direction>
+ <priority>
+ <service>HDFS</service>
+ <service>YARN</service>
+ <service>HBASE</service>
+ </priority>
+ <exclude>
+ <service>AMBARI_METRICS</service>
+ </exclude>
+ </group>
+
+ <group name="HIVE" title="Hive">
+ <skippable>true</skippable>
+ <service name="HIVE">
+ <component>HIVE_METASTORE</component>
+ <component>HIVE_SERVER</component>
+ <component>WEBHCAT_SERVER</component>
+ </service>
+ </group>
+
+ <group name="SPARK" title="Spark">
+ <skippable>true</skippable>
+ <service name="SPARK">
+ <component>SPARK_JOBHISTORYSERVER</component>
+ <component>SPARK_CLIENT</component>
+ </service>
+ </group>
+
+ <group name="OOZIE" title="Oozie">
+ <skippable>true</skippable>
+ <service name="OOZIE">
+ <component>OOZIE_SERVER</component>
+ <component>OOZIE_CLIENT</component>
+ </service>
+ </group>
+
+ <group name="FALCON" title="Falcon">
+ <skippable>true</skippable>
+ <service name="FALCON">
+ <component>FALCON_SERVER</component>
+ <component>FALCON_CLIENT</component>
+ </service>
+ </group>
+
+ <group name="CLIENTS" title="Client Components">
+ <service-check>false</service-check>
+ <service name="ZOOKEEPER">
+ <component>ZOOKEEPER_CLIENT</component>
+ </service>
+ <service name="HDFS">
+ <component>HDFS_CLIENT</component>
+ </service>
+
+ <service name="YARN">
+ <component>YARN_CLIENT</component>
+ </service>
+
+ <service name="MAPREDUCE2">
+ <component>MAPREDUCE2_CLIENT</component>
+ </service>
+
+ <service name="TEZ">
+ <component>TEZ_CLIENT</component>
+ </service>
+
+ <service name="HBASE">
+ <component>HBASE_CLIENT</component>
+ </service>
+
+ <service name="PIG">
+ <component>PIG</component>
+ </service>
+
+ <service name="SQOOP">
+ <component>SQOOP</component>
+ </service>
+
+ <service name="HIVE">
+ <component>HIVE_CLIENT</component>
+ <component>HCAT</component>
+ </service>
+ </group>
+
+ <group name="SERVICE_CHECK" title="All Service Checks" xsi:type="service-check">
+ <skippable>true</skippable>
+ <direction>UPGRADE</direction>
+ <priority>
+ <service>HDFS</service>
+ <service>YARN</service>
+ <service>HBASE</service>
+ </priority>
+ <exclude>
+ <service>AMBARI_METRICS</service>
+ </exclude>
+ </group>
+
+ <group name="KAFKA" title="Kafka">
+ <skippable>true</skippable>
+ <service name="KAFKA">
+ <component>KAFKA_BROKER</component>
+ </service>
+ </group>
+
+ <group name="KNOX" title="Knox">
+ <skippable>true</skippable>
+ <service name="KNOX">
+ <component>KNOX_GATEWAY</component>
+ </service>
+ </group>
+
+ <group name="STORM" title="Storm">
+ <skippable>true</skippable>
+ <service name="STORM">
+ <component>NIMBUS</component>
+ <component>STORM_REST_API</component>
+ <component>SUPERVISOR</component>
+ <component>STORM_UI_SERVER</component>
+ <component>DRPC_SERVER</component>
+ </service>
+ </group>
+
+ <group name="SLIDER" title="Slider">
+ <skippable>true</skippable>
+ <service name="SLIDER">
+ <component>SLIDER</component>
+ </service>
+ </group>
+
+ <group name="FLUME" title="Flume">
+ <skippable>true</skippable>
+ <service name="FLUME">
+ <component>FLUME_HANDLER</component>
+ </service>
+ </group>
+
+
+ <group xsi:type="cluster" name="POST_CLUSTER" title="Finalize {{direction.text.proper}}">
+ <skippable>true</skippable>
+ <execute-stage title="Check Unhealthy Hosts" id="unhealthy-hosts">
+ <task xsi:type="manual">
+ <message>The following hosts were unhealthy and should be resolved before finalizing can be completed: {{hosts.unhealthy}}</message>
+ </task>
+ </execute-stage>
+
+ <execute-stage title="Confirm Finalize">
+ <direction>UPGRADE</direction>
+ <task xsi:type="manual">
+ <message>Please confirm you are ready to finalize.</message>
+ </task>
+ </execute-stage>
+
+ <execute-stage service="HDFS" component="NAMENODE" title="Execute HDFS Finalize">
+ <task xsi:type="execute" hosts="master">
+ <script>scripts/namenode.py</script>
+ <function>finalize_rolling_upgrade</function>
+ </task>
+ </execute-stage>
+ <execute-stage title="Save Cluster State" service="" component="">
+ <task xsi:type="server_action" class="org.apache.ambari.server.serveraction.upgrades.FinalizeUpgradeAction">
+ </task>
+ </execute-stage>
+ </group>
+ </order>
+
+ <processing>
+ <service name="ZOOKEEPER">
+ <component name="ZOOKEEPER_SERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="ZOOKEEPER_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="RANGER">
+ <component name="RANGER_ADMIN">
+ <pre-upgrade>
+ <task xsi:type="manual">
+ <message>Before continuing, please backup the Ranger Admin database and Ranger Audit database</message>
+ </task>
+ </pre-upgrade>
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="RANGER_USERSYNC">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="HDFS">
+ <component name="NAMENODE">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="DATANODE">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="HDFS_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="JOURNALNODE">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="MAPREDUCE2">
+ <component name="HISTORYSERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="MAPREDUCE2_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="YARN">
+ <component name="APP_TIMELINE_SERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="RESOURCEMANAGER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="NODEMANAGER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="YARN_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+ <service name="HBASE">
+ <component name="HBASE_MASTER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="HBASE_REGIONSERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="HBASE_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="TEZ">
+ <component name="TEZ_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="PIG">
+ <component name="PIG">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="SQOOP">
+ <component name="SQOOP">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="HIVE">
+ <component name="HIVE_METASTORE">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="HIVE_SERVER">
+ <pre-upgrade>
+ <task xsi:type="manual">
+ <summary>HiveServer Port Availability</summary>
+ <message>Please note that the HiveServer port will now change to 10010 if hive is using a binary transfer mode or 10011 if hive is using an http transport mode. You can use "netstat -anp | grep 1001[01]" to determine if the port is available on each of following HiveServer host(s): {{hosts.all}}. If the port is not available, the process using it must be terminated.</message>
+ </task>
+
+ <task xsi:type="configure">
+ <condition type="hive-site" key="hive.server2.transport.mode" value="binary">
+ <type>hive-site</type>
+ <key>hive.server2.thrift.port</key>
+ <value>10010</value>
+ </condition>
+ <condition type="hive-site" key="hive.server2.transport.mode" value="http">
+ <type>hive-site</type>
+ <key>hive.server2.http.port</key>
+ <value>10011</value>
+ </condition>
+ </task>
+ </pre-upgrade>
+
+ <pre-downgrade>
+ <task xsi:type="manual">
+ <summary>HiveServer Port Availability</summary>
+ <message>Please note that the HiveServer port will now change to 10000 if hive is using a binary transfer mode or 10001 if hive is using an http transport mode. You can use "netstat -anp | grep 1000[01]" to determine if the port is available on each of following HiveServer host(s): {{hosts.all}}. If the port is not available, the process using it must be terminated.</message>
+ </task>
+
+ <task xsi:type="configure">
+ <condition type="hive-site" key="hive.server2.transport.mode" value="binary">
+ <type>hive-site</type>
+ <key>hive.server2.thrift.port</key>
+ <value>10000</value>
+ </condition>
+ <condition type="hive-site" key="hive.server2.transport.mode" value="http">
+ <type>hive-site</type>
+ <key>hive.server2.http.port</key>
+ <value>10001</value>
+ </condition>
+ </task>
+ </pre-downgrade>
+
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="WEBHCAT_SERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="HIVE_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+
+ <component name="HCAT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="SLIDER">
+ <component name="SLIDER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="SPARK">
+ <component name="SPARK_JOBHISTORYSERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ <component name="SPARK_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="OOZIE">
+ <component name="OOZIE_SERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ <component name="OOZIE_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="FALCON">
+ <component name="FALCON_SERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ <component name="FALCON_CLIENT">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="KAFKA">
+ <component name="KAFKA_BROKER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="KNOX">
+ <component name="KNOX_GATEWAY">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+
+ <service name="STORM">
+ <component name="NIMBUS">
+ <pre-upgrade>
+ <task xsi:type="manual">
+ <message>Before continuing, please deactivate and kill any currently running topologies.</message>
+ </task>
+ </pre-upgrade>
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ <component name="STORM_REST_API">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ <component name="SUPERVISOR">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ <component name="STORM_UI_SERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ <component name="DRPC_SERVER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ <post-upgrade>
+ <task xsi:type="manual">
+ <message>Please rebuild your topology using the new Storm version dependencies and resubmit it using the newly created jar.</message>
+ </task>
+ </post-upgrade>
+ </component>
+ </service>
+
+ <service name="FLUME">
+ <component name="FLUME_HANDLER">
+ <upgrade>
+ <task xsi:type="restart" />
+ </upgrade>
+ </component>
+ </service>
+ </processing>
+</upgrade>
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
index 88e62ff..5ac91fd 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
@@ -381,7 +381,7 @@ public class QueryImplTest {
Assert.assertEquals("StackVersion:1", versionNode.getName());
Assert.assertEquals(Resource.Type.StackVersion, versionNode.getObject().getType());
- Assert.assertEquals(5, versionNode.getChildren().size());
+ Assert.assertEquals(6, versionNode.getChildren().size());
TreeNode<Resource> opSystemsNode = versionNode.getChild("operating_systems");
Assert.assertEquals(3, opSystemsNode.getChildren().size());
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/test/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinitionTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinitionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinitionTest.java
index 518b3cf..6aada51 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinitionTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinitionTest.java
@@ -18,13 +18,13 @@
package org.apache.ambari.server.api.resources;
-import org.apache.ambari.server.controller.spi.Resource;
-import org.junit.Test;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertTrue;
import java.util.Set;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.junit.Test;
/**
* StackVersionResourceDefinition unit tests
@@ -42,13 +42,14 @@ public class StackVersionResourceDefinitionTest {
ResourceDefinition def = new StackVersionResourceDefinition();
Set<SubResourceDefinition> subResources = def.getSubResourceDefinitions();
- assertEquals(5, subResources.size());
+ assertEquals(6, subResources.size());
boolean operatingSystemFound = false;
boolean serviceFound = false;
boolean configFound = false;
boolean repoFound = false;
boolean artifactReturned = false;
+ boolean compatibleFound = false;
for (SubResourceDefinition subResource : subResources) {
Resource.Type type = subResource.getType();
@@ -58,10 +59,12 @@ public class StackVersionResourceDefinitionTest {
serviceFound = true;
} else if (type.equals(Resource.Type.StackLevelConfiguration)) {
configFound = true;
- }else if (type.equals(Resource.Type.RepositoryVersion)) {
+ } else if (type.equals(Resource.Type.RepositoryVersion)) {
repoFound = true;
- }else if (type.equals(Resource.Type.StackArtifact)) {
+ } else if (type.equals(Resource.Type.StackArtifact)) {
artifactReturned = true;
+ } else if (type.equals(Resource.Type.CompatibleRepositoryVersion)) {
+ compatibleFound = true;
}
}
assertTrue(operatingSystemFound);
@@ -69,5 +72,6 @@ public class StackVersionResourceDefinitionTest {
assertTrue(configFound);
assertTrue(repoFound);
assertTrue(artifactReturned);
+ assertTrue(compatibleFound);
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/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 7c2cdcd..e3a723e 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
@@ -18,13 +18,44 @@
package org.apache.ambari.server.controller;
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.persist.PersistService;
+import static org.easymock.EasyMock.capture;
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.createStrictMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.lang.reflect.Type;
+import java.net.ConnectException;
+import java.net.MalformedURLException;
+import java.net.UnknownHostException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import javax.persistence.EntityManager;
+
import junit.framework.Assert;
+
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.ClusterNotFoundException;
import org.apache.ambari.server.DuplicateResourceException;
@@ -114,41 +145,12 @@ import org.junit.rules.ExpectedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.persistence.EntityManager;
-import java.io.IOException;
-import java.io.StringReader;
-import java.lang.reflect.Type;
-import java.net.ConnectException;
-import java.net.MalformedURLException;
-import java.net.UnknownHostException;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-
-import static org.easymock.EasyMock.capture;
-import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.createStrictMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.persist.PersistService;
public class AmbariManagementControllerTest {
@@ -6917,7 +6919,7 @@ public class AmbariManagementControllerTest {
Assert.assertEquals(1, responsesWithParams.size());
StackVersionResponse resp = responsesWithParams.iterator().next();
assertNotNull(resp.getUpgradePacks());
- assertEquals(4, resp.getUpgradePacks().size());
+ assertEquals(5, resp.getUpgradePacks().size());
assertTrue(resp.getUpgradePacks().contains("upgrade_test"));
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/43550a78/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
index 147dc49..d126198 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
@@ -30,7 +30,6 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
@@ -50,13 +49,13 @@ import org.apache.ambari.server.controller.spi.ProviderModule;
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.Resource.Type;
import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
import org.apache.ambari.server.controller.spi.ResourceProvider;
import org.apache.ambari.server.controller.spi.SortRequest;
import org.apache.ambari.server.controller.spi.SortRequestProperty;
import org.apache.ambari.server.controller.spi.SystemException;
import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
-import org.apache.ambari.server.controller.spi.Resource.Type;
import org.apache.ambari.server.controller.utilities.PredicateBuilder;
import org.apache.ambari.server.controller.utilities.PredicateHelper;
import org.apache.ambari.server.controller.utilities.PropertyHelper;
@@ -943,6 +942,7 @@ public class ClusterControllerImplTest {
providers.put(Resource.Type.OperatingSystem, new TestOperatingSystemResourceProvider());
providers.put(Resource.Type.Repository, new TestRepositoryResourceProvider());
providers.put(Resource.Type.RepositoryVersion, new TestRepositoryVersionResourceProvider());
+ providers.put(Resource.Type.CompatibleRepositoryVersion, new TestCompatibleRepositoryVersionResourceProvider());
providers.put(Type.StackArtifact, new TestStackArtifactResourceProvider());
}
@@ -966,7 +966,7 @@ public class ClusterControllerImplTest {
private TestResourceProvider(Resource.Type type) {
super(PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type));
}
-
+
private TestResourceProvider(Set<String> propertyIds, Map<Resource.Type, String> keyPropertyIds) {
super(propertyIds, keyPropertyIds);
}
@@ -1200,7 +1200,7 @@ public class ClusterControllerImplTest {
return getResources(Resource.Type.Repository, predicate, "Repositories/repo_id", keyPropertyValues);
}
}
-
+
private static class TestRepositoryVersionResourceProvider extends TestResourceProvider {
private TestRepositoryVersionResourceProvider() {
super(RepositoryVersionResourceProvider.propertyIds, RepositoryVersionResourceProvider.keyPropertyIds);
@@ -1218,6 +1218,23 @@ public class ClusterControllerImplTest {
}
}
+ private static class TestCompatibleRepositoryVersionResourceProvider extends TestResourceProvider {
+ private TestCompatibleRepositoryVersionResourceProvider() {
+ super(CompatibleRepositoryVersionResourceProvider.propertyIds, CompatibleRepositoryVersionResourceProvider.keyPropertyIds);
+ }
+
+ @Override
+ public Set<Resource> getResources(Request request, Predicate predicate)
+ throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+ Set<String> keyPropertyValues = new LinkedHashSet<String>();
+
+ keyPropertyValues.add("1");
+ keyPropertyValues.add("2");
+
+ return getResources(Resource.Type.CompatibleRepositoryVersion, predicate, "CompatibleRepositoriVersions/id", keyPropertyValues);
+ }
+ }
+
private static class TestStackArtifactResourceProvider extends TestResourceProvider {
private TestStackArtifactResourceProvider() {
super(StackArtifactResourceProvider.propertyIds, StackArtifactResourceProvider.keyPropertyIds);