You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by lm...@apache.org on 2017/11/09 00:04:55 UTC
knox git commit: KNOX-1105 - Provide indication that topologies were
generated from simple descriptors (Phil Zampino via lmccay)
Repository: knox
Updated Branches:
refs/heads/master a068eb8da -> f52dc2015
KNOX-1105 - Provide indication that topologies were generated from simple descriptors (Phil Zampino via lmccay)
Project: http://git-wip-us.apache.org/repos/asf/knox/repo
Commit: http://git-wip-us.apache.org/repos/asf/knox/commit/f52dc201
Tree: http://git-wip-us.apache.org/repos/asf/knox/tree/f52dc201
Diff: http://git-wip-us.apache.org/repos/asf/knox/diff/f52dc201
Branch: refs/heads/master
Commit: f52dc20159ae1d8adcd6e9f9966b7bb6b42d14cf
Parents: a068eb8
Author: Larry McCay <lm...@hortonworks.com>
Authored: Wed Nov 8 19:04:40 2017 -0500
Committer: Larry McCay <lm...@hortonworks.com>
Committed: Wed Nov 8 19:04:40 2017 -0500
----------------------------------------------------------------------
.../builder/BeanPropertyTopologyBuilder.java | 11 +++++++++
.../simple/SimpleDescriptorHandler.java | 20 +++++++++++++++-
.../xml/KnoxFormatXmlTopologyRules.java | 2 ++
.../src/main/resources/conf/topology-v1.xsd | 1 +
.../simple/SimpleDescriptorHandlerTest.java | 8 +++++++
.../service/admin/TopologiesResource.java | 25 ++++++++++++++++----
.../service/admin/beans/BeanConverter.java | 2 ++
.../gateway/service/admin/beans/Topology.java | 11 +++++++++
.../hadoop/gateway/i18n/GatewaySpiMessages.java | 3 +++
.../hadoop/gateway/topology/Topology.java | 9 +++++++
10 files changed, 87 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/knox/blob/f52dc201/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/builder/BeanPropertyTopologyBuilder.java
----------------------------------------------------------------------
diff --git a/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/builder/BeanPropertyTopologyBuilder.java b/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/builder/BeanPropertyTopologyBuilder.java
index 65278a1..5058508 100644
--- a/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/builder/BeanPropertyTopologyBuilder.java
+++ b/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/builder/BeanPropertyTopologyBuilder.java
@@ -28,6 +28,7 @@ public class BeanPropertyTopologyBuilder implements TopologyBuilder {
private String name;
private String defaultService;
+ private boolean isGenerated;
private List<Provider> providers;
private List<Service> services;
private List<Application> applications;
@@ -47,6 +48,15 @@ public class BeanPropertyTopologyBuilder implements TopologyBuilder {
return name;
}
+ public BeanPropertyTopologyBuilder generated(String isGenerated) {
+ this.isGenerated = Boolean.valueOf(isGenerated);
+ return this;
+ }
+
+ public boolean isGenerated() {
+ return isGenerated;
+ }
+
public BeanPropertyTopologyBuilder defaultService(String defaultService) {
this.defaultService = defaultService;
return this;
@@ -87,6 +97,7 @@ public class BeanPropertyTopologyBuilder implements TopologyBuilder {
Topology topology = new Topology();
topology.setName(name);
topology.setDefaultServicePath(defaultService);
+ topology.setGenerated(isGenerated);
for (Provider provider : providers) {
topology.addProvider(provider);
http://git-wip-us.apache.org/repos/asf/knox/blob/f52dc201/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/simple/SimpleDescriptorHandler.java
----------------------------------------------------------------------
diff --git a/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/simple/SimpleDescriptorHandler.java b/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/simple/SimpleDescriptorHandler.java
index 040eb86..089925d 100644
--- a/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/simple/SimpleDescriptorHandler.java
+++ b/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/simple/SimpleDescriptorHandler.java
@@ -77,7 +77,14 @@ public class SimpleDescriptorHandler {
DefaultServiceDiscoveryConfig sdc = new DefaultServiceDiscoveryConfig(desc.getDiscoveryAddress());
sdc.setUser(desc.getDiscoveryUser());
sdc.setPasswordAlias(desc.getDiscoveryPasswordAlias());
- ServiceDiscovery sd = ServiceDiscoveryFactory.get(desc.getDiscoveryType(), gatewayServices);
+
+ // Use the discovery type from the descriptor. If it's unspecified, employ the default type.
+ String discoveryType = desc.getDiscoveryType();
+ if (discoveryType == null) {
+ discoveryType = "AMBARI";
+ }
+
+ ServiceDiscovery sd = ServiceDiscoveryFactory.get(discoveryType, gatewayServices);
ServiceDiscovery.Cluster cluster = sd.discover(sdc, desc.getClusterName());
List<String> validServiceNames = new ArrayList<>();
@@ -148,10 +155,20 @@ public class SimpleDescriptorHandler {
topologyFilename = desc.getClusterName();
}
topologyDescriptor = new File(destDirectory, topologyFilename + ".xml");
+
fw = new BufferedWriter(new FileWriter(topologyDescriptor));
+ fw.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
+
+ fw.write("<!--==============================================-->\n");
+ fw.write("<!-- DO NOT EDIT. This is an auto-generated file. -->\n");
+ fw.write("<!--==============================================-->\n");
+
fw.write("<topology>\n");
+ // KNOX-1105 Indicate that this topology was auto-generated
+ fw.write(" <generated>true</generated>\n");
+
// Copy the externalized provider configuration content into the topology descriptor in-line
InputStreamReader policyReader = new InputStreamReader(new FileInputStream(providerConfig));
char[] buffer = new char[1024];
@@ -243,6 +260,7 @@ public class SimpleDescriptorHandler {
return result;
}
+
private static boolean validateURL(String serviceName, String url) {
boolean result = false;
http://git-wip-us.apache.org/repos/asf/knox/blob/f52dc201/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/xml/KnoxFormatXmlTopologyRules.java
----------------------------------------------------------------------
diff --git a/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/xml/KnoxFormatXmlTopologyRules.java b/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/xml/KnoxFormatXmlTopologyRules.java
index cb30769..7f9ec3e 100644
--- a/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/xml/KnoxFormatXmlTopologyRules.java
+++ b/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/xml/KnoxFormatXmlTopologyRules.java
@@ -33,6 +33,7 @@ public class KnoxFormatXmlTopologyRules extends AbstractRulesModule {
private static final String NAME_TAG = "name";
private static final String VERSION_TAG = "version";
private static final String DEFAULT_SERVICE_TAG = "path";
+ private static final String GENERATED_TAG = "generated";
private static final String APPLICATION_TAG = "application";
private static final String SERVICE_TAG = "service";
private static final String ROLE_TAG = "role";
@@ -50,6 +51,7 @@ public class KnoxFormatXmlTopologyRules extends AbstractRulesModule {
forPattern( ROOT_TAG + "/" + NAME_TAG ).callMethod("name").usingElementBodyAsArgument();
forPattern( ROOT_TAG + "/" + VERSION_TAG ).callMethod("version").usingElementBodyAsArgument();
forPattern( ROOT_TAG + "/" + DEFAULT_SERVICE_TAG ).callMethod("defaultService").usingElementBodyAsArgument();
+ forPattern( ROOT_TAG + "/" + GENERATED_TAG ).callMethod("generated").usingElementBodyAsArgument();
forPattern( ROOT_TAG + "/" + APPLICATION_TAG ).createObject().ofType( Application.class ).then().setNext( "addApplication" );
forPattern( ROOT_TAG + "/" + APPLICATION_TAG + "/" + ROLE_TAG ).setBeanProperty();
http://git-wip-us.apache.org/repos/asf/knox/blob/f52dc201/gateway-server/src/main/resources/conf/topology-v1.xsd
----------------------------------------------------------------------
diff --git a/gateway-server/src/main/resources/conf/topology-v1.xsd b/gateway-server/src/main/resources/conf/topology-v1.xsd
index 96c9ba2..936c701 100644
--- a/gateway-server/src/main/resources/conf/topology-v1.xsd
+++ b/gateway-server/src/main/resources/conf/topology-v1.xsd
@@ -22,6 +22,7 @@ limitations under the License.
<h:element name="name" minOccurs="0" maxOccurs="1"/>
<h:element name="path" minOccurs="0" maxOccurs="1"/>
+ <h:element name="generated" type="h:boolean" minOccurs="0"/>
<h:element name="gateway" minOccurs="0" maxOccurs="1">
<h:complexType>
http://git-wip-us.apache.org/repos/asf/knox/blob/f52dc201/gateway-server/src/test/java/org/apache/hadoop/gateway/topology/simple/SimpleDescriptorHandlerTest.java
----------------------------------------------------------------------
diff --git a/gateway-server/src/test/java/org/apache/hadoop/gateway/topology/simple/SimpleDescriptorHandlerTest.java b/gateway-server/src/test/java/org/apache/hadoop/gateway/topology/simple/SimpleDescriptorHandlerTest.java
index a1fda1c..3a62980 100644
--- a/gateway-server/src/test/java/org/apache/hadoop/gateway/topology/simple/SimpleDescriptorHandlerTest.java
+++ b/gateway-server/src/test/java/org/apache/hadoop/gateway/topology/simple/SimpleDescriptorHandlerTest.java
@@ -44,9 +44,12 @@ import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
+import static org.hamcrest.Matchers.hasXPath;
+import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -231,6 +234,11 @@ public class SimpleDescriptorHandlerTest {
// Parse the topology descriptor
Document topologyXml = XmlUtils.readXml(topologyFile);
+ // KNOX-1105 Mark generated topology files
+ assertThat("Expected the \"generated\" marker element in the topology XML, with value of \"true\".",
+ topologyXml,
+ hasXPath("/topology/generated", is("true")));
+
// Validate the provider configuration
Document extProviderConf = XmlUtils.readXml(new ByteArrayInputStream(TEST_PROVIDER_CONFIG.getBytes()));
Node gatewayNode = (Node) xpath.compile("/topology/gateway").evaluate(topologyXml, XPathConstants.NODE);
http://git-wip-us.apache.org/repos/asf/knox/blob/f52dc201/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/TopologiesResource.java
----------------------------------------------------------------------
diff --git a/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/TopologiesResource.java b/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/TopologiesResource.java
index 445e85d..67a053b 100644
--- a/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/TopologiesResource.java
+++ b/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/TopologiesResource.java
@@ -135,16 +135,33 @@ public class TopologiesResource {
@Consumes({APPLICATION_JSON, APPLICATION_XML})
@Path(SINGLE_TOPOLOGY_API_PATH)
public Topology uploadTopology(@PathParam("id") String id, Topology t) {
+ Topology result = null;
- GatewayServices gs = (GatewayServices) request.getServletContext()
- .getAttribute(GatewayServices.GATEWAY_SERVICES_ATTRIBUTE);
+ GatewayServices gs =
+ (GatewayServices) request.getServletContext().getAttribute(GatewayServices.GATEWAY_SERVICES_ATTRIBUTE);
t.setName(id);
TopologyService ts = gs.getService(GatewayServices.TOPOLOGY_SERVICE);
- ts.deployTopology(BeanConverter.getTopology(t));
+ // Check for existing topology with the same name, to see if it had been generated
+ boolean existingGenerated = false;
+ for (org.apache.hadoop.gateway.topology.Topology existingTopology : ts.getTopologies()) {
+ if(existingTopology.getName().equals(id)) {
+ existingGenerated = existingTopology.isGenerated();
+ break;
+ }
+ }
- return getTopology(id);
+ // If a topology with the same ID exists, which had been generated, then DO NOT overwrite it because it will be
+ // out of sync with the source descriptor. Otherwise, deploy the updated version.
+ if (!existingGenerated) {
+ ts.deployTopology(BeanConverter.getTopology(t));
+ result = getTopology(id);
+ } else {
+ log.disallowedOverwritingGeneratedTopology(id);
+ }
+
+ return result;
}
@DELETE
http://git-wip-us.apache.org/repos/asf/knox/blob/f52dc201/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/BeanConverter.java
----------------------------------------------------------------------
diff --git a/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/BeanConverter.java b/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/BeanConverter.java
index f94dcad..b25f0de 100644
--- a/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/BeanConverter.java
+++ b/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/BeanConverter.java
@@ -29,6 +29,7 @@ public class BeanConverter {
topologyResource.setTimestamp(topology.getTimestamp());
topologyResource.setPath(topology.getDefaultServicePath());
topologyResource.setUri(topology.getUri());
+ topologyResource.setGenerated(topology.isGenerated());
for ( org.apache.hadoop.gateway.topology.Provider provider : topology.getProviders() ) {
topologyResource.getProviders().add( getProvider(provider) );
}
@@ -47,6 +48,7 @@ public class BeanConverter {
deploymentTopology.setTimestamp(topology.getTimestamp());
deploymentTopology.setDefaultServicePath(topology.getPath());
deploymentTopology.setUri(topology.getUri());
+ deploymentTopology.setGenerated(topology.isGenerated());
for ( Provider provider : topology.getProviders() ) {
deploymentTopology.addProvider( getProvider(provider) );
}
http://git-wip-us.apache.org/repos/asf/knox/blob/f52dc201/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/Topology.java
----------------------------------------------------------------------
diff --git a/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/Topology.java b/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/Topology.java
index a197c27..67ecc27 100644
--- a/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/Topology.java
+++ b/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/Topology.java
@@ -39,6 +39,9 @@ public class Topology {
@XmlElement
private long timestamp;
+ @XmlElement(name="generated")
+ private boolean isGenerated;
+
@XmlElement(name="provider")
@XmlElementWrapper(name="gateway")
public List<Provider> providers;
@@ -84,6 +87,14 @@ public class Topology {
this.timestamp = timestamp;
}
+ public boolean isGenerated() {
+ return isGenerated;
+ }
+
+ public void setGenerated(boolean isGenerated) {
+ this.isGenerated = isGenerated;
+ }
+
public List<Service> getServices() {
if (services == null) {
services = new ArrayList<>();
http://git-wip-us.apache.org/repos/asf/knox/blob/f52dc201/gateway-spi/src/main/java/org/apache/hadoop/gateway/i18n/GatewaySpiMessages.java
----------------------------------------------------------------------
diff --git a/gateway-spi/src/main/java/org/apache/hadoop/gateway/i18n/GatewaySpiMessages.java b/gateway-spi/src/main/java/org/apache/hadoop/gateway/i18n/GatewaySpiMessages.java
index aad4d8a..4a5b926 100644
--- a/gateway-spi/src/main/java/org/apache/hadoop/gateway/i18n/GatewaySpiMessages.java
+++ b/gateway-spi/src/main/java/org/apache/hadoop/gateway/i18n/GatewaySpiMessages.java
@@ -88,4 +88,7 @@ public interface GatewaySpiMessages {
@Message(level = MessageLevel.ERROR, text = "Invalid resource URI {0} : {1}")
void invalidResourceURI(final String uri, final String reason, @StackTrace(level = MessageLevel.DEBUG) Exception e );
+ @Message( level = MessageLevel.ERROR, text = "Topology {0} cannot be manually overwritten because it was generated from a simple descriptor." )
+ void disallowedOverwritingGeneratedTopology(final String topologyName);
+
}
http://git-wip-us.apache.org/repos/asf/knox/blob/f52dc201/gateway-spi/src/main/java/org/apache/hadoop/gateway/topology/Topology.java
----------------------------------------------------------------------
diff --git a/gateway-spi/src/main/java/org/apache/hadoop/gateway/topology/Topology.java b/gateway-spi/src/main/java/org/apache/hadoop/gateway/topology/Topology.java
index c366421..6415afe 100644
--- a/gateway-spi/src/main/java/org/apache/hadoop/gateway/topology/Topology.java
+++ b/gateway-spi/src/main/java/org/apache/hadoop/gateway/topology/Topology.java
@@ -33,6 +33,7 @@ public class Topology {
private String name;
private String defaultServicePath = null;
private long timestamp;
+ private boolean isGenerated;
public List<Provider> providerList = new ArrayList<Provider>();
private Map<String,Map<String,Provider>> providerMap = new HashMap<>();
public List<Service> services = new ArrayList<Service>();
@@ -76,6 +77,14 @@ public class Topology {
defaultServicePath = servicePath;
}
+ public void setGenerated(boolean isGenerated) {
+ this.isGenerated = isGenerated;
+ }
+
+ public boolean isGenerated() {
+ return isGenerated;
+ }
+
public Collection<Service> getServices() {
return services;
}