Skip to content

Commit 6406947

Browse files
Merge pull request #1 from yashsinghcodes/newapp
new opensearch app with certificate auth
2 parents 1227939 + d167f48 commit 6406947

5 files changed

Lines changed: 854 additions & 0 deletions

File tree

opensearch/1.0.0/Dockerfile

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Base our app image off of the WALKOFF App SDK image
2+
FROM frikky/shuffle:app_sdk as base
3+
4+
# We're going to stage away all of the bloat from the build tools so lets create a builder stage
5+
FROM base as builder
6+
7+
# Install all alpine build tools needed for our pip installs
8+
RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev
9+
10+
# Install all of our pip packages in a single directory that we can copy to our base image later
11+
RUN mkdir /install
12+
WORKDIR /install
13+
COPY requirements.txt /requirements.txt
14+
RUN pip install --prefix="/install" -r /requirements.txt
15+
16+
# Switch back to our base image and copy in all of our built packages and source code
17+
FROM base
18+
COPY --from=builder /install /usr/local
19+
COPY src /app
20+
21+
# Finally, lets run our app!
22+
WORKDIR /app
23+
CMD python app.py --log-level DEBUG

opensearch/1.0.0/README.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# OpenSearch
2+
3+
OpenSearch Shuffle app using mutual TLS (client certificate) authentication.
4+
5+
## Authentication
6+
7+
Configure the following in the app authentication section:
8+
9+
- `base_url`: OpenSearch base URL (e.g. `https://opensearch.example.com:9200`).
10+
- `client_cert`: Client certificate (PEM) file ID.
11+
- `client_key`: Client private key (PEM) file ID.
12+
- `ca_cert` (optional): CA certificate (PEM) file ID used for TLS verification.
13+
- `verify` (optional): `true` or `false`.
14+
- `timeout` (optional): Request timeout in seconds.
15+
16+
Notes:
17+
- If your client certificate file already contains the private key, upload the same file for both `client_cert` and `client_key`.
18+
- If `verify` is `true` and `ca_cert` is provided, the CA cert is used for TLS verification.
19+
20+
## Actions
21+
22+
- `cluster_health`: Get cluster health status.
23+
- `list_indices`: List indices via `_cat/indices`.
24+
- `get_index`: Get index settings and mappings.
25+
- `create_index`: Create an index with settings/mappings.
26+
- `delete_index`: Delete an index.
27+
- `index_document`: Index a document by ID.
28+
- `create_document`: Create a document with an auto-generated ID.
29+
- `get_document`: Get a document by ID.
30+
- `update_document`: Update a document by ID.
31+
- `delete_document`: Delete a document by ID.
32+
- `search`: Search an index by query DSL or query string.
33+
- `bulk`: Bulk index/update/delete (NDJSON).
34+
- `raw_request`: Send a custom request to any OpenSearch endpoint.
35+
36+
## Local development
37+
38+
From this version directory:
39+
40+
```bash
41+
docker build -t shuffle-opensearch:1.0.0 .
42+
docker run --rm shuffle-opensearch:1.0.0
43+
```
44+
45+
Or run locally:
46+
47+
```bash
48+
pip install -r requirements.txt
49+
python src/app.py --log-level DEBUG
50+
```

opensearch/1.0.0/api.yaml

Lines changed: 320 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,320 @@
1+
app_version: 1.0.0
2+
name: OpenSearch
3+
description: Manage OpenSearch indices and documents with mutual TLS authentication.
4+
contact_info:
5+
name: Shuffle
6+
url: https://shuffler.io
7+
email: support@shuffler.io
8+
categories:
9+
- Search
10+
- Databases
11+
authentication:
12+
required: true
13+
parameters:
14+
- name: base_url
15+
description: OpenSearch base URL (e.g. https://opensearch.example.com:9200)
16+
example: "https://opensearch.example.com:9200"
17+
required: true
18+
schema:
19+
type: string
20+
- name: client_cert
21+
description: Client certificate file ID (PEM). If your cert contains the key, upload the same file for client_key.
22+
example: "adf5e3d0fd85633be17004735a0a119e"
23+
required: true
24+
schema:
25+
type: file
26+
- name: client_key
27+
description: Client private key file ID (PEM).
28+
example: "9a1b2c3d4e5f67890123456789abcdef"
29+
required: true
30+
schema:
31+
type: file
32+
- name: ca_cert
33+
description: CA certificate file ID (PEM) for TLS verification.
34+
example: "0f91affa651ff09f4e7b0c3d2a1b9c8d"
35+
required: false
36+
schema:
37+
type: file
38+
- name: verify
39+
description: Verify TLS certificates. Use false to disable verification.
40+
example: "true"
41+
required: false
42+
schema:
43+
type: string
44+
- name: timeout
45+
description: Request timeout in seconds.
46+
example: "30"
47+
required: false
48+
schema:
49+
type: string
50+
actions:
51+
- name: cluster_health
52+
description: Get cluster health status.
53+
parameters: []
54+
returns:
55+
schema:
56+
type: string
57+
- name: list_indices
58+
description: List indices via _cat/indices.
59+
parameters: []
60+
returns:
61+
schema:
62+
type: string
63+
- name: get_index
64+
description: Get index settings and mappings.
65+
parameters:
66+
- name: index
67+
description: Index name.
68+
example: "logs-2025.01.01"
69+
required: true
70+
schema:
71+
type: string
72+
returns:
73+
schema:
74+
type: string
75+
- name: create_index
76+
description: Create an index with optional settings/mappings.
77+
parameters:
78+
- name: index
79+
description: Index name.
80+
example: "logs-2025.01.01"
81+
required: true
82+
schema:
83+
type: string
84+
- name: body
85+
description: Index settings/mappings JSON.
86+
example: '{"settings": {"number_of_shards": 1}, "mappings": {"properties": {"message": {"type": "text"}}}}'
87+
required: false
88+
multiline: true
89+
schema:
90+
type: string
91+
returns:
92+
schema:
93+
type: string
94+
- name: delete_index
95+
description: Delete an index.
96+
parameters:
97+
- name: index
98+
description: Index name.
99+
example: "logs-2025.01.01"
100+
required: true
101+
schema:
102+
type: string
103+
returns:
104+
schema:
105+
type: string
106+
- name: index_document
107+
description: Index (create or replace) a document by ID.
108+
parameters:
109+
- name: index
110+
description: Index name.
111+
example: "logs-2025.01.01"
112+
required: true
113+
schema:
114+
type: string
115+
- name: document_id
116+
description: Document ID.
117+
example: "doc-123"
118+
required: true
119+
schema:
120+
type: string
121+
- name: body
122+
description: Document JSON.
123+
example: '{"message": "hello", "level": "info"}'
124+
required: true
125+
multiline: true
126+
schema:
127+
type: string
128+
- name: refresh
129+
description: Refresh option (true, false, or wait_for).
130+
example: "wait_for"
131+
required: false
132+
schema:
133+
type: string
134+
returns:
135+
schema:
136+
type: string
137+
- name: create_document
138+
description: Create a document with auto-generated ID.
139+
parameters:
140+
- name: index
141+
description: Index name.
142+
example: "logs-2025.01.01"
143+
required: true
144+
schema:
145+
type: string
146+
- name: body
147+
description: Document JSON.
148+
example: '{"message": "hello", "level": "info"}'
149+
required: true
150+
multiline: true
151+
schema:
152+
type: string
153+
- name: refresh
154+
description: Refresh option (true, false, or wait_for).
155+
example: "true"
156+
required: false
157+
schema:
158+
type: string
159+
returns:
160+
schema:
161+
type: string
162+
- name: get_document
163+
description: Get a document by ID.
164+
parameters:
165+
- name: index
166+
description: Index name.
167+
example: "logs-2025.01.01"
168+
required: true
169+
schema:
170+
type: string
171+
- name: document_id
172+
description: Document ID.
173+
example: "doc-123"
174+
required: true
175+
schema:
176+
type: string
177+
returns:
178+
schema:
179+
type: string
180+
- name: update_document
181+
description: Update a document by ID using partial doc or script.
182+
parameters:
183+
- name: index
184+
description: Index name.
185+
example: "logs-2025.01.01"
186+
required: true
187+
schema:
188+
type: string
189+
- name: document_id
190+
description: Document ID.
191+
example: "doc-123"
192+
required: true
193+
schema:
194+
type: string
195+
- name: body
196+
description: Update JSON payload.
197+
example: '{"doc": {"level": "warn"}}'
198+
required: true
199+
multiline: true
200+
schema:
201+
type: string
202+
- name: refresh
203+
description: Refresh option (true, false, or wait_for).
204+
example: "false"
205+
required: false
206+
schema:
207+
type: string
208+
returns:
209+
schema:
210+
type: string
211+
- name: delete_document
212+
description: Delete a document by ID.
213+
parameters:
214+
- name: index
215+
description: Index name.
216+
example: "logs-2025.01.01"
217+
required: true
218+
schema:
219+
type: string
220+
- name: document_id
221+
description: Document ID.
222+
example: "doc-123"
223+
required: true
224+
schema:
225+
type: string
226+
- name: refresh
227+
description: Refresh option (true, false, or wait_for).
228+
example: "true"
229+
required: false
230+
schema:
231+
type: string
232+
returns:
233+
schema:
234+
type: string
235+
- name: search
236+
description: Search an index using query body or query string.
237+
parameters:
238+
- name: index
239+
description: Index name.
240+
example: "logs-2025.01.01"
241+
required: true
242+
schema:
243+
type: string
244+
- name: query_body
245+
description: Query DSL JSON.
246+
example: '{"query": {"match": {"message": "error"}}}'
247+
required: false
248+
multiline: true
249+
schema:
250+
type: string
251+
- name: query_string
252+
description: Query string (q parameter).
253+
example: "message:error"
254+
required: false
255+
schema:
256+
type: string
257+
returns:
258+
schema:
259+
type: string
260+
- name: bulk
261+
description: Bulk index/update/delete using NDJSON payload.
262+
parameters:
263+
- name: payload
264+
description: NDJSON bulk payload.
265+
example: |
266+
{"index": {"_index": "logs-2025.01.01", "_id": "1"}}
267+
{"message": "hello"}
268+
{"delete": {"_index": "logs-2025.01.01", "_id": "2"}}
269+
required: true
270+
multiline: true
271+
schema:
272+
type: string
273+
- name: refresh
274+
description: Refresh option (true, false, or wait_for).
275+
example: "true"
276+
required: false
277+
schema:
278+
type: string
279+
returns:
280+
schema:
281+
type: string
282+
- name: raw_request
283+
description: Send a custom request to OpenSearch.
284+
parameters:
285+
- name: method
286+
description: HTTP method.
287+
example: "GET"
288+
required: true
289+
schema:
290+
type: string
291+
- name: path
292+
description: API path starting with a slash.
293+
example: "/_plugins/_security/api/roles"
294+
required: true
295+
schema:
296+
type: string
297+
- name: body
298+
description: Request body (JSON string or raw text).
299+
example: '{"some": "payload"}'
300+
required: false
301+
multiline: true
302+
schema:
303+
type: string
304+
- name: headers
305+
description: JSON object of headers.
306+
example: '{"Content-Type": "application/json"}'
307+
required: false
308+
multiline: true
309+
schema:
310+
type: string
311+
- name: params
312+
description: JSON object of query parameters.
313+
example: '{"pretty": "true"}'
314+
required: false
315+
multiline: true
316+
schema:
317+
type: string
318+
returns:
319+
schema:
320+
type: string

opensearch/1.0.0/requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
requests==2.31.0
2+
shuffle_sdk

0 commit comments

Comments
 (0)