You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by bu...@apache.org on 2020/04/30 20:20:33 UTC

[geode-benchmarks] branch sni created (now 0dd3a29)

This is an automated email from the ASF dual-hosted git repository.

burcham pushed a change to branch sni
in repository https://gitbox.apache.org/repos/asf/geode-benchmarks.git.


      at 0dd3a29  generate haproxy.cfg

This branch includes the following new commits:

     new 0dd3a29  generate haproxy.cfg

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[geode-benchmarks] 01/01: generate haproxy.cfg

Posted by bu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

burcham pushed a commit to branch sni
in repository https://gitbox.apache.org/repos/asf/geode-benchmarks.git

commit 0dd3a29b68f2630ee1f424ddd9b9c9a3339a623e
Author: Bill Burcham <bb...@pivotal.io>
AuthorDate: Thu Apr 30 13:19:29 2020 -0700

    generate haproxy.cfg
---
 .../geode/benchmark/tasks/StartSniProxy.java       |  94 +++++++++++++++++++
 .../topology/ClientServerTopologyWithSNIProxy.java | 100 +++++++++++++++++++++
 .../geode/benchmark/tasks/StartSniProxyTest.java   |  35 ++++++++
 .../scripts/aws/image/files/docker-compose.yml     |  26 ++++++
 infrastructure/scripts/aws/image/files/haproxy.cfg |  53 +++++++++++
 5 files changed, 308 insertions(+)

diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartSniProxy.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartSniProxy.java
new file mode 100644
index 0000000..3d5f2f9
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartSniProxy.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geode.benchmark.tasks;
+
+import java.net.InetAddress;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.geode.perftest.Task;
+import org.apache.geode.perftest.TestContext;
+
+/**
+ * Task to create the client cache
+ */
+public class StartSniProxy implements Task {
+  private int locatorPort;
+
+  public StartSniProxy(int locatorPort) {
+    this.locatorPort = locatorPort;
+  }
+
+  @Override
+  public void run(TestContext context) throws Exception {
+
+    final String stuff = generateHaProxyConfig(
+        hostNamesFor(context, "locator"),
+        hostNamesFor(context, "server"));
+
+    System.out.println(stuff);
+  }
+
+  private List<String> hostNamesFor(final TestContext context, final String role) {
+    return context.getHostsForRole(role).stream().map(InetAddress::getHostName)
+        .collect(Collectors.toList());
+  }
+
+  String generateHaProxyConfig(final Iterable<String> locators,
+                               final Iterable<String> servers) {
+
+    final StringBuilder stuff = new StringBuilder("defaults\n"
+        + "  timeout client 1000\n"
+        + "  timeout connect 1000\n"
+        + "  timeout server 1000\n"
+        + "frontend sniproxy\n"
+        + "  bind *:15443\n"
+        + "  mode tcp\n"
+        + "  tcp-request inspect-delay 5s\n"
+        + "  tcp-request content accept if { req_ssl_hello_type 1 }\n"
+        + "  log stdout format raw  local0  debug\n");
+
+    for (final String addy : locators) {
+      stuff.append("  use_backend locators-").append(addy)
+          .append(" if { req.ssl_sni -i ").append(addy
+          ).append(" }\n");
+    }
+
+    for (final String addy : servers) {
+      stuff.append("  use_backend servers-").append(addy)
+          .append(" if { req.ssl_sni -i ").append(addy
+          ).append(" }\n");
+    }
+
+    final String firstLocator = locators.iterator().next();
+    stuff.append("  default_backend locators-").append(firstLocator).append("\n");
+
+    for (final String addy : locators) {
+      stuff.append("backend locators-").append(addy).append("\n")
+          .append("  mode tcp\n").append("  server locator1 ").append(addy)
+          .append(":" + locatorPort + "\n");
+    }
+
+    for (final String addy : servers) {
+      stuff.append("backend servers-").append(addy).append("\n")
+          .append("  mode tcp\n").append("  server server1 ").append(addy)
+          .append(":40404\n");
+    }
+    return stuff.toString();
+  }
+}
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/ClientServerTopologyWithSNIProxy.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/ClientServerTopologyWithSNIProxy.java
new file mode 100644
index 0000000..35bdc67
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/ClientServerTopologyWithSNIProxy.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.geode.benchmark.topology;
+
+import static org.apache.geode.benchmark.topology.ClientServerTopologyWithSNIProxy.Roles.CLIENT;
+import static org.apache.geode.benchmark.topology.ClientServerTopologyWithSNIProxy.Roles.LOCATOR;
+import static org.apache.geode.benchmark.topology.ClientServerTopologyWithSNIProxy.Roles.SERVER;
+import static org.apache.geode.benchmark.topology.ClientServerTopologyWithSNIProxy.Roles.PROXY;
+
+import org.bouncycastle.util.Arrays;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.geode.benchmark.parameters.GcLoggingParameters;
+import org.apache.geode.benchmark.parameters.GcParameters;
+import org.apache.geode.benchmark.parameters.HeapParameters;
+import org.apache.geode.benchmark.parameters.JvmParameters;
+import org.apache.geode.benchmark.parameters.ProfilerParameters;
+import org.apache.geode.benchmark.tasks.StartClient;
+import org.apache.geode.benchmark.tasks.StartLocator;
+import org.apache.geode.benchmark.tasks.StartServer;
+import org.apache.geode.benchmark.tasks.StartSniProxy;
+import org.apache.geode.perftest.TestConfig;
+
+public class ClientServerTopologyWithSNIProxy {
+  private static final Logger logger = LoggerFactory.getLogger(ClientServerTopologyWithSNIProxy.class);
+
+  /**
+   * All roles defined for the JVMs created for the benchmark
+   */
+  public static class Roles {
+    public static final String SERVER = "server";
+    public static final String CLIENT = "client";
+    public static final String LOCATOR = "locator";
+    public static final String PROXY = "proxy";
+  }
+
+  /**
+   * The port used to create the locator for the tests
+   */
+  public static final int LOCATOR_PORT = 10334;
+
+  static final int NUM_LOCATORS = 1;
+  static final int NUM_SERVERS = 2;
+  static final int NUM_CLIENTS = 1;
+  static final int NUM_PROXIES = 1;
+  private static final String WITH_SSL_ARGUMENT = "-DwithSsl=true";
+  private static final String WITH_SECURITY_MANAGER_ARGUMENT = "-DwithSecurityManager=true";
+
+  public static void configure(TestConfig testConfig) {
+    testConfig.role(LOCATOR, NUM_LOCATORS);
+    testConfig.role(SERVER, NUM_SERVERS);
+    testConfig.role(CLIENT, NUM_CLIENTS);
+    testConfig.role(PROXY, NUM_PROXIES);
+
+    JvmParameters.configure(testConfig);
+    HeapParameters.configure(testConfig);
+    GcLoggingParameters.configure(testConfig);
+    GcParameters.configure(testConfig);
+    ProfilerParameters.configure(testConfig);
+
+    addToTestConfig(testConfig, "withSsl", WITH_SSL_ARGUMENT);
+    addToTestConfig(testConfig, "withSecurityManager", WITH_SECURITY_MANAGER_ARGUMENT);
+
+    testConfig.before(new StartLocator(LOCATOR_PORT), LOCATOR);
+    testConfig.before(new StartServer(LOCATOR_PORT), SERVER);
+    testConfig.before(new StartClient(LOCATOR_PORT), CLIENT);
+    testConfig.before(new StartSniProxy(LOCATOR_PORT), PROXY);
+  }
+
+  private static void addToTestConfig(TestConfig testConfig, String systemPropertyKey,
+      String jvmArgument) {
+    if (Boolean.getBoolean(systemPropertyKey)) {
+      logger.info("Configuring JVMs to run with " + jvmArgument);
+      testConfig.jvmArgs(CLIENT, jvmArgument);
+      testConfig.jvmArgs(LOCATOR, jvmArgument);
+      testConfig.jvmArgs(SERVER, jvmArgument);
+    }
+  }
+
+  private static String[] appendIfNotEmpty(String[] a, String b) {
+    if (null == b || b.length() == 0) {
+      return a;
+    }
+
+    return Arrays.append(a, b);
+  }
+}
diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tasks/StartSniProxyTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tasks/StartSniProxyTest.java
new file mode 100644
index 0000000..189172b
--- /dev/null
+++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tasks/StartSniProxyTest.java
@@ -0,0 +1,35 @@
+package org.apache.geode.benchmark.tasks;
+
+import java.util.Collections;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+class StartSniProxyTest {
+
+  @Test
+  public void generateConfigTest() {
+    final StartSniProxy starter = new StartSniProxy(42);
+    final String config =
+        starter.generateHaProxyConfig(Collections.singleton("one"), Collections.singleton("two"));
+    assertThat(config).isEqualTo("defaults\n"
+        + "  timeout client 1000\n"
+        + "  timeout connect 1000\n"
+        + "  timeout server 1000\n"
+        + "frontend sniproxy\n"
+        + "  bind *:15443\n"
+        + "  mode tcp\n"
+        + "  tcp-request inspect-delay 5s\n"
+        + "  tcp-request content accept if { req_ssl_hello_type 1 }\n"
+        + "  log stdout format raw  local0  debug\n"
+        + "  use_backend locators-one if { req.ssl_sni -i one }\n"
+        + "  use_backend servers-two if { req.ssl_sni -i two }\n"
+        + "  default_backend locators-one\n"
+        + "backend locators-one\n"
+        + "  mode tcp\n"
+        + "  server locator1 one:42\n"
+        + "backend servers-two\n"
+        + "  mode tcp\n"
+        + "  server server1 two:40404\n");
+  }
+}
\ No newline at end of file
diff --git a/infrastructure/scripts/aws/image/files/docker-compose.yml b/infrastructure/scripts/aws/image/files/docker-compose.yml
new file mode 100644
index 0000000..73c133a
--- /dev/null
+++ b/infrastructure/scripts/aws/image/files/docker-compose.yml
@@ -0,0 +1,26 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+version: '3'
+services:
+  haproxy:
+    container_name: 'haproxy'
+    image: 'haproxy:2.1'
+    ports:
+      - "15443"
+    volumes:
+      - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
+
diff --git a/infrastructure/scripts/aws/image/files/haproxy.cfg b/infrastructure/scripts/aws/image/files/haproxy.cfg
new file mode 100644
index 0000000..11a25d5
--- /dev/null
+++ b/infrastructure/scripts/aws/image/files/haproxy.cfg
@@ -0,0 +1,53 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+defaults
+  timeout client 1000
+  timeout connect 1000
+  timeout server 1000
+
+frontend sniproxy
+  bind *:15443
+  mode tcp
+  tcp-request inspect-delay 5s
+  tcp-request content accept if { req_ssl_hello_type 1 }
+  use_backend locators-maeve if { req.ssl_sni -i locator-maeve }
+  use_backend servers-dolores if { req.ssl_sni -i server-dolores }
+  use_backend servers-clementine if { req.ssl_sni -i server-clementine }
+  default_backend locators-maeve
+  log stdout format raw  local0  debug
+
+# ip-172-31-39-152 locator
+# ip-172-31-45-107 server
+# ip-172-31-39-104 server
+# ip-172-31-44-235 client
+# ip-172-31-32-137 proxy
+
+backend locators-maeve
+  mode tcp
+  # TODO: make the host name dynamic
+  server locator1 ip-172-31-39-152:10334
+
+backend servers-dolores
+  mode tcp
+  # TODO: make the host name dynamic
+  server server1 ip-172-31-45-107:40404
+
+backend servers-clementine
+  mode tcp
+  # TODO: make the host name dynamic
+  server server1 ip-172-31-39-104:40404