AMBARI-21758 - Prevent New Clusters from Being Provisioned With PATCH/MAINT 
Repos (jonathanhurley)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/28a42236
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/28a42236
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/28a42236

Branch: refs/heads/branch-feature-logsearch-ui
Commit: 28a42236a1dfc924fed73edfaf4ea6d896f16f02
Parents: f901e15
Author: Jonathan Hurley <jhur...@hortonworks.com>
Authored: Fri Aug 18 15:38:17 2017 -0400
Committer: Jonathan Hurley <jhur...@hortonworks.com>
Committed: Mon Aug 21 09:31:10 2017 -0400

----------------------------------------------------------------------
 .../controller/AmbariManagementControllerImpl.java   | 15 ++++++---------
 .../controller/internal/ServiceResourceProvider.java | 10 ++++++++++
 .../server/orm/entities/RepositoryVersionEntity.java |  8 +++-----
 .../apache/ambari/server/topology/AmbariContext.java |  8 ++++++++
 .../ambari/server/topology/AmbariContextTest.java    |  2 ++
 5 files changed, 29 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/28a42236/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index d3b6d7c..96280ea 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -39,7 +39,6 @@ import static 
org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_R
 import static 
org.apache.ambari.server.agent.ExecutionCommand.KeyNames.UNLIMITED_KEY_JCE_REQUIRED;
 import static 
org.apache.ambari.server.agent.ExecutionCommand.KeyNames.USER_GROUPS;
 import static 
org.apache.ambari.server.agent.ExecutionCommand.KeyNames.USER_LIST;
-import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.VERSION;
 import static 
org.apache.ambari.server.controller.AmbariCustomCommandExecutionHelper.masterToSlaveMappingForDecom;
 
 import java.io.File;
@@ -434,18 +433,19 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
     if (request.getClusterName() == null
         || request.getClusterName().isEmpty()
         || request.getClusterId() != null) {
-      throw new IllegalArgumentException("Cluster name should be provided" +
-          " and clusterId should be null");
+      throw new IllegalArgumentException(
+          "Cluster name should be provided and clusterId should be null");
     }
 
     if (LOG.isDebugEnabled()) {
-      LOG.debug("Received a createCluster request, clusterName={}, 
request={}", request.getClusterName(), request);
+      LOG.debug("Received a createCluster request, clusterName={}, request={}",
+          request.getClusterName(), request);
     }
 
     if (request.getStackVersion() == null
         || request.getStackVersion().isEmpty()) {
-      throw new IllegalArgumentException("Stack information should be"
-          + " provided when creating a cluster");
+      throw new IllegalArgumentException(
+          "Stack information should be provided when creating a cluster");
     }
 
     StackId stackId = new StackId(request.getStackVersion());
@@ -2418,9 +2418,6 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
         commandParams.put(MAX_DURATION_OF_RETRIES, 
Integer.toString(retryMaxTime));
         commandParams.put(COMMAND_RETRY_ENABLED, 
Boolean.toString(retryEnabled));
 
-        if (repoVersion != null) {
-         commandParams.put(VERSION, repoVersion.getVersion());
-        }
         if (script.getTimeout() > 0) {
           scriptCommandTimeout = String.valueOf(script.getTimeout());
         }

http://git-wip-us.apache.org/repos/asf/ambari/blob/28a42236/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
index 818017e..e65693b 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
@@ -68,6 +68,7 @@ import 
org.apache.ambari.server.serveraction.kerberos.KerberosMissingAdminCreden
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.MaintenanceState;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.ServiceComponentHost;
@@ -417,6 +418,7 @@ public class ServiceResourceProvider extends 
AbstractControllerResourceProvider
       LOG.warn("Received an empty requests set");
       return;
     }
+
     Clusters clusters = getManagementController().getClusters();
     // do all validation checks
     validateCreateRequests(requests, clusters);
@@ -430,6 +432,14 @@ public class ServiceResourceProvider extends 
AbstractControllerResourceProvider
         throw new AmbariException("Could not find any repository on the 
request.");
       }
 
+      if (repositoryVersion.getType() != RepositoryType.STANDARD
+          && cluster.getProvisioningState() == State.INIT) {
+        throw new AmbariException(String.format(
+            "Unable to add %s to %s because the cluster is still being 
provisioned and the repository for the service is not %s: $s",
+            request.getServiceName(), cluster.getClusterName(), 
RepositoryType.STANDARD,
+            repositoryVersion));
+      }
+
       Service s = cluster.addService(request.getServiceName(), 
repositoryVersion);
 
       /*

http://git-wip-us.apache.org/repos/asf/ambari/blob/28a42236/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 2f38af3..c746363 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
@@ -380,11 +380,9 @@ public class RepositoryVersionEntity {
    * {@inheritDoc}
    */
   @Override
-  public String toString(){
-    return Objects.toStringHelper(this)
-        .add("id", id)
-        .add("stack", stack)
-        .add("version", version).toString();
+  public String toString() {
+    return Objects.toStringHelper(this).add("id", id).add("stack", 
stack).add("version",
+        version).add("type", type).toString();
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/28a42236/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
index 0bbd5e6..fa703ed 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
@@ -76,6 +76,7 @@ import org.apache.ambari.server.state.ConfigFactory;
 import org.apache.ambari.server.state.ConfigHelper;
 import org.apache.ambari.server.state.DesiredConfig;
 import org.apache.ambari.server.state.Host;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.SecurityType;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.configgroup.ConfigGroup;
@@ -233,6 +234,13 @@ public class AmbariContext {
       }
     }
 
+    // only use a STANDARD repo when creating a new cluster
+    if (repoVersion.getType() != RepositoryType.STANDARD) {
+      throw new IllegalArgumentException(String.format(
+          "Unable to create a cluster using the following repository since it 
is not a STANDARD type: %s",
+          repoVersion));
+    }
+
     createAmbariClusterResource(clusterName, stack.getName(), 
stack.getVersion(), securityType);
     createAmbariServiceAndComponentResources(topology, clusterName, stackId, 
repoVersion.getId());
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/28a42236/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java
index efafbea..bef0a45 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java
@@ -69,6 +69,7 @@ import org.apache.ambari.server.state.ConfigFactory;
 import org.apache.ambari.server.state.ConfigHelper;
 import org.apache.ambari.server.state.DesiredConfig;
 import org.apache.ambari.server.state.Host;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.configgroup.ConfigGroup;
@@ -209,6 +210,7 @@ public class AmbariContextTest {
     RepositoryVersionEntity repositoryVersion = 
createNiceMock(RepositoryVersionEntity.class);
     expect(repositoryVersion.getId()).andReturn(1L).atLeastOnce();
     expect(repositoryVersion.getVersion()).andReturn("1.1.1.1").atLeastOnce();
+    
expect(repositoryVersion.getType()).andReturn(RepositoryType.STANDARD).atLeastOnce();
 
     
expect(repositoryVersionDAO.findByStack(EasyMock.anyObject(StackId.class))).andReturn(
         Collections.singletonList(repositoryVersion)).atLeastOnce();

Reply via email to