From 53c959657f56a29a56bf816262700cf19e430bbc Mon Sep 17 00:00:00 2001 From: Junwei Dai Date: Mon, 28 Oct 2024 11:34:25 -0700 Subject: [PATCH 1/6] Added the rest api spec comparison test Signed-off-by: Junwei Dai --- .../flowframework/util/ApiSpecFetcher.java | 2 +- .../workflow/CreateConnectorStepTests.java | 17 ++++++++++++++ .../RegisterLocalCustomModelStepTests.java | 22 ++++++++++++++----- ...RegisterLocalPretrainedModelStepTests.java | 22 ++++++++++++++----- ...sterLocalSparseEncodingModelStepTests.java | 22 ++++++++++++++----- .../workflow/RegisterModelGroupStepTests.java | 16 ++++++++++++++ .../RegisterRemoteModelStepTests.java | 20 ++++++++++++++--- 7 files changed, 102 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/opensearch/flowframework/util/ApiSpecFetcher.java b/src/main/java/org/opensearch/flowframework/util/ApiSpecFetcher.java index 80be71b65..b22bb4097 100644 --- a/src/main/java/org/opensearch/flowframework/util/ApiSpecFetcher.java +++ b/src/main/java/org/opensearch/flowframework/util/ApiSpecFetcher.java @@ -81,7 +81,7 @@ public static boolean compareRequiredFields(List requiredEnumParams, Str List requiredApiParams = schema.getRequired(); if (requiredApiParams != null && !requiredApiParams.isEmpty()) { - return new HashSet<>(requiredEnumParams).equals(new HashSet<>(requiredApiParams)); + return new HashSet<>(requiredEnumParams).containsAll(new HashSet<>(requiredApiParams)); } } return false; diff --git a/src/test/java/org/opensearch/flowframework/workflow/CreateConnectorStepTests.java b/src/test/java/org/opensearch/flowframework/workflow/CreateConnectorStepTests.java index dd9eb369d..5905f1bee 100644 --- a/src/test/java/org/opensearch/flowframework/workflow/CreateConnectorStepTests.java +++ b/src/test/java/org/opensearch/flowframework/workflow/CreateConnectorStepTests.java @@ -14,20 +14,24 @@ import org.opensearch.flowframework.common.CommonValue; import org.opensearch.flowframework.exception.FlowFrameworkException; import org.opensearch.flowframework.indices.FlowFrameworkIndicesHandler; +import org.opensearch.flowframework.util.ApiSpecFetcher; import org.opensearch.ml.client.MachineLearningNodeClient; import org.opensearch.ml.common.connector.ConnectorAction; import org.opensearch.ml.common.transport.connector.MLCreateConnectorInput; import org.opensearch.ml.common.transport.connector.MLCreateConnectorResponse; +import org.opensearch.rest.RestRequest; import org.opensearch.test.OpenSearchTestCase; import java.io.IOException; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import static org.opensearch.flowframework.common.CommonValue.ML_COMMONS_API_SPEC_YAML_URI; import static org.opensearch.flowframework.common.WorkflowResources.CONNECTOR_ID; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; @@ -134,4 +138,17 @@ public void testCreateConnectorFailure() throws IOException { assertEquals("Failed to create connector", ex.getCause().getMessage()); } + public void testApiSpecCreateConnectorInputParamComparison() throws Exception { + List requiredEnumParams = WorkflowStepFactory.WorkflowSteps.CREATE_CONNECTOR.inputs(); + + boolean isMatch = ApiSpecFetcher.compareRequiredFields( + requiredEnumParams, + ML_COMMONS_API_SPEC_YAML_URI, + "/_plugins/_ml/connectors/_create", + RestRequest.Method.POST + ); + + assertTrue(isMatch); + } + } diff --git a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalCustomModelStepTests.java b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalCustomModelStepTests.java index 6a6809d07..3b6bddde3 100644 --- a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalCustomModelStepTests.java +++ b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalCustomModelStepTests.java @@ -20,11 +20,13 @@ import org.opensearch.flowframework.exception.FlowFrameworkException; import org.opensearch.flowframework.exception.WorkflowStepException; import org.opensearch.flowframework.indices.FlowFrameworkIndicesHandler; +import org.opensearch.flowframework.util.ApiSpecFetcher; import org.opensearch.ml.client.MachineLearningNodeClient; import org.opensearch.ml.common.MLTask; import org.opensearch.ml.common.MLTaskState; import org.opensearch.ml.common.transport.register.MLRegisterModelInput; import org.opensearch.ml.common.transport.register.MLRegisterModelResponse; +import org.opensearch.rest.RestRequest; import org.opensearch.test.OpenSearchTestCase; import org.opensearch.threadpool.ScalingExecutorBuilder; import org.opensearch.threadpool.TestThreadPool; @@ -33,6 +35,7 @@ import java.io.IOException; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -41,11 +44,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import static org.opensearch.flowframework.common.CommonValue.DEPLOY_FIELD; -import static org.opensearch.flowframework.common.CommonValue.FLOW_FRAMEWORK_THREAD_POOL_PREFIX; -import static org.opensearch.flowframework.common.CommonValue.PROVISION_WORKFLOW_THREAD_POOL; -import static org.opensearch.flowframework.common.CommonValue.REGISTER_MODEL_STATUS; -import static org.opensearch.flowframework.common.CommonValue.WORKFLOW_THREAD_POOL; +import static org.opensearch.flowframework.common.CommonValue.*; import static org.opensearch.flowframework.common.WorkflowResources.MODEL_GROUP_ID; import static org.opensearch.flowframework.common.WorkflowResources.MODEL_ID; import static org.mockito.ArgumentMatchers.any; @@ -398,4 +397,17 @@ public void testBoolParseFail() throws IOException, ExecutionException, Interrup assertEquals("Failed to parse value [no] as only [true] or [false] are allowed.", w.getMessage()); assertEquals(RestStatus.BAD_REQUEST, w.getRestStatus()); } + + public void testApiSpecRegisterLocalCustomModelInputParamComparison() throws Exception { + List requiredEnumParams = WorkflowStepFactory.WorkflowSteps.REGISTER_LOCAL_CUSTOM_MODEL.inputs(); + + boolean isMatch = ApiSpecFetcher.compareRequiredFields( + requiredEnumParams, + ML_COMMONS_API_SPEC_YAML_URI, + "/_plugins/_ml/models/_register", + RestRequest.Method.POST + ); + + assertTrue(isMatch); + } } diff --git a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalPretrainedModelStepTests.java b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalPretrainedModelStepTests.java index 162b97dba..e91a3d168 100644 --- a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalPretrainedModelStepTests.java +++ b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalPretrainedModelStepTests.java @@ -20,11 +20,13 @@ import org.opensearch.flowframework.exception.FlowFrameworkException; import org.opensearch.flowframework.exception.WorkflowStepException; import org.opensearch.flowframework.indices.FlowFrameworkIndicesHandler; +import org.opensearch.flowframework.util.ApiSpecFetcher; import org.opensearch.ml.client.MachineLearningNodeClient; import org.opensearch.ml.common.MLTask; import org.opensearch.ml.common.MLTaskState; import org.opensearch.ml.common.transport.register.MLRegisterModelInput; import org.opensearch.ml.common.transport.register.MLRegisterModelResponse; +import org.opensearch.rest.RestRequest; import org.opensearch.test.OpenSearchTestCase; import org.opensearch.threadpool.ScalingExecutorBuilder; import org.opensearch.threadpool.TestThreadPool; @@ -33,6 +35,7 @@ import java.io.IOException; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -40,11 +43,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import static org.opensearch.flowframework.common.CommonValue.DEPLOY_FIELD; -import static org.opensearch.flowframework.common.CommonValue.FLOW_FRAMEWORK_THREAD_POOL_PREFIX; -import static org.opensearch.flowframework.common.CommonValue.PROVISION_WORKFLOW_THREAD_POOL; -import static org.opensearch.flowframework.common.CommonValue.REGISTER_MODEL_STATUS; -import static org.opensearch.flowframework.common.CommonValue.WORKFLOW_THREAD_POOL; +import static org.opensearch.flowframework.common.CommonValue.*; import static org.opensearch.flowframework.common.WorkflowResources.MODEL_GROUP_ID; import static org.opensearch.flowframework.common.WorkflowResources.MODEL_ID; import static org.mockito.ArgumentMatchers.any; @@ -303,4 +302,17 @@ public void testBoolParseFail() throws IOException, ExecutionException, Interrup assertEquals("Failed to parse value [no] as only [true] or [false] are allowed.", w.getMessage()); assertEquals(RestStatus.BAD_REQUEST, w.getRestStatus()); } + + public void testApiSpecRegisterLocalPretrainedModelInputParamComparison() throws Exception { + List requiredEnumParams = WorkflowStepFactory.WorkflowSteps.REGISTER_LOCAL_PRETRAINED_MODEL.inputs(); + + boolean isMatch = ApiSpecFetcher.compareRequiredFields( + requiredEnumParams, + ML_COMMONS_API_SPEC_YAML_URI, + "/_plugins/_ml/models/_register", + RestRequest.Method.POST + ); + + assertTrue(isMatch); + } } diff --git a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalSparseEncodingModelStepTests.java b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalSparseEncodingModelStepTests.java index 79d7bb883..297d173fc 100644 --- a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalSparseEncodingModelStepTests.java +++ b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalSparseEncodingModelStepTests.java @@ -20,11 +20,13 @@ import org.opensearch.flowframework.exception.FlowFrameworkException; import org.opensearch.flowframework.exception.WorkflowStepException; import org.opensearch.flowframework.indices.FlowFrameworkIndicesHandler; +import org.opensearch.flowframework.util.ApiSpecFetcher; import org.opensearch.ml.client.MachineLearningNodeClient; import org.opensearch.ml.common.MLTask; import org.opensearch.ml.common.MLTaskState; import org.opensearch.ml.common.transport.register.MLRegisterModelInput; import org.opensearch.ml.common.transport.register.MLRegisterModelResponse; +import org.opensearch.rest.RestRequest; import org.opensearch.test.OpenSearchTestCase; import org.opensearch.threadpool.ScalingExecutorBuilder; import org.opensearch.threadpool.TestThreadPool; @@ -33,6 +35,7 @@ import java.io.IOException; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -40,11 +43,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import static org.opensearch.flowframework.common.CommonValue.DEPLOY_FIELD; -import static org.opensearch.flowframework.common.CommonValue.FLOW_FRAMEWORK_THREAD_POOL_PREFIX; -import static org.opensearch.flowframework.common.CommonValue.PROVISION_WORKFLOW_THREAD_POOL; -import static org.opensearch.flowframework.common.CommonValue.REGISTER_MODEL_STATUS; -import static org.opensearch.flowframework.common.CommonValue.WORKFLOW_THREAD_POOL; +import static org.opensearch.flowframework.common.CommonValue.*; import static org.opensearch.flowframework.common.WorkflowResources.MODEL_GROUP_ID; import static org.opensearch.flowframework.common.WorkflowResources.MODEL_ID; import static org.mockito.ArgumentMatchers.any; @@ -310,4 +309,17 @@ public void testBoolParseFail() throws IOException, ExecutionException, Interrup assertEquals("Failed to parse value [no] as only [true] or [false] are allowed.", w.getMessage()); assertEquals(RestStatus.BAD_REQUEST, w.getRestStatus()); } + + public void testApiSpecRegisterLocalSparseEncodingModelInputParamComparison() throws Exception { + List requiredEnumParams = WorkflowStepFactory.WorkflowSteps.REGISTER_LOCAL_SPARSE_ENCODING_MODEL.inputs(); + + boolean isMatch = ApiSpecFetcher.compareRequiredFields( + requiredEnumParams, + ML_COMMONS_API_SPEC_YAML_URI, + "/_plugins/_ml/models/_register", + RestRequest.Method.POST + ); + + assertTrue(isMatch); + } } diff --git a/src/test/java/org/opensearch/flowframework/workflow/RegisterModelGroupStepTests.java b/src/test/java/org/opensearch/flowframework/workflow/RegisterModelGroupStepTests.java index 7f7adf44b..54cc10680 100644 --- a/src/test/java/org/opensearch/flowframework/workflow/RegisterModelGroupStepTests.java +++ b/src/test/java/org/opensearch/flowframework/workflow/RegisterModelGroupStepTests.java @@ -14,11 +14,13 @@ import org.opensearch.flowframework.exception.FlowFrameworkException; import org.opensearch.flowframework.exception.WorkflowStepException; import org.opensearch.flowframework.indices.FlowFrameworkIndicesHandler; +import org.opensearch.flowframework.util.ApiSpecFetcher; import org.opensearch.ml.client.MachineLearningNodeClient; import org.opensearch.ml.common.AccessMode; import org.opensearch.ml.common.MLTaskState; import org.opensearch.ml.common.transport.model_group.MLRegisterModelGroupInput; import org.opensearch.ml.common.transport.model_group.MLRegisterModelGroupResponse; +import org.opensearch.rest.RestRequest; import org.opensearch.test.OpenSearchTestCase; import java.io.IOException; @@ -31,6 +33,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import static org.opensearch.flowframework.common.CommonValue.ML_COMMONS_API_SPEC_YAML_URI; import static org.opensearch.flowframework.common.CommonValue.MODEL_GROUP_STATUS; import static org.opensearch.flowframework.common.WorkflowResources.MODEL_GROUP_ID; import static org.mockito.ArgumentMatchers.any; @@ -204,4 +207,17 @@ public void testBoolParseFail() throws IOException, ExecutionException, Interrup assertEquals("Failed to parse value [no] as only [true] or [false] are allowed.", w.getMessage()); assertEquals(RestStatus.BAD_REQUEST, w.getRestStatus()); } + + public void testApiSpecRegisterModelGroupInputParamComparison() throws Exception { + List requiredEnumParams = WorkflowStepFactory.WorkflowSteps.REGISTER_MODEL_GROUP.inputs(); + + boolean isMatch = ApiSpecFetcher.compareRequiredFields( + requiredEnumParams, + ML_COMMONS_API_SPEC_YAML_URI, + "/_plugins/_ml/model_groups/_register", + RestRequest.Method.POST + ); + + assertTrue(isMatch); + } } diff --git a/src/test/java/org/opensearch/flowframework/workflow/RegisterRemoteModelStepTests.java b/src/test/java/org/opensearch/flowframework/workflow/RegisterRemoteModelStepTests.java index 0e2ab91e9..cb4feb7c7 100644 --- a/src/test/java/org/opensearch/flowframework/workflow/RegisterRemoteModelStepTests.java +++ b/src/test/java/org/opensearch/flowframework/workflow/RegisterRemoteModelStepTests.java @@ -17,15 +17,18 @@ import org.opensearch.flowframework.exception.FlowFrameworkException; import org.opensearch.flowframework.exception.WorkflowStepException; import org.opensearch.flowframework.indices.FlowFrameworkIndicesHandler; +import org.opensearch.flowframework.util.ApiSpecFetcher; import org.opensearch.ml.client.MachineLearningNodeClient; import org.opensearch.ml.common.MLTaskState; import org.opensearch.ml.common.transport.register.MLRegisterModelInput; import org.opensearch.ml.common.transport.register.MLRegisterModelResponse; +import org.opensearch.rest.RestRequest; import org.opensearch.test.OpenSearchTestCase; import org.opensearch.transport.RemoteTransportException; import java.io.IOException; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicInteger; @@ -33,9 +36,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import static org.opensearch.flowframework.common.CommonValue.DEPLOY_FIELD; -import static org.opensearch.flowframework.common.CommonValue.INTERFACE_FIELD; -import static org.opensearch.flowframework.common.CommonValue.REGISTER_MODEL_STATUS; +import static org.opensearch.flowframework.common.CommonValue.*; import static org.opensearch.flowframework.common.WorkflowResources.CONNECTOR_ID; import static org.opensearch.flowframework.common.WorkflowResources.MODEL_ID; import static org.mockito.ArgumentMatchers.any; @@ -416,4 +417,17 @@ public void testBoolParseFail() throws IOException, ExecutionException, Interrup assertEquals("Failed to parse value [yes] as only [true] or [false] are allowed.", w.getMessage()); assertEquals(RestStatus.BAD_REQUEST, w.getRestStatus()); } + + public void testApiSpecRegisterRemoteModelInputParamComparison() throws Exception { + List requiredEnumParams = WorkflowStepFactory.WorkflowSteps.REGISTER_REMOTE_MODEL.inputs(); + + boolean isMatch = ApiSpecFetcher.compareRequiredFields( + requiredEnumParams, + ML_COMMONS_API_SPEC_YAML_URI, + "/_plugins/_ml/model_groups/_register", + RestRequest.Method.POST + ); + + assertTrue(isMatch); + } } From 09962f276286160e3b153c1260569c7b3486dd07 Mon Sep 17 00:00:00 2001 From: Junwei Dai Date: Mon, 28 Oct 2024 13:31:39 -0700 Subject: [PATCH 2/6] Added github Action to run api consistency test daily Signed-off-by: Junwei Dai --- .github/workflows/test-api-consistency.yml | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/test-api-consistency.yml diff --git a/.github/workflows/test-api-consistency.yml b/.github/workflows/test-api-consistency.yml new file mode 100644 index 000000000..9c1bd4204 --- /dev/null +++ b/.github/workflows/test-api-consistency.yml @@ -0,0 +1,25 @@ +name: Daily API Consistency Test + +on: + schedule: + - cron: '0 8 * * *' # Runs daily at 8 AM UTC + +jobs: + API-consistency-test: + runs-on: ubuntu-latest + strategy: + matrix: + java: [21] + + steps: + - name: Checkout Flow Framework + uses: actions/checkout@v3 + + - name: Setup Java ${{ matrix.java }} + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: ${{ matrix.java }} + + - name: Run API Consistency Tests + run: ./gradlew test --tests "org.opensearch.flowframework.workflow.*" From 7065f55a3459f75feb3279a735342a3b08129225 Mon Sep 17 00:00:00 2001 From: Junwei Dai Date: Mon, 28 Oct 2024 13:48:44 -0700 Subject: [PATCH 3/6] fix formating issue Signed-off-by: Junwei Dai --- .../flowframework/workflow/CreateConnectorStepTests.java | 8 ++++---- .../workflow/RegisterLocalCustomModelStepTests.java | 8 ++++---- .../workflow/RegisterLocalPretrainedModelStepTests.java | 8 ++++---- .../RegisterLocalSparseEncodingModelStepTests.java | 8 ++++---- .../workflow/RegisterModelGroupStepTests.java | 8 ++++---- .../workflow/RegisterRemoteModelStepTests.java | 8 ++++---- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/test/java/org/opensearch/flowframework/workflow/CreateConnectorStepTests.java b/src/test/java/org/opensearch/flowframework/workflow/CreateConnectorStepTests.java index 5905f1bee..3ed8d15ec 100644 --- a/src/test/java/org/opensearch/flowframework/workflow/CreateConnectorStepTests.java +++ b/src/test/java/org/opensearch/flowframework/workflow/CreateConnectorStepTests.java @@ -142,10 +142,10 @@ public void testApiSpecCreateConnectorInputParamComparison() throws Exception { List requiredEnumParams = WorkflowStepFactory.WorkflowSteps.CREATE_CONNECTOR.inputs(); boolean isMatch = ApiSpecFetcher.compareRequiredFields( - requiredEnumParams, - ML_COMMONS_API_SPEC_YAML_URI, - "/_plugins/_ml/connectors/_create", - RestRequest.Method.POST + requiredEnumParams, + ML_COMMONS_API_SPEC_YAML_URI, + "/_plugins/_ml/connectors/_create", + RestRequest.Method.POST ); assertTrue(isMatch); diff --git a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalCustomModelStepTests.java b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalCustomModelStepTests.java index 3b6bddde3..2502b99d4 100644 --- a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalCustomModelStepTests.java +++ b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalCustomModelStepTests.java @@ -402,10 +402,10 @@ public void testApiSpecRegisterLocalCustomModelInputParamComparison() throws Exc List requiredEnumParams = WorkflowStepFactory.WorkflowSteps.REGISTER_LOCAL_CUSTOM_MODEL.inputs(); boolean isMatch = ApiSpecFetcher.compareRequiredFields( - requiredEnumParams, - ML_COMMONS_API_SPEC_YAML_URI, - "/_plugins/_ml/models/_register", - RestRequest.Method.POST + requiredEnumParams, + ML_COMMONS_API_SPEC_YAML_URI, + "/_plugins/_ml/models/_register", + RestRequest.Method.POST ); assertTrue(isMatch); diff --git a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalPretrainedModelStepTests.java b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalPretrainedModelStepTests.java index e91a3d168..4a1f071b5 100644 --- a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalPretrainedModelStepTests.java +++ b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalPretrainedModelStepTests.java @@ -307,10 +307,10 @@ public void testApiSpecRegisterLocalPretrainedModelInputParamComparison() throws List requiredEnumParams = WorkflowStepFactory.WorkflowSteps.REGISTER_LOCAL_PRETRAINED_MODEL.inputs(); boolean isMatch = ApiSpecFetcher.compareRequiredFields( - requiredEnumParams, - ML_COMMONS_API_SPEC_YAML_URI, - "/_plugins/_ml/models/_register", - RestRequest.Method.POST + requiredEnumParams, + ML_COMMONS_API_SPEC_YAML_URI, + "/_plugins/_ml/models/_register", + RestRequest.Method.POST ); assertTrue(isMatch); diff --git a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalSparseEncodingModelStepTests.java b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalSparseEncodingModelStepTests.java index 297d173fc..c5598ea9a 100644 --- a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalSparseEncodingModelStepTests.java +++ b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalSparseEncodingModelStepTests.java @@ -314,10 +314,10 @@ public void testApiSpecRegisterLocalSparseEncodingModelInputParamComparison() th List requiredEnumParams = WorkflowStepFactory.WorkflowSteps.REGISTER_LOCAL_SPARSE_ENCODING_MODEL.inputs(); boolean isMatch = ApiSpecFetcher.compareRequiredFields( - requiredEnumParams, - ML_COMMONS_API_SPEC_YAML_URI, - "/_plugins/_ml/models/_register", - RestRequest.Method.POST + requiredEnumParams, + ML_COMMONS_API_SPEC_YAML_URI, + "/_plugins/_ml/models/_register", + RestRequest.Method.POST ); assertTrue(isMatch); diff --git a/src/test/java/org/opensearch/flowframework/workflow/RegisterModelGroupStepTests.java b/src/test/java/org/opensearch/flowframework/workflow/RegisterModelGroupStepTests.java index 54cc10680..05eeb8500 100644 --- a/src/test/java/org/opensearch/flowframework/workflow/RegisterModelGroupStepTests.java +++ b/src/test/java/org/opensearch/flowframework/workflow/RegisterModelGroupStepTests.java @@ -212,10 +212,10 @@ public void testApiSpecRegisterModelGroupInputParamComparison() throws Exception List requiredEnumParams = WorkflowStepFactory.WorkflowSteps.REGISTER_MODEL_GROUP.inputs(); boolean isMatch = ApiSpecFetcher.compareRequiredFields( - requiredEnumParams, - ML_COMMONS_API_SPEC_YAML_URI, - "/_plugins/_ml/model_groups/_register", - RestRequest.Method.POST + requiredEnumParams, + ML_COMMONS_API_SPEC_YAML_URI, + "/_plugins/_ml/model_groups/_register", + RestRequest.Method.POST ); assertTrue(isMatch); diff --git a/src/test/java/org/opensearch/flowframework/workflow/RegisterRemoteModelStepTests.java b/src/test/java/org/opensearch/flowframework/workflow/RegisterRemoteModelStepTests.java index cb4feb7c7..275eab475 100644 --- a/src/test/java/org/opensearch/flowframework/workflow/RegisterRemoteModelStepTests.java +++ b/src/test/java/org/opensearch/flowframework/workflow/RegisterRemoteModelStepTests.java @@ -422,10 +422,10 @@ public void testApiSpecRegisterRemoteModelInputParamComparison() throws Exceptio List requiredEnumParams = WorkflowStepFactory.WorkflowSteps.REGISTER_REMOTE_MODEL.inputs(); boolean isMatch = ApiSpecFetcher.compareRequiredFields( - requiredEnumParams, - ML_COMMONS_API_SPEC_YAML_URI, - "/_plugins/_ml/model_groups/_register", - RestRequest.Method.POST + requiredEnumParams, + ML_COMMONS_API_SPEC_YAML_URI, + "/_plugins/_ml/model_groups/_register", + RestRequest.Method.POST ); assertTrue(isMatch); From 72f2fc49f8aec6eb832c79db76aca9a3fa720e39 Mon Sep 17 00:00:00 2001 From: Junwei Dai Date: Mon, 28 Oct 2024 13:51:31 -0700 Subject: [PATCH 4/6] add change log Signed-off-by: Junwei Dai --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index adf7b3209..47f6edd5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) ### Features - Add ApiSpecFetcher for Fetching and Comparing API Specifications ([#651](https://github.com/opensearch-project/flow-framework/issues/651)) - Add optional config field to tool step ([#899](https://github.com/opensearch-project/flow-framework/pull/899)) +- Add API Consistency Tests with ML-Common and Set Up Daily GitHub Action Trigger([#908](https://github.com/opensearch-project/flow-framework/issues/908)) ### Enhancements - Incrementally remove resources from workflow state during deprovisioning ([#898](https://github.com/opensearch-project/flow-framework/pull/898)) From 96bcd36f6c3752c9d42868fdbae6e531f5632522 Mon Sep 17 00:00:00 2001 From: Junwei Dai Date: Mon, 28 Oct 2024 14:14:01 -0700 Subject: [PATCH 5/6] fix *import Signed-off-by: Junwei Dai --- .../workflow/RegisterLocalCustomModelStepTests.java | 7 ++++++- .../workflow/RegisterLocalPretrainedModelStepTests.java | 7 ++++++- .../RegisterLocalSparseEncodingModelStepTests.java | 7 ++++++- .../workflow/RegisterRemoteModelStepTests.java | 5 ++++- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalCustomModelStepTests.java b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalCustomModelStepTests.java index 2502b99d4..d42a1ae21 100644 --- a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalCustomModelStepTests.java +++ b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalCustomModelStepTests.java @@ -44,7 +44,12 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import static org.opensearch.flowframework.common.CommonValue.*; +import static org.opensearch.flowframework.common.CommonValue.DEPLOY_FIELD; +import static org.opensearch.flowframework.common.CommonValue.FLOW_FRAMEWORK_THREAD_POOL_PREFIX; +import static org.opensearch.flowframework.common.CommonValue.ML_COMMONS_API_SPEC_YAML_URI; +import static org.opensearch.flowframework.common.CommonValue.PROVISION_WORKFLOW_THREAD_POOL; +import static org.opensearch.flowframework.common.CommonValue.REGISTER_MODEL_STATUS; +import static org.opensearch.flowframework.common.CommonValue.WORKFLOW_THREAD_POOL; import static org.opensearch.flowframework.common.WorkflowResources.MODEL_GROUP_ID; import static org.opensearch.flowframework.common.WorkflowResources.MODEL_ID; import static org.mockito.ArgumentMatchers.any; diff --git a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalPretrainedModelStepTests.java b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalPretrainedModelStepTests.java index 4a1f071b5..a0ef430b9 100644 --- a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalPretrainedModelStepTests.java +++ b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalPretrainedModelStepTests.java @@ -43,7 +43,12 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import static org.opensearch.flowframework.common.CommonValue.*; +import static org.opensearch.flowframework.common.CommonValue.DEPLOY_FIELD; +import static org.opensearch.flowframework.common.CommonValue.FLOW_FRAMEWORK_THREAD_POOL_PREFIX; +import static org.opensearch.flowframework.common.CommonValue.ML_COMMONS_API_SPEC_YAML_URI; +import static org.opensearch.flowframework.common.CommonValue.PROVISION_WORKFLOW_THREAD_POOL; +import static org.opensearch.flowframework.common.CommonValue.REGISTER_MODEL_STATUS; +import static org.opensearch.flowframework.common.CommonValue.WORKFLOW_THREAD_POOL; import static org.opensearch.flowframework.common.WorkflowResources.MODEL_GROUP_ID; import static org.opensearch.flowframework.common.WorkflowResources.MODEL_ID; import static org.mockito.ArgumentMatchers.any; diff --git a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalSparseEncodingModelStepTests.java b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalSparseEncodingModelStepTests.java index c5598ea9a..e3157b20b 100644 --- a/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalSparseEncodingModelStepTests.java +++ b/src/test/java/org/opensearch/flowframework/workflow/RegisterLocalSparseEncodingModelStepTests.java @@ -43,7 +43,12 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import static org.opensearch.flowframework.common.CommonValue.*; +import static org.opensearch.flowframework.common.CommonValue.DEPLOY_FIELD; +import static org.opensearch.flowframework.common.CommonValue.FLOW_FRAMEWORK_THREAD_POOL_PREFIX; +import static org.opensearch.flowframework.common.CommonValue.ML_COMMONS_API_SPEC_YAML_URI; +import static org.opensearch.flowframework.common.CommonValue.PROVISION_WORKFLOW_THREAD_POOL; +import static org.opensearch.flowframework.common.CommonValue.REGISTER_MODEL_STATUS; +import static org.opensearch.flowframework.common.CommonValue.WORKFLOW_THREAD_POOL; import static org.opensearch.flowframework.common.WorkflowResources.MODEL_GROUP_ID; import static org.opensearch.flowframework.common.WorkflowResources.MODEL_ID; import static org.mockito.ArgumentMatchers.any; diff --git a/src/test/java/org/opensearch/flowframework/workflow/RegisterRemoteModelStepTests.java b/src/test/java/org/opensearch/flowframework/workflow/RegisterRemoteModelStepTests.java index 275eab475..362601264 100644 --- a/src/test/java/org/opensearch/flowframework/workflow/RegisterRemoteModelStepTests.java +++ b/src/test/java/org/opensearch/flowframework/workflow/RegisterRemoteModelStepTests.java @@ -36,7 +36,10 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import static org.opensearch.flowframework.common.CommonValue.*; +import static org.opensearch.flowframework.common.CommonValue.DEPLOY_FIELD; +import static org.opensearch.flowframework.common.CommonValue.INTERFACE_FIELD; +import static org.opensearch.flowframework.common.CommonValue.ML_COMMONS_API_SPEC_YAML_URI; +import static org.opensearch.flowframework.common.CommonValue.REGISTER_MODEL_STATUS; import static org.opensearch.flowframework.common.WorkflowResources.CONNECTOR_ID; import static org.opensearch.flowframework.common.WorkflowResources.MODEL_ID; import static org.mockito.ArgumentMatchers.any; From 0c73128248dbad2b5de6c6efff91f0a70d333128 Mon Sep 17 00:00:00 2001 From: Junwei Dai Date: Fri, 1 Nov 2024 09:53:46 -0700 Subject: [PATCH 6/6] addrssed all comment Signed-off-by: Junwei Dai --- .github/workflows/test-api-consistency.yml | 1 + .../java/org/opensearch/flowframework/util/ApiSpecFetcher.java | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-api-consistency.yml b/.github/workflows/test-api-consistency.yml index 9c1bd4204..4c71b4d3b 100644 --- a/.github/workflows/test-api-consistency.yml +++ b/.github/workflows/test-api-consistency.yml @@ -3,6 +3,7 @@ name: Daily API Consistency Test on: schedule: - cron: '0 8 * * *' # Runs daily at 8 AM UTC + workflow_dispatch: jobs: API-consistency-test: diff --git a/src/main/java/org/opensearch/flowframework/util/ApiSpecFetcher.java b/src/main/java/org/opensearch/flowframework/util/ApiSpecFetcher.java index b22bb4097..12630b6c3 100644 --- a/src/main/java/org/opensearch/flowframework/util/ApiSpecFetcher.java +++ b/src/main/java/org/opensearch/flowframework/util/ApiSpecFetcher.java @@ -14,7 +14,6 @@ import org.opensearch.flowframework.exception.ApiSpecParseException; import org.opensearch.rest.RestRequest; -import java.util.HashSet; import java.util.List; import io.swagger.v3.oas.models.OpenAPI; @@ -81,7 +80,7 @@ public static boolean compareRequiredFields(List requiredEnumParams, Str List requiredApiParams = schema.getRequired(); if (requiredApiParams != null && !requiredApiParams.isEmpty()) { - return new HashSet<>(requiredEnumParams).containsAll(new HashSet<>(requiredApiParams)); + return requiredApiParams.stream().allMatch(requiredEnumParams::contains); } } return false;