Skip to content

Commit 52bf157

Browse files
authored
Merge pull request #22 from imubit/service-mode-update
Service mode update
2 parents 141b949 + 85af87f commit 52bf157

File tree

18 files changed

+288
-72
lines changed

18 files changed

+288
-72
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ jobs:
6262
strategy:
6363
matrix:
6464
python:
65-
- "3.8" # oldest Python supported by PSF
66-
- "3.11" # newest Python that is stable
65+
- "3.11" # oldest Python supported by PSF
66+
- "3.13" # newest Python that is stable
6767
platform:
6868
- ubuntu-latest
6969
# - windows-latest

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ exclude: '^docs/conf.py'
22

33
repos:
44
- repo: https://github.com/pre-commit/pre-commit-hooks
5-
rev: v4.4.0
5+
rev: v5.0.0
66
hooks:
77
- id: trailing-whitespace
88
- id: check-added-large-files

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ with LocalAgent() as agent:
4040

4141
## Command Line Usage
4242

43+
Start broker based agent
4344
```bash
44-
dagent --service.id my_service --broker.uri amqp://guest:guest@192.168.4.23/
45+
da-broker-svc --service.id my_service --broker.uri amqp://guest:guest@192.168.4.23/
4546
```

docs/cli-usage.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# CLI Usage
2+
3+
## Creating OPC UA Connection
4+
5+
### Matrikon simulator
6+
7+
```commandline
8+
da-broker exec create_connection --conn_type=opc-ua --conn_name=ua --server_uri=opc.tcp://127.0.0.1:4840/freeopcua/server/
9+
da-broker exec enable_connection --conn_name=ua
10+
```
11+
12+
### Matrikon simulator
13+
```
14+
da-broker exec create_job --job_id=job1 --conn_name=ua --tags="['2:PLC Server/2:CyclicData', '2:PLC Server/2:BooleanData']" --seconds=2
15+
```

setup.cfg

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,9 @@ testing =
7070

7171
[options.entry_points]
7272
console_scripts =
73-
dagentsvc = data_agent.broker_agent_main:run_event_loop
74-
dagent = data_agent.cli_main:run
73+
da-broker-svc = data_agent.broker.agent_main:run_event_loop
74+
da-broker = data_agent.broker.cli:run
75+
data-agent = data_agent.local_cli:run
7576
pyinstaller40 =
7677
hook-dirs = data_agent.win32.hooks:get_hook_dirs
7778

@@ -97,6 +98,8 @@ testpaths = tests
9798
# markers =
9899
# slow: mark tests as slow (deselect with '-m "not slow"')
99100

101+
asyncio_default_fixture_loop_scope = function
102+
100103
[aliases]
101104
dists = bdist_wheel
102105

src/data_agent/abstract_connector.py

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -129,25 +129,3 @@ def read_tag_values_period(
129129
@abstractmethod
130130
def write_tag_values(self, tags: dict, wait_for_result: bool, **kwargs) -> dict:
131131
pass
132-
133-
# @abstractmethod
134-
# def list_groups(self) -> list:
135-
# pass
136-
#
137-
# @abstractmethod
138-
# def register_group(self, group_name: str, tags: list, refresh_rate_ms: int = 1000):
139-
# pass
140-
#
141-
# @abstractmethod
142-
# def unregister_group(self, group_name: str):
143-
# pass
144-
#
145-
# @abstractmethod
146-
# def read_group_values(self, group_name: str, from_cache: bool = True) -> dict:
147-
# pass
148-
#
149-
# @abstractmethod
150-
# def write_group_values(
151-
# self, group_name: str, tags: dict, wait_for_result: bool, **kwargs
152-
# ) -> dict:
153-
# pass

src/data_agent/broker/__init__.py

Whitespace-only changes.
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
)
2121
from data_agent.connection_manager import ConnectionManager
2222
from data_agent.daq_scheduler import create_daq_scheduler
23+
from data_agent.exchanger import DataExchanger
2324
from data_agent.safe_manipulator import SafeManipulator
2425

2526
log = logging.getLogger(__name__)
@@ -30,6 +31,7 @@ class BrokerAgent:
3031
_broker_conn = None
3132
_connection_manager = None
3233
_safe_manipulator = None
34+
_data_exchanger = None
3335
_scheduler = None
3436

3537
async def init(self, loop, is_service=False, enable_persistance=True):
@@ -92,8 +94,12 @@ async def init(self, loop, is_service=False, enable_persistance=True):
9294
enable_persistence=enable_persistance,
9395
),
9496
)
97+
self._data_exchanger = DataExchanger(self._connection_manager)
9598
api = ServiceApi(
96-
self._scheduler, self._connection_manager, self._safe_manipulator
99+
self._scheduler,
100+
self._connection_manager,
101+
self._data_exchanger,
102+
self._safe_manipulator,
97103
)
98104
await self._broker_conn.rpc_register(api)
99105

@@ -102,7 +108,7 @@ async def init(self, loop, is_service=False, enable_persistance=True):
102108
"************ Data Agent Service Initialized *************************"
103109
)
104110
log.info(
105-
f" Supported connectors: {self._connection_manager.list_supported_connectors()}"
111+
f" Supported connectors: {list(self._connection_manager.list_supported_connectors().keys())}"
106112
)
107113
log.info(
108114
"***********************************************************************"
@@ -117,6 +123,7 @@ async def close(self):
117123
self._broker_conn = None
118124
self._connection_manager = None
119125
self._safe_manipulator = None
126+
self._data_exchanger = None
120127
self._scheduler = None
121128
log.info("")
122129
log.info(
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import asyncio
22
import logging
33

4-
from data_agent.broker_agent import BrokerAgent
4+
from data_agent.broker.agent import BrokerAgent
55

66
log = logging.getLogger(__name__)
77

src/data_agent/broker/cli.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import argparse
2+
import asyncio
3+
import logging
4+
5+
from amqp_fabric.amq_broker_connector import AmqBrokerConnector
6+
7+
from data_agent import __version__
8+
from data_agent.broker.instr_exec import cli_exec
9+
from data_agent.broker.instr_list_services import cli_list_services
10+
from data_agent.config_manager import component_config_view, init_configuration
11+
from data_agent.config_template import CONFIG_SECTION_BROKER, CONFIG_SECTION_SERVICE
12+
13+
# logging.basicConfig(level=os.environ.get("LOGLEVEL", "DEBUG"))
14+
# logging.getLogger().addHandler(logging.StreamHandler())
15+
16+
log = logging.getLogger(__name__)
17+
18+
19+
async def create_amq_broker_connector(config, keep_alive_listen):
20+
config_broker = component_config_view(config, CONFIG_SECTION_BROKER)
21+
config_service = component_config_view(config, CONFIG_SECTION_SERVICE)
22+
23+
amq = AmqBrokerConnector(
24+
amqp_uri=config_broker.uri,
25+
service_domain=config_service.domain,
26+
service_id=config_service.id,
27+
service_type=config_service.type,
28+
keep_alive_listen=keep_alive_listen,
29+
)
30+
await amq.open(timeout=config_broker.timeout)
31+
return amq
32+
33+
34+
def run():
35+
loop = asyncio.get_event_loop()
36+
37+
parser = argparse.ArgumentParser(description="Broker Connected Data Agent CLI")
38+
subparsers = parser.add_subparsers(dest="instruction", help="Execute API call")
39+
subparsers.add_parser("exec")
40+
subparsers.add_parser("list_services")
41+
42+
config, unrecognized_args = init_configuration(
43+
loop=loop, is_service=False, parser=parser
44+
)
45+
known_args, _ = parser.parse_known_args()
46+
47+
config_service = component_config_view(config, CONFIG_SECTION_SERVICE)
48+
49+
log.info(
50+
'***** Broker Connected Agent CLI: "{}", Instruction: "{}", Ver: {} ******'.format(
51+
config_service["id"], known_args.instruction, __version__
52+
)
53+
)
54+
55+
broker = loop.run_until_complete(
56+
create_amq_broker_connector(
57+
config=config, keep_alive_listen=(known_args.instruction == "list_services")
58+
)
59+
)
60+
61+
task = None
62+
63+
if known_args.instruction == "exec":
64+
task = cli_exec(broker, config, unrecognized_args)
65+
elif known_args.instruction == "list_services":
66+
task = cli_list_services(broker, config, unrecognized_args)
67+
else:
68+
raise Exception("Unknown instruction")
69+
70+
loop.run_until_complete(task)
71+
72+
loop.run_until_complete(broker.close())
73+
loop.run_until_complete(loop.shutdown_asyncgens())
74+
loop.close()
75+
76+
77+
if __name__ == "__main__":
78+
run()

0 commit comments

Comments
 (0)