You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by pz...@apache.org on 2018/03/22 12:44:45 UTC

knox git commit: KNOX-1219 - Eliminated duplicate useTwoWaySsl dispatch filter params [Forced Update!]

Repository: knox
Updated Branches:
  refs/heads/master 02f1b8b5a -> 335dbd989 (forced update)


KNOX-1219 - Eliminated duplicate useTwoWaySsl dispatch filter params


Project: http://git-wip-us.apache.org/repos/asf/knox/repo
Commit: http://git-wip-us.apache.org/repos/asf/knox/commit/335dbd98
Tree: http://git-wip-us.apache.org/repos/asf/knox/tree/335dbd98
Diff: http://git-wip-us.apache.org/repos/asf/knox/diff/335dbd98

Branch: refs/heads/master
Commit: 335dbd989fdfb667dbf6a09ad959743935da47a1
Parents: a27c8eb
Author: Phil Zampino <pz...@apache.org>
Authored: Tue Mar 20 14:47:39 2018 -0400
Committer: Phil Zampino <pz...@apache.org>
Committed: Thu Mar 22 08:42:38 2018 -0400

----------------------------------------------------------------------
 .../impl/FilterParamDescriptorImpl.java         |  11 ++
 ...viceDefinitionDeploymentContributorTest.java | 127 +++++++++++++++++++
 2 files changed, 138 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/knox/blob/335dbd98/gateway-server/src/main/java/org/apache/knox/gateway/descriptor/impl/FilterParamDescriptorImpl.java
----------------------------------------------------------------------
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/descriptor/impl/FilterParamDescriptorImpl.java b/gateway-server/src/main/java/org/apache/knox/gateway/descriptor/impl/FilterParamDescriptorImpl.java
index b84f946..f3592bf 100644
--- a/gateway-server/src/main/java/org/apache/knox/gateway/descriptor/impl/FilterParamDescriptorImpl.java
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/descriptor/impl/FilterParamDescriptorImpl.java
@@ -47,6 +47,17 @@ public class FilterParamDescriptorImpl implements FilterParamDescriptor {
   @Override
   public FilterParamDescriptor name( String name ) {
     this.name = name;
+
+    // If there is already a param identified by the new name, remove it, such that it is REPLACED with this new param
+    if (parent != null) {
+      for (FilterParamDescriptor param : parent.params()) {
+        if (name.equals(param.name()) && (param != this)) {
+          parent.params().remove(param);
+          break;
+        }
+      }
+    }
+
     return this;
   }
 

http://git-wip-us.apache.org/repos/asf/knox/blob/335dbd98/gateway-server/src/test/java/org/apache/knox/gateway/deploy/impl/ServiceDefinitionDeploymentContributorTest.java
----------------------------------------------------------------------
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/deploy/impl/ServiceDefinitionDeploymentContributorTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/deploy/impl/ServiceDefinitionDeploymentContributorTest.java
index c8923bb..4045789 100644
--- a/gateway-server/src/test/java/org/apache/knox/gateway/deploy/impl/ServiceDefinitionDeploymentContributorTest.java
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/deploy/impl/ServiceDefinitionDeploymentContributorTest.java
@@ -17,13 +17,34 @@
  */
 package org.apache.knox.gateway.deploy.impl;
 
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.deploy.DeploymentContext;
 import org.apache.knox.gateway.deploy.ProviderDeploymentContributor;
+import org.apache.knox.gateway.descriptor.FilterDescriptor;
+import org.apache.knox.gateway.descriptor.FilterParamDescriptor;
+import org.apache.knox.gateway.descriptor.ResourceDescriptor;
+import org.apache.knox.gateway.descriptor.impl.GatewayDescriptorImpl;
+import org.apache.knox.gateway.filter.rewrite.api.UrlRewriteRulesDescriptor;
+import org.apache.knox.gateway.service.definition.CustomDispatch;
+import org.apache.knox.gateway.service.definition.Rewrite;
+import org.apache.knox.gateway.service.definition.Route;
+import org.apache.knox.gateway.service.definition.ServiceDefinition;
+import org.apache.knox.gateway.topology.Provider;
+import org.apache.knox.gateway.topology.Service;
+import org.apache.knox.gateway.topology.Topology;
+import org.easymock.EasyMock;
 import org.junit.Test;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import java.util.ServiceLoader;
 
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
 
 public class ServiceDefinitionDeploymentContributorTest {
@@ -40,4 +61,110 @@ public class ServiceDefinitionDeploymentContributorTest {
       }
     }
   }
+
+  /**
+   * Test that service param useTwoWaySsl in topologies overrides the corresponding custom dispatch property.
+   */
+  @Test
+  public void testServiceAttributeUseTwoWaySSLParamOverride() throws Exception {
+
+    final String TEST_SERVICE_ROLE     = "Test";
+    final String USE_TWO_WAY_SSL_PARAM = "useTwoWaySsl";
+
+    UrlRewriteRulesDescriptor clusterRules = EasyMock.createNiceMock(UrlRewriteRulesDescriptor.class);
+    EasyMock.replay(clusterRules);
+
+    UrlRewriteRulesDescriptor svcRules = EasyMock.createNiceMock(UrlRewriteRulesDescriptor.class);
+    EasyMock.replay(svcRules);
+
+    ServiceDefinition svcDef = EasyMock.createNiceMock(ServiceDefinition.class);
+    EasyMock.expect(svcDef.getRole()).andReturn(TEST_SERVICE_ROLE).anyTimes();
+    List<Route> svcRoutes = new ArrayList<>();
+    Route route = EasyMock.createNiceMock(Route.class);
+    List<Rewrite> filters = new ArrayList<>();
+    EasyMock.expect(route.getRewrites()).andReturn(filters).anyTimes();
+    svcRoutes.add(route);
+    EasyMock.replay(route);
+    EasyMock.expect(svcDef.getRoutes()).andReturn(svcRoutes).anyTimes();
+    CustomDispatch cd = EasyMock.createNiceMock(CustomDispatch.class);
+    EasyMock.expect(cd.getClassName()).andReturn("TestDispatch").anyTimes();
+    EasyMock.expect(cd.getHaClassName()).andReturn("TestHADispatch").anyTimes();
+    EasyMock.expect(cd.getHaContributorName()).andReturn(null).anyTimes();
+
+    // Let useTwoWaySsl be FALSE by default
+    EasyMock.expect(cd.getUseTwoWaySsl()).andReturn(false).anyTimes();
+
+    EasyMock.replay(cd);
+    EasyMock.expect(svcDef.getDispatch()).andReturn(cd).anyTimes();
+    EasyMock.replay(svcDef);
+
+    ServiceDefinitionDeploymentContributor sddc = new ServiceDefinitionDeploymentContributor(svcDef, svcRules);
+
+    DeploymentContext context = EasyMock.createNiceMock(DeploymentContext.class);
+    EasyMock.expect(context.getDescriptor("rewrite")).andReturn(clusterRules).anyTimes();
+    GatewayConfig gc = EasyMock.createNiceMock(GatewayConfig.class);
+    EasyMock.expect(gc.isXForwardedEnabled()).andReturn(false).anyTimes();
+    EasyMock.expect(gc.isCookieScopingToPathEnabled()).andReturn(false).anyTimes();
+    EasyMock.replay(gc);
+    EasyMock.expect(context.getGatewayConfig()).andReturn(gc).anyTimes();
+
+    // Configure the HaProvider
+    Topology topology = EasyMock.createNiceMock(Topology.class);
+    List<Provider> providers = new ArrayList<>();
+    Provider haProvider = EasyMock.createNiceMock(Provider.class);
+    EasyMock.expect(haProvider.getRole()).andReturn("ha").anyTimes();
+    EasyMock.expect(haProvider.isEnabled()).andReturn(true).anyTimes();
+    Map<String, String> providerParams = new HashMap<>();
+    providerParams.put(TEST_SERVICE_ROLE, "whatever");
+    EasyMock.expect(haProvider.getParams()).andReturn(providerParams).anyTimes();
+
+    EasyMock.replay(haProvider);
+    providers.add(haProvider);
+    EasyMock.expect(topology.getProviders()).andReturn(providers).anyTimes();
+    EasyMock.replay(topology);
+    EasyMock.expect(context.getTopology()).andReturn(topology).anyTimes();
+
+    TestGatewayDescriptor gd = new TestGatewayDescriptor();
+    EasyMock.expect(context.getGatewayDescriptor()).andReturn(gd).anyTimes();
+    EasyMock.replay(context);
+
+    // Configure the service with the useTwoWaySsl param to OVERRIDE the value in the service definition
+    Service service = EasyMock.createNiceMock(Service.class);
+    Map<String, String> svcParams = new HashMap<>();
+    svcParams.put(USE_TWO_WAY_SSL_PARAM, "true");
+    EasyMock.expect(service.getParams()).andReturn(svcParams).anyTimes();
+    EasyMock.replay(service);
+
+    sddc.contributeService(context, service);
+
+    List<ResourceDescriptor> resources = gd.resources();
+    assertEquals(1, gd.resources().size());
+    ResourceDescriptor res = gd.resources().get(0);
+    assertNotNull(res);
+    List<FilterDescriptor> filterList = res.filters();
+    assertEquals(1, filterList.size());
+    FilterDescriptor f = filterList.get(0);
+    assertNotNull(f);
+    assertEquals("dispatch", f.role());
+    List<FilterParamDescriptor> fParams = f.params();
+    assertNotNull(fParams);
+
+    // Collect the values of filter params named useTwoWaySsl
+    List<String> useTwoWaySslFilterParamValues = new ArrayList<>();
+    for (FilterParamDescriptor param : fParams) {
+      if (param.name().equals(USE_TWO_WAY_SSL_PARAM)) {
+        useTwoWaySslFilterParamValues.add(param.value());
+      }
+    }
+
+    assertEquals("Expected only a single filter param named " + USE_TWO_WAY_SSL_PARAM,
+                 1, useTwoWaySslFilterParamValues.size());
+    assertEquals("Expected the service param to override the service definition value for " + USE_TWO_WAY_SSL_PARAM,
+                 "true", useTwoWaySslFilterParamValues.get(0));
+  }
+
+
+  private static class TestGatewayDescriptor extends GatewayDescriptorImpl {
+  }
+
 }