Переглянути джерело

AMBARI-14090. Ambari upgrade to 2.1.3 fails with NPE.(vbrodetskyi)

Vitaly Brodetskyi 9 роки тому
батько
коміт
b34cf6d95c

+ 77 - 81
ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog213.java

@@ -50,7 +50,6 @@ import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.SecurityType;
-import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.StackInfo;
 import org.apache.ambari.server.state.alert.SourceType;
@@ -320,91 +319,88 @@ public class UpgradeCatalog213 extends AbstractUpgradeCatalog {
   protected void updateKnoxTopology() throws AmbariException {
     AmbariManagementController ambariManagementController = injector.getInstance(AmbariManagementController.class);
     for (final Cluster cluster : getCheckedClusterMap(ambariManagementController.getClusters()).values()) {
-      Service knoxService = cluster.getService(KNOX_SERVICE);
-      if (knoxService != null) {
-        Config topology = cluster.getDesiredConfigByType(TOPOLOGY_CONFIG);
-        if (topology != null) {
-          String content = topology.getProperties().get(CONTENT_PROPERTY);
-          if (content != null) {
-            Document topologyXml = convertStringToDocument(content);
-            if (topologyXml != null) {
-              Element root = topologyXml.getDocumentElement();
-              if (root != null)  {
-                NodeList providerNodes = root.getElementsByTagName("provider");
-                boolean authorizationProviderExists = false;
-                try {
-                  for (int i = 0; i < providerNodes.getLength(); i++) {
-                    Node providerNode = providerNodes.item(i);
-                    NodeList childNodes = providerNode.getChildNodes();
-                    for (int k = 0; k < childNodes.getLength(); k++) {
-                      Node child = childNodes.item(k);
-                      child.normalize();
-                      String childTextContent = child.getTextContent();
-                      if (childTextContent != null && childTextContent.toLowerCase().equals("authorization")) {
-                        authorizationProviderExists = true;
-                        break;
-                      }
-                    }
-                    if (authorizationProviderExists) {
+      Config topology = cluster.getDesiredConfigByType(TOPOLOGY_CONFIG);
+      if (topology != null) {
+        String content = topology.getProperties().get(CONTENT_PROPERTY);
+        if (content != null) {
+          Document topologyXml = convertStringToDocument(content);
+          if (topologyXml != null) {
+            Element root = topologyXml.getDocumentElement();
+            if (root != null)  {
+              NodeList providerNodes = root.getElementsByTagName("provider");
+              boolean authorizationProviderExists = false;
+              try {
+                for (int i = 0; i < providerNodes.getLength(); i++) {
+                  Node providerNode = providerNodes.item(i);
+                  NodeList childNodes = providerNode.getChildNodes();
+                  for (int k = 0; k < childNodes.getLength(); k++) {
+                    Node child = childNodes.item(k);
+                    child.normalize();
+                    String childTextContent = child.getTextContent();
+                    if (childTextContent != null && childTextContent.toLowerCase().equals("authorization")) {
+                      authorizationProviderExists = true;
                       break;
                     }
                   }
-                } catch(Exception e) {
-                  e.printStackTrace();
-                  LOG.error("Error occurred during check 'authorization' provider already exists in topology." + e);
-                  return;
+                  if (authorizationProviderExists) {
+                    break;
+                  }
                 }
-                if (!authorizationProviderExists) {
-                  NodeList nodeList = root.getElementsByTagName("gateway");
-                  if (nodeList != null && nodeList.getLength() > 0) {
-                    boolean rangerPluginEnabled = isRangerPluginEnabled(cluster);
-
-                    Node gatewayNode = nodeList.item(0);
-                    Element newProvider = topologyXml.createElement("provider");
-
-                    Element role = topologyXml.createElement("role");
-                    role.appendChild(topologyXml.createTextNode("authorization"));
-                    newProvider.appendChild(role);
-
-                    Element name = topologyXml.createElement("name");
-                    if (rangerPluginEnabled) {
-                      name.appendChild(topologyXml.createTextNode("XASecurePDPKnox"));
-                    } else {
-                      name.appendChild(topologyXml.createTextNode("AclsAuthz"));
-                    }
-                    newProvider.appendChild(name);
-
-                    Element enabled = topologyXml.createElement("enabled");
-                    enabled.appendChild(topologyXml.createTextNode("true"));
-                    newProvider.appendChild(enabled);
-
-
-                    gatewayNode.appendChild(newProvider);
-
-                    DOMSource topologyDomSource = new DOMSource(root);
-                    StringWriter writer = new StringWriter();
-                    try {
-                      Transformer transformer = TransformerFactory.newInstance().newTransformer();
-                      transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
-                      transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
-                      transformer.setOutputProperty(OutputKeys.METHOD, "xml");
-                      transformer.setOutputProperty(OutputKeys.INDENT, "yes");
-                      transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "5");
-                      transformer.transform(topologyDomSource, new StreamResult(writer));
-                    } catch (TransformerConfigurationException e) {
-                      e.printStackTrace();
-                      LOG.error("Unable to create transformer instance, to convert Document(XML) to String. " + e);
-                      return;
-                    } catch (TransformerException e) {
-                      e.printStackTrace();
-                      LOG.error("Unable to transform Document(XML) to StringWriter. " + e);
-                      return;
-                    }
-
-                    content = writer.toString();
-                    Map<String, String> updates = Collections.singletonMap(CONTENT_PROPERTY, content);
-                    updateConfigurationPropertiesForCluster(cluster, TOPOLOGY_CONFIG, updates, true, false);
+              } catch(Exception e) {
+                e.printStackTrace();
+                LOG.error("Error occurred during check 'authorization' provider already exists in topology." + e);
+                return;
+              }
+              if (!authorizationProviderExists) {
+                NodeList nodeList = root.getElementsByTagName("gateway");
+                if (nodeList != null && nodeList.getLength() > 0) {
+                  boolean rangerPluginEnabled = isRangerPluginEnabled(cluster);
+
+                  Node gatewayNode = nodeList.item(0);
+                  Element newProvider = topologyXml.createElement("provider");
+
+                  Element role = topologyXml.createElement("role");
+                  role.appendChild(topologyXml.createTextNode("authorization"));
+                  newProvider.appendChild(role);
+
+                  Element name = topologyXml.createElement("name");
+                  if (rangerPluginEnabled) {
+                    name.appendChild(topologyXml.createTextNode("XASecurePDPKnox"));
+                  } else {
+                    name.appendChild(topologyXml.createTextNode("AclsAuthz"));
                   }
+                  newProvider.appendChild(name);
+
+                  Element enabled = topologyXml.createElement("enabled");
+                  enabled.appendChild(topologyXml.createTextNode("true"));
+                  newProvider.appendChild(enabled);
+
+
+                  gatewayNode.appendChild(newProvider);
+
+                  DOMSource topologyDomSource = new DOMSource(root);
+                  StringWriter writer = new StringWriter();
+                  try {
+                    Transformer transformer = TransformerFactory.newInstance().newTransformer();
+                    transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+                    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+                    transformer.setOutputProperty(OutputKeys.METHOD, "xml");
+                    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+                    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "5");
+                    transformer.transform(topologyDomSource, new StreamResult(writer));
+                  } catch (TransformerConfigurationException e) {
+                    e.printStackTrace();
+                    LOG.error("Unable to create transformer instance, to convert Document(XML) to String. " + e);
+                    return;
+                  } catch (TransformerException e) {
+                    e.printStackTrace();
+                    LOG.error("Unable to transform Document(XML) to StringWriter. " + e);
+                    return;
+                  }
+
+                  content = writer.toString();
+                  Map<String, String> updates = Collections.singletonMap(CONTENT_PROPERTY, content);
+                  updateConfigurationPropertiesForCluster(cluster, TOPOLOGY_CONFIG, updates, true, false);
                 }
               }
             }

+ 0 - 6
ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog213Test.java

@@ -1271,7 +1271,6 @@ public class UpgradeCatalog213Test {
     final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock(AmbariManagementController.class);
     final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class);
     final Cluster mockClusterExpected = easyMockSupport.createNiceMock(Cluster.class);
-    final Service mockKnoxService = easyMockSupport.createNiceMock(Service.class);
     final Map<String, String> propertiesTopologyWithoutAuthorizationProvider = new HashMap<String, String>() {{
       put("content", "<topology> <gateway>  </gateway> </topology>");
     }};
@@ -1300,7 +1299,6 @@ public class UpgradeCatalog213Test {
     expect(mockClusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{
       put("cl1", mockClusterExpected);
     }}).atLeastOnce();
-    expect(mockClusterExpected.getService("KNOX")).andReturn(mockKnoxService).once();
     expect(mockClusterExpected.getDesiredConfigByType("topology")).andReturn(mockTopologyConf).atLeastOnce();
     expect(mockTopologyConf.getProperties()).andReturn(propertiesTopologyWithoutAuthorizationProvider).once();
 
@@ -1327,7 +1325,6 @@ public class UpgradeCatalog213Test {
     final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock(AmbariManagementController.class);
     final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class);
     final Cluster mockClusterExpected = easyMockSupport.createNiceMock(Cluster.class);
-    final Service mockKnoxService = easyMockSupport.createNiceMock(Service.class);
     final Map<String, String> propertiesTopologyWitAuthorizationProvider = new HashMap<String, String>() {{
       put("content", "<topology> <gateway>  <provider>" +
               "<role>authorization</role>" +
@@ -1354,7 +1351,6 @@ public class UpgradeCatalog213Test {
     expect(mockClusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{
       put("cl1", mockClusterExpected);
     }}).atLeastOnce();
-    expect(mockClusterExpected.getService("KNOX")).andReturn(mockKnoxService).once();
     expect(mockClusterExpected.getDesiredConfigByType("topology")).andReturn(mockTopologyConf).atLeastOnce();
     expect(mockTopologyConf.getProperties()).andReturn(propertiesTopologyWitAuthorizationProvider).once();
 
@@ -1380,7 +1376,6 @@ public class UpgradeCatalog213Test {
     final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock(AmbariManagementController.class);
     final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class);
     final Cluster mockClusterExpected = easyMockSupport.createNiceMock(Cluster.class);
-    final Service mockKnoxService = easyMockSupport.createNiceMock(Service.class);
     final Map<String, String> propertiesTopologyWithoutAuthorizationProvider = new HashMap<String, String>() {{
       put("content", "<topology> <gateway>  </gateway> </topology>");
     }};
@@ -1413,7 +1408,6 @@ public class UpgradeCatalog213Test {
     expect(mockClusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{
       put("cl1", mockClusterExpected);
     }}).atLeastOnce();
-    expect(mockClusterExpected.getService("KNOX")).andReturn(mockKnoxService).once();
     expect(mockClusterExpected.getDesiredConfigByType("topology")).andReturn(mockTopologyConf).atLeastOnce();
     expect(mockClusterExpected.getDesiredConfigByType("ranger-knox-plugin-properties")).andReturn(mockRangerKnoxPluginConf).atLeastOnce();
     expect(mockTopologyConf.getProperties()).andReturn(propertiesTopologyWithoutAuthorizationProvider).once();