Skip to content

Commit b8d8e31

Browse files
authored
Merge pull request #408 from Lellek/master
added app for basic redis integration
2 parents dcbbefa + c3e429e commit b8d8e31

File tree

5 files changed

+196
-0
lines changed

5 files changed

+196
-0
lines changed

redis/1.0.0/Dockerfile

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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+
RUN apk add curl
21+
22+
# Install any binary dependencies needed in our final image
23+
# RUN apk --no-cache add --update my_binary_dependency
24+
25+
# Finally, lets run our app!
26+
WORKDIR /app
27+
CMD python app.py --log-level DEBUG

redis/1.0.0/api.yaml

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
app_version: 1.0.0
2+
name: Redis
3+
description: Redis integration.
4+
tags:
5+
- redis
6+
categories:
7+
- Other
8+
# contact_info:
9+
# name: "@frikkylikeme"
10+
# url: https://shuffler.io
11+
# email: frikky@shuffler.io
12+
authentication:
13+
required: true
14+
parameters:
15+
- name: server
16+
description: Redis server ip
17+
example: "127.0.0.1"
18+
required: true
19+
schema:
20+
type: string
21+
- name: port
22+
description: Redis port
23+
example: "6379"
24+
required: true
25+
schema:
26+
type: string
27+
- name: password
28+
description: redis password
29+
example: "*****"
30+
required: false
31+
schema:
32+
type: string
33+
- name: database
34+
description: redis database
35+
example: "0"
36+
required: false
37+
options:
38+
- 0
39+
- 1
40+
- 2
41+
- 3
42+
- 4
43+
- 5
44+
- 6
45+
- 7
46+
- 8
47+
- 9
48+
- 10
49+
- 11
50+
- 12
51+
- 13
52+
- 14
53+
- 15
54+
schema:
55+
type: string
56+
57+
actions:
58+
- name: set_value
59+
description: Set a key value pair
60+
parameters:
61+
- name: key
62+
description: Key name
63+
required: true
64+
multiline: false
65+
example: "my key"
66+
schema:
67+
type: string
68+
- name: value
69+
description: Value
70+
required: true
71+
multiline: true
72+
example: 'my value'
73+
schema:
74+
type: string
75+
- name: nx
76+
description: Set value only if not exists
77+
required: true
78+
options:
79+
- "false"
80+
- "true"
81+
multiline: false
82+
example: "true"
83+
schema:
84+
type: bool
85+
- name: ex
86+
description: Expiration time in seconds
87+
required: false
88+
multiline: false
89+
example: '60'
90+
schema:
91+
type: string
92+
returns:
93+
schema:
94+
type: string
95+
96+
- name: get_value
97+
description: Get value of a key
98+
parameters:
99+
- name: key
100+
description: Key name
101+
required: true
102+
multiline: false
103+
example: "my key"
104+
schema:
105+
type: string
106+
returns:
107+
schema:
108+
type: string
109+
large_image: data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPgo8c3ZnIHdpZHRoPSI4MDBweCIgaGVpZ2h0PSI4MDBweCIgdmlld0JveD0iMCAtMTggMjU2IDI1NiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij48cGF0aCBkPSJNMjQ1Ljk3IDE2OC45NDNjLTEzLjY2MiA3LjEyMS04NC40MzQgMzYuMjItOTkuNTAxIDQ0LjA3NS0xNS4wNjcgNy44NTYtMjMuNDM3IDcuNzgtMzUuMzQgMi4wOS0xMS45MDItNS42OS04Ny4yMTYtMzYuMTEyLTEwMC43ODMtNDIuNTk3QzMuNTY2IDE2OS4yNzEgMCAxNjYuNTM1IDAgMTYzLjk1MXYtMjUuODc2czk4LjA1LTIxLjM0NSAxMTMuODc5LTI3LjAyNGMxNS44MjgtNS42NzkgMjEuMzItNS44ODQgMzQuNzktLjk1IDEzLjQ3MiA0LjkzNiA5NC4wMTggMTkuNDY4IDEwNy4zMzEgMjQuMzQ0bC0uMDA2IDI1LjUxYy4wMDIgMi41NTgtMy4wNyA1LjM2NC0xMC4wMjQgOC45ODgiIGZpbGw9IiM5MTI2MjYiLz48cGF0aCBkPSJNMjQ1Ljk2NSAxNDMuMjJjLTEzLjY2MSA3LjExOC04NC40MzEgMzYuMjE4LTk5LjQ5OCA0NC4wNzItMTUuMDY2IDcuODU3LTIzLjQzNiA3Ljc4LTM1LjMzOCAyLjA5LTExLjkwMy01LjY4Ni04Ny4yMTQtMzYuMTEzLTEwMC43OC00Mi41OTQtMTMuNTY2LTYuNDg1LTEzLjg1LTEwLjk0OC0uNTI0LTE2LjE2NiAxMy4zMjYtNS4yMiA4OC4yMjQtMzQuNjA1IDEwNC4wNTUtNDAuMjg0IDE1LjgyOC01LjY3NyAyMS4zMTktNS44ODQgMzQuNzg5LS45NDggMTMuNDcxIDQuOTM0IDgzLjgxOSAzMi45MzUgOTcuMTMgMzcuODEgMTMuMzE2IDQuODgxIDEzLjgyNyA4LjkuMTY2IDE2LjAyIiBmaWxsPSIjQzYzMDJCIi8+PHBhdGggZD0iTTI0NS45NyAxMjcuMDc0Yy0xMy42NjIgNy4xMjItODQuNDM0IDM2LjIyLTk5LjUwMSA0NC4wNzgtMTUuMDY3IDcuODUzLTIzLjQzNyA3Ljc3Ny0zNS4zNCAyLjA4Ny0xMS45MDMtNS42ODctODcuMjE2LTM2LjExMi0xMDAuNzgzLTQyLjU5N0MzLjU2NiAxMjcuNDAyIDAgMTI0LjY3IDAgMTIyLjA4NVY5Ni4yMDZzOTguMDUtMjEuMzQ0IDExMy44NzktMjcuMDIzYzE1LjgyOC01LjY3OSAyMS4zMi01Ljg4NSAzNC43OS0uOTVDMTYyLjE0MiA3My4xNjggMjQyLjY4OCA4Ny42OTcgMjU2IDkyLjU3NGwtLjAwNiAyNS41MTNjLjAwMiAyLjU1Ny0zLjA3IDUuMzYzLTEwLjAyNCA4Ljk4NyIgZmlsbD0iIzkxMjYyNiIvPjxwYXRoIGQ9Ik0yNDUuOTY1IDEwMS4zNTFjLTEzLjY2MSA3LjEyLTg0LjQzMSAzNi4yMTgtOTkuNDk4IDQ0LjA3NS0xNS4wNjYgNy44NTQtMjMuNDM2IDcuNzc3LTM1LjMzOCAyLjA4Ny0xMS45MDMtNS42ODYtODcuMjE0LTM2LjExMi0xMDAuNzgtNDIuNTk0LTEzLjU2Ni02LjQ4My0xMy44NS0xMC45NDctLjUyNC0xNi4xNjdDMjMuMTUxIDgzLjUzNSA5OC4wNSA1NC4xNDggMTEzLjg4IDQ4LjQ3YzE1LjgyOC01LjY3OCAyMS4zMTktNS44ODQgMzQuNzg5LS45NDkgMTMuNDcxIDQuOTM0IDgzLjgxOSAzMi45MzMgOTcuMTMgMzcuODEgMTMuMzE2IDQuODggMTMuODI3IDguOS4xNjYgMTYuMDIiIGZpbGw9IiNDNjMwMkIiLz48cGF0aCBkPSJNMjQ1Ljk3IDgzLjY1M2MtMTMuNjYyIDcuMTItODQuNDM0IDM2LjIyLTk5LjUwMSA0NC4wNzgtMTUuMDY3IDcuODU0LTIzLjQzNyA3Ljc3Ny0zNS4zNCAyLjA4Ny0xMS45MDMtNS42ODctODcuMjE2LTM2LjExMy0xMDAuNzgzLTQyLjU5NUMzLjU2NiA4My45OCAwIDgxLjI0NyAwIDc4LjY2NXYtMjUuODhzOTguMDUtMjEuMzQzIDExMy44NzktMjcuMDIxYzE1LjgyOC01LjY4IDIxLjMyLTUuODg0IDM0Ljc5LS45NUMxNjIuMTQyIDI5Ljc0OSAyNDIuNjg4IDQ0LjI3OCAyNTYgNDkuMTU1bC0uMDA2IDI1LjUxMmMuMDAyIDIuNTU1LTMuMDcgNS4zNjEtMTAuMDI0IDguOTg2IiBmaWxsPSIjOTEyNjI2Ii8+PHBhdGggZD0iTTI0NS45NjUgNTcuOTNjLTEzLjY2MSA3LjEyLTg0LjQzMSAzNi4yMi05OS40OTggNDQuMDc0LTE1LjA2NiA3Ljg1NC0yMy40MzYgNy43NzctMzUuMzM4IDIuMDlDOTkuMjI3IDk4LjQwNCAyMy45MTUgNjcuOTggMTAuMzUgNjEuNDk3LTMuMjE3IDU1LjAxNS0zLjUgNTAuNTUgOS44MjUgNDUuMzMxIDIzLjE1MSA0MC4xMTMgOTguMDUgMTAuNzMgMTEzLjg4IDUuMDVjMTUuODI4LTUuNjc5IDIxLjMxOS01Ljg4MyAzNC43ODktLjk0OCAxMy40NzEgNC45MzUgODMuODE5IDMyLjkzNCA5Ny4xMyAzNy44MTEgMTMuMzE2IDQuODc2IDEzLjgyNyA4Ljg5Ny4xNjYgMTYuMDE3IiBmaWxsPSIjQzYzMDJCIi8+PHBhdGggZD0iTTE1OS4yODMgMzIuNzU3bC0yMi4wMSAyLjI4NS00LjkyNyAxMS44NTYtNy45NTgtMTMuMjMtMjUuNDE1LTIuMjg0IDE4Ljk2NC02LjgzOS01LjY5LTEwLjQ5OCAxNy43NTUgNi45NDQgMTYuNzM4LTUuNDgtNC41MjQgMTAuODU1IDE3LjA2NyA2LjM5MU0xMzEuMDMyIDkwLjI3NUw4OS45NTUgNzMuMjM4bDU4Ljg2LTkuMDM1LTE3Ljc4MyAyNi4wNzJNNzQuMDgyIDM5LjM0N2MxNy4zNzUgMCAzMS40NiA1LjQ2IDMxLjQ2IDEyLjE5NCAwIDYuNzM2LTE0LjA4NSAxMi4xOTUtMzEuNDYgMTIuMTk1cy0zMS40Ni01LjQ2LTMxLjQ2LTEyLjE5NWMwLTYuNzM0IDE0LjA4NS0xMi4xOTQgMzEuNDYtMTIuMTk0IiBmaWxsPSIjRkZGIi8+PHBhdGggZD0iTTE4NS4yOTUgMzUuOTk4bDM0LjgzNiAxMy43NjYtMzQuODA2IDEzLjc1My0uMDMtMjcuNTIiIGZpbGw9IiM2MjFCMUMiLz48cGF0aCBkPSJNMTQ2Ljc1NSA1MS4yNDNsMzguNTQtMTUuMjQ1LjAzIDI3LjUxOS0zLjc3OSAxLjQ3OC0zNC43OTEtMTMuNzUyIiBmaWxsPSIjOUEyOTI4Ii8+PC9zdmc+
110+
# yamllint disable-line rule:line-length

redis/1.0.0/app.zip

4.48 KB
Binary file not shown.

redis/1.0.0/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
redis==5.2.1

redis/1.0.0/src/app.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import json
2+
import ast
3+
import redis
4+
5+
from walkoff_app_sdk.app_base import AppBase
6+
7+
class REDIS(AppBase):
8+
__version__ = "1.0.0"
9+
app_name = "Redis"
10+
11+
def __init__(self, redis, logger, console_logger=None):
12+
print("INIT")
13+
"""
14+
Each app should have this __init__ to set up Redis and logging.
15+
:param redis:
16+
:param logger:
17+
:param console_logger:
18+
"""
19+
super().__init__(redis, logger, console_logger)
20+
21+
def set_value(self, server, port, key, value, nx, ex = None, password = None, database = 0):
22+
"""
23+
Sets a key-value pair in Redis.
24+
"""
25+
26+
if password == None:
27+
redis_client = redis.Redis(decode_responses=True, host=server, port=port, db=database)
28+
else:
29+
redis_client = redis.Redis(decode_responses=True, password=password, port=port, host=server, db=database)
30+
31+
32+
result = redis_client.set(name=key, value=value, nx=nx, ex=ex) # nx=True ensures "set only if the key does not exist"
33+
print(result)
34+
if result: # If result is True, the key was successfully set
35+
print(f"Success: Key {key} set with value '{value}'")
36+
return {"success": True}
37+
else:
38+
print(f"Failed: Key {key} already exists.")
39+
return {"success": False}
40+
41+
def get_value(self, server, port, key, password = None, database = 0):
42+
"""
43+
Gets a value for a key in Redis.
44+
"""
45+
if password == None:
46+
redis_client = redis.Redis(decode_responses=True, host=server, port=port, db=database)
47+
else:
48+
redis_client = redis.Redis(decode_responses=True, password=password, port=port, host=server, db=database)
49+
50+
result = redis_client.get(name=key)
51+
if result:
52+
return {"success": True, "value": result}
53+
else:
54+
return {"success": False, "error": f"Key {key} does not exist", "value": None}
55+
56+
57+
if __name__ == "__main__":
58+
REDIS.run()

0 commit comments

Comments
 (0)