From 45c090372cb7a20926e04bda0cc10fcdd4ace60e Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 8 Jan 2026 11:30:32 -0800 Subject: [PATCH 01/78] add --- .github/workflows/dev-to-stage.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/dev-to-stage.yml b/.github/workflows/dev-to-stage.yml index beec6c94ab..becb2187c4 100644 --- a/.github/workflows/dev-to-stage.yml +++ b/.github/workflows/dev-to-stage.yml @@ -3,6 +3,11 @@ name: Dev to stage on: # This workflow manipulates the stage and dev branches regardless of the branch this workflow is run from workflow_dispatch: + inputs: + server-tag: + required: true + default: 'latest' + description: 'Server docker image tag' jobs: # We want to skip the stage tests if the changes made between dev and stage wouldn't affect the results of the stage tests @@ -46,6 +51,7 @@ jobs: with: use_jfrog_builds: true jfrog-build-version-to-test: ${{ needs.compare-latest-dev-tag-and-stage.outputs.latest-dev-tag }} + server-tag: ${{ inputs.server-tag }} # Stage tests have passed or skipped # so it is safe to update the stage branch with the changes in dev, promote the version to an RC, and rebuild and upload the RC to JFrog From ba4e7c7bca61bcef0d4beae0634411d9dd3f8f86 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 8 Jan 2026 13:11:44 -0800 Subject: [PATCH 02/78] WIP dry run --- .github/workflows/dev-to-stage.yml | 12 ++++++++++++ .github/workflows/stage-tests.yml | 9 +++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dev-to-stage.yml b/.github/workflows/dev-to-stage.yml index becb2187c4..d8ce3dcc57 100644 --- a/.github/workflows/dev-to-stage.yml +++ b/.github/workflows/dev-to-stage.yml @@ -8,6 +8,16 @@ on: required: true default: 'latest' description: 'Server docker image tag' + # For debugging + dry-run: + required: false + default: false + type: boolean + description: "Don't tag or upload anything" + test-file: + required: false + default: '' + description: 'new_tests/' jobs: # We want to skip the stage tests if the changes made between dev and stage wouldn't affect the results of the stage tests @@ -52,6 +62,7 @@ jobs: use_jfrog_builds: true jfrog-build-version-to-test: ${{ needs.compare-latest-dev-tag-and-stage.outputs.latest-dev-tag }} server-tag: ${{ inputs.server-tag }} + test-file: ${{ inputs.test-file }} # Stage tests have passed or skipped # so it is safe to update the stage branch with the changes in dev, promote the version to an RC, and rebuild and upload the RC to JFrog @@ -68,4 +79,5 @@ jobs: uses: ./.github/workflows/bump-stage-and-upload-to-jfrog.yml with: passed-dev-tag: ${{ needs.compare-latest-dev-tag-and-stage.outputs.latest-dev-tag }} + dry-run: ${{ inputs.dry-run }} secrets: inherit diff --git a/.github/workflows/stage-tests.yml b/.github/workflows/stage-tests.yml index 1c76ea938a..8fd5d60f8e 100644 --- a/.github/workflows/stage-tests.yml +++ b/.github/workflows/stage-tests.yml @@ -34,6 +34,11 @@ on: required: false default: 'latest' description: 'Server docker image tag' + test-file: + required: false + default: '' + type: string + description: 'new_tests/' test-macos-x86: required: false type: boolean @@ -176,7 +181,7 @@ jobs: run: docker exec --workdir /aerospike-client-python/test ${{ env.LINUX_DISTRO_CONTAINER_NAME }} python${{ env.PYTHON_VERSION }} -m ${{ env.PIP_INSTALL_COMMAND }} pytest -c requirements.txt - name: Run tests - run: docker exec --workdir /aerospike-client-python/test ${{ env.LINUX_DISTRO_CONTAINER_NAME }} python${{ env.PYTHON_VERSION }} -m pytest new_tests/ + run: docker exec --workdir /aerospike-client-python/test ${{ env.LINUX_DISTRO_CONTAINER_NAME }} python${{ env.PYTHON_VERSION }} -m pytest new_tests/${{ inputs.test-file }} macOS: if: ${{ inputs.test-macos-x86 }} @@ -251,7 +256,7 @@ jobs: - name: Run tests if: ${{ matrix.runner-os-and-arch[1] == 'x86_64' }} - run: python3 -m pytest new_tests/ + run: python3 -m pytest new_tests/${{ inputs.test-file }} working-directory: test - name: Run tests on macos 26 From 8e19597d93424e51204afa04207ce96b947c6fa4 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Wed, 21 Jan 2026 12:45:38 -0800 Subject: [PATCH 03/78] Need registry name to test qe nightly builds --- .github/workflows/dev-to-stage.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/dev-to-stage.yml b/.github/workflows/dev-to-stage.yml index d8ce3dcc57..40641bbe7f 100644 --- a/.github/workflows/dev-to-stage.yml +++ b/.github/workflows/dev-to-stage.yml @@ -4,6 +4,10 @@ on: # This workflow manipulates the stage and dev branches regardless of the branch this workflow is run from workflow_dispatch: inputs: + registry-name: + required: true + default: docker.io + description: 'Docker registry' server-tag: required: true default: 'latest' @@ -61,6 +65,7 @@ jobs: with: use_jfrog_builds: true jfrog-build-version-to-test: ${{ needs.compare-latest-dev-tag-and-stage.outputs.latest-dev-tag }} + registry-name: ${{ inputs.registry-name }} server-tag: ${{ inputs.server-tag }} test-file: ${{ inputs.test-file }} From 3cf8e8d2f08dd476bf130e1922acf5d31174f6cb Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Wed, 21 Jan 2026 12:48:53 -0800 Subject: [PATCH 04/78] Add skeleton code to disable tagging --- .github/workflows/bump-stage-and-upload-to-jfrog.yml | 7 +++++++ .github/workflows/bump-version.yml | 11 +++++++++++ .github/workflows/dev-to-stage.yml | 2 +- .github/workflows/update-version.yml | 11 +++++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/.github/workflows/bump-stage-and-upload-to-jfrog.yml b/.github/workflows/bump-stage-and-upload-to-jfrog.yml index 922c94de93..7d54364bdb 100644 --- a/.github/workflows/bump-stage-and-upload-to-jfrog.yml +++ b/.github/workflows/bump-stage-and-upload-to-jfrog.yml @@ -1,6 +1,11 @@ on: workflow_call: inputs: + dry-run: + required: false + default: false + type: boolean + description: "Don't tag or upload anything to JFrog" passed-dev-tag: type: string description: Dev tag to fast forward the stage branch to @@ -31,6 +36,7 @@ jobs: with: change: 'promote-dev-build-to-rc' ref: ${{ vars.STAGE_BRANCH_NAME }} + dry-run: ${{ inputs.dry-run }} secrets: inherit rebuild-artifacts-with-rc-version: @@ -50,6 +56,7 @@ jobs: uses: ./.github/workflows/upload-to-jfrog.yml with: version: ${{ needs.promote-dev-build-to-rc.outputs.new_version }} + dry-run: ${{ inputs.dry-run }} secrets: inherit # See reason for deleting artifacts in dev-workflow-p2.yml diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml index 736663f431..f972a0f19d 100644 --- a/.github/workflows/bump-version.yml +++ b/.github/workflows/bump-version.yml @@ -5,6 +5,11 @@ name: Bump version on: workflow_dispatch: inputs: + dry-run: + required: false + default: false + type: boolean + description: "Don't tag" change: type: choice description: Python script name to update the version @@ -15,6 +20,11 @@ on: - promote-rc-build-to-release workflow_call: inputs: + dry-run: + required: false + default: false + type: boolean + description: "Don't tag" change: # Since workflow_call doesn't support 'options' input type, # we take in a string instead that must be a valid Python script name (excluding the .py part) @@ -93,4 +103,5 @@ jobs: with: new_version: ${{ needs.get-new-version.outputs.new_version }} ref: ${{ inputs.is_workflow_call && inputs.ref || github.ref }} + dry-run: ${{ inputs.dry-run }} secrets: inherit diff --git a/.github/workflows/dev-to-stage.yml b/.github/workflows/dev-to-stage.yml index 40641bbe7f..8bf2f6f99f 100644 --- a/.github/workflows/dev-to-stage.yml +++ b/.github/workflows/dev-to-stage.yml @@ -17,7 +17,7 @@ on: required: false default: false type: boolean - description: "Don't tag or upload anything" + description: "Don't tag or upload anything to JFrog" test-file: required: false default: '' diff --git a/.github/workflows/update-version.yml b/.github/workflows/update-version.yml index 0098a64f2c..63983d08e3 100644 --- a/.github/workflows/update-version.yml +++ b/.github/workflows/update-version.yml @@ -5,12 +5,22 @@ name: Update version in repo on: workflow_dispatch: inputs: + dry-run: + required: false + default: false + type: boolean + description: "Don't tag" new_version: type: string description: Version string to set in the repo required: true workflow_call: inputs: + dry-run: + required: false + default: false + type: boolean + description: "Don't tag" new_version: type: string description: Version string to set in the repo @@ -61,6 +71,7 @@ jobs: with: commit_message: 'Auto-bump version to ${{ inputs.new_version }} [skip ci]' commit_author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> + # TODO tagging_message: ${{ inputs.new_version }} branch: ${{ inputs.is_workflow_call && inputs.ref || github.ref }} From e0ed822785fa9502c2f781f3fb5018de8f836eeb Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 22 Jan 2026 10:07:45 -0800 Subject: [PATCH 05/78] finish --- .github/workflows/update-version.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/update-version.yml b/.github/workflows/update-version.yml index 63983d08e3..55a7cbdb2e 100644 --- a/.github/workflows/update-version.yml +++ b/.github/workflows/update-version.yml @@ -71,8 +71,7 @@ jobs: with: commit_message: 'Auto-bump version to ${{ inputs.new_version }} [skip ci]' commit_author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> - # TODO - tagging_message: ${{ inputs.new_version }} + tagging_message: ${{ !inputs.dry-run && inputs.new_version || '' }} branch: ${{ inputs.is_workflow_call && inputs.ref || github.ref }} - name: Output bump commit hash for next jobs to use From 070591d40d9c7a4599974bce2ceb473a58c206e6 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 22 Jan 2026 10:11:55 -0800 Subject: [PATCH 06/78] Support dry run flag for uploading to jfrog workflow --- .github/workflows/upload-to-jfrog.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/upload-to-jfrog.yml b/.github/workflows/upload-to-jfrog.yml index 4b1e480db1..e865b28ed9 100644 --- a/.github/workflows/upload-to-jfrog.yml +++ b/.github/workflows/upload-to-jfrog.yml @@ -3,6 +3,11 @@ name: Upload to JFrog on: workflow_call: inputs: + dry-run: + required: false + default: false + type: boolean + description: "Don't upload to jfrog" version: type: string required: false @@ -39,19 +44,22 @@ jobs: JF_URL: ${{ secrets.JFROG_PLATFORM_URL }} JF_ACCESS_TOKEN: ${{ secrets.JFROG_ACCESS_TOKEN }} + - if: ${{ inputs.dry-run }} + run: echo "DRY_RUN_FLAG=--dry-run" >> $GITHUB_ENV + - name: Upload manylinux builds from arbitrary branches to JFrog generic repo if: ${{ inputs.jfrog-repo-name == vars.JFROG_GENERIC_REPO_NAME }} - run: jf rt upload "*manylinux*" ${{ vars.JFROG_GENERIC_REPO_NAME }}/${{ github.ref_name }}/ + run: jf rt upload $DRY_RUN_FLAG "*manylinux*" ${{ vars.JFROG_GENERIC_REPO_NAME }}/${{ github.ref_name }}/ working-directory: artifacts - name: Upload passing builds to JFrog PyPI repo if: ${{ inputs.jfrog-repo-name == vars.JFROG_REPO_NAME }} # Source path must be in quotes if it contains an asterisk # https://github.com/jfrog/jfrog-cli/issues/1775#issuecomment-1348986551 - run: jf rt upload --build-name python-client --build-number $NEW_VERSION "artifacts/*" ${{ vars.JFROG_REPO_NAME }}/aerospike/$NEW_VERSION/ + run: jf rt upload $DRY_RUN_FLAG --build-name python-client --build-number $NEW_VERSION "artifacts/*" ${{ vars.JFROG_REPO_NAME }}/aerospike/$NEW_VERSION/ env: NEW_VERSION: ${{ inputs.version }} - name: Publish build info if: ${{ inputs.jfrog-repo-name == vars.JFROG_REPO_NAME }} - run: jf rt build-publish python-client ${{ inputs.version }} + run: jf rt build-publish $DRY_RUN_FLAG python-client ${{ inputs.version }} From 297944feb468176854ee2ffc4b2729609fbeda87 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Mon, 23 Mar 2026 13:23:29 -0700 Subject: [PATCH 07/78] Add implementation and first rough draft of test case. TODO: needs edge cases covered --- src/main/client/sec_index.c | 7 +++++-- test/new_tests/test_set_index.py | 26 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 test/new_tests/test_set_index.py diff --git a/src/main/client/sec_index.c b/src/main/client/sec_index.c index e2d96d74a8..f7b042bbf8 100644 --- a/src/main/client/sec_index.c +++ b/src/main/client/sec_index.c @@ -84,12 +84,14 @@ static PyObject *convert_python_args_to_c_and_create_index( } // Convert python object into namespace string - if (!PyUnicode_Check(py_ns)) { + char *namespace = NULL; + if (PyUnicode_Check(py_ns)) { + namespace = (char *)PyUnicode_AsUTF8(py_ns); + } else if (!Py_IsNone(py_ns)) { as_error_update(&err, AEROSPIKE_ERR_PARAM, "Namespace should be a string"); goto CLEANUP; } - char *namespace = (char *)PyUnicode_AsUTF8(py_ns); // Convert python object into set string char *set_ptr = NULL; @@ -407,6 +409,7 @@ static PyObject *AerospikeClient_Index_Create_Deprecated_Helper( AerospikeClient *self, PyObject *args, PyObject *kwds, const char *ml_name, as_index_datatype index_datatype) { + // TODO: wait until we decide whether next release is a major version or not PyErr_WarnFormat(PyExc_DeprecationWarning, STACK_LEVEL, DEPRECATION_NOTICE_TO_USE_INDEX_SINGLE_VALUE_CREATE, ml_name); diff --git a/test/new_tests/test_set_index.py b/test/new_tests/test_set_index.py new file mode 100644 index 0000000000..561a3ab589 --- /dev/null +++ b/test/new_tests/test_set_index.py @@ -0,0 +1,26 @@ +import pytest +import aerospike +from .index_helpers import ensure_dropped_index + + +INDEX_NAME = "index_name" + +@pytest.mark.usefixtures("as_connection") +class TestSetIndex: + @pytest.fixture(autouse=True) + def setup(self): + yield + ensure_dropped_index(self.as_connection, None, INDEX_NAME) + + @pytest.mark.parametrize( + "index_create_method", + [ + aerospike.Client.index_single_value_create, + aerospike.Client.index_map_keys_create, + aerospike.Client.index_map_values_create, + aerospike.Client.index_list_create, + ] + ) + def test_create_set_index(self): + # TODO: reuse code from other PR + self.as_connection.index_create_method(None, "demo", "number", aerospike.INDEX_NUMERIC, INDEX_NAME) From cc5475f3fa4a146c0f112a6662dfc9206fbdca75 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 20:24:47 +0000 Subject: [PATCH 08/78] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/main/client/sec_index.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/client/sec_index.c b/src/main/client/sec_index.c index f7b042bbf8..2038080e0a 100644 --- a/src/main/client/sec_index.c +++ b/src/main/client/sec_index.c @@ -87,7 +87,8 @@ static PyObject *convert_python_args_to_c_and_create_index( char *namespace = NULL; if (PyUnicode_Check(py_ns)) { namespace = (char *)PyUnicode_AsUTF8(py_ns); - } else if (!Py_IsNone(py_ns)) { + } + else if (!Py_IsNone(py_ns)) { as_error_update(&err, AEROSPIKE_ERR_PARAM, "Namespace should be a string"); goto CLEANUP; From 8519ae2d76ea0c803b3202893539a9f700d88359 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Mon, 23 Mar 2026 13:33:07 -0700 Subject: [PATCH 09/78] Fix test syntax. --- test/new_tests/test_set_index.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/new_tests/test_set_index.py b/test/new_tests/test_set_index.py index 561a3ab589..4aaa81a48f 100644 --- a/test/new_tests/test_set_index.py +++ b/test/new_tests/test_set_index.py @@ -21,6 +21,6 @@ def setup(self): aerospike.Client.index_list_create, ] ) - def test_create_set_index(self): + def test_create_set_index(self, index_create_method): # TODO: reuse code from other PR - self.as_connection.index_create_method(None, "demo", "number", aerospike.INDEX_NUMERIC, INDEX_NAME) + index_create_method(self.as_connection, None, "demo", "number", aerospike.INDEX_NUMERIC, INDEX_NAME) From 71f84e7c2f5b7a5fef9b06107a1e5a81a1b18ea2 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Tue, 24 Mar 2026 10:53:40 -0700 Subject: [PATCH 10/78] Revert c changes. Sets need to belong to a namespace --- src/main/client/sec_index.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/client/sec_index.c b/src/main/client/sec_index.c index 2038080e0a..e2d96d74a8 100644 --- a/src/main/client/sec_index.c +++ b/src/main/client/sec_index.c @@ -84,15 +84,12 @@ static PyObject *convert_python_args_to_c_and_create_index( } // Convert python object into namespace string - char *namespace = NULL; - if (PyUnicode_Check(py_ns)) { - namespace = (char *)PyUnicode_AsUTF8(py_ns); - } - else if (!Py_IsNone(py_ns)) { + if (!PyUnicode_Check(py_ns)) { as_error_update(&err, AEROSPIKE_ERR_PARAM, "Namespace should be a string"); goto CLEANUP; } + char *namespace = (char *)PyUnicode_AsUTF8(py_ns); // Convert python object into set string char *set_ptr = NULL; @@ -410,7 +407,6 @@ static PyObject *AerospikeClient_Index_Create_Deprecated_Helper( AerospikeClient *self, PyObject *args, PyObject *kwds, const char *ml_name, as_index_datatype index_datatype) { - // TODO: wait until we decide whether next release is a major version or not PyErr_WarnFormat(PyExc_DeprecationWarning, STACK_LEVEL, DEPRECATION_NOTICE_TO_USE_INDEX_SINGLE_VALUE_CREATE, ml_name); From 3c8943642d6d0672b2251d836f5f4de3672bf35c Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Fri, 3 Apr 2026 11:16:50 -0700 Subject: [PATCH 11/78] Rename since we will have set index creation logic in here --- src/main/client/{sec_index.c => index.c} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/client/{sec_index.c => index.c} (100%) diff --git a/src/main/client/sec_index.c b/src/main/client/index.c similarity index 100% rename from src/main/client/sec_index.c rename to src/main/client/index.c From 24ac4c5ab09f391c25f7871b235149631c6bf775 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Fri, 3 Apr 2026 11:38:19 -0700 Subject: [PATCH 12/78] fix test. This should be its own method --- test/new_tests/test_set_index.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/test/new_tests/test_set_index.py b/test/new_tests/test_set_index.py index 4aaa81a48f..01e398d4ad 100644 --- a/test/new_tests/test_set_index.py +++ b/test/new_tests/test_set_index.py @@ -12,15 +12,5 @@ def setup(self): yield ensure_dropped_index(self.as_connection, None, INDEX_NAME) - @pytest.mark.parametrize( - "index_create_method", - [ - aerospike.Client.index_single_value_create, - aerospike.Client.index_map_keys_create, - aerospike.Client.index_map_values_create, - aerospike.Client.index_list_create, - ] - ) - def test_create_set_index(self, index_create_method): - # TODO: reuse code from other PR - index_create_method(self.as_connection, None, "demo", "number", aerospike.INDEX_NUMERIC, INDEX_NAME) + def test_create_set_index(self): + self.as_connection.index_set_create("test", "demo", INDEX_NAME) From 52e53287a421191dc1488ce962e407dd56fb594f Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Mon, 6 Apr 2026 14:52:05 -0700 Subject: [PATCH 13/78] Implement index_set_create --- .gitmodules | 2 +- aerospike-client-c | 2 +- src/include/client.h | 3 +++ src/main/client/index.c | 26 +++++++++++++++++++++++++- src/main/client/type.c | 2 ++ 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index 136ba68cbe..977e188dcc 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,4 +2,4 @@ path = aerospike-client-c # url = git@github.com:aerospike/aerospike-client-c.git url = https://github.com/aerospike/aerospike-client-c.git - branch = stage + branch = CLIENT-4314-set-indices diff --git a/aerospike-client-c b/aerospike-client-c index 4297aaf5ac..d9c90d1515 160000 --- a/aerospike-client-c +++ b/aerospike-client-c @@ -1 +1 @@ -Subproject commit 4297aaf5ac03d6f7180b43f4e2576b626b597991 +Subproject commit d9c90d1515141f3394d0b789c8a6f9e2cfa33ff6 diff --git a/src/include/client.h b/src/include/client.h index cd168c57c5..6193091dbc 100644 --- a/src/include/client.h +++ b/src/include/client.h @@ -425,6 +425,9 @@ PyObject *AerospikeClient_Index_Map_Values_Create(AerospikeClient *self, PyObject *args, PyObject *kwds); +PyObject *AerospikeClient_Index_Set_Create(AerospikeClient *self, + PyObject *args, PyObject *kwds); + /** * Get the base64 representation of an aerospike CDT ctx. * diff --git a/src/main/client/index.c b/src/main/client/index.c index e2d96d74a8..bafe88a9f4 100644 --- a/src/main/client/index.c +++ b/src/main/client/index.c @@ -33,11 +33,12 @@ #define CTX_PARSE_ERROR_MESSAGE "Unable to parse ctx" /* - * Create a complex index on the specified ns/set/bin with the given name and index and data_type. Return PyObject(0) on success + * Create an index on the specified ns/set/bin with the given name and index and data_type. Return PyObject(0) on success * else return NULL with an error raised. */ // expr is optional and can be NULL. // If expr is non-NULL (i.e we are indexing an expression), py_bin should be NULL. +// If py_bin is NULL, we are indexing a set. // This is permissive and allows py_ctx to be None or NULL // // NOTE: data_type and index_type are integers because some index creation methods i.e index_expr_create @@ -398,6 +399,29 @@ PyObject *AerospikeClient_Index_Remove(AerospikeClient *self, PyObject *args, return PyLong_FromLong(0); } +PyObject *AerospikeClient_Index_Set_Create(AerospikeClient *self, + PyObject *args, PyObject *kwds) +{ + // Python Function Arguments + PyObject *py_ns = NULL; + PyObject *py_set = NULL; + PyObject *py_name = NULL; + PyObject *py_policy = NULL; + + // Python Function Keyword Arguments + static char *kwlist[] = {"ns", "set", "name", "policy", NULL}; + + // Python Function Argument Parsing + if (PyArg_ParseTupleAndKeywords(args, kwds, "OOO|O:index_set_create", + kwlist, &py_ns, &py_set, &py_name, + &py_policy) == false) { + return NULL; + } + + return convert_python_args_to_c_and_create_index( + self, py_policy, py_ns, py_set, NULL, py_name, 0, 0, NULL, NULL); +} + // Deprecated API's #define DEPRECATION_NOTICE_TO_USE_INDEX_SINGLE_VALUE_CREATE \ diff --git a/src/main/client/type.c b/src/main/client/type.c index b77e5a3290..39c68f8ea0 100644 --- a/src/main/client/type.c +++ b/src/main/client/type.c @@ -486,6 +486,8 @@ static PyMethodDef AerospikeClient_Type_Methods[] = { {"index_map_values_create", (PyCFunction)AerospikeClient_Index_Map_Values_Create, METH_VARARGS | METH_KEYWORDS, index_map_values_create_doc}, + {"index_set_create", (PyCFunction)AerospikeClient_Index_Set_Create, + METH_VARARGS | METH_KEYWORDS, NULL}, {"index_geo2dsphere_create", (PyCFunction)AerospikeClient_Index_2dsphere_Create, From ac49a08d95610070c1caaa3e9bc856a795670f0c Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Mon, 6 Apr 2026 15:00:30 -0700 Subject: [PATCH 14/78] Fix compiler error --- aerospike_helpers/expressions/base.py | 2 +- src/main/aerospike.c | 2 +- src/main/convert_expressions.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/aerospike_helpers/expressions/base.py b/aerospike_helpers/expressions/base.py index b78711cd58..72b0c1305c 100644 --- a/aerospike_helpers/expressions/base.py +++ b/aerospike_helpers/expressions/base.py @@ -1137,7 +1137,7 @@ class ResultRemove(_BaseExpr): """ Indicates entry deletion for :py:class:`ModifyByPath`. """ - _op = aerospike._AS_EXP_CODE_RESULT_REMOVE + _op = aerospike._AS_EXP_CODE_REMOVE_RESULT def __init__(self): warnings.warn( diff --git a/src/main/aerospike.c b/src/main/aerospike.c index 1e7ac45cd6..3da12b190e 100644 --- a/src/main/aerospike.c +++ b/src/main/aerospike.c @@ -585,7 +585,7 @@ static struct module_constant_name_to_value module_constants[] = { // so we define unique ones in the Python client code EXPOSE_MACRO(_AS_EXP_CODE_CALL_SELECT), EXPOSE_MACRO(_AS_EXP_CODE_CALL_APPLY), - EXPOSE_MACRO(_AS_EXP_CODE_RESULT_REMOVE), + EXPOSE_MACRO(_AS_EXP_CODE_REMOVE_RESULT), EXPOSE_STRING_MACRO_FOR_AEROSPIKE_HELPERS(_CDT_FLAGS_KEY), EXPOSE_STRING_MACRO_FOR_AEROSPIKE_HELPERS(_CDT_APPLY_MOD_EXP_KEY), diff --git a/src/main/convert_expressions.c b/src/main/convert_expressions.c index 09a87e190a..2ae0e9ec92 100644 --- a/src/main/convert_expressions.c +++ b/src/main/convert_expressions.c @@ -206,7 +206,7 @@ static as_status get_expr_size(int *size_to_alloc, int *intermediate_exprs_size, EXP_SZ(as_exp_select_by_path(NULL, 0, 0, NIL)), [_AS_EXP_CODE_CALL_APPLY] = EXP_SZ(as_exp_modify_by_path(NULL, 0, NULL, 0, NIL)), - [_AS_EXP_CODE_RESULT_REMOVE] = EXP_SZ(as_exp_result_remove()), + [_AS_EXP_CODE_REMOVE_RESULT] = EXP_SZ(as_exp_result_remove()), [BIN] = EXP_SZ(as_exp_bin_int(0)), [_AS_EXP_CODE_AS_VAL] = EXP_SZ(as_exp_val(NULL)), [_AS_EXP_LOOPVAR_FLOAT] = EXP_SZ(as_exp_loopvar_float(0)), @@ -1705,7 +1705,7 @@ add_expr_macros(AerospikeClient *self, as_static_pool *static_pool, lval2, NIL)); } break; - case _AS_EXP_CODE_RESULT_REMOVE: + case _AS_EXP_CODE_REMOVE_RESULT: APPEND_ARRAY(0, as_exp_result_remove()); break; default: From f15587e23cdd3aa14a56aee7e428597cf8bdcab4 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Mon, 6 Apr 2026 15:05:41 -0700 Subject: [PATCH 15/78] add type stub --- aerospike-stubs/aerospike.pyi | 1 + 1 file changed, 1 insertion(+) diff --git a/aerospike-stubs/aerospike.pyi b/aerospike-stubs/aerospike.pyi index d80dccfbd1..96355cac76 100644 --- a/aerospike-stubs/aerospike.pyi +++ b/aerospike-stubs/aerospike.pyi @@ -399,6 +399,7 @@ class Client: def index_list_create(self, ns: str, set: str, bin: str, index_datatype: int, name: str, policy: dict = ..., ctx: Optional[list] = ...) -> None: ... def index_map_keys_create(self, ns: str, set: str, bin: str, index_datatype: int, name: str, policy: dict = ..., ctx: Optional[list] = ...) -> None: ... def index_map_values_create(self, ns: str, set: str, bin: str, index_datatype: int, name: str, policy: dict = ..., ctx: Optional[list] = ...) -> None: ... + def index_set_create(self, ns: str, set: str, name: str, policy: dict = ...) -> None: ... def index_cdt_create(self, ns: str, set: str, bin: str, index_type: int, index_datatype: int, name: str, ctx: list, policy: dict = ...) -> int: ... def index_expr_create(self, ns: str, set: str, index_type: int, index_datatype: int, expressions: list, name: str, policy: dict = ...) -> None: ... From 44c807587424dd7b0350b332c9e94ca8ce0dbea1 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Mon, 6 Apr 2026 16:30:15 -0700 Subject: [PATCH 16/78] Have sindex test case log in as user with only sindex-admin role. --- test/new_tests/test_set_index.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/test/new_tests/test_set_index.py b/test/new_tests/test_set_index.py index 01e398d4ad..00b0a1d8d2 100644 --- a/test/new_tests/test_set_index.py +++ b/test/new_tests/test_set_index.py @@ -1,16 +1,31 @@ import pytest import aerospike from .index_helpers import ensure_dropped_index +from .test_base_class import TestBaseClass INDEX_NAME = "index_name" @pytest.mark.usefixtures("as_connection") class TestSetIndex: - @pytest.fixture(autouse=True) - def setup(self): - yield + @pytest.fixture + def client_as_sindex_admin_user(self): + USERNAME_AND_PASSWORD = "user_with_sindex_admin" + self.as_connection.admin_create_user( + username=USERNAME_AND_PASSWORD, + password=USERNAME_AND_PASSWORD, + roles=[ + "sindex-admin" + ] + ) + + config = TestBaseClass.get_connection_config() + config["user"] = USERNAME_AND_PASSWORD + config["password"] = USERNAME_AND_PASSWORD + + yield aerospike.client(config) + ensure_dropped_index(self.as_connection, None, INDEX_NAME) - def test_create_set_index(self): - self.as_connection.index_set_create("test", "demo", INDEX_NAME) + def test_create_set_index(self, client_as_sindex_admin_user): + client_as_sindex_admin_user.index_set_create("test", "demo", INDEX_NAME) From 41acfa808e6bddabad6b27f889b53211cf264be2 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Mon, 6 Apr 2026 16:36:21 -0700 Subject: [PATCH 17/78] Update c client to address segv from dereferencing NULL ptr --- aerospike-client-c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aerospike-client-c b/aerospike-client-c index d9c90d1515..a8e51986f2 160000 --- a/aerospike-client-c +++ b/aerospike-client-c @@ -1 +1 @@ -Subproject commit d9c90d1515141f3394d0b789c8a6f9e2cfa33ff6 +Subproject commit a8e51986f28d6b6c5e2bdf64cf2ee6d1651ed792 From 441aff0399a8371989b8fdf6a8d8bb5e5ceba1d2 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Mon, 6 Apr 2026 21:46:04 -0700 Subject: [PATCH 18/78] Update c client again. --- aerospike-client-c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aerospike-client-c b/aerospike-client-c index a8e51986f2..7678e6117c 160000 --- a/aerospike-client-c +++ b/aerospike-client-c @@ -1 +1 @@ -Subproject commit a8e51986f28d6b6c5e2bdf64cf2ee6d1651ed792 +Subproject commit 7678e6117ce37619a0720a75dfdfd1fd92324d63 From a08dd29f98264c35208ad8419a92cafd4c1da49c Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Tue, 7 Apr 2026 08:39:36 -0700 Subject: [PATCH 19/78] Fix incorrect kwarg. TODO need to fix type stubs as well... --- test/new_tests/test_set_index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/new_tests/test_set_index.py b/test/new_tests/test_set_index.py index 00b0a1d8d2..b7abc3d79e 100644 --- a/test/new_tests/test_set_index.py +++ b/test/new_tests/test_set_index.py @@ -12,7 +12,7 @@ class TestSetIndex: def client_as_sindex_admin_user(self): USERNAME_AND_PASSWORD = "user_with_sindex_admin" self.as_connection.admin_create_user( - username=USERNAME_AND_PASSWORD, + user=USERNAME_AND_PASSWORD, password=USERNAME_AND_PASSWORD, roles=[ "sindex-admin" From fae5bdbdb484542f3189367960c682ecb0a58902 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Tue, 7 Apr 2026 08:43:03 -0700 Subject: [PATCH 20/78] Fix test not cleaning up after new user --- test/new_tests/test_set_index.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/new_tests/test_set_index.py b/test/new_tests/test_set_index.py index b7abc3d79e..b7bca3bbbf 100644 --- a/test/new_tests/test_set_index.py +++ b/test/new_tests/test_set_index.py @@ -26,6 +26,9 @@ def client_as_sindex_admin_user(self): yield aerospike.client(config) ensure_dropped_index(self.as_connection, None, INDEX_NAME) + self.as_connection.admin_drop_user( + user=USERNAME_AND_PASSWORD, + ) def test_create_set_index(self, client_as_sindex_admin_user): client_as_sindex_admin_user.index_set_create("test", "demo", INDEX_NAME) From 204957daac4aa550f2cedf01801447390f3ae1e4 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Tue, 7 Apr 2026 08:45:26 -0700 Subject: [PATCH 21/78] Have test start with known environment --- test/new_tests/test_set_index.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/test/new_tests/test_set_index.py b/test/new_tests/test_set_index.py index b7bca3bbbf..54f9188ecd 100644 --- a/test/new_tests/test_set_index.py +++ b/test/new_tests/test_set_index.py @@ -1,7 +1,9 @@ import pytest import aerospike +from aerospike import exception as e from .index_helpers import ensure_dropped_index from .test_base_class import TestBaseClass +import time INDEX_NAME = "index_name" @@ -10,6 +12,14 @@ class TestSetIndex: @pytest.fixture def client_as_sindex_admin_user(self): + try: + self.as_connection.admin_drop_user( + user=USERNAME_AND_PASSWORD, + ) + time.sleep(2) + except e.InvalidUser: + pass + USERNAME_AND_PASSWORD = "user_with_sindex_admin" self.as_connection.admin_create_user( user=USERNAME_AND_PASSWORD, @@ -26,9 +36,7 @@ def client_as_sindex_admin_user(self): yield aerospike.client(config) ensure_dropped_index(self.as_connection, None, INDEX_NAME) - self.as_connection.admin_drop_user( - user=USERNAME_AND_PASSWORD, - ) + # TODO: clean up steps should also be run here? def test_create_set_index(self, client_as_sindex_admin_user): client_as_sindex_admin_user.index_set_create("test", "demo", INDEX_NAME) From 5a309697a31929a17e1d92f479448b04f84e5d98 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Tue, 7 Apr 2026 08:56:43 -0700 Subject: [PATCH 22/78] Explicitly set index_type to AS_INDEX_TYPE_SET and index_datatype to AS_INDEX_NONE. I incorrectly assumed that passing NULL to both bin name and expr would implicitly create a set index --- src/main/client/index.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/client/index.c b/src/main/client/index.c index bafe88a9f4..1810847f3d 100644 --- a/src/main/client/index.c +++ b/src/main/client/index.c @@ -419,7 +419,8 @@ PyObject *AerospikeClient_Index_Set_Create(AerospikeClient *self, } return convert_python_args_to_c_and_create_index( - self, py_policy, py_ns, py_set, NULL, py_name, 0, 0, NULL, NULL); + self, py_policy, py_ns, py_set, NULL, py_name, AS_INDEX_TYPE_SET, + AS_INDEX_NONE, NULL, NULL); } // Deprecated API's From 76691c6cc55efa9c43d57dff139f849ffd98a28e Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Tue, 7 Apr 2026 10:20:48 -0700 Subject: [PATCH 23/78] Type stubs: fix admin commands having incorrect kwarg username. Stubtest can't detect this because these kwargs are defined at runtime --- aerospike-stubs/aerospike.pyi | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/aerospike-stubs/aerospike.pyi b/aerospike-stubs/aerospike.pyi index 96355cac76..622046c89c 100644 --- a/aerospike-stubs/aerospike.pyi +++ b/aerospike-stubs/aerospike.pyi @@ -349,23 +349,20 @@ class ConfigProvider: class Client: def __init__(self, *args, **kwargs) -> None: ... - def admin_change_password(self, username: str, password: str, policy: dict = ...) -> None: ... + def admin_change_password(self, user: str, password: str, policy: dict = ...) -> None: ... def admin_create_role(self, role: str, privileges: list, policy: dict = ..., whitelist: list = ..., read_quota: int = ..., write_quota: int = ...) -> None: ... - def admin_create_pki_user(self, username: str, roles: list, policy: dict = ...) -> None: ... - def admin_create_user(self, username: str, password: str, roles: list, policy: dict = ...) -> None: ... + def admin_create_user(self, user: str, password: str, roles: list, policy: dict = ...) -> None: ... def admin_drop_role(self, role: str, policy: dict = ...) -> None: ... - def admin_drop_user(self, username: str, policy: dict = ...) -> None: ... + def admin_drop_user(self, user: str, policy: dict = ...) -> None: ... def admin_get_role(self, role: str, policy: dict = ...) -> dict: ... def admin_get_roles(self, policy: dict = ...) -> dict: ... def admin_grant_privileges(self, role: str, privileges: list, policy: dict = ...) -> None: ... - def admin_grant_roles(self, username: str, roles: list, policy: dict = ...) -> None: ... + def admin_grant_roles(self, user: str, roles: list, policy: dict = ...) -> None: ... def admin_query_role(self, role: str, policy: dict = ...) -> list: ... def admin_query_roles(self, policy: dict = ...) -> dict: ... - def admin_query_user_info(self, user: str, policy: dict = ...) -> dict: ... - def admin_query_users_info(self, policy: dict = ...) -> dict: ... def admin_revoke_privileges(self, role: str, privileges: list, policy: dict = ...) -> None: ... - def admin_revoke_roles(self, username: str, roles: list, policy: dict = ...) -> None: ... - def admin_set_password(self, username: str, password: str, policy: dict = ...) -> None: ... + def admin_revoke_roles(self, user: str, roles: list, policy: dict = ...) -> None: ... + def admin_set_password(self, user: str, password: str, policy: dict = ...) -> None: ... def admin_set_quotas(self, role: str, read_quota: int = ..., write_quota: int = ..., policy: dict = ...) -> None: ... def admin_set_whitelist(self, role: str, whitelist: list, policy: dict = ...) -> None: ... def append(self, key: tuple, bin: str, val: str, meta: dict = ..., policy: dict = ...) -> None: ... From 7ff71c65c3aefaa70b83183570bf2033fbfaff02 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Tue, 7 Apr 2026 14:01:38 -0700 Subject: [PATCH 24/78] Fix test syntax --- test/new_tests/test_set_index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/new_tests/test_set_index.py b/test/new_tests/test_set_index.py index 54f9188ecd..0e3cb6cad7 100644 --- a/test/new_tests/test_set_index.py +++ b/test/new_tests/test_set_index.py @@ -12,6 +12,7 @@ class TestSetIndex: @pytest.fixture def client_as_sindex_admin_user(self): + USERNAME_AND_PASSWORD = "user_with_sindex_admin" try: self.as_connection.admin_drop_user( user=USERNAME_AND_PASSWORD, @@ -20,7 +21,6 @@ def client_as_sindex_admin_user(self): except e.InvalidUser: pass - USERNAME_AND_PASSWORD = "user_with_sindex_admin" self.as_connection.admin_create_user( user=USERNAME_AND_PASSWORD, password=USERNAME_AND_PASSWORD, From 0905b0d97f3d473ca23c6b9acdc607057e248716 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Tue, 7 Apr 2026 16:43:51 -0700 Subject: [PATCH 25/78] Skip test for CE. But also running on server < 8.1.2 to see what happens --- .github/workflows/smoke-tests.yml | 2 +- test/new_tests/test_set_index.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index 0f2d2d773f..6350bb6d68 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -449,7 +449,7 @@ jobs: - name: Run tests # -s: we want to check that the test_create_pki_user test case passes or raises an exception as expected # There's no way to tell unless we see the logs - run: python -m pytest -s ./new_tests/test_{mrt_functionality,admin_*,compress}.py -W error::pytest.PytestUnraisableExceptionWarning + run: python -m pytest -s ./new_tests/test_{mrt_functionality,admin_*,compress,set_index}.py -W error::pytest.PytestUnraisableExceptionWarning working-directory: test - name: Show logs if failed diff --git a/test/new_tests/test_set_index.py b/test/new_tests/test_set_index.py index 0e3cb6cad7..0cd38e67f7 100644 --- a/test/new_tests/test_set_index.py +++ b/test/new_tests/test_set_index.py @@ -12,6 +12,9 @@ class TestSetIndex: @pytest.fixture def client_as_sindex_admin_user(self): + if (not TestBaseClass.auth_in_use()): + pytest.skip("Security required to create a user with the sindex-admin role") + USERNAME_AND_PASSWORD = "user_with_sindex_admin" try: self.as_connection.admin_drop_user( From 25400253a807a0b8ec8d15c5f4828f5780a35095 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Tue, 7 Apr 2026 16:52:26 -0700 Subject: [PATCH 26/78] Fix regression where methods were removed from type stubs.. --- aerospike-stubs/aerospike.pyi | 3 +++ 1 file changed, 3 insertions(+) diff --git a/aerospike-stubs/aerospike.pyi b/aerospike-stubs/aerospike.pyi index 622046c89c..5cd0507757 100644 --- a/aerospike-stubs/aerospike.pyi +++ b/aerospike-stubs/aerospike.pyi @@ -351,6 +351,7 @@ class Client: def __init__(self, *args, **kwargs) -> None: ... def admin_change_password(self, user: str, password: str, policy: dict = ...) -> None: ... def admin_create_role(self, role: str, privileges: list, policy: dict = ..., whitelist: list = ..., read_quota: int = ..., write_quota: int = ...) -> None: ... + def admin_create_pki_user(self, username: str, roles: list, policy: dict = ...) -> None: ... def admin_create_user(self, user: str, password: str, roles: list, policy: dict = ...) -> None: ... def admin_drop_role(self, role: str, policy: dict = ...) -> None: ... def admin_drop_user(self, user: str, policy: dict = ...) -> None: ... @@ -360,6 +361,8 @@ class Client: def admin_grant_roles(self, user: str, roles: list, policy: dict = ...) -> None: ... def admin_query_role(self, role: str, policy: dict = ...) -> list: ... def admin_query_roles(self, policy: dict = ...) -> dict: ... + def admin_query_user_info(self, user: str, policy: dict = ...) -> dict: ... + def admin_query_users_info(self, policy: dict = ...) -> dict: ... def admin_revoke_privileges(self, role: str, privileges: list, policy: dict = ...) -> None: ... def admin_revoke_roles(self, user: str, roles: list, policy: dict = ...) -> None: ... def admin_set_password(self, user: str, password: str, policy: dict = ...) -> None: ... From c5538a4180c1c66cd0b81d1a15a24fb48408c1fe Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Tue, 7 Apr 2026 17:35:29 -0700 Subject: [PATCH 27/78] Pull c client again to address segv when running against server 8.1.1 --- aerospike-client-c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aerospike-client-c b/aerospike-client-c index 7678e6117c..f53b2811d8 160000 --- a/aerospike-client-c +++ b/aerospike-client-c @@ -1 +1 @@ -Subproject commit 7678e6117ce37619a0720a75dfdfd1fd92324d63 +Subproject commit f53b2811d89df619fc0fda8fe4586f090c6400db From 21785c639dd0eefb75b333ba94656fdc949abdf3 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Wed, 8 Apr 2026 09:06:17 -0700 Subject: [PATCH 28/78] Pull c client to fix linker error --- aerospike-client-c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aerospike-client-c b/aerospike-client-c index f53b2811d8..e80d6606ea 160000 --- a/aerospike-client-c +++ b/aerospike-client-c @@ -1 +1 @@ -Subproject commit f53b2811d89df619fc0fda8fe4586f090c6400db +Subproject commit e80d6606eab4b1170498bfee37b09e6b7549e75e From 486775f7304cb08aaeadb8f27324d1fdcb84c7ef Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Wed, 8 Apr 2026 09:41:37 -0700 Subject: [PATCH 29/78] Align with c client's config provider interval default of 5000 --- doc/config_provider.rst | 2 +- test/new_tests/test_dynamic_config.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/config_provider.rst b/doc/config_provider.rst index 2b0fd78ca4..5afc10caa6 100644 --- a/doc/config_provider.rst +++ b/doc/config_provider.rst @@ -21,7 +21,7 @@ Methods :type path: str :param interval: Interval in milliseconds between dynamic configuration check for file modifications. - The value must be greater than or equal to the tend interval. Defaults to ``60000``. + The value must be greater than or equal to the tend interval. Defaults to ``5000``. :type interval: int, optional .. py:attribute:: path diff --git a/test/new_tests/test_dynamic_config.py b/test/new_tests/test_dynamic_config.py index 857ded21e0..d8555519c4 100644 --- a/test/new_tests/test_dynamic_config.py +++ b/test/new_tests/test_dynamic_config.py @@ -12,7 +12,7 @@ class TestDynamicConfig: def test_config_provider_defaults(self): provider = aerospike.ConfigProvider(path="path") - assert provider.interval == 60000 + assert provider.interval == 5000 def test_config_provider_class(self): provider = aerospike.ConfigProvider(path="path", interval=30000) From 65b487cec883cde40b9680e84a3c69a20db93e47 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Wed, 8 Apr 2026 13:05:40 -0700 Subject: [PATCH 30/78] Fix test --- test/new_tests/test_set_index.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/new_tests/test_set_index.py b/test/new_tests/test_set_index.py index 0cd38e67f7..6f12ad9fb9 100644 --- a/test/new_tests/test_set_index.py +++ b/test/new_tests/test_set_index.py @@ -38,8 +38,7 @@ def client_as_sindex_admin_user(self): yield aerospike.client(config) - ensure_dropped_index(self.as_connection, None, INDEX_NAME) - # TODO: clean up steps should also be run here? + ensure_dropped_index(self.as_connection, "test", INDEX_NAME) def test_create_set_index(self, client_as_sindex_admin_user): client_as_sindex_admin_user.index_set_create("test", "demo", INDEX_NAME) From 411542082e96d99f1f874b36599c4976ddec28a1 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Wed, 8 Apr 2026 14:49:39 -0700 Subject: [PATCH 31/78] Update c client again to fix test error --- aerospike-client-c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aerospike-client-c b/aerospike-client-c index e80d6606ea..4c94eca320 160000 --- a/aerospike-client-c +++ b/aerospike-client-c @@ -1 +1 @@ -Subproject commit e80d6606eab4b1170498bfee37b09e6b7549e75e +Subproject commit 4c94eca320a8cc0ff71f7c0f74eee1b5477b9f79 From 9287ff9f33b7bdf04ec8753e0ee86221436a9a7e Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Wed, 8 Apr 2026 14:55:56 -0700 Subject: [PATCH 32/78] Fix --- src/main/client/index.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/client/index.c b/src/main/client/index.c index 1810847f3d..5890844e7e 100644 --- a/src/main/client/index.c +++ b/src/main/client/index.c @@ -420,7 +420,7 @@ PyObject *AerospikeClient_Index_Set_Create(AerospikeClient *self, return convert_python_args_to_c_and_create_index( self, py_policy, py_ns, py_set, NULL, py_name, AS_INDEX_TYPE_SET, - AS_INDEX_NONE, NULL, NULL); + AS_INDEX_DEFAULT, NULL, NULL); } // Deprecated API's From 94912410cea10e6b375723fae10377b200b3e212 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Wed, 8 Apr 2026 15:22:55 -0700 Subject: [PATCH 33/78] Test should expect server error on < 8.1.2 --- test/new_tests/conftest.py | 12 ++++++++++++ test/new_tests/test_set_index.py | 12 ++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/test/new_tests/conftest.py b/test/new_tests/conftest.py index 514ff0f509..e5c2ebe2af 100644 --- a/test/new_tests/conftest.py +++ b/test/new_tests/conftest.py @@ -9,6 +9,8 @@ from .test_base_class import TestBaseClass import aerospike +from aerospike import exception as e +from contextlib import nullcontext # Comment this out because nowhere in the repository is using it ''' @@ -257,3 +259,13 @@ def wait_for_job_completion(as_connection, job_id, job_module: int = aerospike.J if response["status"] != aerospike.JOB_STATUS_INPROGRESS: break time.sleep(0.1) + +@pytest.fixture(scope="function") +def expect_earlier_than_server_version_to_fail(as_connection, request): + # Some requesting test cases may not set the param. Like if it is a negative client-side test case and there is no + # required server version, but every test case in that module depends on this fixture + if hasattr(request, "param") and (TestBaseClass.major_ver, TestBaseClass.minor_ver, TestBaseClass.patch_ver) >= request.param: + request.cls.expected_context_for_pos_tests = nullcontext() + else: + # InvalidRequest, BinIncompatibleTypes are exceptions that have been raised + request.cls.expected_context_for_pos_tests = pytest.raises(e.ServerError) diff --git a/test/new_tests/test_set_index.py b/test/new_tests/test_set_index.py index 6f12ad9fb9..4c61093dd1 100644 --- a/test/new_tests/test_set_index.py +++ b/test/new_tests/test_set_index.py @@ -40,5 +40,13 @@ def client_as_sindex_admin_user(self): ensure_dropped_index(self.as_connection, "test", INDEX_NAME) - def test_create_set_index(self, client_as_sindex_admin_user): - client_as_sindex_admin_user.index_set_create("test", "demo", INDEX_NAME) + @pytest.mark.parametrize( + "expect_earlier_than_server_version_to_fail", + [ + (8, 1, 2) + ], + indirect=True + ) + def test_create_set_index(self, client_as_sindex_admin_user, expect_earlier_than_server_version_to_fail): + with self.expected_context_for_pos_tests: + client_as_sindex_admin_user.index_set_create("test", "demo", INDEX_NAME) From 33a0b658785bde10de7bf07959fad1ebae01eba0 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Wed, 8 Apr 2026 15:39:51 -0700 Subject: [PATCH 34/78] Cherry pick ci/cd changes from other 8.1.2 branches --- .github/actions/run-ee-server/action.yml | 23 +++++- .../workflows/build-and-run-stage-tests.yml | 6 ++ .github/workflows/build-artifacts.yml | 10 +-- .github/workflows/build-wheels.yml | 19 +++-- .github/workflows/smoke-tests.yml | 71 ++++++++++++------- .github/workflows/stage-tests.yml | 12 +++- .github/workflows/valgrind.yml | 12 +++- 7 files changed, 113 insertions(+), 40 deletions(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 80a60f54ce..3a50fb6aaf 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -8,6 +8,13 @@ inputs: description: Registry name required: false default: docker.io + oidc-provider-name: + description: For pulling server images from JFrog + required: true + oidc-audience: + description: For pulling server images from JFrog + required: true + # Needed for logging into QE registry registry-username: description: Required for using release candidates required: false @@ -39,6 +46,7 @@ runs: # Start up server - name: Log into registry to get non-public server RCs + if: ${{ inputs.registry-username != '' && inputs.registry-password != '' }} # We can still pull public images while logged in, so just do this all the time to make things simple uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 with: @@ -46,7 +54,20 @@ runs: username: ${{ inputs.registry-username }} password: ${{ inputs.registry-password }} - - run: echo IMAGE_FULL_NAME=${{ inputs.registry-name }}/${{ inputs.image-name }}:${{ inputs.server-tag }} >> $GITHUB_ENV + - uses: step-security/setup-jfrog-cli@a6b41f8338bea0983ddff6bd4ede7d2dcd81e1fa # v4.8.1 + if: ${{ inputs.registry-name == 'artifact.aerospike.io' }} + env: + JF_URL: https://artifact.aerospike.io + with: + oidc-provider-name: ${{ inputs.oidc-provider-name }} + oidc-audience: ${{ inputs.oidc-audience }} + version: 2.98.0 + + - run: echo BASE_IMAGE=${{ inputs.registry-name }}/${{ inputs.image-name }}:${{ inputs.server-tag }} >> $GITHUB_ENV + shell: bash + + - if: ${{ inputs.registry-name == 'artifact.aerospike.io' }} + run: jf docker pull $BASE_IMAGE shell: bash - run: echo CA_CERT_FILE_NAME="ca.cer" >> $GITHUB_ENV diff --git a/.github/workflows/build-and-run-stage-tests.yml b/.github/workflows/build-and-run-stage-tests.yml index 7b926e8f11..e4e4240635 100644 --- a/.github/workflows/build-and-run-stage-tests.yml +++ b/.github/workflows/build-and-run-stage-tests.yml @@ -1,6 +1,12 @@ name: Build artifacts and run stage tests run-name: Build artifacts and run stage tests (registry-name=${{ inputs.registry-name }}, server-tag=${{ inputs.server-tag }}, test-macos-x86=${{ inputs.test-macos-x86 }}) +permissions: + contents: read + id-token: write + statuses: write + packages: read + on: workflow_dispatch: inputs: diff --git a/.github/workflows/build-artifacts.yml b/.github/workflows/build-artifacts.yml index 3bddc6cecc..4a358d0fb3 100644 --- a/.github/workflows/build-artifacts.yml +++ b/.github/workflows/build-artifacts.yml @@ -5,6 +5,12 @@ run-name: Build artifacts (run_tests=${{ inputs.run_tests }}, registry-name=${{ # Optionally run tests on manylinux wheels # Then upload artifacts to Github +permissions: + id-token: write + statuses: write + packages: read + contents: read + on: workflow_dispatch: inputs: @@ -90,10 +96,6 @@ on: type: string default: '' secrets: - DOCKER_HUB_BOT_USERNAME: - required: true - DOCKER_HUB_BOT_PW: - required: true MAC_M1_SELF_HOSTED_RUNNER_PW: required: true diff --git a/.github/workflows/build-wheels.yml b/.github/workflows/build-wheels.yml index 018d4f3bba..854f079aa9 100644 --- a/.github/workflows/build-wheels.yml +++ b/.github/workflows/build-wheels.yml @@ -3,6 +3,12 @@ run-name: 'Build wheels (python-tags=${{ inputs.python-tags }}, platform-tag=${{ # Build wheels on all (or select) Python versions supported by the Python client for a specific platform +permissions: + id-token: write + statuses: write + packages: read + contents: read + on: workflow_dispatch: inputs: @@ -123,10 +129,7 @@ on: type: string default: '' secrets: - # Just make all the secrets required to make things simpler... - DOCKER_HUB_BOT_USERNAME: - required: true - DOCKER_HUB_BOT_PW: + QE_DOCKER_REGISTRY_URL: required: true QE_DOCKER_REGISTRY_USERNAME: required: true @@ -141,8 +144,8 @@ env: # Github mac m1 and windows runners don't support Docker / nested virtualization # so we need to use self-hosted runners to test wheels for these platforms RUN_INTEGRATION_TESTS_IN_CIBW: ${{ inputs.run_tests && (startsWith(inputs.platform-tag, 'manylinux') || inputs.platform-tag == 'macosx_x86_64') }} - REGISTRY_USERNAME: ${{ inputs.registry-name == 'docker.io' && secrets.DOCKER_HUB_BOT_USERNAME || secrets.QE_DOCKER_REGISTRY_USERNAME }} - REGISTRY_PASSWORD: ${{ inputs.registry-name == 'docker.io' && secrets.DOCKER_HUB_BOT_PW || secrets.QE_DOCKER_REGISTRY_PASSWORD }} + REGISTRY_USERNAME: ${{ inputs.registry-name == secrets.QE_DOCKER_REGISTRY_URL && secrets.QE_DOCKER_REGISTRY_USERNAME || '' }} + REGISTRY_PASSWORD: ${{ inputs.registry-name == secrets.QE_DOCKER_REGISTRY_URL && secrets.QE_DOCKER_REGISTRY_PASSWORD || '' }} jobs: # Maps don't exist in Github Actions, so we have to store the map using a script and fetch it in a job @@ -228,6 +231,8 @@ jobs: registry-name: ${{ inputs.registry-name }} registry-username: ${{ env.REGISTRY_USERNAME }} registry-password: ${{ env.REGISTRY_PASSWORD }} + oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} + oidc-audience: ${{ vars.OIDC_AUDIENCE }} image-name: ${{ inputs.image-name }} server-tag: ${{ inputs.server-tag }} where-is-client-connecting-from: ${{ inputs.platform-tag == 'macosx_x86_64' && 'docker-host' || 'separate-docker-container' }} @@ -406,6 +411,8 @@ jobs: registry-name: ${{ inputs.registry-name }} registry-username: ${{ env.REGISTRY_USERNAME }} registry-password: ${{ env.REGISTRY_PASSWORD }} + oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} + oidc-audience: ${{ vars.OIDC_AUDIENCE }} image-name: ${{ inputs.image-name }} server-tag: ${{ inputs.server-tag }} where-is-client-connecting-from: ${{ inputs.platform-tag == 'win_amd64' && 'remote-connection' || 'docker-host' }} diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index 6350bb6d68..007423b83e 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -1,12 +1,7 @@ name: Smoke tests permissions: contents: read - -env: - LOWEST_SUPPORTED_PY_VERSION: '3.10' - # pull_request event doesn't support inputs - REGISTRY_NAME: ${{ github.event_name == 'workflow_dispatch' && inputs.registry-name || 'docker.io' }} - SERVER_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.server-tag || 'latest' }} + id-token: write # Trigger test workflow whenever: # 1. A pull request is updated (e.g with new commits) @@ -39,6 +34,14 @@ on: default: latest required: true +env: + LOWEST_SUPPORTED_PY_VERSION: '3.10' + # pull_request event doesn't support inputs + REGISTRY_NAME: ${{ github.event_name == 'workflow_dispatch' && inputs.registry-name || 'docker.io' }} + SERVER_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.server-tag || 'latest' }} + REGISTRY_USERNAME: ${{ inputs.registry-name == secrets.QE_DOCKER_REGISTRY_URL && secrets.QE_DOCKER_REGISTRY_USERNAME || '' }} + REGISTRY_PASSWORD: ${{ inputs.registry-name == secrets.QE_DOCKER_REGISTRY_URL && secrets.QE_DOCKER_REGISTRY_PASSWORD || '' }} + jobs: build: runs-on: ubuntu-22.04 @@ -124,8 +127,10 @@ jobs: with: registry-name: ${{ env.REGISTRY_NAME }} server-tag: ${{ env.SERVER_TAG }} - registry-username: ${{ env.REGISTRY_NAME == 'docker.io' && secrets.DOCKER_HUB_BOT_USERNAME || secrets.QE_DOCKER_REGISTRY_USERNAME }} - registry-password: ${{ env.REGISTRY_NAME == 'docker.io' && secrets.DOCKER_HUB_BOT_PW || secrets.QE_DOCKER_REGISTRY_PASSWORD }} + registry-username: ${{ env.REGISTRY_USERNAME }} + registry-password: ${{ env.REGISTRY_PASSWORD }} + oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} + oidc-audience: ${{ vars.OIDC_AUDIENCE }} - run: python3-dbg -m pytest ./new_tests working-directory: test @@ -168,8 +173,10 @@ jobs: with: registry-name: ${{ env.REGISTRY_NAME }} server-tag: ${{ env.SERVER_TAG }} - registry-username: ${{ env.REGISTRY_NAME == 'docker.io' && secrets.DOCKER_HUB_BOT_USERNAME || secrets.QE_DOCKER_REGISTRY_USERNAME }} - registry-password: ${{ env.REGISTRY_NAME == 'docker.io' && secrets.DOCKER_HUB_BOT_PW || secrets.QE_DOCKER_REGISTRY_PASSWORD }} + registry-username: ${{ env.REGISTRY_USERNAME }} + registry-password: ${{ env.REGISTRY_PASSWORD }} + oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} + oidc-audience: ${{ vars.OIDC_AUDIENCE }} # -Werror: we need code coverage for code paths where warnings are treated as errors # TODO: currently this doesn't seem to work though @@ -287,7 +294,7 @@ jobs: type: - sanitizer - dont_validate_keys - - lowest_supported_server_version + # - lowest_supported_server_version fail-fast: false runs-on: ubuntu-22.04 needs: build @@ -333,8 +340,10 @@ jobs: with: registry-name: ${{ env.REGISTRY_NAME }} server-tag: ${{ matrix.type == 'lowest_supported_server_version' && vars.LOWEST_SUPPORTED_SERVER_VERSION || env.SERVER_TAG }} - registry-username: ${{ env.REGISTRY_NAME == 'docker.io' && secrets.DOCKER_HUB_BOT_USERNAME || secrets.QE_DOCKER_REGISTRY_USERNAME }} - registry-password: ${{ env.REGISTRY_NAME == 'docker.io' && secrets.DOCKER_HUB_BOT_PW || secrets.QE_DOCKER_REGISTRY_PASSWORD }} + registry-username: ${{ env.REGISTRY_USERNAME }} + registry-password: ${{ env.REGISTRY_PASSWORD }} + oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} + oidc-audience: ${{ vars.OIDC_AUDIENCE }} - if: ${{ matrix.type == 'dont_validate_keys' }} run: crudini --existing=param --set config.conf input-validation validate_keys false @@ -390,11 +399,12 @@ jobs: - name: Install test dependencies run: pip install -r test/requirements.txt - - uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 + - if: ${{ env.REGISTRY_USERNAME != '' && env.REGISTRY_PASSWORD != '' }} + uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 with: registry: ${{ env.REGISTRY_NAME }} - username: ${{ env.REGISTRY_NAME == 'docker.io' && secrets.DOCKER_HUB_BOT_USERNAME || secrets.QE_DOCKER_REGISTRY_USERNAME }} - password: ${{ env.REGISTRY_NAME == 'docker.io' && secrets.DOCKER_HUB_BOT_PW || secrets.QE_DOCKER_REGISTRY_PASSWORD }} + username: ${{ env.REGISTRY_USERNAME }} + password: ${{ env.REGISTRY_PASSWORD }} - name: Run Aerospike server run: docker run -d --name aerospike -p 3000-3002:3000-3002 -e DEFAULT_TTL=2592000 ${{ env.REGISTRY_NAME }}/aerospike/aerospike-server:${{ env.SERVER_TAG }} @@ -408,9 +418,15 @@ jobs: container-name: aerospike - name: Run tests - run: python -m pytest ./new_tests -vv -W error::pytest.PytestUnraisableExceptionWarning + run: python -m pytest ./new_tests -svv -W error::pytest.PytestUnraisableExceptionWarning working-directory: test + - name: Show logs if failed + if: ${{ failure() }} + run: | + docker container logs aerospike + cat ./configs/aerospike.conf + test-ee: runs-on: ubuntu-22.04 needs: build @@ -443,13 +459,15 @@ jobs: with: registry-name: ${{ env.REGISTRY_NAME }} server-tag: ${{ env.SERVER_TAG }} - registry-username: ${{ env.REGISTRY_NAME == 'docker.io' && secrets.DOCKER_HUB_BOT_USERNAME || secrets.QE_DOCKER_REGISTRY_USERNAME }} - registry-password: ${{ env.REGISTRY_NAME == 'docker.io' && secrets.DOCKER_HUB_BOT_PW || secrets.QE_DOCKER_REGISTRY_PASSWORD }} + registry-username: ${{ env.REGISTRY_USERNAME }} + registry-password: ${{ env.REGISTRY_PASSWORD }} + oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} + oidc-audience: ${{ vars.OIDC_AUDIENCE }} - name: Run tests # -s: we want to check that the test_create_pki_user test case passes or raises an exception as expected # There's no way to tell unless we see the logs - run: python -m pytest -s ./new_tests/test_{mrt_functionality,admin_*,compress,set_index}.py -W error::pytest.PytestUnraisableExceptionWarning + run: python -m pytest -s ./new_tests/test_{mrt_functionality,admin_*,compress}.py -W error::pytest.PytestUnraisableExceptionWarning working-directory: test - name: Show logs if failed @@ -514,19 +532,22 @@ jobs: name: wheel-${{ env.LOWEST_SUPPORTED_PY_VERSION }} - run: python3 -m pip install *.whl - - uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 + - if: ${{ env.REGISTRY_USERNAME != '' && env.REGISTRY_PASSWORD != '' }} + uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 with: registry: ${{ env.REGISTRY_NAME }} - username: ${{ env.REGISTRY_NAME == 'docker.io' && secrets.DOCKER_HUB_BOT_USERNAME || secrets.QE_DOCKER_REGISTRY_USERNAME }} - password: ${{ env.REGISTRY_NAME == 'docker.io' && secrets.DOCKER_HUB_BOT_PW || secrets.QE_DOCKER_REGISTRY_PASSWORD }} + username: ${{ env.REGISTRY_USERNAME }} + password: ${{ env.REGISTRY_PASSWORD }} - uses: ./.github/actions/run-ee-server if: ${{ startsWith(matrix.test-script-args, 'true') }} with: registry-name: ${{ env.REGISTRY_NAME }} server-tag: ${{ env.SERVER_TAG }} - registry-username: ${{ env.REGISTRY_NAME == 'docker.io' && secrets.DOCKER_HUB_BOT_USERNAME || secrets.QE_DOCKER_REGISTRY_USERNAME }} - registry-password: ${{ env.REGISTRY_NAME == 'docker.io' && secrets.DOCKER_HUB_BOT_PW || secrets.QE_DOCKER_REGISTRY_PASSWORD }} + registry-username: ${{ env.REGISTRY_USERNAME }} + registry-password: ${{ env.REGISTRY_PASSWORD }} + oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} + oidc-audience: ${{ vars.OIDC_AUDIENCE }} # The user agent can also send the client's username if app-id is not set by the client env-vars: 'SECURITY=1' diff --git a/.github/workflows/stage-tests.yml b/.github/workflows/stage-tests.yml index 1d98e7855c..37fa326e76 100644 --- a/.github/workflows/stage-tests.yml +++ b/.github/workflows/stage-tests.yml @@ -5,6 +5,10 @@ name: Stage tests # The purpose is to test that our artifacts work on the Linux distros / OS versions that the client supports # and QE doesn't have enough disk space for more Linux distros, so we have some tests here in Github Actions +permissions: + contents: read + id-token: write + on: workflow_call: inputs: @@ -41,8 +45,8 @@ on: description: 'Test macOS x86 wheels (unstable)' env: - REGISTRY_USERNAME: ${{ inputs.registry-name == 'docker.io' && secrets.DOCKER_HUB_BOT_USERNAME || secrets.QE_DOCKER_REGISTRY_USERNAME }} - REGISTRY_PASSWORD: ${{ inputs.registry-name == 'docker.io' && secrets.DOCKER_HUB_BOT_PW || secrets.QE_DOCKER_REGISTRY_PASSWORD }} + REGISTRY_USERNAME: ${{ inputs.registry-name == secrets.QE_DOCKER_REGISTRY_URL && secrets.QE_DOCKER_REGISTRY_USERNAME || '' }} + REGISTRY_PASSWORD: ${{ inputs.registry-name == secrets.QE_DOCKER_REGISTRY_URL && secrets.QE_DOCKER_REGISTRY_PASSWORD || '' }} jobs: linux-distro-tests: @@ -120,6 +124,8 @@ jobs: registry-name: ${{ inputs.registry-name }} registry-username: ${{ env.REGISTRY_USERNAME }} registry-password: ${{ env.REGISTRY_PASSWORD }} + oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} + oidc-audience: ${{ vars.OIDC_AUDIENCE }} image-name: ${{ inputs.image-name }} server-tag: ${{ inputs.server-tag }} where-is-client-connecting-from: 'separate-docker-container' @@ -237,6 +243,8 @@ jobs: registry-name: ${{ inputs.registry-name }} registry-username: ${{ env.REGISTRY_USERNAME }} registry-password: ${{ env.REGISTRY_PASSWORD }} + oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} + oidc-audience: ${{ vars.OIDC_AUDIENCE }} image-name: ${{ inputs.image-name }} server-tag: ${{ inputs.server-tag }} where-is-client-connecting-from: 'docker-host' diff --git a/.github/workflows/valgrind.yml b/.github/workflows/valgrind.yml index 7b361dbe0c..b5a345422f 100644 --- a/.github/workflows/valgrind.yml +++ b/.github/workflows/valgrind.yml @@ -1,6 +1,12 @@ name: Valgrind run-name: Valgrind (registry-name=${{ inputs.registry-name }}, server-tag=${{ inputs.server-tag }}, test-file=${{ inputs.test-file }}, massif=${{ inputs.massif }}) +permissions: + contents: read + id-token: write + statuses: write + packages: read + on: workflow_dispatch: inputs: @@ -165,8 +171,10 @@ jobs: uses: ./.github/actions/run-ee-server with: registry-name: ${{ inputs.registry-name }} - registry-username: ${{ inputs.registry-name == 'docker.io' && secrets.DOCKER_HUB_BOT_USERNAME || secrets.QE_DOCKER_REGISTRY_USERNAME }} - registry-password: ${{ inputs.registry-name == 'docker.io' && secrets.DOCKER_HUB_BOT_PW || secrets.QE_DOCKER_REGISTRY_PASSWORD }} + registry-username: ${{ inputs.registry-name == secrets.QE_DOCKER_REGISTRY_URL && secrets.QE_DOCKER_REGISTRY_USERNAME || '' }} + registry-password: ${{ inputs.registry-name == secrets.QE_DOCKER_REGISTRY_URL && secrets.QE_DOCKER_REGISTRY_PASSWORD || '' }} + oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} + oidc-audience: ${{ vars.OIDC_AUDIENCE }} image-name: ${{ inputs.image-name }} server-tag: ${{ inputs.server-tag }} From 53bfc814d6472ff2c321ae93b9b2e2fa8fabeba4 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Wed, 8 Apr 2026 16:08:43 -0700 Subject: [PATCH 35/78] Add test case for code coverage. --- test/new_tests/test_set_index.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/new_tests/test_set_index.py b/test/new_tests/test_set_index.py index 4c61093dd1..e1b5aa573d 100644 --- a/test/new_tests/test_set_index.py +++ b/test/new_tests/test_set_index.py @@ -50,3 +50,7 @@ def client_as_sindex_admin_user(self): def test_create_set_index(self, client_as_sindex_admin_user, expect_earlier_than_server_version_to_fail): with self.expected_context_for_pos_tests: client_as_sindex_admin_user.index_set_create("test", "demo", INDEX_NAME) + + def test_create_set_index_with_invalid_args(self): + with pytest.raises(TypeError): + self.as_connection.index_set_create("test", "demo") From 7e8ca48d8c6b34b86ddf58e3553444eca9b66dc9 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Wed, 8 Apr 2026 17:30:18 -0700 Subject: [PATCH 36/78] Point c client back to stage now that set index creation is there --- .gitmodules | 2 +- aerospike-client-c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 977e188dcc..136ba68cbe 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,4 +2,4 @@ path = aerospike-client-c # url = git@github.com:aerospike/aerospike-client-c.git url = https://github.com/aerospike/aerospike-client-c.git - branch = CLIENT-4314-set-indices + branch = stage diff --git a/aerospike-client-c b/aerospike-client-c index 4c94eca320..7ac6355eb7 160000 --- a/aerospike-client-c +++ b/aerospike-client-c @@ -1 +1 @@ -Subproject commit 4c94eca320a8cc0ff71f7c0f74eee1b5477b9f79 +Subproject commit 7ac6355eb7340e9f613cc40107f7ff898197b6f7 From 1f0c4dea4f938b4285e76931620e9dde460e36d3 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 06:22:51 -0700 Subject: [PATCH 37/78] Revert for now. Create a separate PR/jira ticket for this --- aerospike-stubs/aerospike.pyi | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/aerospike-stubs/aerospike.pyi b/aerospike-stubs/aerospike.pyi index 5cd0507757..96355cac76 100644 --- a/aerospike-stubs/aerospike.pyi +++ b/aerospike-stubs/aerospike.pyi @@ -349,23 +349,23 @@ class ConfigProvider: class Client: def __init__(self, *args, **kwargs) -> None: ... - def admin_change_password(self, user: str, password: str, policy: dict = ...) -> None: ... + def admin_change_password(self, username: str, password: str, policy: dict = ...) -> None: ... def admin_create_role(self, role: str, privileges: list, policy: dict = ..., whitelist: list = ..., read_quota: int = ..., write_quota: int = ...) -> None: ... def admin_create_pki_user(self, username: str, roles: list, policy: dict = ...) -> None: ... - def admin_create_user(self, user: str, password: str, roles: list, policy: dict = ...) -> None: ... + def admin_create_user(self, username: str, password: str, roles: list, policy: dict = ...) -> None: ... def admin_drop_role(self, role: str, policy: dict = ...) -> None: ... - def admin_drop_user(self, user: str, policy: dict = ...) -> None: ... + def admin_drop_user(self, username: str, policy: dict = ...) -> None: ... def admin_get_role(self, role: str, policy: dict = ...) -> dict: ... def admin_get_roles(self, policy: dict = ...) -> dict: ... def admin_grant_privileges(self, role: str, privileges: list, policy: dict = ...) -> None: ... - def admin_grant_roles(self, user: str, roles: list, policy: dict = ...) -> None: ... + def admin_grant_roles(self, username: str, roles: list, policy: dict = ...) -> None: ... def admin_query_role(self, role: str, policy: dict = ...) -> list: ... def admin_query_roles(self, policy: dict = ...) -> dict: ... def admin_query_user_info(self, user: str, policy: dict = ...) -> dict: ... def admin_query_users_info(self, policy: dict = ...) -> dict: ... def admin_revoke_privileges(self, role: str, privileges: list, policy: dict = ...) -> None: ... - def admin_revoke_roles(self, user: str, roles: list, policy: dict = ...) -> None: ... - def admin_set_password(self, user: str, password: str, policy: dict = ...) -> None: ... + def admin_revoke_roles(self, username: str, roles: list, policy: dict = ...) -> None: ... + def admin_set_password(self, username: str, password: str, policy: dict = ...) -> None: ... def admin_set_quotas(self, role: str, read_quota: int = ..., write_quota: int = ..., policy: dict = ...) -> None: ... def admin_set_whitelist(self, role: str, whitelist: list, policy: dict = ...) -> None: ... def append(self, key: tuple, bin: str, val: str, meta: dict = ..., policy: dict = ...) -> None: ... From 60adad8ff3e49141841b43fbe5678874c3b49e24 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 11:43:05 -0700 Subject: [PATCH 38/78] jf docker pull fails because it can't connect to the Docker daemon for some reason on Windows/macos. Try using the shared action to deploy the server instead. --- .github/actions/run-ee-server/action.yml | 91 +++++------------------- .github/workflows/build-wheels.yml | 12 ---- .github/workflows/smoke-tests.yml | 46 +++--------- .github/workflows/stage-tests.yml | 8 --- .github/workflows/valgrind.yml | 4 -- 5 files changed, 27 insertions(+), 134 deletions(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 3a50fb6aaf..f645544cc9 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -4,29 +4,12 @@ description: 'Run EE server. Returns once server is ready. Only tested on Linux # since it's using the default admin / admin credentials inputs: # All inputs in composite actions are strings - registry-name: - description: Registry name - required: false - default: docker.io oidc-provider-name: description: For pulling server images from JFrog required: true oidc-audience: description: For pulling server images from JFrog required: true - # Needed for logging into QE registry - registry-username: - description: Required for using release candidates - required: false - # Github Composite Actions can't access secrets - # so we need to pass them in as inputs - registry-password: - description: Required for using release candidates - required: false - image-name: - required: false - description: aerospike/aerospike-server-enterprise - default: 'aerospike/aerospike-server-enterprise' server-tag: required: true description: Specify Docker tag @@ -35,65 +18,21 @@ inputs: required: false description: 'docker-host, separate-docker-container, "remote-connection" via DOCKER_HOST' default: 'docker-host' - env-vars: - required: false - description: Used to disable server features - default: 'STRONG_CONSISTENCY=1 SECURITY=1 MUTUAL_TLS=1' runs: using: "composite" steps: # Start up server - - - name: Log into registry to get non-public server RCs - if: ${{ inputs.registry-username != '' && inputs.registry-password != '' }} - # We can still pull public images while logged in, so just do this all the time to make things simple - uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 + - uses: ./.github/actions/setup-aerospike-server + id: setup-as-server with: - registry: ${{ inputs.registry-name }} - username: ${{ inputs.registry-username }} - password: ${{ inputs.registry-password }} - - - uses: step-security/setup-jfrog-cli@a6b41f8338bea0983ddff6bd4ede7d2dcd81e1fa # v4.8.1 - if: ${{ inputs.registry-name == 'artifact.aerospike.io' }} - env: - JF_URL: https://artifact.aerospike.io - with: - oidc-provider-name: ${{ inputs.oidc-provider-name }} + enable-security: "true" + enable-tls: "true" + enable-strong-consistency: "true" + num-nodes: 1 + oidc-provider: ${{ inputs.oidc-provider-name }} oidc-audience: ${{ inputs.oidc-audience }} - version: 2.98.0 - - - run: echo BASE_IMAGE=${{ inputs.registry-name }}/${{ inputs.image-name }}:${{ inputs.server-tag }} >> $GITHUB_ENV - shell: bash - - - if: ${{ inputs.registry-name == 'artifact.aerospike.io' }} - run: jf docker pull $BASE_IMAGE - shell: bash - - - run: echo CA_CERT_FILE_NAME="ca.cer" >> $GITHUB_ENV - shell: bash - - - run: echo TLS_PORT="4333" >> $GITHUB_ENV - shell: bash - - - name: 'macOS: install timeout command' - if: ${{ runner.os == 'macOS' }} - run: brew install coreutils - shell: bash - - # Github composite actions don't support env variables for the whole composite action, - # so this is a workaround - - id: get-container-name - run: echo container-name=aerospike >> $GITHUB_OUTPUT - shell: bash - - - run: ${{ inputs.env-vars }} bash ./run-ee-server.bash - working-directory: .github/workflows/docker-setup - shell: bash - env: - CONTAINER_NAME: ${{ steps.get-container-name.outputs.container-name }} - - # Configure tests + server-tag: ${{ inputs.server-tag }} - name: Install crudini to manipulate config.conf run: pipx install crudini --pip-args "-c ${{ github.workspace }}/.github/workflows/requirements.txt" @@ -119,10 +58,9 @@ runs: crudini --existing=param --set config.conf enterprise-edition password ${{ env.SUPERUSER_NAME_AND_PASSWORD }} crudini --set config.conf tls enable true # Cannot use abs path because config.conf is copied into Docker container during cibuildwheel tests - crudini --set config.conf tls cafile ../.github/workflows/docker-setup/${{ env.CA_CERT_FILE_NAME }} - crudini --set config.conf tls keyfile ../.github/workflows/docker-setup/client.pem - crudini --set config.conf tls certfile ../.github/workflows/docker-setup/client.cer - + crudini --set config.conf tls cafile ../${{ steps.setup-as-server.outputs.tls-cert-dir }}/ca.crt + crudini --set config.conf tls keyfile ../${{ steps.setup-as-server.outputs.tls-cert-dir }}/client.key + crudini --set config.conf tls certfile ../${{ steps.setup-as-server.outputs.tls-cert-dir }}/client.crt working-directory: test shell: bash @@ -142,7 +80,10 @@ runs: - name: Set IP address to Docker container for the server if: ${{ inputs.where-is-client-connecting-from == 'separate-docker-container' }} - run: echo SERVER_IP=$(docker container inspect -f '{{ .NetworkSettings.Networks.bridge.IPAddress }}' ${{ steps.get-container-name.outputs.container-name }}) >> $GITHUB_ENV + run: | + server_container_network_name=${{ steps.setup-as-server.outputs.network-name }} + docker_query="{{ .NetworkSettings.Networks.$server_container_network_name.IPAddress }}" + echo SERVER_IP=$(docker container inspect -f "$docker_query" ${{ steps.setup-as-server.outputs.container-names }}) >> $GITHUB_ENV shell: bash - name: Invalid input @@ -155,6 +96,6 @@ runs: - name: Set EE server's IP address and TLS name for test config run: | cluster_name=$(docker run --rm --network host aerospike/aerospike-tools asinfo -U admin -P admin -v "get-config:context=service" -l | grep -i cluster-name | cut -d = -f 2) - crudini --existing=param --set config.conf enterprise-edition hosts "${{ env.SERVER_IP }}:${{ env.TLS_PORT }}|${cluster_name}" + crudini --existing=param --set config.conf enterprise-edition hosts "${{ env.SERVER_IP }}:${{ steps.setup-as-server.outputs.tls-base-port }}|${cluster_name}" working-directory: test shell: bash diff --git a/.github/workflows/build-wheels.yml b/.github/workflows/build-wheels.yml index 854f079aa9..b6a670432d 100644 --- a/.github/workflows/build-wheels.yml +++ b/.github/workflows/build-wheels.yml @@ -129,8 +129,6 @@ on: type: string default: '' secrets: - QE_DOCKER_REGISTRY_URL: - required: true QE_DOCKER_REGISTRY_USERNAME: required: true QE_DOCKER_REGISTRY_PASSWORD: @@ -144,8 +142,6 @@ env: # Github mac m1 and windows runners don't support Docker / nested virtualization # so we need to use self-hosted runners to test wheels for these platforms RUN_INTEGRATION_TESTS_IN_CIBW: ${{ inputs.run_tests && (startsWith(inputs.platform-tag, 'manylinux') || inputs.platform-tag == 'macosx_x86_64') }} - REGISTRY_USERNAME: ${{ inputs.registry-name == secrets.QE_DOCKER_REGISTRY_URL && secrets.QE_DOCKER_REGISTRY_USERNAME || '' }} - REGISTRY_PASSWORD: ${{ inputs.registry-name == secrets.QE_DOCKER_REGISTRY_URL && secrets.QE_DOCKER_REGISTRY_PASSWORD || '' }} jobs: # Maps don't exist in Github Actions, so we have to store the map using a script and fetch it in a job @@ -228,12 +224,8 @@ jobs: if: ${{ env.RUN_INTEGRATION_TESTS_IN_CIBW == 'true' }} uses: ./.github/actions/run-ee-server with: - registry-name: ${{ inputs.registry-name }} - registry-username: ${{ env.REGISTRY_USERNAME }} - registry-password: ${{ env.REGISTRY_PASSWORD }} oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} - image-name: ${{ inputs.image-name }} server-tag: ${{ inputs.server-tag }} where-is-client-connecting-from: ${{ inputs.platform-tag == 'macosx_x86_64' && 'docker-host' || 'separate-docker-container' }} @@ -408,12 +400,8 @@ jobs: - uses: ./.github/actions/run-ee-server with: - registry-name: ${{ inputs.registry-name }} - registry-username: ${{ env.REGISTRY_USERNAME }} - registry-password: ${{ env.REGISTRY_PASSWORD }} oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} - image-name: ${{ inputs.image-name }} server-tag: ${{ inputs.server-tag }} where-is-client-connecting-from: ${{ inputs.platform-tag == 'win_amd64' && 'remote-connection' || 'docker-host' }} diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index 007423b83e..5db47fb13a 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -22,12 +22,6 @@ on: - benchmarks/**/* workflow_dispatch: inputs: - # Used to test server RCs - registry-name: - description: Registry name - type: string - default: docker.io - required: true server-tag: description: Server tag type: string @@ -37,10 +31,7 @@ on: env: LOWEST_SUPPORTED_PY_VERSION: '3.10' # pull_request event doesn't support inputs - REGISTRY_NAME: ${{ github.event_name == 'workflow_dispatch' && inputs.registry-name || 'docker.io' }} SERVER_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.server-tag || 'latest' }} - REGISTRY_USERNAME: ${{ inputs.registry-name == secrets.QE_DOCKER_REGISTRY_URL && secrets.QE_DOCKER_REGISTRY_USERNAME || '' }} - REGISTRY_PASSWORD: ${{ inputs.registry-name == secrets.QE_DOCKER_REGISTRY_URL && secrets.QE_DOCKER_REGISTRY_PASSWORD || '' }} jobs: build: @@ -125,12 +116,9 @@ jobs: - name: Run Aerospike server uses: ./.github/actions/run-ee-server with: - registry-name: ${{ env.REGISTRY_NAME }} - server-tag: ${{ env.SERVER_TAG }} - registry-username: ${{ env.REGISTRY_USERNAME }} - registry-password: ${{ env.REGISTRY_PASSWORD }} oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} + server-tag: ${{ env.SERVER_TAG }} - run: python3-dbg -m pytest ./new_tests working-directory: test @@ -171,12 +159,9 @@ jobs: - name: Run Aerospike server uses: ./.github/actions/run-ee-server with: - registry-name: ${{ env.REGISTRY_NAME }} - server-tag: ${{ env.SERVER_TAG }} - registry-username: ${{ env.REGISTRY_USERNAME }} - registry-password: ${{ env.REGISTRY_PASSWORD }} oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} + server-tag: ${{ env.SERVER_TAG }} # -Werror: we need code coverage for code paths where warnings are treated as errors # TODO: currently this doesn't seem to work though @@ -336,14 +321,12 @@ jobs: echo ASAN_OPTIONS='detect_stack_use_after_return=1:detect_leaks=0' >> $GITHUB_ENV echo LD_PRELOAD=$(gcc --print-file-name=libasan.so) >> $GITHUB_ENV - - uses: ./.github/actions/run-ee-server + - name: Run Aerospike server + uses: ./.github/actions/run-ee-server with: - registry-name: ${{ env.REGISTRY_NAME }} - server-tag: ${{ matrix.type == 'lowest_supported_server_version' && vars.LOWEST_SUPPORTED_SERVER_VERSION || env.SERVER_TAG }} - registry-username: ${{ env.REGISTRY_USERNAME }} - registry-password: ${{ env.REGISTRY_PASSWORD }} oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} + server-tag: ${{ env.SERVER_TAG }} - if: ${{ matrix.type == 'dont_validate_keys' }} run: crudini --existing=param --set config.conf input-validation validate_keys false @@ -457,12 +440,9 @@ jobs: - uses: ./.github/actions/run-ee-server with: - registry-name: ${{ env.REGISTRY_NAME }} - server-tag: ${{ env.SERVER_TAG }} - registry-username: ${{ env.REGISTRY_USERNAME }} - registry-password: ${{ env.REGISTRY_PASSWORD }} oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} + server-tag: ${{ env.SERVER_TAG }} - name: Run tests # -s: we want to check that the test_create_pki_user test case passes or raises an exception as expected @@ -539,17 +519,13 @@ jobs: username: ${{ env.REGISTRY_USERNAME }} password: ${{ env.REGISTRY_PASSWORD }} - - uses: ./.github/actions/run-ee-server - if: ${{ startsWith(matrix.test-script-args, 'true') }} + - uses: ./.github/actions/setup-aerospike-server with: - registry-name: ${{ env.REGISTRY_NAME }} + enable-security: "true" + num-nodes: 1 + oidc-provider: ${{ inputs.oidc-provider-name }} + oidc-audience: ${{ inputs.oidc-audience }} server-tag: ${{ env.SERVER_TAG }} - registry-username: ${{ env.REGISTRY_USERNAME }} - registry-password: ${{ env.REGISTRY_PASSWORD }} - oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} - oidc-audience: ${{ vars.OIDC_AUDIENCE }} - # The user agent can also send the client's username if app-id is not set by the client - env-vars: 'SECURITY=1' - if: ${{ startsWith(matrix.test-script-args, 'false') }} run: docker run -d -p 3000:3000 --name aerospike -e DEFAULT_TTL=2592000 ${{ env.REGISTRY_NAME }}/aerospike/aerospike-server:${{ env.SERVER_TAG }} diff --git a/.github/workflows/stage-tests.yml b/.github/workflows/stage-tests.yml index 37fa326e76..df00a970e0 100644 --- a/.github/workflows/stage-tests.yml +++ b/.github/workflows/stage-tests.yml @@ -121,12 +121,8 @@ jobs: - uses: ./.github/actions/run-ee-server with: - registry-name: ${{ inputs.registry-name }} - registry-username: ${{ env.REGISTRY_USERNAME }} - registry-password: ${{ env.REGISTRY_PASSWORD }} oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} - image-name: ${{ inputs.image-name }} server-tag: ${{ inputs.server-tag }} where-is-client-connecting-from: 'separate-docker-container' @@ -240,12 +236,8 @@ jobs: - if: ${{ matrix.runner-os-and-arch[1] == 'x86_64' }} uses: ./.github/actions/run-ee-server with: - registry-name: ${{ inputs.registry-name }} - registry-username: ${{ env.REGISTRY_USERNAME }} - registry-password: ${{ env.REGISTRY_PASSWORD }} oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} - image-name: ${{ inputs.image-name }} server-tag: ${{ inputs.server-tag }} where-is-client-connecting-from: 'docker-host' diff --git a/.github/workflows/valgrind.yml b/.github/workflows/valgrind.yml index b5a345422f..c6a7b90348 100644 --- a/.github/workflows/valgrind.yml +++ b/.github/workflows/valgrind.yml @@ -170,12 +170,8 @@ jobs: - name: Run EE server uses: ./.github/actions/run-ee-server with: - registry-name: ${{ inputs.registry-name }} - registry-username: ${{ inputs.registry-name == secrets.QE_DOCKER_REGISTRY_URL && secrets.QE_DOCKER_REGISTRY_USERNAME || '' }} - registry-password: ${{ inputs.registry-name == secrets.QE_DOCKER_REGISTRY_URL && secrets.QE_DOCKER_REGISTRY_PASSWORD || '' }} oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} - image-name: ${{ inputs.image-name }} server-tag: ${{ inputs.server-tag }} - run: sudo apt-get update From 2f8b47d489164d18610c8bcea064cd4e8eef765e Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 11:46:11 -0700 Subject: [PATCH 39/78] Fix bad syntax --- .github/actions/run-ee-server/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index f645544cc9..2be30fa013 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -23,7 +23,7 @@ runs: using: "composite" steps: # Start up server - - uses: ./.github/actions/setup-aerospike-server + - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@07c958ca4c5cea494dc8790949c08e3fb28c55e1 id: setup-as-server with: enable-security: "true" From d98a65548cb6d5da187eefcac5172ea6cf9b002a Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 11:53:12 -0700 Subject: [PATCH 40/78] Strong consistency requires features.conf --- .github/actions/run-ee-server/action.yml | 4 ++++ .github/workflows/build-wheels.yml | 2 ++ .github/workflows/smoke-tests.yml | 4 ++++ .github/workflows/stage-tests.yml | 2 ++ .github/workflows/valgrind.yml | 1 + 5 files changed, 13 insertions(+) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 2be30fa013..c3202f0966 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -10,6 +10,9 @@ inputs: oidc-audience: description: For pulling server images from JFrog required: true + features-content: + description: For enabling strong consistency + required: true server-tag: required: true description: Specify Docker tag @@ -29,6 +32,7 @@ runs: enable-security: "true" enable-tls: "true" enable-strong-consistency: "true" + features-content: ${{ inputs.features-content }} num-nodes: 1 oidc-provider: ${{ inputs.oidc-provider-name }} oidc-audience: ${{ inputs.oidc-audience }} diff --git a/.github/workflows/build-wheels.yml b/.github/workflows/build-wheels.yml index b6a670432d..c1816a49dc 100644 --- a/.github/workflows/build-wheels.yml +++ b/.github/workflows/build-wheels.yml @@ -226,6 +226,7 @@ jobs: with: oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} + features-content: ${{ secrets.FEATURES_CONTENT }} server-tag: ${{ inputs.server-tag }} where-is-client-connecting-from: ${{ inputs.platform-tag == 'macosx_x86_64' && 'docker-host' || 'separate-docker-container' }} @@ -402,6 +403,7 @@ jobs: with: oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} + features-content: ${{ secrets.FEATURES_CONTENT }} server-tag: ${{ inputs.server-tag }} where-is-client-connecting-from: ${{ inputs.platform-tag == 'win_amd64' && 'remote-connection' || 'docker-host' }} diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index 5db47fb13a..b468d94e27 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -118,6 +118,7 @@ jobs: with: oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} + features-content: ${{ secrets.FEATURES_CONTENT }} server-tag: ${{ env.SERVER_TAG }} - run: python3-dbg -m pytest ./new_tests @@ -161,6 +162,7 @@ jobs: with: oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} + features-content: ${{ secrets.FEATURES_CONTENT }} server-tag: ${{ env.SERVER_TAG }} # -Werror: we need code coverage for code paths where warnings are treated as errors @@ -326,6 +328,7 @@ jobs: with: oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} + features-content: ${{ secrets.FEATURES_CONTENT }} server-tag: ${{ env.SERVER_TAG }} - if: ${{ matrix.type == 'dont_validate_keys' }} @@ -442,6 +445,7 @@ jobs: with: oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} + features-content: ${{ secrets.FEATURES_CONTENT }} server-tag: ${{ env.SERVER_TAG }} - name: Run tests diff --git a/.github/workflows/stage-tests.yml b/.github/workflows/stage-tests.yml index df00a970e0..ba207c509d 100644 --- a/.github/workflows/stage-tests.yml +++ b/.github/workflows/stage-tests.yml @@ -123,6 +123,7 @@ jobs: with: oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} + features-content: ${{ secrets.FEATURES_CONTENT }} server-tag: ${{ inputs.server-tag }} where-is-client-connecting-from: 'separate-docker-container' @@ -238,6 +239,7 @@ jobs: with: oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} + features-content: ${{ secrets.FEATURES_CONTENT }} server-tag: ${{ inputs.server-tag }} where-is-client-connecting-from: 'docker-host' diff --git a/.github/workflows/valgrind.yml b/.github/workflows/valgrind.yml index c6a7b90348..c480b26085 100644 --- a/.github/workflows/valgrind.yml +++ b/.github/workflows/valgrind.yml @@ -172,6 +172,7 @@ jobs: with: oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} + features-content: ${{ secrets.FEATURES_CONTENT }} server-tag: ${{ inputs.server-tag }} - run: sudo apt-get update From 1776e44442300950dad4cfd6fec284c1d6009726 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 12:04:09 -0700 Subject: [PATCH 41/78] Fix CE tests by always pulling from docker.io for now. There's no shared workflow to deploy a CE server, and I don't feel like it's worth keeping registry inputs just for CE --- .github/workflows/smoke-tests.yml | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index b468d94e27..29cc4992c5 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -385,15 +385,8 @@ jobs: - name: Install test dependencies run: pip install -r test/requirements.txt - - if: ${{ env.REGISTRY_USERNAME != '' && env.REGISTRY_PASSWORD != '' }} - uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 - with: - registry: ${{ env.REGISTRY_NAME }} - username: ${{ env.REGISTRY_USERNAME }} - password: ${{ env.REGISTRY_PASSWORD }} - - name: Run Aerospike server - run: docker run -d --name aerospike -p 3000-3002:3000-3002 -e DEFAULT_TTL=2592000 ${{ env.REGISTRY_NAME }}/aerospike/aerospike-server:${{ env.SERVER_TAG }} + run: docker run -d --name aerospike -p 3000-3002:3000-3002 -e DEFAULT_TTL=2592000 aerospike/aerospike-server:${{ env.SERVER_TAG }} - name: Create config.conf run: cp config.conf.template config.conf @@ -516,23 +509,8 @@ jobs: name: wheel-${{ env.LOWEST_SUPPORTED_PY_VERSION }} - run: python3 -m pip install *.whl - - if: ${{ env.REGISTRY_USERNAME != '' && env.REGISTRY_PASSWORD != '' }} - uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 - with: - registry: ${{ env.REGISTRY_NAME }} - username: ${{ env.REGISTRY_USERNAME }} - password: ${{ env.REGISTRY_PASSWORD }} - - - uses: ./.github/actions/setup-aerospike-server - with: - enable-security: "true" - num-nodes: 1 - oidc-provider: ${{ inputs.oidc-provider-name }} - oidc-audience: ${{ inputs.oidc-audience }} - server-tag: ${{ env.SERVER_TAG }} - - if: ${{ startsWith(matrix.test-script-args, 'false') }} - run: docker run -d -p 3000:3000 --name aerospike -e DEFAULT_TTL=2592000 ${{ env.REGISTRY_NAME }}/aerospike/aerospike-server:${{ env.SERVER_TAG }} + run: docker run -d -p 3000:3000 --name aerospike -e DEFAULT_TTL=2592000 aerospike/aerospike-server:${{ env.SERVER_TAG }} - if: ${{ startsWith(matrix.test-script-args, 'false') }} uses: ./.github/actions/wait-for-ce-server-to-start From 8c31958d4f1061159b775d12c5abb8807c410dde Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 13:19:58 -0700 Subject: [PATCH 42/78] Test feature branch from shared workflows to fix tls not working --- .github/actions/run-ee-server/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index c3202f0966..fc0d447ca5 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -26,7 +26,7 @@ runs: using: "composite" steps: # Start up server - - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@07c958ca4c5cea494dc8790949c08e3fb28c55e1 + - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@708ad9e1db6333410437864cd46e184403de1628 id: setup-as-server with: enable-security: "true" From b62aef34cded29d5d55424633d751c02bb450d33 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 13:27:12 -0700 Subject: [PATCH 43/78] Fix wrong output name --- .github/actions/run-ee-server/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index fc0d447ca5..43b55a8196 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -100,6 +100,6 @@ runs: - name: Set EE server's IP address and TLS name for test config run: | cluster_name=$(docker run --rm --network host aerospike/aerospike-tools asinfo -U admin -P admin -v "get-config:context=service" -l | grep -i cluster-name | cut -d = -f 2) - crudini --existing=param --set config.conf enterprise-edition hosts "${{ env.SERVER_IP }}:${{ steps.setup-as-server.outputs.tls-base-port }}|${cluster_name}" + crudini --existing=param --set config.conf enterprise-edition hosts "${{ env.SERVER_IP }}:${{ steps.setup-as-server.outputs.tls-service-ports }}|${cluster_name}" working-directory: test shell: bash From 5505ccc7befe241bc161f1ac518534f1c807b38c Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 13:33:13 -0700 Subject: [PATCH 44/78] Fix user agent job --- .github/workflows/smoke-tests.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index 29cc4992c5..4636f7a89b 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -509,6 +509,14 @@ jobs: name: wheel-${{ env.LOWEST_SUPPORTED_PY_VERSION }} - run: python3 -m pip install *.whl + - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@708ad9e1db6333410437864cd46e184403de1628 + with: + enable-security: "true" + num-nodes: 1 + oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} + oidc-audience: ${{ vars.OIDC_AUDIENCE }} + server-tag: ${{ inputs.server-tag }} + - if: ${{ startsWith(matrix.test-script-args, 'false') }} run: docker run -d -p 3000:3000 --name aerospike -e DEFAULT_TTL=2592000 aerospike/aerospike-server:${{ env.SERVER_TAG }} From fa8f4ab9a32a7ba682e2a46fc52155d67696f598 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 13:36:14 -0700 Subject: [PATCH 45/78] Fix tls paths. TODO this will probably fail for cibuildwheel manylinux jobs, the tls files need to be copied into the container --- .github/actions/run-ee-server/action.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 43b55a8196..25423b6dd8 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -62,9 +62,9 @@ runs: crudini --existing=param --set config.conf enterprise-edition password ${{ env.SUPERUSER_NAME_AND_PASSWORD }} crudini --set config.conf tls enable true # Cannot use abs path because config.conf is copied into Docker container during cibuildwheel tests - crudini --set config.conf tls cafile ../${{ steps.setup-as-server.outputs.tls-cert-dir }}/ca.crt - crudini --set config.conf tls keyfile ../${{ steps.setup-as-server.outputs.tls-cert-dir }}/client.key - crudini --set config.conf tls certfile ../${{ steps.setup-as-server.outputs.tls-cert-dir }}/client.crt + crudini --set config.conf tls cafile ${{ steps.setup-as-server.outputs.tls-cert-dir }}/ca.crt + crudini --set config.conf tls keyfile ${{ steps.setup-as-server.outputs.tls-cert-dir }}/client.key + crudini --set config.conf tls certfile ${{ steps.setup-as-server.outputs.tls-cert-dir }}/client.crt working-directory: test shell: bash From bb0d281c5cfd343573d04d05e4122f42489344ac Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 13:39:55 -0700 Subject: [PATCH 46/78] Fix workflow --- .github/workflows/smoke-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index 4636f7a89b..db5d5b137a 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -513,7 +513,7 @@ jobs: with: enable-security: "true" num-nodes: 1 - oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} + oidc-provider: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} server-tag: ${{ inputs.server-tag }} From 6c1a4875b7b063746eb3f5209bd92c397c0c4a15 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 13:55:06 -0700 Subject: [PATCH 47/78] Point to my feature branch in shared workflows repo to fix TLS connection errors --- .github/actions/run-ee-server/action.yml | 2 +- .github/workflows/smoke-tests.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 25423b6dd8..2c8c6588d7 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -26,7 +26,7 @@ runs: using: "composite" steps: # Start up server - - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@708ad9e1db6333410437864cd46e184403de1628 + - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@a9678fc705ae4df9704da5e8e0e6fe314fab0cbd id: setup-as-server with: enable-security: "true" diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index db5d5b137a..c5d8d70db7 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -509,7 +509,7 @@ jobs: name: wheel-${{ env.LOWEST_SUPPORTED_PY_VERSION }} - run: python3 -m pip install *.whl - - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@708ad9e1db6333410437864cd46e184403de1628 + - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@a9678fc705ae4df9704da5e8e0e6fe314fab0cbd with: enable-security: "true" num-nodes: 1 From 6cb90c7214cd98b89d198e0e6f1fdfa2a02d07c3 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 14:22:04 -0700 Subject: [PATCH 48/78] Fix not creating superuser. Forgot to include this after migrating --- .github/actions/run-ee-server/action.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 2c8c6588d7..5715d6b5a7 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -38,6 +38,14 @@ runs: oidc-audience: ${{ inputs.oidc-audience }} server-tag: ${{ inputs.server-tag }} + - run: echo SUPERUSER_NAME_AND_PASSWORD="superuser" >> $GITHUB_ENV + shell: bash + + - run: | + docker exec --network host aerospike/aerospike-tools asadm --enable --execute "manage acl \ + create user $SUPERUSER_NAME_AND_PASSWORD password $SUPERUSER_NAME_AND_PASSWORD \ + roles read-write-udf, sys-admin, user-admin, data-admin" + - name: Install crudini to manipulate config.conf run: pipx install crudini --pip-args "-c ${{ github.workspace }}/.github/workflows/requirements.txt" working-directory: .github/workflows @@ -53,9 +61,6 @@ runs: working-directory: test shell: bash - - run: echo SUPERUSER_NAME_AND_PASSWORD="superuser" >> $GITHUB_ENV - shell: bash - - name: Set credentials in config file run: | crudini --existing=param --set config.conf enterprise-edition user ${{ env.SUPERUSER_NAME_AND_PASSWORD }} From 48268254d285c4be9707d129f1e1c934a5eacba6 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 14:25:25 -0700 Subject: [PATCH 49/78] Fix workflow --- .github/actions/run-ee-server/action.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 5715d6b5a7..89c7aaea99 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -45,6 +45,7 @@ runs: docker exec --network host aerospike/aerospike-tools asadm --enable --execute "manage acl \ create user $SUPERUSER_NAME_AND_PASSWORD password $SUPERUSER_NAME_AND_PASSWORD \ roles read-write-udf, sys-admin, user-admin, data-admin" + shell: bash - name: Install crudini to manipulate config.conf run: pipx install crudini --pip-args "-c ${{ github.workspace }}/.github/workflows/requirements.txt" From 06672e7b920b09107013b252787dc09b74924279 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 14:29:17 -0700 Subject: [PATCH 50/78] Fix bad syntax.. --- .github/actions/run-ee-server/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 89c7aaea99..d8691281e2 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -42,7 +42,7 @@ runs: shell: bash - run: | - docker exec --network host aerospike/aerospike-tools asadm --enable --execute "manage acl \ + docker run --rm --network host aerospike/aerospike-tools asadm --enable --execute "manage acl \ create user $SUPERUSER_NAME_AND_PASSWORD password $SUPERUSER_NAME_AND_PASSWORD \ roles read-write-udf, sys-admin, user-admin, data-admin" shell: bash From 2b679aad66a4ec8aa07a2cba13c9b71c34b26827 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 14:38:09 -0700 Subject: [PATCH 51/78] Fix workflow.. --- .github/actions/run-ee-server/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index d8691281e2..ecfd361ebd 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -42,7 +42,7 @@ runs: shell: bash - run: | - docker run --rm --network host aerospike/aerospike-tools asadm --enable --execute "manage acl \ + docker run --rm --network host aerospike/aerospike-tools asadm -U admin -P admin --enable --execute "manage acl \ create user $SUPERUSER_NAME_AND_PASSWORD password $SUPERUSER_NAME_AND_PASSWORD \ roles read-write-udf, sys-admin, user-admin, data-admin" shell: bash From 8a45404c53455e2f52c7428acc7d1cae8896902a Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 14:45:30 -0700 Subject: [PATCH 52/78] Fix workflow --- .github/workflows/smoke-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index c5d8d70db7..3e1763a430 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -515,7 +515,7 @@ jobs: num-nodes: 1 oidc-provider: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} - server-tag: ${{ inputs.server-tag }} + server-tag: ${{ env.SERVER_TAG }} - if: ${{ startsWith(matrix.test-script-args, 'false') }} run: docker run -d -p 3000:3000 --name aerospike -e DEFAULT_TTL=2592000 aerospike/aerospike-server:${{ env.SERVER_TAG }} From c1955c0edc2be2a37c42360a8b90e5f204c3b8ce Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 14:46:10 -0700 Subject: [PATCH 53/78] Use Mirza's branch --- .github/actions/run-ee-server/action.yml | 2 +- .github/workflows/smoke-tests.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index ecfd361ebd..18458b6fd4 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -26,7 +26,7 @@ runs: using: "composite" steps: # Start up server - - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@a9678fc705ae4df9704da5e8e0e6fe314fab0cbd + - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@ffcb982e2f3323762bdc26af635fa46ebebf6d93 id: setup-as-server with: enable-security: "true" diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index 3e1763a430..8bd8979ac5 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -509,7 +509,7 @@ jobs: name: wheel-${{ env.LOWEST_SUPPORTED_PY_VERSION }} - run: python3 -m pip install *.whl - - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@a9678fc705ae4df9704da5e8e0e6fe314fab0cbd + - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@ffcb982e2f3323762bdc26af635fa46ebebf6d93 with: enable-security: "true" num-nodes: 1 From 962bc799b26a55cb6b85122e26965971f182a1bb Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 14:50:44 -0700 Subject: [PATCH 54/78] Fix test since we aren't creating superuser anymore --- test/standalone/test-user-agent-e2e.bash | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/standalone/test-user-agent-e2e.bash b/test/standalone/test-user-agent-e2e.bash index 7f1f2a5202..db309002a8 100755 --- a/test/standalone/test-user-agent-e2e.bash +++ b/test/standalone/test-user-agent-e2e.bash @@ -21,7 +21,7 @@ python3 "$python_background_script_name" "$@" & use_security_credentials="$1" if [[ "$use_security_credentials" == "true" ]]; then - CREDENTIALS="-U superuser -P superuser" + CREDENTIALS="-U admin -P admin" fi server_version=$(docker run --network host aerospike/aerospike-tools asinfo $CREDENTIALS -v "build") @@ -57,7 +57,7 @@ if [[ $# -eq 2 ]]; then # app_id was explicitly set in client config expected_app_id="$2" elif [[ "$use_security_credentials" == "true" ]]; then - expected_app_id="superuser" + expected_app_id="admin" else expected_app_id="not-set" fi From a79055bedd873935ec2e20a72c401ac3809ca794 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:07:40 -0700 Subject: [PATCH 55/78] Pull mirza's latest changes to fix tls name not matching cluster name --- .github/actions/run-ee-server/action.yml | 2 +- .github/workflows/smoke-tests.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 18458b6fd4..92e3a82cd5 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -26,7 +26,7 @@ runs: using: "composite" steps: # Start up server - - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@ffcb982e2f3323762bdc26af635fa46ebebf6d93 + - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@662d835b0e34c33cc12a8252b5548732725d0772 id: setup-as-server with: enable-security: "true" diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index 8bd8979ac5..c87ab8ff6b 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -509,7 +509,7 @@ jobs: name: wheel-${{ env.LOWEST_SUPPORTED_PY_VERSION }} - run: python3 -m pip install *.whl - - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@ffcb982e2f3323762bdc26af635fa46ebebf6d93 + - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@662d835b0e34c33cc12a8252b5548732725d0772 with: enable-security: "true" num-nodes: 1 From fcececaf902d328f0e16d6f8780020c2c7bb94e3 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:12:43 -0700 Subject: [PATCH 56/78] Fix workflow.. --- .github/workflows/smoke-tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index c87ab8ff6b..6b50319392 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -509,7 +509,8 @@ jobs: name: wheel-${{ env.LOWEST_SUPPORTED_PY_VERSION }} - run: python3 -m pip install *.whl - - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@662d835b0e34c33cc12a8252b5548732725d0772 + - if: ${{ startsWith(matrix.test-script-args, 'true') }} + uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@662d835b0e34c33cc12a8252b5548732725d0772 with: enable-security: "true" num-nodes: 1 From 10c453926baeff9e8958fe3e89117c97d4a4f1fb Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:29:59 -0700 Subject: [PATCH 57/78] Fix workflow --- .github/actions/run-ee-server/action.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 92e3a82cd5..b2a403c54d 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -37,6 +37,7 @@ runs: oidc-provider: ${{ inputs.oidc-provider-name }} oidc-audience: ${{ inputs.oidc-audience }} server-tag: ${{ inputs.server-tag }} + env-vars: DEFAULT_TTL=2592000 - run: echo SUPERUSER_NAME_AND_PASSWORD="superuser" >> $GITHUB_ENV shell: bash From bf6fc36a94bd0f4f7381338ec6c0deb58fbffc8a Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:38:52 -0700 Subject: [PATCH 58/78] Pull mirza's latest changes to fix action failing if only security is enabled. --- .github/actions/run-ee-server/action.yml | 2 +- .github/workflows/smoke-tests.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index b2a403c54d..2543f0a63d 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -26,7 +26,7 @@ runs: using: "composite" steps: # Start up server - - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@662d835b0e34c33cc12a8252b5548732725d0772 + - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@48edf9ff59ab4da5f15915b22d8895f19ce7fd55 id: setup-as-server with: enable-security: "true" diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index 6b50319392..ea3156bf41 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -510,7 +510,7 @@ jobs: - run: python3 -m pip install *.whl - if: ${{ startsWith(matrix.test-script-args, 'true') }} - uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@662d835b0e34c33cc12a8252b5548732725d0772 + uses: aerospike/shared-workflows/.github/actions/setup-aerospike-server@48edf9ff59ab4da5f15915b22d8895f19ce7fd55 with: enable-security: "true" num-nodes: 1 From 3b879db709d2b3a1084095e7a69caa206fdf9267 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:55:06 -0700 Subject: [PATCH 59/78] Just pull 8.1.x manually, latest tag is pointing to 8.1.0.0-start-75-g49dbabe which causes user agent tests to fail --- .github/workflows/smoke-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index ea3156bf41..d7830302c1 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -516,7 +516,7 @@ jobs: num-nodes: 1 oidc-provider: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} - server-tag: ${{ env.SERVER_TAG }} + server-tag: "8.0" - if: ${{ startsWith(matrix.test-script-args, 'false') }} run: docker run -d -p 3000:3000 --name aerospike -e DEFAULT_TTL=2592000 aerospike/aerospike-server:${{ env.SERVER_TAG }} From 0ab2ba79ee4dc9b963c94975d7dfa55f9b4cc5e0 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 16:01:11 -0700 Subject: [PATCH 60/78] Just uncomment to get tests to pass. --- .github/workflows/smoke-tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index d7830302c1..2d2b795298 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -531,5 +531,5 @@ jobs: run: ./test-user-agent-e2e.bash ${{ matrix.test-script-args }} working-directory: test/standalone - - if: ${{ !cancelled() }} - run: docker logs aerospike + # - if: ${{ !cancelled() }} + # run: docker logs aerospike From 0ede309f34f563535a1d413b3dfa743e809e4d49 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 16:27:37 -0700 Subject: [PATCH 61/78] Replace latest tag since its borked in the jfrog repo --- .github/workflows/smoke-tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index 2d2b795298..a0051d30a6 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -31,7 +31,8 @@ on: env: LOWEST_SUPPORTED_PY_VERSION: '3.10' # pull_request event doesn't support inputs - SERVER_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.server-tag || 'latest' }} + # Our JFrog docker repo doesn't automatically update the latest tag, so we can't use it (it currently points to an old nightly build) + SERVER_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.server-tag || '8.1' }} jobs: build: From f21bb159d953af3eb10b0c2ac9a3cb778fb0f592 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 17:08:40 -0700 Subject: [PATCH 62/78] update ci/cd to not depend on latest tag. this means every manual workflow run needs to specify the server version used --- .github/actions/run-ee-server/action.yml | 1 - .github/workflows/build-and-run-stage-tests.yml | 1 - .github/workflows/build-artifacts.yml | 4 +--- .github/workflows/build-wheels.yml | 6 ++---- .github/workflows/smoke-tests.yml | 1 - .github/workflows/stage-tests.yml | 3 +-- .github/workflows/valgrind.yml | 3 +-- 7 files changed, 5 insertions(+), 14 deletions(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 2543f0a63d..fee2b395a7 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -16,7 +16,6 @@ inputs: server-tag: required: true description: Specify Docker tag - default: 'latest' where-is-client-connecting-from: required: false description: 'docker-host, separate-docker-container, "remote-connection" via DOCKER_HOST' diff --git a/.github/workflows/build-and-run-stage-tests.yml b/.github/workflows/build-and-run-stage-tests.yml index e4e4240635..53ed12eb01 100644 --- a/.github/workflows/build-and-run-stage-tests.yml +++ b/.github/workflows/build-and-run-stage-tests.yml @@ -23,7 +23,6 @@ on: server-tag: type: string required: true - default: 'latest' description: 'Server docker image tag' test-macos-x86: required: true diff --git a/.github/workflows/build-artifacts.yml b/.github/workflows/build-artifacts.yml index 4a358d0fb3..a4bb898485 100644 --- a/.github/workflows/build-artifacts.yml +++ b/.github/workflows/build-artifacts.yml @@ -42,8 +42,7 @@ on: default: 'aerospike/aerospike-server-enterprise' server-tag: type: string - required: true - default: 'latest' + required: false description: 'Server docker image tag (e.g to test a client backport version)' test-file: required: false @@ -90,7 +89,6 @@ on: server-tag: type: string required: false - default: 'latest' test-file: required: false type: string diff --git a/.github/workflows/build-wheels.yml b/.github/workflows/build-wheels.yml index c1816a49dc..93b2d7ca57 100644 --- a/.github/workflows/build-wheels.yml +++ b/.github/workflows/build-wheels.yml @@ -73,8 +73,7 @@ on: description: Image name default: 'aerospike/aerospike-server-enterprise' server-tag: - required: true - default: 'latest' + required: false description: 'Server docker image tag' test-file: required: false @@ -120,9 +119,8 @@ on: required: false default: 'aerospike/aerospike-server-enterprise' server-tag: - required: false + required: true type: string - default: 'latest' description: 'Server docker image tag' test-file: required: false diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index a0051d30a6..238cfaf8d0 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -25,7 +25,6 @@ on: server-tag: description: Server tag type: string - default: latest required: true env: diff --git a/.github/workflows/stage-tests.yml b/.github/workflows/stage-tests.yml index 072307b009..58facecf1b 100644 --- a/.github/workflows/stage-tests.yml +++ b/.github/workflows/stage-tests.yml @@ -35,8 +35,7 @@ on: default: 'aerospike/aerospike-server-enterprise' server-tag: type: string - required: false - default: 'latest' + required: true description: 'Server docker image tag' test-file: required: false diff --git a/.github/workflows/valgrind.yml b/.github/workflows/valgrind.yml index c480b26085..f3546a9886 100644 --- a/.github/workflows/valgrind.yml +++ b/.github/workflows/valgrind.yml @@ -25,9 +25,8 @@ on: description: Image name default: 'aerospike/aerospike-server-enterprise' server-tag: - required: false + required: true description: Server tag - default: latest massif: type: boolean description: 'Use massif for testing memory usage' From fa356b0b62229b8b85d3531da58053aaa7c704f2 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 19:39:16 -0700 Subject: [PATCH 63/78] Read source code for shared action, this could be why? --- .github/actions/run-ee-server/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index fee2b395a7..2bdefaebdc 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -36,7 +36,7 @@ runs: oidc-provider: ${{ inputs.oidc-provider-name }} oidc-audience: ${{ inputs.oidc-audience }} server-tag: ${{ inputs.server-tag }} - env-vars: DEFAULT_TTL=2592000 + env-vars: DEFAULT_TTL=2592000; - run: echo SUPERUSER_NAME_AND_PASSWORD="superuser" >> $GITHUB_ENV shell: bash From f47e3efc72c958eae7be1b6dc054cb23cd1d44f0 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 19:44:58 -0700 Subject: [PATCH 64/78] Make action work inside a docker container --- .github/actions/run-ee-server/action.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 2bdefaebdc..c45781f388 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -68,9 +68,15 @@ runs: crudini --existing=param --set config.conf enterprise-edition password ${{ env.SUPERUSER_NAME_AND_PASSWORD }} crudini --set config.conf tls enable true # Cannot use abs path because config.conf is copied into Docker container during cibuildwheel tests - crudini --set config.conf tls cafile ${{ steps.setup-as-server.outputs.tls-cert-dir }}/ca.crt - crudini --set config.conf tls keyfile ${{ steps.setup-as-server.outputs.tls-cert-dir }}/client.key - crudini --set config.conf tls certfile ${{ steps.setup-as-server.outputs.tls-cert-dir }}/client.crt + + tls_cert_dir=${{ steps.setup-as-server.outputs.tls-cert-dir }} + if [[ "${{ inputs.where-is-client-connecting-from }}" == "separate-docker-container" ]]; then + tls_cert_dir="/host${tls_cert_dir}" + fi + + crudini --set config.conf tls cafile $tls_cert_dir/ca.crt + crudini --set config.conf tls keyfile $tls_cert_dir/client.key + crudini --set config.conf tls certfile $tls_cert_dir/client.crt working-directory: test shell: bash From 4fc4c03517bcb9bb0e83b1315de1f56e166bf094 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Thu, 9 Apr 2026 20:03:25 -0700 Subject: [PATCH 65/78] Fix syntax --- .github/actions/run-ee-server/action.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index c45781f388..704dfb2348 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -98,8 +98,8 @@ runs: if: ${{ inputs.where-is-client-connecting-from == 'separate-docker-container' }} run: | server_container_network_name=${{ steps.setup-as-server.outputs.network-name }} - docker_query="{{ .NetworkSettings.Networks.$server_container_network_name.IPAddress }}" - echo SERVER_IP=$(docker container inspect -f "$docker_query" ${{ steps.setup-as-server.outputs.container-names }}) >> $GITHUB_ENV + # Go templating doesn't support selecting names with hyphens + echo SERVER_IP=$(docker container inspect -f json ${{ steps.setup-as-server.outputs.container-names }} | jq ".[].NetworkSettings.Networks.${server_container_network_name}.IPAddress") >> $GITHUB_ENV shell: bash - name: Invalid input From 916290a491beabc7a795199614acc35129eced38 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Fri, 10 Apr 2026 07:39:06 -0700 Subject: [PATCH 66/78] Use this syntax to support hyphens. --- .github/actions/run-ee-server/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 704dfb2348..8d0c1c3af0 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -99,7 +99,7 @@ runs: run: | server_container_network_name=${{ steps.setup-as-server.outputs.network-name }} # Go templating doesn't support selecting names with hyphens - echo SERVER_IP=$(docker container inspect -f json ${{ steps.setup-as-server.outputs.container-names }} | jq ".[].NetworkSettings.Networks.${server_container_network_name}.IPAddress") >> $GITHUB_ENV + echo SERVER_IP=$(docker container inspect -f json ${{ steps.setup-as-server.outputs.container-names }} | jq ".[].NetworkSettings.Networks.[\"${server_container_network_name}\"].IPAddress") >> $GITHUB_ENV shell: bash - name: Invalid input From a54f9aaf27270dde134f5f147220aaffdffc50ef Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Fri, 10 Apr 2026 07:41:28 -0700 Subject: [PATCH 67/78] Google AI's suggestion didn't work --- .github/actions/run-ee-server/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 8d0c1c3af0..35fd4f28c5 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -99,7 +99,7 @@ runs: run: | server_container_network_name=${{ steps.setup-as-server.outputs.network-name }} # Go templating doesn't support selecting names with hyphens - echo SERVER_IP=$(docker container inspect -f json ${{ steps.setup-as-server.outputs.container-names }} | jq ".[].NetworkSettings.Networks.[\"${server_container_network_name}\"].IPAddress") >> $GITHUB_ENV + echo SERVER_IP=$(docker container inspect -f json ${{ steps.setup-as-server.outputs.container-names }} | jq ".[].NetworkSettings.Networks.\"${server_container_network_name}\".IPAddress") >> $GITHUB_ENV shell: bash - name: Invalid input From 936ff6b10a9feacb714879c3659abe7b324747ba Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Fri, 10 Apr 2026 07:45:49 -0700 Subject: [PATCH 68/78] Forgot to remove quotes. --- .github/actions/run-ee-server/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 35fd4f28c5..0f2a835120 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -99,7 +99,7 @@ runs: run: | server_container_network_name=${{ steps.setup-as-server.outputs.network-name }} # Go templating doesn't support selecting names with hyphens - echo SERVER_IP=$(docker container inspect -f json ${{ steps.setup-as-server.outputs.container-names }} | jq ".[].NetworkSettings.Networks.\"${server_container_network_name}\".IPAddress") >> $GITHUB_ENV + echo SERVER_IP=$(docker container inspect -f json ${{ steps.setup-as-server.outputs.container-names }} | jq -r ".[].NetworkSettings.Networks.\"${server_container_network_name}\".IPAddress") >> $GITHUB_ENV shell: bash - name: Invalid input From 9d92f101db5c42cf7f7693bc4222190fbc8dc2dc Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Fri, 10 Apr 2026 07:52:41 -0700 Subject: [PATCH 69/78] Can't find a setting in cibuildwheel to create the container on the bridge network. So have the server container in bridge. --- .github/actions/run-ee-server/action.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 0f2a835120..11fa0a5528 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -32,6 +32,7 @@ runs: enable-tls: "true" enable-strong-consistency: "true" features-content: ${{ inputs.features-content }} + network-name: bridge num-nodes: 1 oidc-provider: ${{ inputs.oidc-provider-name }} oidc-audience: ${{ inputs.oidc-audience }} From abc7b51078333278b8788431be0d0750fd5c0351 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Fri, 10 Apr 2026 07:57:55 -0700 Subject: [PATCH 70/78] Revert "Can't find a setting in cibuildwheel to create the container on the bridge network. So have the server container in bridge." This reverts commit 9d92f101db5c42cf7f7693bc4222190fbc8dc2dc. --- .github/actions/run-ee-server/action.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 11fa0a5528..0f2a835120 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -32,7 +32,6 @@ runs: enable-tls: "true" enable-strong-consistency: "true" features-content: ${{ inputs.features-content }} - network-name: bridge num-nodes: 1 oidc-provider: ${{ inputs.oidc-provider-name }} oidc-audience: ${{ inputs.oidc-audience }} From 6b6b5185a1d7930e0a6caddba302860e5ab94102 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Fri, 10 Apr 2026 08:03:31 -0700 Subject: [PATCH 71/78] Send server container network name to cibuildwheel --- .github/actions/run-ee-server/action.yml | 4 ++++ .github/workflows/build-wheels.yml | 2 ++ 2 files changed, 6 insertions(+) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index 0f2a835120..a2c0bd0e5e 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -2,6 +2,10 @@ name: 'Run EE Server in a Docker container' description: 'Run EE server. Returns once server is ready. Only tested on Linux and macOS' # NOTE: do not share this server container with others # since it's using the default admin / admin credentials +outputs: + container-network: + description: Forwards the container's network name from setup-as-server + value: ${{ steps.setup-as-server.outputs.network-name }} inputs: # All inputs in composite actions are strings oidc-provider-name: diff --git a/.github/workflows/build-wheels.yml b/.github/workflows/build-wheels.yml index 93b2d7ca57..65845464fb 100644 --- a/.github/workflows/build-wheels.yml +++ b/.github/workflows/build-wheels.yml @@ -221,6 +221,7 @@ jobs: - name: 'Run Aerospike server in Docker container and configure tests accordingly' if: ${{ env.RUN_INTEGRATION_TESTS_IN_CIBW == 'true' }} uses: ./.github/actions/run-ee-server + id: run-ee-server with: oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} @@ -332,6 +333,7 @@ jobs: delocate-listdeps {dest_dir}/*.whl | grep libssl.3.dylib CIBW_TEST_COMMAND: ${{ env.TEST_COMMAND }} CIBW_DEBUG_KEEP_CONTAINER: 1 + CIBW_CONTAINER_ENGINE: "docker;create_args: --network ${{ steps.run-ee-server.outputs.container-network }}" # - name: Setup tmate session # if: ${{ !cancelled() }} From 80d619d1fdb49b90b9441e77d5f7f94dad623832 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Fri, 10 Apr 2026 08:11:42 -0700 Subject: [PATCH 72/78] Fix build-wheels failing due to printing logs from incorrect container name --- .github/actions/run-ee-server/action.yml | 3 +++ .github/workflows/build-wheels.yml | 7 +++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index a2c0bd0e5e..fb5ce66585 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -6,6 +6,9 @@ outputs: container-network: description: Forwards the container's network name from setup-as-server value: ${{ steps.setup-as-server.outputs.network-name }} + container-name: + description: Forwards the container name from setup-as-server + value: ${{ steps.setup-as-server.outputs.container-names }} inputs: # All inputs in composite actions are strings oidc-provider-name: diff --git a/.github/workflows/build-wheels.yml b/.github/workflows/build-wheels.yml index 65845464fb..a718254cd0 100644 --- a/.github/workflows/build-wheels.yml +++ b/.github/workflows/build-wheels.yml @@ -340,10 +340,9 @@ jobs: # uses: mxschmitt/action-tmate@v3 # For debugging - - run: | - # Checks that server started up properly - docker logs aerospike - if: ${{ always() && env.RUN_INTEGRATION_TESTS_IN_CIBW == 'true' }} + # Checks that server started up properly + - if: ${{ !cancelled() && env.RUN_INTEGRATION_TESTS_IN_CIBW == 'true' }} + run: docker logs ${{ steps.run-ee-server.outputs.container-name }} shell: bash - name: Upload wheels to GitHub From d370d5d52749450664668ee9ce6aec3397589319 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Fri, 10 Apr 2026 08:14:47 -0700 Subject: [PATCH 73/78] Fix same issue in smoke tests --- .github/workflows/smoke-tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index 238cfaf8d0..ce35ac500e 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -435,6 +435,7 @@ jobs: run: pip install -r test/requirements.txt - uses: ./.github/actions/run-ee-server + id: run-ee-server with: oidc-provider-name: ${{ vars.OIDC_PROVIDER_NAME }} oidc-audience: ${{ vars.OIDC_AUDIENCE }} @@ -450,7 +451,7 @@ jobs: - name: Show logs if failed if: ${{ failure() }} run: | - docker container logs aerospike + docker container logs ${{ steps.run-ee-server.outputs.container-name }} cat ./configs/aerospike.conf test-metrics: From 970e807c4d3e1402f9b565ece6d02a992accb715 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Fri, 10 Apr 2026 08:22:31 -0700 Subject: [PATCH 74/78] Fix valgrind failing if wheel is not found --- .github/workflows/build-wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-wheels.yml b/.github/workflows/build-wheels.yml index a718254cd0..a5a8a475ce 100644 --- a/.github/workflows/build-wheels.yml +++ b/.github/workflows/build-wheels.yml @@ -119,7 +119,7 @@ on: required: false default: 'aerospike/aerospike-server-enterprise' server-tag: - required: true + required: false type: string description: 'Server docker image tag' test-file: From aaf4c60939dd50af9203fb551b347ffc5e5aa4b8 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Fri, 10 Apr 2026 08:30:49 -0700 Subject: [PATCH 75/78] only connect to server's network if running tests --- .github/workflows/build-wheels.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-wheels.yml b/.github/workflows/build-wheels.yml index a5a8a475ce..fed5bcfed2 100644 --- a/.github/workflows/build-wheels.yml +++ b/.github/workflows/build-wheels.yml @@ -300,6 +300,11 @@ jobs: # Just do it for all Python versions (even those that don't require more room) for futureproofing run: echo CIBW_ENVIRONMENT_MACOS="LDFLAGS='-headerpad_max_install_names'" >> $GITHUB_ENV + - if: ${{ env.RUN_INTEGRATION_TESTS_IN_CIBW == 'true' }} + run: | + echo CIBW_CONTAINER_ENGINE="docker;create_args: --network ${{ steps.run-ee-server.outputs.container-network }}" >> $GITHUB_ENV + shell: bash + - name: Build wheel uses: pypa/cibuildwheel@298ed2fb2c105540f5ed055e8a6ad78d82dd3a7e # v3.3.1 id: cibuildwheel @@ -333,7 +338,6 @@ jobs: delocate-listdeps {dest_dir}/*.whl | grep libssl.3.dylib CIBW_TEST_COMMAND: ${{ env.TEST_COMMAND }} CIBW_DEBUG_KEEP_CONTAINER: 1 - CIBW_CONTAINER_ENGINE: "docker;create_args: --network ${{ steps.run-ee-server.outputs.container-network }}" # - name: Setup tmate session # if: ${{ !cancelled() }} From 33373781e7d7ccd6349c7c00800c621c4ddbee13 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Fri, 10 Apr 2026 08:40:59 -0700 Subject: [PATCH 76/78] Also mount docker host's root directory onto container so it can access the tls files --- .github/workflows/stage-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stage-tests.yml b/.github/workflows/stage-tests.yml index 58facecf1b..811a985bc4 100644 --- a/.github/workflows/stage-tests.yml +++ b/.github/workflows/stage-tests.yml @@ -133,7 +133,7 @@ jobs: - name: Run distro container # Run distro container on host network to access the Aerospike server using localhost (without having to change config.conf) - run: docker run --detach --network host --platform ${{ env.DISTRO_DOCKER_IMAGE_PLATFORM }} --name ${{ env.LINUX_DISTRO_CONTAINER_NAME }} ${{ env.DISTRO_DOCKER_IMAGE_AND_TAG }} tail -f /dev/null + run: docker run --detach --network host -v /:/host:ro --platform ${{ env.DISTRO_DOCKER_IMAGE_PLATFORM }} --name ${{ env.LINUX_DISTRO_CONTAINER_NAME }} ${{ env.DISTRO_DOCKER_IMAGE_AND_TAG }} tail -f /dev/null - name: Copy repo (and artifact) to container run: docker cp . ${{ env.LINUX_DISTRO_CONTAINER_NAME }}:/aerospike-client-python From a4d2d69cbcbec83df0ebb697d8f051979d51d9d1 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Wed, 15 Apr 2026 10:29:29 -0700 Subject: [PATCH 77/78] Try following current implementation as a workaround to get env vars to be processed --- .github/actions/run-ee-server/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/run-ee-server/action.yml b/.github/actions/run-ee-server/action.yml index fb5ce66585..12dcebf67d 100644 --- a/.github/actions/run-ee-server/action.yml +++ b/.github/actions/run-ee-server/action.yml @@ -43,7 +43,7 @@ runs: oidc-provider: ${{ inputs.oidc-provider-name }} oidc-audience: ${{ inputs.oidc-audience }} server-tag: ${{ inputs.server-tag }} - env-vars: DEFAULT_TTL=2592000; + env-vars: DEFAULT_TTL=2592000\; - run: echo SUPERUSER_NAME_AND_PASSWORD="superuser" >> $GITHUB_ENV shell: bash From c18bdf77b2f8839132cd76e3a0eb43b008c61e99 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Wed, 15 Apr 2026 10:50:04 -0700 Subject: [PATCH 78/78] Rm certs and private keys now that the setup-aerospike-server action provides those --- .github/workflows/docker-setup/ca.cer | 23 ---------- .github/workflows/docker-setup/ca.pem | 28 ------------ .github/workflows/docker-setup/client.cer | 28 ------------ .github/workflows/docker-setup/client.pem | 52 ----------------------- .github/workflows/docker-setup/server.cer | 28 ------------ .github/workflows/docker-setup/server.pem | 52 ----------------------- 6 files changed, 211 deletions(-) delete mode 100644 .github/workflows/docker-setup/ca.cer delete mode 100644 .github/workflows/docker-setup/ca.pem delete mode 100644 .github/workflows/docker-setup/client.cer delete mode 100644 .github/workflows/docker-setup/client.pem delete mode 100644 .github/workflows/docker-setup/server.cer delete mode 100644 .github/workflows/docker-setup/server.pem diff --git a/.github/workflows/docker-setup/ca.cer b/.github/workflows/docker-setup/ca.cer deleted file mode 100644 index 6d09507328..0000000000 --- a/.github/workflows/docker-setup/ca.cer +++ /dev/null @@ -1,23 +0,0 @@ ------BEGIN CERTIFICATE----- -MIID2TCCAsGgAwIBAgIUS2sz3DHfTxANPRz3JwdN5V3IQsIwDQYJKoZIhvcNAQEL -BQAwezELMAkGA1UEBhMCWFgxEjAQBgNVBAgMCVN0YXRlTmFtZTERMA8GA1UEBwwI -Q2l0eU5hbWUxFDASBgNVBAoMC0NvbXBhbnlOYW1lMRswGQYDVQQLDBJDb21wYW55 -U2VjdGlvbk5hbWUxEjAQBgNVBAMMCW15ZHVtbXljYTAgFw0yNTAzMDUyMzUwMzVa -GA85OTk5MTIzMTIzNTk1OVowezELMAkGA1UEBhMCWFgxEjAQBgNVBAgMCVN0YXRl -TmFtZTERMA8GA1UEBwwIQ2l0eU5hbWUxFDASBgNVBAoMC0NvbXBhbnlOYW1lMRsw -GQYDVQQLDBJDb21wYW55U2VjdGlvbk5hbWUxEjAQBgNVBAMMCW15ZHVtbXljYTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALM9cBS9RwQvxP4jUrE3ig+v -QDrUtzKDUZqaVVWbMx70jiT1bE4umiWlEFSqlwIvORd4rbY/LfDvZq5HN59cOByC -ecW0kciAO1qFg9ds3DM7pQd9thk/X4RM2zQUyH0/aLqdRX6HGpzPCoQohwRF08Yd -NvJsIw0iSs7cYkf8h4KKlVBhgsnrqHqFfgnT4MF5amzpE5tDkiMvJIZoB74lh29T -JRkofqPNXrJExjH0KGbNrkaqnOAVM8bg9rsk9NUkMnWDvo40SRtNRbDqMfpF4JyG -GnqRu6EdKvSFjgA1u0ZgKqSOMAL7U9zA0oa02b5vtFXpBLsvODJwfst8dfCo0WUC -AwEAAaNTMFEwHQYDVR0OBBYEFFwbutYrFTa4cnP1kQzBK1mLihjkMB8GA1UdIwQY -MBaAFFwbutYrFTa4cnP1kQzBK1mLihjkMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI -hvcNAQELBQADggEBADKvC0am4yS3jTBZNwyRkfPTvQ9/zp5imndlNr1HG+PVp4Yv -ZchMrqarFRd6aKzasJcm8bsVmXYSUd7JPkgVO5LiLuyLNwkEaL6+24pUeyFJAOF0 -AdOP2v2GddDPxIswQ/Rx2U2Yp2I2XFwuo0NEyMLPfambglknBBQji0vhsdxBeYxJ -NtxBHUb30ElPz6PwypH5QVnB2jrKLqtlwu8fP5evWs70JYgYEnBb72B1mvLeCvCr -ZusKJaqM04ezUM6NnGMrv7PrBjEcMg9MtA2Y8/1XNsaHp/9Fnpbd6uY4XDXsTxyW -BH6y+iVSBhJScZF0yEtXZgWtaNd/oMjt2978bnk= ------END CERTIFICATE----- diff --git a/.github/workflows/docker-setup/ca.pem b/.github/workflows/docker-setup/ca.pem deleted file mode 100644 index d844b0f64d..0000000000 --- a/.github/workflows/docker-setup/ca.pem +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCzPXAUvUcEL8T+ -I1KxN4oPr0A61Lcyg1GamlVVmzMe9I4k9WxOLpolpRBUqpcCLzkXeK22Py3w72au -RzefXDgcgnnFtJHIgDtahYPXbNwzO6UHfbYZP1+ETNs0FMh9P2i6nUV+hxqczwqE -KIcERdPGHTbybCMNIkrO3GJH/IeCipVQYYLJ66h6hX4J0+DBeWps6RObQ5IjLySG -aAe+JYdvUyUZKH6jzV6yRMYx9Chmza5GqpzgFTPG4Pa7JPTVJDJ1g76ONEkbTUWw -6jH6ReCchhp6kbuhHSr0hY4ANbtGYCqkjjAC+1PcwNKGtNm+b7RV6QS7LzgycH7L -fHXwqNFlAgMBAAECggEAATa/eBHSFc1XBFuWjJxc2H9Y1tfS8nTLjC79uJ8ySO7i -DuOvReubNU8OsxbBVWKe0dxfh3ZFEuEkLQukF6BcbEEBScf6cW+rjJDj6YUTYVtx -jNaanEV+xEVwT0QmxBu2U1vg+RrkIL9m3v9BRCj5kVloTQWoynF61+IhM5iaYwAX -XLhdK9Vcc7hmKyTpWckO3MNUUMCScLBlIJBMQJE20raunJZqWD6NZiiKoOOydMoR -Td5qRpNan+vWT0UsLspQCZ9DXrx9EYHDzxwQj1ztfU4EXxpLkQowp6snKhVqyy53 -qJywx/6J6Vj4tkj6PUXtQNF5G1qg/I4UFvFzic7ZUQKBgQDcYZ9o1fUwti+87lYd -3kIb5v4ma5uZSrgZNYI+wrp1xg+dqOpoAzA8rsuZvrL/wPkafRZ8L1OJH0wo0FRB -JLMsclitY1YxiliiWKXX57BvnSaEiSmRIxdf/tMutdH4Bs8xnRhT7qFXgjowK+9G -T7OfKRQFQRlDn8lkeckdbpYVWQKBgQDQNZLFVsSaU9mdnBHnZn00q67lEGHH3B3w -hNopxNWljdz17loys7UVTHjQ4EXcthAgFLk/XKmEnqm5YRFtDbE+MPIpTATA9CoA -YILWB1fn4AfPvtdjsKHlMHK7ohyA3DURBC7Ijd7McwLNd09RudBykgZbYgNNMmMN -zzm/y/e+7QKBgGFGthaQWqolwOykR17nvEaUr5pF5WjEkn6OH++UBLn3suzkopNG -1QP0I+q5Qkmh5FLM5B/sw/LC3dsmGgqnKG92Ca5/KoyzhGwktQ+YNUkPFPFrme12 -j9rPoGf92bChUNOVhCeILa9yzDx3KCbhB2g5uZyYH465+StglmVnatgBAoGAPO2Q -d6L+gVLMOaz0KEz7krAyy+FRW9T0BfA6j0KEap/q6yTGzFN+SC9Ko4UdrIqyiVDH -LN2G1cJAVHktSkZZeaOFGcSfF3/b0qRrZQpdFQOgBZEJIqkLly/oQzQbNzI5bTNW -JWYurpFxXoLteTLw5rYImjFCWhLGncHoWlHru7kCgYBUV5JQqDsYRqsUkMCu+L1e -ESxnV7QhrBBnFqczbIyfvShwFtMW0oH1gvfcVNbOOmnlsZe2/Ru9DpixlfKhE1je -fB2ePPoYssyWF4h02juBU4yKRojYyGMYaN2ba+fVHzOsTFrhWnQE1nC6C3Hqf7Nh -GTsIT5fcyPAnx9OxPy/j1Q== ------END PRIVATE KEY----- diff --git a/.github/workflows/docker-setup/client.cer b/.github/workflows/docker-setup/client.cer deleted file mode 100644 index b3ebc6d7b8..0000000000 --- a/.github/workflows/docker-setup/client.cer +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEyDCCA7CgAwIBAgIUIETHVXivRIYcjdTxPSoh3RtC4ogwDQYJKoZIhvcNAQEL -BQAwezELMAkGA1UEBhMCWFgxEjAQBgNVBAgMCVN0YXRlTmFtZTERMA8GA1UEBwwI -Q2l0eU5hbWUxFDASBgNVBAoMC0NvbXBhbnlOYW1lMRswGQYDVQQLDBJDb21wYW55 -U2VjdGlvbk5hbWUxEjAQBgNVBAMMCW15ZHVtbXljYTAgFw0yNTA2MTYxNjEwNTNa -GA85OTk5MTIzMTIzNTk1OVowezELMAkGA1UEBhMCWFgxEjAQBgNVBAgMCVN0YXRl -TmFtZTERMA8GA1UEBwwIQ2l0eU5hbWUxFDASBgNVBAoMC0NvbXBhbnlOYW1lMRsw -GQYDVQQLDBJDb21wYW55U2VjdGlvbk5hbWUxEjAQBgNVBAMMCXN1cGVydXNlcjCC -AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALfGbEi8S6LpivbttTJSrFEb -TN7rjk7hjbxlF9BTWKmVjhdrOxQQmVEJMy6PMgR0HgWtn3aGW6LONYhpx01K2l9w -ZjB3BoJzNSXK3pRliIJofTUOhCdkwfHDwECWvPgaVmFgtxIexXMX2Kj/70fdncGk -ucjeYQFolFfRcKCKPV5E4UceH2blU427e/PH3vFE8VRmYAIK/yTy31e1ES1IbG3H -zcGDREWvA1RAqWcPeII65/vb++2xb8mW0JVQlE1mXIuLMtt3p7QVbK84ApgqxKxj -2qjcq4O4RMmMgmUXU1k5/PLkgPwct3JmzZzkbv8fXe5LuYokUMIlpsJH0gNfPjCo -sSZO34g1uf9HX/gszxA//27/O4yEgw9056+/bIAkMlLxP2VIyJB1WMjS6npv0A9D -D+mDhdub2Y7fjxlz9geR3xrceRZWh8kn0QSgfio3kEVQEQXwi27AVoJB8Xg3GUYN -F0eLsV57wrKFm/a2HmvVUzxL/aJOznaa8jsPNVGE845es4PMIYEHesTjeTn7umos -/XILme0iRqzB1KsCbjrUbar2JOo0gFYWtpUOOEG2VXvVdpBYTDZ48XyFqUeybhUV -XH3uQ7nemssYgdCqYpjHSS7jTEQrkkbofGd058XsmAon+bOexEJxZ0Fr4KlgRiUb -SUUpTBqyiSKItzUzO1ehAgMBAAGjQjBAMB0GA1UdDgQWBBRwXiTq3ZMAkXifcUKi -X9mkalOtWDAfBgNVHSMEGDAWgBRcG7rWKxU2uHJz9ZEMwStZi4oY5DANBgkqhkiG -9w0BAQsFAAOCAQEApptwoi388Qtypv3/ArFEmGfaiL5Dne0NbT003NHyRpI6WkZf -qnrZlrs8e46hqaqiEE8B8bIYX7ANZW8ZUCz+NAqvsY9QFlDytOVK3B/shEDCWAz6 -28edGAjeBXgJBX1yVQWQO882vux7Cgwut/ziBYQX9A5WNDkhj6PsvsGXqCq20C0B -E8xa5BitGNaVwSXqdSUipt3DofCZQzTRYBXgvQXPrzVOWpye/5ls/xux9oIVwIiO -P5WSNTj0J1vFUGlj8YSWLah9Lo52W94T00oQeRt5yAdkIaYzufwYYVzbcmlH5v23 -iRtOk9ZTxN/1VdT+3KGjj92ukH2McLrR1A1fWg== ------END CERTIFICATE----- diff --git a/.github/workflows/docker-setup/client.pem b/.github/workflows/docker-setup/client.pem deleted file mode 100644 index a3c2b51e37..0000000000 --- a/.github/workflows/docker-setup/client.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -bTJcNI/1lR7ZONcgBG7vh43FD3Yk8w== ------END PRIVATE KEY----- diff --git a/.github/workflows/docker-setup/server.cer b/.github/workflows/docker-setup/server.cer deleted file mode 100644 index 504882b3e4..0000000000 --- a/.github/workflows/docker-setup/server.cer +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIUVrnirMWwziBzL5bjtlhX3KDwPwgwDQYJKoZIhvcNAQEL -BQAwezELMAkGA1UEBhMCWFgxEjAQBgNVBAgMCVN0YXRlTmFtZTERMA8GA1UEBwwI -Q2l0eU5hbWUxFDASBgNVBAoMC0NvbXBhbnlOYW1lMRswGQYDVQQLDBJDb21wYW55 -U2VjdGlvbk5hbWUxEjAQBgNVBAMMCW15ZHVtbXljYTAgFw0yNTEyMDQxNzUwMDZa -GA85OTk5MTIzMTIzNTk1OVoweDELMAkGA1UEBhMCWFgxEjAQBgNVBAgMCVN0YXRl -TmFtZTERMA8GA1UEBwwIQ2l0eU5hbWUxFDASBgNVBAoMC0NvbXBhbnlOYW1lMRsw -GQYDVQQLDBJDb21wYW55U2VjdGlvbk5hbWUxDzANBgNVBAMMBmRvY2tlcjCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALmq454JVsP6T+OEcChKXu9zYODm -2m7WU5KKGgom4FgK44kGPNB6gbfUBOeFMbvoviEKb5ygfkwJpDECGbwGXuLMQjIk -wtZvJogAivk7TdRbP8sglKjnjTgG7SqUjmNykkMyk+9WSOcUGODhj9YRK9Qb2h9/ -eyI4iaZ1DQQgrSybPj5jw3d+sqRyUuvwiMbfOWe5n6CvRtDTqUII2gTGw5x86CEe -sCVdfkSn4FNjdBbnYz1UR41Pg4S8d3h9O+HLWNmOWej91ytga5pkuNcp2UmNKkNk -KLD3bFhnNKnvp3zgga17UsTiDefVxTiH9K197tQ+zr3b5bPs/UIYfA+InWzPyJlT -8cHmBQwVLPhWT+lMk1jZcc0Zwogf9Gd3USwuqAngW6C13b89Bk9dxdsw2xnydSGC -1CcOU6quQMai5BgOVhQqLLdYsjCQUFOa4Nqy7+pS4igYv19aIs3PpVJyKvEjf+jR -kFw7PvcQMyrNPVLo8JjqUUtw63pUY9RVCnkXUsixuLfhgLzEFUR9Qc/75tWoSQ4v -7UvNZdh+FPzVNJlWpCjqBos2sT5SuPcvif2L1Bs9rCdZsnhkQyCz7PpGfoeCtuD/ -ZaJuCp/P0WyiMaUbeCTqjLrFHvYqs5wg9rYEOfPACHYt+VL2qWVtiSx3Kc3M7LNb -a+lMwbxgzfpCsI9nAgMBAAGjQjBAMB0GA1UdDgQWBBQHLdxWoy+93fyw89lDXDkK -3Z4UUzAfBgNVHSMEGDAWgBRcG7rWKxU2uHJz9ZEMwStZi4oY5DANBgkqhkiG9w0B -AQsFAAOCAQEAoi+g+EmqtwFLMMvRNx/5TvdUhS57NRAxwYXDNtKrwXFMYBIXUgiu -fCltdVTh7toxL8S5of3icEYvd+zdZu3X5zKyBP67hujQ3zFem16x5U+Ux4/SWLxQ -LpwFlIw5bEmqsot/8nj8+RVfo8XcaVShSTQ4ie+wt0RqkUATwLkkEXGYyOyHzFtt -VxKhCVVwPnklT8bQ3LZOzzaiYs1lYoFBLSqnpkGyIB0vukXqaWkn4jOfg1u9hfKw -cKp9MK5Niko0eHf5lbFXudeYaKrrpzDFyeNx25CXyn/Yyx5Nhc/sd5teHUXYl3bU -k+l8/BV3MnOxCgxj9pjCz3grssKIJN9wuw== ------END CERTIFICATE----- diff --git a/.github/workflows/docker-setup/server.pem b/.github/workflows/docker-setup/server.pem deleted file mode 100644 index 0175740af5..0000000000 --- a/.github/workflows/docker-setup/server.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQC5quOeCVbD+k/j -hHAoSl7vc2Dg5tpu1lOSihoKJuBYCuOJBjzQeoG31ATnhTG76L4hCm+coH5MCaQx -Ahm8Bl7izEIyJMLWbyaIAIr5O03UWz/LIJSo5404Bu0qlI5jcpJDMpPvVkjnFBjg -4Y/WESvUG9off3siOImmdQ0EIK0smz4+Y8N3frKkclLr8IjG3zlnuZ+gr0bQ06lC -CNoExsOcfOghHrAlXX5Ep+BTY3QW52M9VEeNT4OEvHd4fTvhy1jZjlno/dcrYGua -ZLjXKdlJjSpDZCiw92xYZzSp76d84IGte1LE4g3n1cU4h/Stfe7UPs692+Wz7P1C -GHwPiJ1sz8iZU/HB5gUMFSz4Vk/pTJNY2XHNGcKIH/Rnd1EsLqgJ4Fugtd2/PQZP -XcXbMNsZ8nUhgtQnDlOqrkDGouQYDlYUKiy3WLIwkFBTmuDasu/qUuIoGL9fWiLN -z6VScirxI3/o0ZBcOz73EDMqzT1S6PCY6lFLcOt6VGPUVQp5F1LIsbi34YC8xBVE -fUHP++bVqEkOL+1LzWXYfhT81TSZVqQo6gaLNrE+Urj3L4n9i9QbPawnWbJ4ZEMg -s+z6Rn6Hgrbg/2Wibgqfz9FsojGlG3gk6oy6xR72KrOcIPa2BDnzwAh2LflS9qll -bYksdynNzOyzW2vpTMG8YM36QrCPZwIDAQABAoICAB3gCC15xeMATV0ysPQKuNPs -INPk0ZOxcP53XPvyiCQikbzkAA0bvpuxxfLq/7cDcEnTarotKPqwjSGa+5ZsVVWb -wFsJMetcieVVu7Ghf+3Xm6A3vIlLw5wW9o/kxN9DpD1OeiIHeZuVJEZV2oB7gC3q -fWKWxLLGSNU7/b2C9IU6RahhrSYhK5BCb7f/RZhFJZuHHCRi5RDdE13IxtarP6Et -MrzW5J5ejjQbPywBKMDhYpqPtnkKflhxawKRmX0aQfsKaMqQwyVQ/SokDYoG9dZb -8fJTaijE50N3ooW68PGrE7Kye/2qJ3VSdHWa4B1lJ3Tc1loTyWug3++EDmesIoha -EjQuNQ25n+FfCKUpBdXFzYrSNc8WNddHz0b1z0tadq4Pfj92m0mHngcS+zPQwHHt -1O9pqdH6Q2841Cmm2EclevYh874z6C7Fyr78zfpHC1SaJHX6R2Mt/+oleTUpjxwb -0OnnzdOIPZv0zd4uVtMQPjC3SOwPuem8fGexrckxzFDdAH8dXEBLzoSF+OI6AQW1 -YEMbaqpVRbVJwS9cA3I3hxBKUAIGOTxHu4fNBSPNgdF0eyO+dN3CukRvbBGfi3QZ -Tyip6LVu5ssPFgFVxqbQScnhakzQW1ao2PCUMGBWq72gPvmsUUuhXD3SpFOPInKX -q0nXetzXidasewMpT8iBAoIBAQD935Lix2icEie0OdW13SVl3SsTD2Crvk4rZwyY -myq9K3W5OhbQpn2ezLuXUDtQxaxiKXB4YpvWyox8GG1dx0z+kaqK5SZXzYiDMdkh -uO0Cp1OCrTnV/DZpSjvAXV5OfnZr/RPJaDhvT8kibtKIUQZ3svJhBxT50TPq8Tps -KkX+kQARpDI07j8E8yD1jp8/e/cXe6rcZZJ3AIEq2YZ7j46KNyznCqJTACUBmVgX -tl4++X4sW4o6zsc92RmuPAYCDwFntpIqSFAMV0+ywL0cyQMXUJp9BZpGtYkgS5Be -MC3++oHCOO+1tM1C/xtvG58a/zQg1zNM42qi5nVeZiM/KQFRAoIBAQC7OQylkmoF -3zRKLab43sZWbk5oeBQpRr07oqaVy6G4Y2p5gCTSNrPnhGlyDX4uYENM3jEwJ6fs -7M7rev09KvRaY7Sxt1zFDR3KiH9ndaJoYxt0asnYRS4NvYogztUpGuEPCs0ubClY -nHEIwAg3uYspg80uMstHR32CUbX0ZTIJ5UquWpixoxaWea/NSi7iui2uFH06iAFT -ar/KUc06y2Bv83qJsXRoKQ8xy7O7CV2ocu5aY0jkauvHWR6DTMgYGPKVyrDRQwOr -8pPYzqTxKamVcM1R4Yq59zCrYhaDFYd+TYz0WDOwa0z17Q1UoxFvcQYedbn+TLPy -r0SGhiUs0xc3AoIBAQDWnOvlPkGWvlpGJyYcychVpnRFdph4VzZpxoGFeJbWuCia -3xpuZHCJj/V9Ytvh2llx2ioz+thW6X99YIED5/mUsruDE1gonZ2rmrY9pcDmn2Ef -dSURWlb9Bz4fzk5s+MdPXvAdMTeUEdSsgRcFGcnn4qS3lW8MCOhk0mxbCBmHrDhs -sWuoB0fK/WV9cIX6+ubVOTwleNAqPYj0GlNvnNoYya/x2LGEjPi7s1AfK5Hclrks -8m2WbTtNc3wcKK3Di7/aVyKVD/BrnlvHdtvnu54bVY5j5hqXb9tuK7LtjLk1dbu/ -3rX129QxsMsWUDlebyM4J/Q8KXv6HexWUu209QshAoIBAE9LeVTC706vW2kzbq2n -RN+kdmb+vKNCx7DzUZTOGx+KU7VEFdRGwOmEhlh86H1h3f83eCPKF/Bb18OaYpk+ -kSGbaxN98reut3hpWXSLOQ73MtCazgRgQIInTdJZZ6SyMrH5RC+uNdDG6YToOFLJ -rewWW5d+geQdnkXMr8Dj/057o6a2zkcmKNHwlgnfqn3ylphNK0DYC5+17acWAFMv -ghfISpT46LGY+kt/2A6Wh+lpTBRSSrQbqOLUlvzLT1ANeOkCYOMwe+SeqAnCc8+E -csPNc9iDKwtaa22a7Kf2PV28IL/4f2Pv/jeGgAfhzOejOhE6kVzoRaq6ms5TEHms -qf8CggEBAJAIoRCE9ybPqjPeaXge2+JYp5wd+s54umkI4uufWa20R33+Yp0oxkIn -CpgxPH+jvgXRYFD+ZwpYVsAhdgN7j1o0JdthdWWyxT4yT5+XtM85bgWivtYVEJXr -q/a4kJB6LP+B4BujMvWK9gkLEa4t8CqD/MtVrFD0QE07aTyEhkDd1HNAUi/k0+0B -W2wfsqK2G03FVGnIijk4Ip8hwoR5cdP8MEs6PbcixR9XIByHH+qS2I3ImfeZRqPw -RHOQ1G7tt4Z5Rf8tzyZqWYRarehvNcf6FHw35PfTseQheTxSkfS9T9xtebCJu0Uh -4f7/1IN8kpQ8H9uar8/YmPYyP+jqXOk= ------END PRIVATE KEY-----