From 5dbcbaf292c31767b33eae179aff868c5e3d5af1 Mon Sep 17 00:00:00 2001 From: Sachin Sahu <75629410+SachinSahu431@users.noreply.github.com> Date: Thu, 7 Dec 2023 02:18:02 +0530 Subject: [PATCH 01/11] Release notes automation (#4196) Signed-off-by: Sachin Sahu --- .gitignore | 1 + Pipfile | 1 + Pipfile.lock | 14 +- src/release_notes_workflow/README.md | 72 ++++++- src/release_notes_workflow/release_notes.py | 27 ++- .../release_notes_check_args.py | 2 +- .../release_notes_component.py | 27 ++- src/run_releasenotes_check.py | 182 +++++++++++++++++- tests/data/opensearch-test-main.yml | 16 ++ .../test_release_notes.py | 19 +- .../test_releasenotes_check_args.py | 13 ++ 11 files changed, 344 insertions(+), 30 deletions(-) create mode 100644 tests/data/opensearch-test-main.yml diff --git a/.gitignore b/.gitignore index c5b7406016..10f3751b51 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,4 @@ out.txt vars/ test-report.yml +src/release_notes_workflow/results/* diff --git a/Pipfile b/Pipfile index 328cad7677..0b66bef510 100644 --- a/Pipfile +++ b/Pipfile @@ -38,6 +38,7 @@ typed-ast = "~=1.5.4" zipp = "~=3.8.1" importlib-metadata = "~=4.12.0" ruamel-yaml = "~=0.17.21" +mistune = "~=3.0.1" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index 97bdeab8f0..5b493148b7 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "c7967cf4ead64b6ca007013a5dd53dd22a044683b5cc7c2e1dd6c375a91e483d" + "sha256": "2693fe85022b7e3a58a900e44ed03c8e635808fef6186077c6a9e9c8e359833f" }, "pipfile-spec": 6, "requires": { @@ -67,7 +67,7 @@ "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f" ], - "markers": "python_version >= '3.6'", + "markers": "python_full_version >= '3.6.0'", "version": "==2.1.1" }, "click": { @@ -226,6 +226,14 @@ ], "version": "==0.6.1" }, + "mistune": { + "hashes": [ + "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205", + "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8" + ], + "index": "pypi", + "version": "==3.0.2" + }, "mypy": { "hashes": [ "sha256:02ef476f6dcb86e6f502ae39a16b93285fef97e7f1ff22932b657d1ef1f28655", @@ -564,7 +572,7 @@ "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" ], - "markers": "python_version >= '3.7'", + "markers": "python_version < '3.11'", "version": "==2.0.1" }, "typed-ast": { diff --git a/src/release_notes_workflow/README.md b/src/release_notes_workflow/README.md index e8a3e66c38..9348d0a6d5 100644 --- a/src/release_notes_workflow/README.md +++ b/src/release_notes_workflow/README.md @@ -1,13 +1,19 @@ -#### Components Release Notes Check +- [Consolidated Release Notes Automation](#consolidated-release-notes-automation) + - [Components Release Notes Check](#components-release-notes-check) + - [Consolidated Release Notes](#consolidated-release-notes) + +## Consolidated Release Notes + +### Components Release Notes Check Pulls the latest code to check if the release notes exists and whether new commits have been made based on user passed argument `--date`. Outputs a formated markdown table as follows. -*Usage* +#### Usage ``` ./release_notes.sh check manifests/3.0.0/opensearch-3.0.0.yml --date 2022-07-26 ``` -*Sample Output* +#### Sample Output ``` # OpenSearch CommitID(after 2022-07-26) & Release Notes info | Repo | Branch |CommitID|Commit Date|Release Notes| @@ -25,7 +31,7 @@ Pulls the latest code to check if the release notes exists and whether new commi The workflow uses the following arguments: * `--date`: To check if commit exists after a specific date (in format yyyy-mm-dd, example 2022-07-26). -* `--output`: To dump the output into an `.md` file, example `--output table.md`). +* `--output`: To dump the output into an `.md` file, example `--output table.md`. The following options are available. @@ -35,3 +41,61 @@ The following options are available. | --date | Shows commit after a specific date. | | --output | Saves the table output to user specified file. | | -v, --verbose | Show more verbose output. | + +### Consolidated Release Notes + +This workflow generates a consolidated release notes for all the components. +It utilizes the output from the preceding step to compile these consolidated release notes. If the preceding step hasn't been executed, it will automatically run that step first before generating the consolidated release notes. + +#### Usage +``` +./release_notes.sh compile manifests/3.0.0/opensearch-3.0.0.yml --date 2022-07-26 +``` + +#### Sample Output +Two output files are generated: +- Markdown table containing links to individual components' release notes for quick reference (Example: `release_notes_table-2.10.0.md`) +- Consolidated release notes for all the components (Example: `release_notes-2.10.0.md`) + +
+Markdown table with links + +# OpenSearch CommitID(after 2022-07-26) & Release Notes info +| Repo | Branch |CommitID|Commit Date|Release Notes Exists| URL | +|-------------------------|---------------|--------|-----------|--------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------| +|alerting |[tags/2.10.0.0]|dc1b9bf |2023-09-18 |True |https://raw.githubusercontent.com/opensearch-project/alerting/2.10.0.0/release-notes/opensearch-alerting.release-notes-2.10.0.0.md | +|anomaly-detection |[tags/2.10.0.0]|bc4d8b1 |2023-09-08 |True |https://raw.githubusercontent.com/opensearch-project/anomaly-detection/2.10.0.0/release-notes/opensearch-anomaly-detection.release-notes-2.10.0.0.md | +|asynchronous-search |[tags/2.10.0.0]|a312d9a |2023-09-07 |True |https://raw.githubusercontent.com/opensearch-project/asynchronous-search/2.10.0.0/release-notes/opensearch-asynchronous-search.release-notes-2.10.0.0.md | +|common-utils |[tags/2.10.0.0]|0352c2f |2023-09-08 |True |https://raw.githubusercontent.com/opensearch-project/common-utils/2.10.0.0/release-notes/opensearch-common-utils.release-notes-2.10.0.0.md | +|cross-cluster-replication|[tags/2.10.0.0]|dee2f60 |2023-09-08 |True |https://raw.githubusercontent.com/opensearch-project/cross-cluster-replication/2.10.0.0/release-notes/opensearch-cross-cluster-replication.release-notes-2.10.0.0.md| +|custom-codecs |[tags/2.10.0.0]|3437b43 |2023-09-15 |True |https://raw.githubusercontent.com/opensearch-project/custom-codecs/2.10.0.0/release-notes/opensearch-custom-codecs.release-notes-2.10.0.0.md | +|geospatial |[tags/2.10.0.0]|a3da222 |2023-09-12 |True |https://raw.githubusercontent.com/opensearch-project/geospatial/2.10.0.0/release-notes/opensearch-geospatial.release-notes-2.10.0.0.md | +|index-management |[tags/2.10.0.0]|062badd |2023-09-07 |True |https://raw.githubusercontent.com/opensearch-project/index-management/2.10.0.0/release-notes/opensearch-index-management.release-notes-2.10.0.0.md | +|job-scheduler |[tags/2.10.0.0]|e9d3637 |2023-09-12 |True |https://raw.githubusercontent.com/opensearch-project/job-scheduler/2.10.0.0/release-notes/opensearch.job-scheduler.release-notes-2.10.0.0.md | +|k-NN |[tags/2.10.0.0]|e437016 |2023-09-07 |True |https://raw.githubusercontent.com/opensearch-project/k-NN/2.10.0.0/release-notes/opensearch-knn.release-notes-2.10.0.0.md | +|ml-commons |[tags/2.10.0.0]|521214b |2023-09-13 |True |https://raw.githubusercontent.com/opensearch-project/ml-commons/2.10.0.0/release-notes/opensearch-ml-common.release-notes-2.10.0.0.md | +|neural-search |[tags/2.10.0.0]|9476d43 |2023-09-07 |True |https://raw.githubusercontent.com/opensearch-project/neural-search/2.10.0.0/release-notes/opensearch-neural-search.release-notes-2.10.0.0.md | +|notifications |[tags/2.10.0.0]|0a9dfb0 |2023-09-07 |True |https://raw.githubusercontent.com/opensearch-project/notifications/2.10.0.0/release-notes/opensearch-notifications.release-notes-2.10.0.0.md | +|opensearch-observability |[tags/2.10.0.0]|d2c087c |2023-09-13 |True |https://raw.githubusercontent.com/opensearch-project/observability/2.10.0.0/release-notes/opensearch-observability.release-notes-2.10.0.0.md | +|opensearch-reports |[tags/2.10.0.0]|3095e3c |2023-09-13 |True |https://raw.githubusercontent.com/opensearch-project/reporting/2.10.0.0/release-notes/opensearch-reporting.release-notes-2.10.0.0.md | +|performance-analyzer |[tags/2.10.0.0]|3ee56fc |2023-09-07 |True |https://raw.githubusercontent.com/opensearch-project/performance-analyzer/2.10.0.0/release-notes/opensearch-performance-analyzer.release-notes-2.10.0.0.md | +|security |[tags/2.10.0.0]|6daa697 |2023-09-12 |True |https://raw.githubusercontent.com/opensearch-project/security/2.10.0.0/release-notes/opensearch-security.release-notes-2.10.0.0.md | +|security-analytics |[tags/2.10.0.0]|e005b5a |2023-09-19 |True |https://raw.githubusercontent.com/opensearch-project/security-analytics/2.10.0.0/release-notes/opensearch-security-analytics.release-notes-2.10.0.0.md | +|sql |[tags/2.10.0.0]|ef18b38 |2023-09-07 |True |https://raw.githubusercontent.com/opensearch-project/sql/2.10.0.0/release-notes/opensearch-sql.release-notes-2.10.0.0.md | + +
+ +--- + +The workflow uses the following arguments: +* `--date`: To check if commit exists after a specific date (in format yyyy-mm-dd, example 2022-07-26). This is optional if the previous step is already run. +* `--output`: To dump the consolidated release notes into an `.md` file, example `--output table.md`. + + +The following options are available. + +| name | description | +|--------------------|-------------------------------------------------------------------------| +| --date | Shows commit after a specific date. | +| --output | Saves the release notes to user specified file. | +| -v, --verbose | Show more verbose output. | diff --git a/src/release_notes_workflow/release_notes.py b/src/release_notes_workflow/release_notes.py index 6aa4ed36fb..c84f361ab8 100644 --- a/src/release_notes_workflow/release_notes.py +++ b/src/release_notes_workflow/release_notes.py @@ -19,18 +19,32 @@ class ReleaseNotes: - def __init__(self, manifest: InputManifest, date: str) -> None: + def __init__(self, manifest: InputManifest, date: str, action_type: str) -> None: self.manifest = manifest self.date = date + self.action_type = action_type def table(self) -> MarkdownTableWriter: table_result = [] for component in self.manifest.components.select(): + if component.name == 'OpenSearch' or component.name == 'OpenSearch-Dashboards' or component.name == 'notifications-core': + continue if hasattr(component, "repository"): table_result.append(self.check(component)) # type: ignore[arg-type] + + # Sort table_result based on Repo column + table_result.sort(key=lambda x: (x[0], x[1]) if len(x) > 1 else x[0]) + + if self.action_type == "check": + headers = ["Repo", "Branch", "CommitID", "Commit Date", "Release Notes Exists"] + elif self.action_type == "compile": + headers = ["Repo", "Branch", "CommitID", "Commit Date", "Release Notes Exists", "URL"] + else: + raise ValueError("Invalid action_type. Use 'check' or 'compile'.") + writer = MarkdownTableWriter( table_name=f" {self.manifest.build.name} CommitID(after {self.date}) & Release Notes info", - headers=["Repo", "Branch", "CommitID", "Commit Date", "Release Notes"], + headers=headers, value_matrix=table_result ) return writer @@ -57,4 +71,13 @@ def check(self, component: InputComponentFromSource) -> List: results.append(None) results.append(None) results.append(release_notes.exists()) + + if(release_notes.exists()): + releasenote = os.path.basename(release_notes.full_path) + repo_name = component.repository.split("/")[-1].split('.')[0] + repo_ref = component.ref.split("/")[-1] + url = f"https://raw.githubusercontent.com/opensearch-project/{repo_name}/{repo_ref}/release-notes/{releasenote}" + results.append(url) + else: + results.append(None) return results diff --git a/src/release_notes_workflow/release_notes_check_args.py b/src/release_notes_workflow/release_notes_check_args.py index 52e9621944..df6523f486 100644 --- a/src/release_notes_workflow/release_notes_check_args.py +++ b/src/release_notes_workflow/release_notes_check_args.py @@ -19,7 +19,7 @@ class ReleaseNotesCheckArgs: def __init__(self) -> None: parser = argparse.ArgumentParser(description="Checkout an OpenSearch Bundle and check for CommitID and Release Notes") - parser.add_argument("action", choices=["check"], help="Operation to perform.") + parser.add_argument("action", choices=["check", "compile"], help="Operation to perform.") parser.add_argument("manifest", type=argparse.FileType("r"), help="Manifest file.") parser.add_argument( "-v", diff --git a/src/release_notes_workflow/release_notes_component.py b/src/release_notes_workflow/release_notes_component.py index 1ffef28eea..ff33659cf1 100644 --- a/src/release_notes_workflow/release_notes_component.py +++ b/src/release_notes_workflow/release_notes_component.py @@ -25,27 +25,44 @@ def filename(self) -> str: @property def path(self) -> str: - return os.path.join(self.root, "release-notes") + release_notes_path = os.path.join(self.root, "release-notes") + return release_notes_path + + # combine path with the file in files_in_path such that it ends with the filename + @property + def full_path(self) -> str: + files_in_path = os.listdir(self.path) + for fname in files_in_path: + if fname.endswith(self.filename): + release_notes_full_path = os.path.join(self.path, fname) + return release_notes_full_path + return None def path_exists(self) -> bool: - return os.path.exists(self.path) + path_exists = os.path.exists(self.path) + return path_exists def exists(self) -> bool: - return self.path_exists() and any(fname.endswith(self.filename) for fname in os.listdir(self.path)) + if not os.path.exists(self.path): + return False + files_in_path = os.listdir(self.path) + return self.path_exists() and any(fname.endswith(self.filename) for fname in files_in_path) class ReleaseNotesOpenSearch(ReleaseNotesComponent): @property def filename(self) -> str: - return f'.release-notes-{self.build_version}.md' + release_notes_filename = f'.release-notes-{self.build_version}.md' + return release_notes_filename class ReleaseNotesOpenSearchPlugin(ReleaseNotesComponent): @property def filename(self) -> str: - return f'.release-notes-{self.build_version}.0.md' + release_notes_filename = f'.release-notes-{self.build_version}.0.md' + return release_notes_filename class ReleaseNotesComponents: diff --git a/src/run_releasenotes_check.py b/src/run_releasenotes_check.py index 4b8bdccee3..bd8c1a85ce 100644 --- a/src/run_releasenotes_check.py +++ b/src/run_releasenotes_check.py @@ -5,6 +5,15 @@ # this file be licensed under the Apache-2.0 license or a # compatible open source license. +import logging +import os +import re +import shutil +from collections import defaultdict + +import mistune +import requests + from manifests.input_manifest import InputManifest from release_notes_workflow.release_notes import ReleaseNotes from release_notes_workflow.release_notes_check_args import ReleaseNotesCheckArgs @@ -15,12 +24,175 @@ def main() -> int: args = ReleaseNotesCheckArgs() console.configure(level=args.logging_level) manifest_file = InputManifest.from_file(args.manifest) - release_notes = ReleaseNotes(manifest_file, args.date) - if args.action == "check": - table_output = release_notes.table() - table_output.write_table() + BUILD_VERSION = manifest_file.build.version + + # storing temporary release notes for testing purposes + BASE_FILE_PATH = "release_notes_workflow/results" + table_filename = f"{BASE_FILE_PATH}/release_notes_table-{BUILD_VERSION}.md" + urls_filename = f"{BASE_FILE_PATH}/release_notes_urls-{BUILD_VERSION}.txt" + + def capitalize_acronyms(formatted_name: str) -> str: + acronyms = {"sql": "SQL", "ml": "ML", "knn": "k-NN", "k-nn": "k-NN", "ml-commons": "ML Commons", "ml commons": "ML Commons"} + for acronym, replacement in acronyms.items(): + formatted_name = re.sub(r'\b' + re.escape(acronym) + r'\b', replacement, formatted_name, flags=re.IGNORECASE) + return formatted_name + + def format_component_name_from_url(url: str) -> str: + start_index = url.find("release-notes/") + if start_index == -1: + raise ValueError("'release-notes/' not found in the URL") + end_index = url.find(".release-notes", start_index) + if end_index == -1: + raise ValueError("'.release-notes' not found after 'release-notes/'") + component_name = url[start_index + len("release-notes/"): end_index] + if component_name == "opensearch-sql": + component_name = "SQL" + formatted_name = " ".join(word.capitalize() for word in re.split(r"[-.]", component_name)) + return capitalize_acronyms(formatted_name) + + def create_urls_file_if_not_exists() -> None: + + release_notes = ReleaseNotes(manifest_file, args.date, args.action) + table = release_notes.table() + + table_filepath = os.path.join(os.path.dirname(__file__), table_filename) + os.makedirs(os.path.dirname(table_filepath), exist_ok=True) + with open(table_filepath, "w") as table_file: + table.dump(table_file) + if args.output is not None: - table_output.dump(args.output) + logging.info(f"Moving {table_filepath} to {args.output}") + shutil.move(table_filepath, args.output) + else: + with open(table_filepath, "r") as table_file: + logging.info(table_file.read()) + + urls = [row[-1].strip() for row in table.value_matrix if row[-1]] + + urls_filepath = os.path.join(os.path.dirname(__file__), urls_filename) + os.makedirs(os.path.dirname(urls_filepath), exist_ok=True) + with open(urls_filepath, "w") as urls_file: + urls_file.writelines("\n".join(urls)) + + if args.action == "check": + create_urls_file_if_not_exists() + return 0 + + elif args.action == "compile": + create_urls_file_if_not_exists() + + RELEASENOTES_CATEGORIES = "BREAKING,FEATURES,ENHANCEMENTS,BUG FIXES,INFRASTRUCTURE,DOCUMENTATION,MAINTENANCE,REFACTORING,EXPERIMENTAL" + RELEASE_NOTE_MD = f"{BASE_FILE_PATH}/release_notes-{BUILD_VERSION}.md" + + # Clean up URLs in the file + urls_filepath = os.path.join(os.path.dirname(__file__), urls_filename) + with open(urls_filepath, "r") as file: + urls = [line.strip() for line in file if line.strip()] + + unique_urls = list(set(urls)) + + # store plugin data + plugin_data: defaultdict = defaultdict(lambda: defaultdict(list)) + # handle custom headings + heading_mapping = { + "Feature": "Features", + "Feat": "Features", + "Experimental Features": "Experimental", + "Refactor": "Refactoring", + "Enhancement": "Enhancements", + "Bug Fix": "Bug Fixes", + } + unique_headings = set() + for url in unique_urls: + if not url.startswith("#"): + response = requests.get(url) + + if response.status_code == 200: + content = response.text + plugin_name = format_component_name_from_url(url) + + # obtain headings (###) from the content + headings = [match.strip() for match in re.findall(r"###.+", content)] + if not headings: + continue + + # Store content under each heading in respective plugin + for i in range(len(headings)): + heading = headings[i].strip() + if heading.startswith("### "): + heading = heading[4:] + heading = heading.title() + + if heading in heading_mapping: + heading = heading_mapping[heading] + unique_headings.add(heading) + + content_start = content.find(headings[i]) + if content_start != -1: + if i == len(headings) - 1: + content_to_end = content[content_start:] + else: + content_to_end = content[content_start: content.find(headings[i + 1])] + content_to_end = content_to_end.replace(f"### {heading}", "").lstrip() + parts = content_to_end.split("*", 1) + if len(parts) == 2: + content_to_end = "*" + parts[1] + else: + content_to_end = content_to_end.lstrip().lstrip("-") + if len(content_to_end) > 0: + content_to_end = "* " + content_to_end + plugin_data[plugin_name][heading].append(content_to_end) + plugin_data = defaultdict(list, sorted(plugin_data.items())) + logging.info("Compilation complete.") + + # Markdown renderer + markdown = mistune.create_markdown() + + RELEASE_NOTE_MD_path = os.path.join(os.path.dirname(__file__), RELEASE_NOTE_MD) + os.makedirs(os.path.dirname(RELEASE_NOTE_MD_path), exist_ok=True) + + # Filter content for each category + with open(RELEASE_NOTE_MD_path, "w") as outfile: + outfile.write(markdown(f"# OpenSearch and OpenSearch Dashboards {BUILD_VERSION} Release Notes\n\n")) + + for category in RELEASENOTES_CATEGORIES.split(","): + # Discard category content if no data is available + temp_content = [] + temp_content.append(markdown(f"\n## {category}\n\n")) + + for plugin, categories in plugin_data.items(): + if category.lower() in [cat.lower() for cat in categories.keys()]: + for cat, content_list in categories.items(): + if cat.lower() == category.lower(): + for content in content_list: + if content.strip(): + temp_content.append(markdown(f"\n### {plugin}\n\n")) + temp_content.append(markdown(content)) + + if len(temp_content) > 1: + outfile.write("\n".join(temp_content)) + outfile.write("\n") + else: + logging.info(f"\n## {category} was empty\n\n") + + # Handle unknown categories + temp_content = [] + for plugin, categories in plugin_data.items(): + for cat, content_list in categories.items(): + if cat.lower() not in RELEASENOTES_CATEGORIES.lower(): + temp_content.append(f"\n## {cat.upper()}\n\n") + temp_content.append(f"\n### {plugin}\n\n") + temp_content.extend(content_list) + if temp_content: + outfile.write(markdown("## NON-COMPLIANT")) + for item in temp_content: + outfile.write(markdown(item)) + + if args.output is not None: + logging.info(f"Moving {RELEASE_NOTE_MD} to {args.output}") + shutil.move(RELEASE_NOTE_MD_path, args.output) + else: + logging.info(f"Release notes compiled to {RELEASE_NOTE_MD_path}") return 0 diff --git a/tests/data/opensearch-test-main.yml b/tests/data/opensearch-test-main.yml new file mode 100644 index 0000000000..536ff7ca87 --- /dev/null +++ b/tests/data/opensearch-test-main.yml @@ -0,0 +1,16 @@ +--- +schema-version: '1.0' +build: + name: OpenSearch + version: 'replace' +ci: + image: + name: opensearchstaging/ci-runner:ci-runner-centos7-opensearch-build-v3 + args: -e JAVA_HOME=/opt/java/openjdk-17 +components: + - name: OpenSearch-test + repository: https://github.com/opensearch-project/OpenSearch.git + ref: main + checks: + - gradle:publish + - gradle:properties:version diff --git a/tests/tests_release_notes_workflow/test_release_notes.py b/tests/tests_release_notes_workflow/test_release_notes.py index 0962906fc5..dcf8ca7721 100644 --- a/tests/tests_release_notes_workflow/test_release_notes.py +++ b/tests/tests_release_notes_workflow/test_release_notes.py @@ -20,18 +20,17 @@ def setUp(self) -> None: MANIFESTS = os.path.join( os.path.dirname(__file__), "..", - "..", - "manifests", + "data", ) - OPENSEARCH_MANIFEST = os.path.realpath(os.path.join(MANIFESTS, "templates", "opensearch", "default", "manifest.yml")) + OPENSEARCH_MANIFEST = os.path.realpath(os.path.join(MANIFESTS, "opensearch-test-main.yml")) self.manifest_file = InputManifest.from_file(open(OPENSEARCH_MANIFEST)) - self.release_notes = ReleaseNotes(self.manifest_file, "2022-07-26") - self.component = InputComponentFromSource({"name": "OpenSearch", "repository": "url", "ref": "ref"}) + self.release_notes = ReleaseNotes(self.manifest_file, "2022-07-26", "compile") + self.component = InputComponentFromSource({"name": "OpenSearch-test", "repository": "url", "ref": "ref"}) @patch("subprocess.check_output", return_value=''.encode()) @patch("subprocess.check_call") def test_check(self, *mocks: Any) -> None: - self.assertEqual(self.release_notes.check(self.component), ['OpenSearch', '[ref]', None, None, False]) + self.assertEqual(self.release_notes.check(self.component), ['OpenSearch-test', '[ref]', None, None, False, None]) @patch("subprocess.check_output", return_value=''.encode()) @patch("subprocess.check_call") @@ -39,11 +38,11 @@ def test_check_with_manifest(self, *mocks: Any) -> None: component = next(self.manifest_file.components.select()) if type(component) is InputComponentFromSource: self.assertIsInstance(component, InputComponentFromSource) - self.assertEqual(self.release_notes.check(component), ['OpenSearch', '[main]', None, None, False]) + self.assertEqual(self.release_notes.check(component), ['OpenSearch-test', '[main]', None, None, False]) - @patch('release_notes_workflow.release_notes.ReleaseNotes.check', return_value=['OpenSearch', '[main]', 'ee26e01', '2022-08-18', False]) + @patch('release_notes_workflow.release_notes.ReleaseNotes.check', return_value=['OpenSearch-test', '[main]', 'ee26e01', '2022-08-18', False]) def test_table(self, *mocks: Any) -> None: table_output = self.release_notes.table() self.assertEqual(table_output._table_name.strip(), 'OpenSearch CommitID(after 2022-07-26) & Release Notes info') - self.assertEqual(table_output.headers, ['Repo', 'Branch', 'CommitID', 'Commit Date', 'Release Notes']) - self.assertEqual(table_output.value_matrix, [['OpenSearch', '[main]', 'ee26e01', '2022-08-18', False]]) + self.assertEqual(table_output.headers, ['Repo', 'Branch', 'CommitID', 'Commit Date', 'Release Notes Exists', 'URL']) + self.assertEqual(table_output.value_matrix, [['OpenSearch-test', '[main]', 'ee26e01', '2022-08-18', False]]) diff --git a/tests/tests_release_notes_workflow/test_releasenotes_check_args.py b/tests/tests_release_notes_workflow/test_releasenotes_check_args.py index a9a654c4f8..3ee4fb074b 100644 --- a/tests/tests_release_notes_workflow/test_releasenotes_check_args.py +++ b/tests/tests_release_notes_workflow/test_releasenotes_check_args.py @@ -43,6 +43,11 @@ def test_manifest(self) -> None: self.assertEqual(ReleaseNotesCheckArgs().manifest.name, TestReleaseNotesCheckArgs.OPENSEARCH_MANIFEST) self.assertEqual(ReleaseNotesCheckArgs().date, datetime.date(2022, 7, 26)) + @patch("argparse._sys.argv", [RELEASE_NOTES_CHECK_PY, "compile", OPENSEARCH_MANIFEST, "--date", '2022-07-26']) + def test_manifest_compile(self) -> None: + self.assertEqual(ReleaseNotesCheckArgs().manifest.name, TestReleaseNotesCheckArgs.OPENSEARCH_MANIFEST) + self.assertEqual(ReleaseNotesCheckArgs().date, datetime.date(2022, 7, 26)) + @patch("argparse._sys.argv", [RELEASE_NOTES_CHECK_PY, "check", OPENSEARCH_MANIFEST]) def test_manifest_withoutdate(self) -> None: with self.assertRaises(SystemExit) as cm: @@ -55,6 +60,14 @@ def test_manifest_withoutdate(self) -> None: def test_verbose_true(self) -> None: self.assertTrue(ReleaseNotesCheckArgs().logging_level, logging.DEBUG) + @patch("argparse._sys.argv", [RELEASE_NOTES_CHECK_PY, "compile", OPENSEARCH_MANIFEST, "--date", '2022-07-26', "--verbose"]) + def test_verbose_true_compile(self) -> None: + self.assertTrue(ReleaseNotesCheckArgs().logging_level, logging.DEBUG) + @patch("argparse._sys.argv", [RELEASE_NOTES_CHECK_PY, "check", OPENSEARCH_MANIFEST, "--date", '2022-07-26', "--output", "test.md"]) def test_output(self) -> None: self.assertEqual(ReleaseNotesCheckArgs().output, "test.md") + + @patch("argparse._sys.argv", [RELEASE_NOTES_CHECK_PY, "compile", OPENSEARCH_MANIFEST, "--date", '2022-07-26', "--output", "test.md"]) + def test_output_compile(self) -> None: + self.assertEqual(ReleaseNotesCheckArgs().output, "test.md") From 537ccdbfc23be07e6de08236dce95906ea5b6719 Mon Sep 17 00:00:00 2001 From: Martin Gaievski Date: Wed, 6 Dec 2023 14:24:02 -0800 Subject: [PATCH 02/11] Added neural-search to 2.12 manifest (#4268) Signed-off-by: Martin Gaievski --- manifests/2.12.0/opensearch-2.12.0.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/manifests/2.12.0/opensearch-2.12.0.yml b/manifests/2.12.0/opensearch-2.12.0.yml index 78cec8bf81..6591eb347e 100644 --- a/manifests/2.12.0/opensearch-2.12.0.yml +++ b/manifests/2.12.0/opensearch-2.12.0.yml @@ -50,6 +50,15 @@ components: checks: - gradle:properties:version - gradle:dependencies:opensearch.version: opensearch-ml-plugin + - name: neural-search + repository: https://github.com/opensearch-project/neural-search.git + ref: 2.x + platforms: + - linux + - windows + checks: + - gradle:properties:version + - gradle:dependencies:opensearch.version - name: flow-framework repository: https://github.com/opensearch-project/flow-framework.git ref: 2.x From 553ba121666ece888a5562071162beb7b056420c Mon Sep 17 00:00:00 2001 From: Zelin Hao Date: Thu, 7 Dec 2023 19:50:35 -0800 Subject: [PATCH 03/11] Freeze commit ids for 1.3.14 manifests (#4273) Signed-off-by: Zelin Hao --- jenkins/check-for-build.jenkinsfile | 2 -- manifests/1.3.14/opensearch-1.3.14.yml | 30 +++++++++---------- .../1.3.14/opensearch-dashboards-1.3.14.yml | 20 ++++++------- 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/jenkins/check-for-build.jenkinsfile b/jenkins/check-for-build.jenkinsfile index 054bdaa720..f8aea047cf 100644 --- a/jenkins/check-for-build.jenkinsfile +++ b/jenkins/check-for-build.jenkinsfile @@ -24,10 +24,8 @@ pipeline { triggers { parameterizedCron ''' H 1 * * * %INPUT_MANIFEST=2.11.2/opensearch-2.11.2.yml;TARGET_JOB_NAME=distribution-build-opensearch;BUILD_PLATFORM=linux macos windows;BUILD_DISTRIBUTION=tar rpm deb zip - H/60 * * * * %INPUT_MANIFEST=1.3.14/opensearch-dashboards-1.3.14.yml;TARGET_JOB_NAME=distribution-build-opensearch-dashboards;BUILD_PLATFORM=linux windows;BUILD_DISTRIBUTION=tar rpm deb zip H 1 * * * %INPUT_MANIFEST=2.12.0/opensearch-dashboards-2.12.0.yml;TARGET_JOB_NAME=distribution-build-opensearch-dashboards;BUILD_PLATFORM=linux windows;BUILD_DISTRIBUTION=tar rpm deb zip H 1 * * * %INPUT_MANIFEST=2.12.0/opensearch-2.12.0.yml;TARGET_JOB_NAME=distribution-build-opensearch;BUILD_PLATFORM=linux macos windows;BUILD_DISTRIBUTION=tar rpm deb zip - H/60 * * * * %INPUT_MANIFEST=1.3.14/opensearch-1.3.14.yml;TARGET_JOB_NAME=distribution-build-opensearch;BUILD_PLATFORM=linux macos windows;BUILD_DISTRIBUTION=tar rpm deb zip H */6 * * * %INPUT_MANIFEST=3.0.0/opensearch-3.0.0.yml;TEST_MANIFEST=3.0.0/opensearch-3.0.0-test.yml;TARGET_JOB_NAME=distribution-build-opensearch;BUILD_PLATFORM=linux macos windows;BUILD_DISTRIBUTION=tar rpm deb zip H */6 * * * %INPUT_MANIFEST=3.0.0/opensearch-dashboards-3.0.0.yml;TEST_MANIFEST=3.0.0/opensearch-dashboards-3.0.0-test.yml;TARGET_JOB_NAME=distribution-build-opensearch-dashboards;BUILD_PLATFORM=linux windows;BUILD_DISTRIBUTION=tar rpm deb zip ''' diff --git a/manifests/1.3.14/opensearch-1.3.14.yml b/manifests/1.3.14/opensearch-1.3.14.yml index 19e1436380..65d27bfee4 100644 --- a/manifests/1.3.14/opensearch-1.3.14.yml +++ b/manifests/1.3.14/opensearch-1.3.14.yml @@ -10,13 +10,13 @@ ci: components: - name: OpenSearch repository: https://github.com/opensearch-project/OpenSearch.git - ref: '1.3' + ref: cedab0bd232290c2606c28ef7087106fc1a74f9a checks: - gradle:publish - gradle:properties:version - name: common-utils repository: https://github.com/opensearch-project/common-utils.git - ref: '1.3' + ref: 02d6bfdc3113e2aeb9a52dd108144948dabe81b9 checks: - gradle:publish - gradle:properties:version @@ -25,7 +25,7 @@ components: - windows - name: job-scheduler repository: https://github.com/opensearch-project/job-scheduler.git - ref: '1.3' + ref: ed410027d243b764b623be1c76dd6ded55e6fd19 checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -34,7 +34,7 @@ components: - windows - name: security repository: https://github.com/opensearch-project/security.git - ref: '1.3' + ref: b653d56d561171c10049064d5a17861d97aac843 checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -43,7 +43,7 @@ components: - windows - name: ml-commons repository: https://github.com/opensearch-project/ml-commons.git - ref: '1.3' + ref: 143048f718128e6bc0d0b5413055abadb7721b38 checks: - gradle:properties:version - gradle:dependencies:opensearch.version: opensearch-ml-plugin @@ -52,7 +52,7 @@ components: - windows - name: performance-analyzer repository: https://github.com/opensearch-project/performance-analyzer.git - ref: '1.3' + ref: 5ee85f736d0c6dc3ab45e7a0a57c612bf25c2ad4 checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -60,7 +60,7 @@ components: - linux - name: alerting repository: https://github.com/opensearch-project/alerting.git - ref: '1.3' + ref: 5f67ea58d9489b8ad9fc06d4f89d347727e5fe9e checks: - gradle:properties:version - gradle:dependencies:opensearch.version: alerting @@ -69,7 +69,7 @@ components: - windows - name: opensearch-reports repository: https://github.com/opensearch-project/reporting.git - ref: '1.3' + ref: e68a5a38240f0f26d34bcad38c1cd0de8c7ada95 checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -78,7 +78,7 @@ components: - windows - name: cross-cluster-replication repository: https://github.com/opensearch-project/cross-cluster-replication.git - ref: '1.3' + ref: 1294d44e572a250673a30328e8bf0a1ea0c295b5 checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -87,7 +87,7 @@ components: - windows - name: sql repository: https://github.com/opensearch-project/sql.git - ref: '1.3' + ref: 1e4d12efb7ae37c4dc9b792336322e69dbb2a177 checks: - gradle:properties:version - gradle:dependencies:opensearch.version: plugin @@ -96,7 +96,7 @@ components: - windows - name: k-NN repository: https://github.com/opensearch-project/k-NN.git - ref: '1.3' + ref: 2740d97374ba559526b0c07df0bb31384f70cb2b checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -105,7 +105,7 @@ components: - windows - name: opensearch-observability repository: https://github.com/opensearch-project/observability.git - ref: '1.3' + ref: a72f824b7e4165765152c4ebd4c47e98d6b8c94e checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -114,7 +114,7 @@ components: - windows - name: index-management repository: https://github.com/opensearch-project/index-management.git - ref: '1.3' + ref: 71db6ce79dcdf1dada24c07303cff5e2aee997e2 checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -123,7 +123,7 @@ components: - windows - name: anomaly-detection repository: https://github.com/opensearch-project/anomaly-detection.git - ref: '1.3' + ref: 97efd1ef35d33f60c2edf6b9dcbf81ce808693e6 checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -132,7 +132,7 @@ components: - windows - name: asynchronous-search repository: https://github.com/opensearch-project/asynchronous-search.git - ref: '1.3' + ref: f4d500419482e0a53cf35a34cd8864e5f0864d96 checks: - gradle:properties:version - gradle:dependencies:opensearch.version diff --git a/manifests/1.3.14/opensearch-dashboards-1.3.14.yml b/manifests/1.3.14/opensearch-dashboards-1.3.14.yml index 9663558cc7..3e24976deb 100644 --- a/manifests/1.3.14/opensearch-dashboards-1.3.14.yml +++ b/manifests/1.3.14/opensearch-dashboards-1.3.14.yml @@ -9,32 +9,32 @@ ci: components: - name: OpenSearch-Dashboards repository: https://github.com/opensearch-project/OpenSearch-Dashboards.git - ref: '1.3' + ref: 39fdcad14c375edbf8e5cd992241084bd2d56871 - name: functionalTestDashboards repository: https://github.com/opensearch-project/opensearch-dashboards-functional-test.git - ref: '1.3' + ref: 9fc625b491f39e1682d9fb67ebd862537b103969 - name: anomalyDetectionDashboards repository: https://github.com/opensearch-project/anomaly-detection-dashboards-plugin - ref: '1.3' + ref: 4cb5ec5e3d3b234036b1fff1be65186293aefba7 - name: ganttChartDashboards repository: https://github.com/opensearch-project/dashboards-visualizations.git + ref: 99b9779c0c167d41a53add2c1681ac9968c389c2 working_directory: gantt-chart - ref: '1.3' - name: observabilityDashboards repository: https://github.com/opensearch-project/dashboards-observability.git - ref: '1.3' + ref: ba3458981e3f2f08950a774a3e2f27e2cdd04885 - name: alertingDashboards repository: https://github.com/opensearch-project/alerting-dashboards-plugin.git - ref: '1.3' + ref: 7937896ee07160cb4e1fffec989ff64c60c64fa6 - name: indexManagementDashboards repository: https://github.com/opensearch-project/index-management-dashboards-plugin - ref: '1.3' + ref: 762c086503368b5aa26b3c3e7fe9413aaaaec77f - name: reportsDashboards repository: https://github.com/opensearch-project/dashboards-reporting.git - ref: '1.3' + ref: fb6e305fff5893c8820cad97a353465dcfc1edc6 - name: securityDashboards repository: https://github.com/opensearch-project/security-dashboards-plugin.git - ref: '1.3' + ref: f861f46379a88aab2f9a9c88dd4f2101af1bdfe4 - name: queryWorkbenchDashboards repository: https://github.com/opensearch-project/dashboards-query-workbench.git - ref: '1.3' + ref: 95231a70357834240b3169491a8ce35c36fff0cf From a6fd12cc398cd571f008ddd52f92e3c111b4e9d9 Mon Sep 17 00:00:00 2001 From: Zelin Hao Date: Fri, 8 Dec 2023 13:55:29 -0800 Subject: [PATCH 04/11] Update commit IDs for 1.3.14 manifests (#4275) Signed-off-by: Zelin Hao --- manifests/1.3.14/opensearch-1.3.14.yml | 4 ++-- manifests/1.3.14/opensearch-dashboards-1.3.14.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifests/1.3.14/opensearch-1.3.14.yml b/manifests/1.3.14/opensearch-1.3.14.yml index 65d27bfee4..568570ef9b 100644 --- a/manifests/1.3.14/opensearch-1.3.14.yml +++ b/manifests/1.3.14/opensearch-1.3.14.yml @@ -10,7 +10,7 @@ ci: components: - name: OpenSearch repository: https://github.com/opensearch-project/OpenSearch.git - ref: cedab0bd232290c2606c28ef7087106fc1a74f9a + ref: 21940d8239b50285ef7f98a1762ef281a5b1c7ee checks: - gradle:publish - gradle:properties:version @@ -34,7 +34,7 @@ components: - windows - name: security repository: https://github.com/opensearch-project/security.git - ref: b653d56d561171c10049064d5a17861d97aac843 + ref: 8924b34f9132297bfbd49fe447f2338b13a95108 checks: - gradle:properties:version - gradle:dependencies:opensearch.version diff --git a/manifests/1.3.14/opensearch-dashboards-1.3.14.yml b/manifests/1.3.14/opensearch-dashboards-1.3.14.yml index 3e24976deb..ac38df39e8 100644 --- a/manifests/1.3.14/opensearch-dashboards-1.3.14.yml +++ b/manifests/1.3.14/opensearch-dashboards-1.3.14.yml @@ -34,7 +34,7 @@ components: ref: fb6e305fff5893c8820cad97a353465dcfc1edc6 - name: securityDashboards repository: https://github.com/opensearch-project/security-dashboards-plugin.git - ref: f861f46379a88aab2f9a9c88dd4f2101af1bdfe4 + ref: 307c7a0674ad1d15fe575a3dbf0a3a7213634099 - name: queryWorkbenchDashboards repository: https://github.com/opensearch-project/dashboards-query-workbench.git ref: 95231a70357834240b3169491a8ce35c36fff0cf From b9116fdb97af77456700acee4344218f04534d47 Mon Sep 17 00:00:00 2001 From: Prudhvi Godithi Date: Mon, 11 Dec 2023 16:52:25 -0800 Subject: [PATCH 05/11] [Release 2.12.0] Manifest components update (#4197) Signed-off-by: Prudhvi Godithi --- manifests/2.12.0/opensearch-2.12.0.yml | 131 ++++++++++++++++++ .../2.12.0/opensearch-dashboards-2.12.0.yml | 43 ++++++ 2 files changed, 174 insertions(+) diff --git a/manifests/2.12.0/opensearch-2.12.0.yml b/manifests/2.12.0/opensearch-2.12.0.yml index 6591eb347e..94e8fb7cdf 100644 --- a/manifests/2.12.0/opensearch-2.12.0.yml +++ b/manifests/2.12.0/opensearch-2.12.0.yml @@ -32,6 +32,12 @@ components: checks: - gradle:properties:version - gradle:dependencies:opensearch.version + - name: security + repository: https://github.com/opensearch-project/security.git + ref: 2.x + platforms: + - linux + - windows - name: k-NN repository: https://github.com/opensearch-project/k-NN.git ref: 2.x @@ -41,6 +47,24 @@ components: checks: - gradle:properties:version - gradle:dependencies:opensearch.version + - name: geospatial + repository: https://github.com/opensearch-project/geospatial.git + ref: 2.x + platforms: + - linux + - windows + checks: + - gradle:properties:version + - gradle:dependencies:opensearch.version + - name: cross-cluster-replication + repository: https://github.com/opensearch-project/cross-cluster-replication.git + ref: 2.x + platforms: + - linux + - windows + checks: + - gradle:properties:version + - gradle:dependencies:opensearch.version - name: ml-commons repository: https://github.com/opensearch-project/ml-commons.git ref: 2.x @@ -59,6 +83,113 @@ components: checks: - gradle:properties:version - gradle:dependencies:opensearch.version + - name: notifications-core + repository: https://github.com/opensearch-project/notifications.git + ref: 2.x + platforms: + - linux + - windows + working_directory: notifications + checks: + - gradle:properties:version + - gradle:dependencies:opensearch.version: opensearch-notifications-core + - name: notifications + repository: https://github.com/opensearch-project/notifications.git + ref: 2.x + platforms: + - linux + - windows + working_directory: notifications + checks: + - gradle:properties:version + - gradle:dependencies:opensearch.version: notifications + - name: opensearch-observability + repository: https://github.com/opensearch-project/observability.git + ref: 2.x + platforms: + - linux + - windows + checks: + - gradle:properties:version + - gradle:dependencies:opensearch.version + - name: opensearch-reports + repository: https://github.com/opensearch-project/reporting.git + ref: 2.x + platforms: + - linux + - windows + checks: + - gradle:properties:version + - gradle:dependencies:opensearch.version + - name: sql + repository: https://github.com/opensearch-project/sql.git + ref: 2.x + platforms: + - linux + - windows + checks: + - gradle:properties:version + - gradle:dependencies:opensearch.version: opensearch-sql-plugin + - name: asynchronous-search + repository: https://github.com/opensearch-project/asynchronous-search.git + ref: 2.x + platforms: + - linux + - windows + checks: + - gradle:properties:version + - gradle:dependencies:opensearch.version + - name: anomaly-detection + repository: https://github.com/opensearch-project/anomaly-detection.git + ref: 2.x + platforms: + - linux + - windows + checks: + - gradle:properties:version + - gradle:dependencies:opensearch.version + - name: alerting + repository: https://github.com/opensearch-project/alerting.git + ref: 2.x + platforms: + - linux + - windows + checks: + - gradle:properties:version + - gradle:dependencies:opensearch.version: alerting + - name: security-analytics + repository: https://github.com/opensearch-project/security-analytics.git + ref: 2.x + platforms: + - linux + - windows + checks: + - gradle:properties:version + - name: index-management + repository: https://github.com/opensearch-project/index-management.git + ref: 2.x + platforms: + - linux + - windows + checks: + - gradle:properties:version + - name: performance-analyzer + repository: https://github.com/opensearch-project/performance-analyzer.git + ref: 2.x + platforms: + - linux + checks: + - gradle:properties:version + - gradle:dependencies:opensearch.version + - name: custom-codecs + repository: https://github.com/opensearch-project/custom-codecs.git + ref: 2.x + platforms: + - linux + - windows + checks: + - gradle:properties:version + - gradle:dependencies:opensearch.version - name: flow-framework repository: https://github.com/opensearch-project/flow-framework.git ref: 2.x diff --git a/manifests/2.12.0/opensearch-dashboards-2.12.0.yml b/manifests/2.12.0/opensearch-dashboards-2.12.0.yml index cf6e627500..861f181602 100644 --- a/manifests/2.12.0/opensearch-dashboards-2.12.0.yml +++ b/manifests/2.12.0/opensearch-dashboards-2.12.0.yml @@ -10,3 +10,46 @@ components: - name: OpenSearch-Dashboards repository: https://github.com/opensearch-project/OpenSearch-Dashboards.git ref: 2.x + - name: functionalTestDashboards + repository: https://github.com/opensearch-project/opensearch-dashboards-functional-test.git + ref: 2.x + - name: observabilityDashboards + repository: https://github.com/opensearch-project/dashboards-observability.git + ref: 2.x + - name: reportsDashboards + repository: https://github.com/opensearch-project/dashboards-reporting.git + ref: 2.x + - name: ganttChartDashboards + repository: https://github.com/opensearch-project/dashboards-visualizations.git + working_directory: gantt-chart + ref: 2.x + - name: queryWorkbenchDashboards + repository: https://github.com/opensearch-project/dashboards-query-workbench.git + ref: 2.x + - name: customImportMapDashboards + repository: https://github.com/opensearch-project/dashboards-maps.git + ref: 2.x + - name: anomalyDetectionDashboards + repository: https://github.com/opensearch-project/anomaly-detection-dashboards-plugin + ref: 2.x + - name: mlCommonsDashboards + repository: https://github.com/opensearch-project/ml-commons-dashboards.git + ref: 2.x + - name: indexManagementDashboards + repository: https://github.com/opensearch-project/index-management-dashboards-plugin.git + ref: 2.x + - name: notificationsDashboards + repository: https://github.com/opensearch-project/dashboards-notifications.git + ref: 2.x + - name: alertingDashboards + repository: https://github.com/opensearch-project/alerting-dashboards-plugin.git + ref: 2.x + - name: securityAnalyticsDashboards + repository: https://github.com/opensearch-project/security-analytics-dashboards-plugin.git + ref: 2.x + - name: securityDashboards + repository: https://github.com/opensearch-project/security-dashboards-plugin.git + ref: 2.x + - name: searchRelevanceDashboards + repository: https://github.com/opensearch-project/dashboards-search-relevance.git + ref: 2.x From 00d5821d812d1046b9c39c6ed8aa73674be168e1 Mon Sep 17 00:00:00 2001 From: Zelin Hao Date: Tue, 12 Dec 2023 12:05:02 -0800 Subject: [PATCH 06/11] Add consolidated release notes for 1314 (#4277) Signed-off-by: Zelin Hao --- .../opensearch-release-notes-1.3.14.md | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 release-notes/opensearch-release-notes-1.3.14.md diff --git a/release-notes/opensearch-release-notes-1.3.14.md b/release-notes/opensearch-release-notes-1.3.14.md new file mode 100644 index 0000000000..fb0388f041 --- /dev/null +++ b/release-notes/opensearch-release-notes-1.3.14.md @@ -0,0 +1,45 @@ +# OpenSearch and OpenSearch Dashboards 1.3.14 Release Notes + +## Release Details + +[OpenSearch and OpenSearch Dashboards 1.3.14](https://opensearch.org/versions/opensearch-1-3-14.html) includes the following bug fixes, enhancements and maintenance updates. + +OpenSearch [Release Notes](https://github.com/opensearch-project/OpenSearch/blob/main/release-notes/opensearch.release-notes-1.3.14.md). + +OpenSearch Dashboards [Release Notes](https://github.com/opensearch-project/OpenSearch-Dashboards/blob/main/release-notes/opensearch-dashboards.release-notes-1.3.14.md). + +

ENHANCEMENTS

+ +

OpenSearch Security

+ +
    +
  • Add early rejection from RestHandler for unauthorized requests (#3675)
  • +
  • Expanding Authentication with SecurityRequest Abstraction (#3670)
  • +
  • Adding minimum viable integration tests framework (#3649)
  • +
  • For read-only tenants filter with allow list (4e962f2)
  • +
+ +

BUG FIXES

+ +

OpenSearch Security

+ +
    +
  • Prevent OptionalDataException from User data structures (#3725)
  • +
+ +

MAINTENANCE

+ +

OpenSearch Security

+ +
    +
  • Update the version of snappy-java to 1.1.10.5 (#3478)
  • +
  • Update the version of zookeeper to 3.9.1, xmlsec to 2.3.4, and jackson-databind to 2.14.2 (#3800)
  • +
  • Adds OpenSearch trigger bot to discerning merger list to allow automatic merges (#3474)
  • +
+ +

OpenSearch Security Dashboards Plugin

+ +
    +
  • Update yarn.lock file (#1669)
  • +
  • Bump debug to 4.3.4 and browserify-sign to 4.2.2 to address CVEs (#1674)
  • +
From 9043e0f81ae766808821534961d8c70a1930f99f Mon Sep 17 00:00:00 2001 From: Jeff Lu Date: Tue, 12 Dec 2023 12:25:14 -0800 Subject: [PATCH 07/11] Using jenv to set Java version on Jenkins Mac agent node (#4278) Signed-off-by: Jeff Lu --- jenkins/opensearch/publish-min-snapshots.jenkinsfile | 5 ++--- .../opensearch/publish-min-snapshots.jenkinsfile.txt | 2 ++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/jenkins/opensearch/publish-min-snapshots.jenkinsfile b/jenkins/opensearch/publish-min-snapshots.jenkinsfile index c5eb035dc1..22f6dcce7b 100644 --- a/jenkins/opensearch/publish-min-snapshots.jenkinsfile +++ b/jenkins/opensearch/publish-min-snapshots.jenkinsfile @@ -123,11 +123,10 @@ pipeline { label AGENT_MACOS_X64 } } - tools { - jdk dockerAgent.javaVersion - } steps { script { + echo("Switching to Java ${env.javaVersionNumber} on Mac Docker Container") + sh("jenv local ${dockerAgent.javaVersion}") buildManifest( componentName: "OpenSearch", inputManifest: "manifests/${INPUT_MANIFEST}", diff --git a/tests/jenkins/jenkinsjob-regression-files/opensearch/publish-min-snapshots.jenkinsfile.txt b/tests/jenkins/jenkinsjob-regression-files/opensearch/publish-min-snapshots.jenkinsfile.txt index f9efc54990..f6d955567f 100644 --- a/tests/jenkins/jenkinsjob-regression-files/opensearch/publish-min-snapshots.jenkinsfile.txt +++ b/tests/jenkins/jenkinsjob-regression-files/opensearch/publish-min-snapshots.jenkinsfile.txt @@ -89,6 +89,8 @@ publish-min-snapshots.stage(macos-x64-tar, groovy.lang.Closure) publish-min-snapshots.echo(Executing on agent [label:Jenkins-Agent-MacOS12-X64-Mac1Metal-Multi-Host]) publish-min-snapshots.script(groovy.lang.Closure) + publish-min-snapshots.echo(Switching to Java 17 on Mac Docker Container) + publish-min-snapshots.sh(jenv local openjdk-17) publish-min-snapshots.buildManifest({componentName=OpenSearch, inputManifest=manifests/3.0.0/opensearch-3.0.0.yml, platform=darwin, architecture=x64, distribution=tar, snapshot=true}) buildManifest.sh(./build.sh manifests/3.0.0/opensearch-3.0.0.yml -d tar --component OpenSearch -p darwin -a x64 --snapshot) publish-min-snapshots.echo(Uploading darwin min snapshots to S3) From 6444bd923de1057bb1c1d1e585181d2287dbb5b3 Mon Sep 17 00:00:00 2001 From: Zelin Hao Date: Tue, 12 Dec 2023 13:06:50 -0800 Subject: [PATCH 08/11] Replace refs in manifests with tags for 1.3.14 (#4282) Signed-off-by: Zelin Hao --- manifests/1.3.14/opensearch-1.3.14.yml | 30 +++++++++---------- .../1.3.14/opensearch-dashboards-1.3.14.yml | 20 ++++++------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/manifests/1.3.14/opensearch-1.3.14.yml b/manifests/1.3.14/opensearch-1.3.14.yml index 568570ef9b..bf6a6a52ac 100644 --- a/manifests/1.3.14/opensearch-1.3.14.yml +++ b/manifests/1.3.14/opensearch-1.3.14.yml @@ -10,13 +10,13 @@ ci: components: - name: OpenSearch repository: https://github.com/opensearch-project/OpenSearch.git - ref: 21940d8239b50285ef7f98a1762ef281a5b1c7ee + ref: tags/1.3.14 checks: - gradle:publish - gradle:properties:version - name: common-utils repository: https://github.com/opensearch-project/common-utils.git - ref: 02d6bfdc3113e2aeb9a52dd108144948dabe81b9 + ref: tags/1.3.14.0 checks: - gradle:publish - gradle:properties:version @@ -25,7 +25,7 @@ components: - windows - name: job-scheduler repository: https://github.com/opensearch-project/job-scheduler.git - ref: ed410027d243b764b623be1c76dd6ded55e6fd19 + ref: tags/1.3.14.0 checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -34,7 +34,7 @@ components: - windows - name: security repository: https://github.com/opensearch-project/security.git - ref: 8924b34f9132297bfbd49fe447f2338b13a95108 + ref: tags/1.3.14.0 checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -43,7 +43,7 @@ components: - windows - name: ml-commons repository: https://github.com/opensearch-project/ml-commons.git - ref: 143048f718128e6bc0d0b5413055abadb7721b38 + ref: tags/1.3.14.0 checks: - gradle:properties:version - gradle:dependencies:opensearch.version: opensearch-ml-plugin @@ -52,7 +52,7 @@ components: - windows - name: performance-analyzer repository: https://github.com/opensearch-project/performance-analyzer.git - ref: 5ee85f736d0c6dc3ab45e7a0a57c612bf25c2ad4 + ref: tags/1.3.14.0 checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -60,7 +60,7 @@ components: - linux - name: alerting repository: https://github.com/opensearch-project/alerting.git - ref: 5f67ea58d9489b8ad9fc06d4f89d347727e5fe9e + ref: tags/1.3.14.0 checks: - gradle:properties:version - gradle:dependencies:opensearch.version: alerting @@ -69,7 +69,7 @@ components: - windows - name: opensearch-reports repository: https://github.com/opensearch-project/reporting.git - ref: e68a5a38240f0f26d34bcad38c1cd0de8c7ada95 + ref: tags/1.3.14.0 checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -78,7 +78,7 @@ components: - windows - name: cross-cluster-replication repository: https://github.com/opensearch-project/cross-cluster-replication.git - ref: 1294d44e572a250673a30328e8bf0a1ea0c295b5 + ref: tags/1.3.14.0 checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -87,7 +87,7 @@ components: - windows - name: sql repository: https://github.com/opensearch-project/sql.git - ref: 1e4d12efb7ae37c4dc9b792336322e69dbb2a177 + ref: tags/1.3.14.0 checks: - gradle:properties:version - gradle:dependencies:opensearch.version: plugin @@ -96,7 +96,7 @@ components: - windows - name: k-NN repository: https://github.com/opensearch-project/k-NN.git - ref: 2740d97374ba559526b0c07df0bb31384f70cb2b + ref: tags/1.3.14.0 checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -105,7 +105,7 @@ components: - windows - name: opensearch-observability repository: https://github.com/opensearch-project/observability.git - ref: a72f824b7e4165765152c4ebd4c47e98d6b8c94e + ref: tags/1.3.14.0 checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -114,7 +114,7 @@ components: - windows - name: index-management repository: https://github.com/opensearch-project/index-management.git - ref: 71db6ce79dcdf1dada24c07303cff5e2aee997e2 + ref: tags/1.3.14.0 checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -123,7 +123,7 @@ components: - windows - name: anomaly-detection repository: https://github.com/opensearch-project/anomaly-detection.git - ref: 97efd1ef35d33f60c2edf6b9dcbf81ce808693e6 + ref: tags/1.3.14.0 checks: - gradle:properties:version - gradle:dependencies:opensearch.version @@ -132,7 +132,7 @@ components: - windows - name: asynchronous-search repository: https://github.com/opensearch-project/asynchronous-search.git - ref: f4d500419482e0a53cf35a34cd8864e5f0864d96 + ref: tags/1.3.14.0 checks: - gradle:properties:version - gradle:dependencies:opensearch.version diff --git a/manifests/1.3.14/opensearch-dashboards-1.3.14.yml b/manifests/1.3.14/opensearch-dashboards-1.3.14.yml index ac38df39e8..e9c603c676 100644 --- a/manifests/1.3.14/opensearch-dashboards-1.3.14.yml +++ b/manifests/1.3.14/opensearch-dashboards-1.3.14.yml @@ -9,32 +9,32 @@ ci: components: - name: OpenSearch-Dashboards repository: https://github.com/opensearch-project/OpenSearch-Dashboards.git - ref: 39fdcad14c375edbf8e5cd992241084bd2d56871 + ref: tags/1.3.14 - name: functionalTestDashboards repository: https://github.com/opensearch-project/opensearch-dashboards-functional-test.git - ref: 9fc625b491f39e1682d9fb67ebd862537b103969 + ref: tags/1.3.14 - name: anomalyDetectionDashboards repository: https://github.com/opensearch-project/anomaly-detection-dashboards-plugin - ref: 4cb5ec5e3d3b234036b1fff1be65186293aefba7 + ref: tags/1.3.14.0 - name: ganttChartDashboards repository: https://github.com/opensearch-project/dashboards-visualizations.git - ref: 99b9779c0c167d41a53add2c1681ac9968c389c2 + ref: tags/1.3.14.0 working_directory: gantt-chart - name: observabilityDashboards repository: https://github.com/opensearch-project/dashboards-observability.git - ref: ba3458981e3f2f08950a774a3e2f27e2cdd04885 + ref: tags/1.3.14.0 - name: alertingDashboards repository: https://github.com/opensearch-project/alerting-dashboards-plugin.git - ref: 7937896ee07160cb4e1fffec989ff64c60c64fa6 + ref: tags/1.3.14.0 - name: indexManagementDashboards repository: https://github.com/opensearch-project/index-management-dashboards-plugin - ref: 762c086503368b5aa26b3c3e7fe9413aaaaec77f + ref: tags/1.3.14.0 - name: reportsDashboards repository: https://github.com/opensearch-project/dashboards-reporting.git - ref: fb6e305fff5893c8820cad97a353465dcfc1edc6 + ref: tags/1.3.14.0 - name: securityDashboards repository: https://github.com/opensearch-project/security-dashboards-plugin.git - ref: 307c7a0674ad1d15fe575a3dbf0a3a7213634099 + ref: tags/1.3.14.0 - name: queryWorkbenchDashboards repository: https://github.com/opensearch-project/dashboards-query-workbench.git - ref: 95231a70357834240b3169491a8ce35c36fff0cf + ref: tags/1.3.14.0 From 44e2903b47f5a1b2cc29bf0a279312aaf0f12fd0 Mon Sep 17 00:00:00 2001 From: Sayali Gaikawad <61760125+gaiksaya@users.noreply.github.com> Date: Wed, 13 Dec 2023 10:34:14 -0800 Subject: [PATCH 09/11] Mark build stage as unstable if plugins failed to build (#4224) Signed-off-by: Sayali Gaikawad --- .../opensearch/distribution-build.jenkinsfile | 64 +++++++++++++++++-- 1 file changed, 57 insertions(+), 7 deletions(-) diff --git a/jenkins/opensearch/distribution-build.jenkinsfile b/jenkins/opensearch/distribution-build.jenkinsfile index 965596fe2f..211f28477e 100644 --- a/jenkins/opensearch/distribution-build.jenkinsfile +++ b/jenkins/opensearch/distribution-build.jenkinsfile @@ -7,7 +7,7 @@ * compatible open source license. */ -lib = library(identifier: 'jenkins@5.11.1', retriever: modernSCM([ +lib = library(identifier: 'jenkins@5.12.0', retriever: modernSCM([ $class: 'GitSCMSource', remote: 'https://github.com/opensearch-project/opensearch-build-libraries.git', ])) @@ -213,13 +213,19 @@ pipeline { } } post { + success { + script { + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } + } + } always { script { lib.jenkins.Messages.new(this).add( "${STAGE_NAME}", lib.jenkins.Messages.new(this).get(["${STAGE_NAME}"]) ) - postCleanup() } } @@ -258,6 +264,13 @@ pipeline { } } post { + success { + script { + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } + } + } always { postCleanup() } @@ -310,7 +323,6 @@ pipeline { "${STAGE_NAME}", lib.jenkins.Messages.new(this).get(["${STAGE_NAME}"]) ) - postCleanup() } } @@ -351,6 +363,13 @@ pipeline { } } post { + success { + script { + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } + } + } always { postCleanup() } @@ -453,13 +472,19 @@ pipeline { } } post { + success { + script { + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } + } + } always { script { lib.jenkins.Messages.new(this).add( "${STAGE_NAME}", lib.jenkins.Messages.new(this).get(["${STAGE_NAME}"]) ) - postCleanup() } } @@ -498,6 +523,13 @@ pipeline { } } post { + success { + script { + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } + } + } always { postCleanup() } @@ -550,7 +582,6 @@ pipeline { "${STAGE_NAME}", lib.jenkins.Messages.new(this).get(["${STAGE_NAME}"]) ) - postCleanup() } } @@ -591,6 +622,13 @@ pipeline { } } post { + success { + script { + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } + } + } always { postCleanup() } @@ -633,7 +671,6 @@ pipeline { "${STAGE_NAME}", lib.jenkins.Messages.new(this).get(["${STAGE_NAME}"]) ) - postCleanup() } } @@ -678,13 +715,19 @@ pipeline { } } post { + success { + script { + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } + } + } always { script { lib.jenkins.Messages.new(this).add( "${STAGE_NAME}", lib.jenkins.Messages.new(this).get(["${STAGE_NAME}"]) ) - postCleanup() } } @@ -824,3 +867,10 @@ pipeline { } } } + +def markStageUnstableIfPluginsFailedToBuild() { + def stageLogs = getLogsForStage(stageName: "${STAGE_NAME}") + if (stageLogs.any{e -> e.contains('Failed plugins are')}) { + unstable('Some plugins failed to build. See the ./build.sh step for logs and more details') + } +} \ No newline at end of file From 787f8db676cf57a54d04ed5d4bc2614f9db48ce2 Mon Sep 17 00:00:00 2001 From: Sayali Gaikawad <61760125+gaiksaya@users.noreply.github.com> Date: Wed, 13 Dec 2023 16:04:30 -0800 Subject: [PATCH 10/11] Move unstable functional call to post always block (#4287) Signed-off-by: Sayali Gaikawad --- .../distribution-build.jenkinsfile | 39 ++++++++++++-- .../opensearch/distribution-build.jenkinsfile | 54 ++++++------------- 2 files changed, 53 insertions(+), 40 deletions(-) diff --git a/jenkins/opensearch-dashboards/distribution-build.jenkinsfile b/jenkins/opensearch-dashboards/distribution-build.jenkinsfile index a7284e6451..8c84f07125 100644 --- a/jenkins/opensearch-dashboards/distribution-build.jenkinsfile +++ b/jenkins/opensearch-dashboards/distribution-build.jenkinsfile @@ -230,6 +230,9 @@ pipeline { "${STAGE_NAME}", lib.jenkins.Messages.new(this).get(["${STAGE_NAME}"]) ) + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } postCleanup() } } @@ -274,7 +277,12 @@ pipeline { } post { always { - postCleanup() + script{ + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } + postCleanup() + } } } } @@ -371,7 +379,12 @@ pipeline { } post { always { - postCleanup() + script{ + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } + postCleanup() + } } } } @@ -465,6 +478,9 @@ pipeline { "${STAGE_NAME}", lib.jenkins.Messages.new(this).get(["${STAGE_NAME}"]) ) + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } postCleanup() } } @@ -591,6 +607,9 @@ pipeline { "${STAGE_NAME}", lib.jenkins.Messages.new(this).get(["${STAGE_NAME}"]) ) + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } postCleanup() } } @@ -688,7 +707,12 @@ pipeline { } post { always { - postCleanup() + script { + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } + postCleanup() + } } } } @@ -785,6 +809,9 @@ pipeline { "${STAGE_NAME}", lib.jenkins.Messages.new(this).get(["${STAGE_NAME}"]) ) + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } postCleanup() } } @@ -935,3 +962,9 @@ pipeline { } } +def markStageUnstableIfPluginsFailedToBuild() { + def stageLogs = getLogsForStage(stageName: "${STAGE_NAME}") + if (stageLogs.any{e -> e.contains('Failed plugins are')}) { + unstable('Some plugins failed to build. See the ./build.sh step for logs and more details') + } +} \ No newline at end of file diff --git a/jenkins/opensearch/distribution-build.jenkinsfile b/jenkins/opensearch/distribution-build.jenkinsfile index 211f28477e..e45e2ee233 100644 --- a/jenkins/opensearch/distribution-build.jenkinsfile +++ b/jenkins/opensearch/distribution-build.jenkinsfile @@ -213,19 +213,15 @@ pipeline { } } post { - success { - script { - if (params.CONTINUE_ON_ERROR) { - markStageUnstableIfPluginsFailedToBuild() - } - } - } always { script { lib.jenkins.Messages.new(this).add( "${STAGE_NAME}", lib.jenkins.Messages.new(this).get(["${STAGE_NAME}"]) ) + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } postCleanup() } } @@ -264,16 +260,14 @@ pipeline { } } post { - success { + always { script { if (params.CONTINUE_ON_ERROR) { markStageUnstableIfPluginsFailedToBuild() } + postCleanup() } } - always { - postCleanup() - } } } stage('assemble-archive-and-test-linux-x64-rpm') { @@ -363,16 +357,14 @@ pipeline { } } post { - success { + always { script { if (params.CONTINUE_ON_ERROR) { markStageUnstableIfPluginsFailedToBuild() } + postCleanup() } } - always { - postCleanup() - } } } stage('assemble-archive-and-test-linux-x64-deb') { @@ -472,19 +464,15 @@ pipeline { } } post { - success { - script { - if (params.CONTINUE_ON_ERROR) { - markStageUnstableIfPluginsFailedToBuild() - } - } - } always { script { lib.jenkins.Messages.new(this).add( "${STAGE_NAME}", lib.jenkins.Messages.new(this).get(["${STAGE_NAME}"]) ) + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } postCleanup() } } @@ -523,16 +511,14 @@ pipeline { } } post { - success { + always { script { if (params.CONTINUE_ON_ERROR) { markStageUnstableIfPluginsFailedToBuild() } + postCleanup() } } - always { - postCleanup() - } } } stage('assemble-archive-and-test-linux-arm64-rpm') { @@ -622,16 +608,14 @@ pipeline { } } post { - success { + always { script { if (params.CONTINUE_ON_ERROR) { markStageUnstableIfPluginsFailedToBuild() } + postCleanup() } } - always { - postCleanup() - } } } stage('assemble-archive-and-test-linux-arm64-deb') { @@ -715,19 +699,15 @@ pipeline { } } post { - success { - script { - if (params.CONTINUE_ON_ERROR) { - markStageUnstableIfPluginsFailedToBuild() - } - } - } always { script { lib.jenkins.Messages.new(this).add( "${STAGE_NAME}", lib.jenkins.Messages.new(this).get(["${STAGE_NAME}"]) ) + if (params.CONTINUE_ON_ERROR) { + markStageUnstableIfPluginsFailedToBuild() + } postCleanup() } } From cc1280696b71eea355aab825e8e9eb94528dd094 Mon Sep 17 00:00:00 2001 From: Naveen Tatikonda Date: Thu, 14 Dec 2023 05:48:08 +0530 Subject: [PATCH 11/11] Fix k-NN 2.10 Release Notes (#4244) Signed-off-by: Naveen Tatikonda --- release-notes/opensearch-release-notes-2.10.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release-notes/opensearch-release-notes-2.10.0.md b/release-notes/opensearch-release-notes-2.10.0.md index 3481e140a2..b9cbea9838 100644 --- a/release-notes/opensearch-release-notes-2.10.0.md +++ b/release-notes/opensearch-release-notes-2.10.0.md @@ -74,7 +74,7 @@ OpenSearch Dashboards [Release Notes](https://github.com/opensearch-project/Open ### OpenSearch k-NN -* Add Clear Cache API ([#740](https://github.com/opensearch-project/k-NN/pull/740)) +* ~~Add Clear Cache API ([#740](https://github.com/opensearch-project/k-NN/pull/740))~~ Feature was mistakenly added to the release notes, although it was not included in the release. ### OpenSearch ML Commons