Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix point in time rest api #191

Merged
merged 12 commits into from
Nov 2, 2022
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
OpenSearch Python Client

- [Welcome!](https://github.com/opensearch-project/opensearch-py#welcome)
- [Getting Started](https://github.com/opensearch-project/opensearch-py#getting-started)
- [User guide](https://github.com/opensearch-project/opensearch-py#user-guide)
- [API Doc](https://opensearch-project.github.io/opensearch-py/)
- [Compatibility with OpenSearch](https://github.com/opensearch-project/opensearch-py#compatibility-with-opensearch)
- [Project Resources](https://github.com/opensearch-project/opensearch-py#project-resources)
Expand Down
39 changes: 36 additions & 3 deletions GETTING_STARTED.md → USER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
- [Using IAM credentials for authentication](#using-iam-credentials-for-authentication)
- [Pre-requisites to use `AWSV4SignerAuth`](#pre-requisites-to-use-awsv4signerauth)

# Getting Started with the OpenSearch Python Client
# User guide of OpenSearch Python Client

## Setup

Expand All @@ -23,8 +23,9 @@ from opensearchpy import OpenSearch
If you prefer to add the client manually or just want to examine the source code, see [opensearch-py on GitHub](https://github.com/opensearch-project/opensearch-py).


## Sample code

## Example
In the example given below, we create a client, an index with non-default settings, insert a
document in the index, search for the document, delete the document and finally delete the index.
```python
from opensearchpy import OpenSearch

Expand Down Expand Up @@ -119,7 +120,39 @@ response = client.indices.delete(
print('\nDeleting index:')
print(response)
```
## Making API Calls

### Point in Time API calls

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we give a brief about Point In Time here?

Copy link
Contributor Author

@Arpit-Bandejiya Arpit-Bandejiya Oct 27, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will update it with the official documentation link later.


```python
# create a point in time on a index
index_name = "test-index"
response = client.create_point_in_time(index=index_name,
keep_alive="1m")

pit_id = response.get("pit_id")
print('\n Point in time ID:')
print(pit_id)

# To list all point in time which are alive in the cluster
response = client.list_all_point_in_time()
print('\n List of all Point in Time:')
print(response)

# To delete point in time
pit_body = {
"pit_id": [pit_id]
}

# To delete all point in time
# client.delete_point_in_time(body=None, all=True)
response = client.delete_point_in_time(body=pit_body)

print('\n The deleted point in time:')
print(response)


```
## Using IAM credentials for authentication

Refer the AWS documentation regarding usage of IAM credentials to sign requests to OpenSearch APIs - [Signing HTTP requests to Amazon OpenSearch Service.](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/request-signing.html#request-signing-python)
Expand Down
2 changes: 1 addition & 1 deletion noxfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def format(session):
session.install("black", "isort")

session.run("isort", "--profile=black", *SOURCE_FILES)
session.run("black", "--target-version=py27", *SOURCE_FILES)
session.run("black", "--target-version=py33", *SOURCE_FILES)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix for running lint formatter in nox, the py27 is not supported any more. We have update it in other places in the same file but this was left.

session.run("python", "utils/license-headers.py", "fix", *SOURCE_FILES)

lint(session)
Expand Down
39 changes: 31 additions & 8 deletions opensearchpy/_async/client/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1948,26 +1948,46 @@ async def get_script_languages(self, params=None, headers=None):
)

@query_params()
async def close_point_in_time(self, body=None, params=None, headers=None):
async def list_all_point_in_time(self, params=None, headers=None):
"""
Close a point in time
Returns the list of point in times which are alive
Arpit-Bandejiya marked this conversation as resolved.
Show resolved Hide resolved
"""
return await self.transport.perform_request(
"GET",
_make_path("_search", "point_in_time", "_all"),
params=params,
headers=headers,
)

@query_params()
async def delete_point_in_time(
self, body=None, all=False, params=None, headers=None
):
"""
Delete a point in time


:arg body: a point-in-time id to close
:arg body: a point-in-time id to delete
:arg all: set it to `True` to delete all alive point in time.
"""
path = (
_make_path("_search", "point_in_time", "_all")
if all
else _make_path("_search", "point_in_time")
)
return await self.transport.perform_request(
"DELETE", "/_pit", params=params, headers=headers, body=body
"DELETE", path, params=params, headers=headers, body=body
)

@query_params(
"expand_wildcards", "ignore_unavailable", "keep_alive", "preference", "routing"
)
async def open_point_in_time(self, index=None, params=None, headers=None):
async def create_point_in_time(self, index=None, params=None, headers=None):
"""
Open a point in time that can be used in subsequent searches
Create a point in time that can be used in subsequent searches


:arg index: A comma-separated list of index names to open point
:arg index: A comma-separated list of index names to create point
in time; use `_all` or empty string to perform the operation on all
indices
:arg expand_wildcards: Whether to expand wildcard expression to
Expand All @@ -1981,7 +2001,10 @@ async def open_point_in_time(self, index=None, params=None, headers=None):
:arg routing: Specific routing value
"""
return await self.transport.perform_request(
"POST", _make_path(index, "_pit"), params=params, headers=headers
"POST",
_make_path(index, "_search", "point_in_time"),
params=params,
headers=headers,
)

@query_params()
Expand Down
36 changes: 29 additions & 7 deletions opensearchpy/client/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1947,23 +1947,42 @@ def get_script_languages(self, params=None, headers=None):
)

@query_params()
def close_point_in_time(self, body=None, params=None, headers=None):
def list_all_point_in_time(self, params=None, headers=None):
"""
Close a point in time
Returns the list of active point in times searches
"""
return self.transport.perform_request(
"GET",
_make_path("_search", "point_in_time", "_all"),
params=params,
headers=headers,
)

@query_params()
def delete_point_in_time(self, body=None, all=False, params=None, headers=None):
"""
Delete a point in time

:arg body: a point-in-time id to close

:arg body: a point-in-time id to delete
:arg all: set it to `True` to delete all alive point in time.
"""

path = (
_make_path("_search", "point_in_time", "_all")
if all
else _make_path("_search", "point_in_time")
)
return self.transport.perform_request(
"DELETE", "/_pit", params=params, headers=headers, body=body
"DELETE", path, params=params, headers=headers, body=body
)

@query_params(
"expand_wildcards", "ignore_unavailable", "keep_alive", "preference", "routing"
)
def open_point_in_time(self, index=None, params=None, headers=None):
def create_point_in_time(self, index=None, params=None, headers=None):
"""
Open a point in time that can be used in subsequent searches
Create a point in time that can be used in subsequent searches


:arg index: A comma-separated list of index names to open point
Expand All @@ -1980,7 +1999,10 @@ def open_point_in_time(self, index=None, params=None, headers=None):
:arg routing: Specific routing value
"""
return self.transport.perform_request(
"POST", _make_path(index, "_pit"), params=params, headers=headers
"POST",
_make_path(index, "_search", "point_in_time"),
params=params,
headers=headers,
)

@query_params()
Expand Down
43 changes: 43 additions & 0 deletions test_opensearchpy/test_client/test_point_in_time.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# SPDX-License-Identifier: Apache-2.0
#
# The OpenSearch Contributors require contributions made to
# this file be licensed under the Apache-2.0 license or a
# compatible open source license.
#
# Licensed to Elasticsearch B.V. under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch B.V. licenses this file to you under
# the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

from test_opensearchpy.test_cases import OpenSearchTestCase


class TestPointInTime(OpenSearchTestCase):
def test_create_one_point_in_time(self):
index_name = "test-index"
self.client.create_point_in_time(index=index_name)
self.assert_url_called("POST", "/test-index/_search/point_in_time")

def test_delete_one_point_in_time(self):
self.client.delete_point_in_time(body={"pit_id": ["Sample-PIT-ID"]})
self.assert_url_called("DELETE", "/_search/point_in_time")

def test_delete_all_point_in_time(self):
self.client.delete_point_in_time(all=True)
self.assert_url_called("DELETE", "/_search/point_in_time/_all")

def test_list_all_point_in_time(self):
self.client.list_all_point_in_time()
self.assert_url_called("GET", "/_search/point_in_time/_all")