Skip to content

Commit 9491391

Browse files
author
Jeny Sadadia
committed
kernelci.cli: add commands for pop and push from unicast list
Add `kci event push` command to push event to a given Redis unicast list. Add `kci event pop` command to pop event from the list for a single consumer. Signed-off-by: Jeny Sadadia <[email protected]>
1 parent 24b5ad2 commit 9491391

File tree

4 files changed

+60
-0
lines changed

4 files changed

+60
-0
lines changed

kernelci/api/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,14 @@ def send_event(self, channel: str, data):
8383
def receive_event(self, sub_id: int) -> CloudEvent:
8484
"""Listen and receive an event from a given subscription id"""
8585

86+
@abc.abstractmethod
87+
def push_event(self, list_name: str, data):
88+
"""Push an event to a given Redis List"""
89+
90+
@abc.abstractmethod
91+
def pop_event(self, list_name: str) -> CloudEvent:
92+
"""Listen and pop an event from a given List"""
93+
8694
# -----
8795
# Nodes
8896
# -----

kernelci/api/helper.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ def receive_event_data(self, sub_id):
4343
"""Receive CloudEvent from Pub/Sub and return its data payload"""
4444
return self.api.receive_event(sub_id).data
4545

46+
def pop_event_data(self, list_name):
47+
"""Receive CloudEvent from Redis list and return its data payload"""
48+
return self.api.pop_event(list_name).data
49+
4650
def get_node_from_event(self, event_data):
4751
"""Listen for an event and get the matching node object from it"""
4852
return self.api.get_node(event_data['id'])

kernelci/api/latest.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"""KernelCI API bindings for the latest version"""
77

88
import enum
9+
import json
910
from typing import Optional, Sequence
1011

1112
from cloudevents.http import from_json
@@ -72,6 +73,17 @@ def receive_event(self, sub_id: int):
7273
continue
7374
return event
7475

76+
def push_event(self, list_name: str, data):
77+
self._post('/'.join(['push', list_name]), data)
78+
79+
def pop_event(self, list_name: str):
80+
path = '/'.join(['pop', str(list_name)])
81+
while True:
82+
resp = self._get(path)
83+
data = json.dumps(resp.json())
84+
event = from_json(data)
85+
return event
86+
7587
def _get_api_objs(self, params: dict, path: str,
7688
limit: Optional[int] = None,
7789
offset: Optional[int] = None) -> list:

kernelci/cli/event.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,39 @@ def receive(config, api, indent, sub_id, secrets):
8181
click.echo(json.dumps(event, indent=indent))
8282
else:
8383
click.echo(event)
84+
85+
86+
@kci_event.command(secrets=True)
87+
@click.option('--is-json', help="Parse input data as JSON", is_flag=True)
88+
@Args.config
89+
@Args.api
90+
@click.argument('list_name')
91+
def push(config, api, is_json, list_name, secrets):
92+
"""Read some data on stdin and push it as an event on a list"""
93+
configs = kernelci.config.load(config)
94+
api_config = configs['api'][api]
95+
api = kernelci.api.get_api(api_config, secrets.api.token)
96+
data = sys.stdin.read()
97+
if is_json:
98+
data = json.loads(data)
99+
api.push_event(list_name, {'data': data})
100+
101+
102+
@kci_event.command(secrets=True)
103+
@click.argument('list_name')
104+
@Args.config
105+
@Args.api
106+
@Args.indent
107+
def pop(config, api, indent, list_name, secrets):
108+
"""Wait and pop an event from a List when received print on stdout"""
109+
configs = kernelci.config.load(config)
110+
api_config = configs['api'][api]
111+
api = kernelci.api.get_api(api_config, secrets.api.token)
112+
helper = kernelci.api.helper.APIHelper(api)
113+
event = helper.pop_event_data(list_name)
114+
if isinstance(event, str):
115+
click.echo(event.strip())
116+
elif isinstance(event, dict):
117+
click.echo(json.dumps(event, indent=indent))
118+
else:
119+
click.echo(event)

0 commit comments

Comments
 (0)