|
@@ -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);
|
|
|
}
|
|
|
}
|
|
|
}
|