fc-server 0.7.2__tar.gz → 0.7.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fc-server-0.7.2 → fc-server-0.7.3}/PKG-INFO +1 -1
- {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_client/Dockerfile +1 -1
- {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_guarder/Dockerfile +1 -1
- {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_server/Dockerfile +1 -1
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_client/client.py +53 -0
- fc-server-0.7.3/fc_common/VERSION +1 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/core/api_svr.py +10 -1
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/core/coordinator.py +1 -1
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server.egg-info/PKG-INFO +1 -1
- fc-server-0.7.2/fc_common/VERSION +0 -1
- {fc-server-0.7.2 → fc-server-0.7.3}/.QualityGate +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/.github/workflows/main.yml +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/.gitignore +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/.pylintrc +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/.readthedocs.yaml +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/LICENSE +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/README.rst +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/SCR-fc.txt +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/ci/black.sh +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/ci/docker.sh +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/ci/package.sh +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/ci/publish_docker.sh +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/ci/pylint.sh +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/ci/pytest.sh +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/ci/setup.sh +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/doc/Makefile +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/doc/conf.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/doc/configuration.rst +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/doc/css/css-style.css +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/doc/images/architecture.svg +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/doc/images/era.svg +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/doc/images/fc.png +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/doc/images/flowchart.svg +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/doc/images/principle.svg +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/doc/index.rst +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/doc/make.bat +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/doc/overview.rst +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/doc/quickstart.rst +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/doc/support.rst +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/doc/usage.rst +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_client/fc-client +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_guarder/docker-compose.yaml +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_guarder/entrypoint.sh +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_guarder/sample.env +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_server/docker-compose.yaml +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_server/entrypoint.sh +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_client/sample_client.env +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_client_daemon/client_daemon.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_client_docker/__init__.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_client_docker/fc_client_docker +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_common/__init__.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_common/config.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_common/etcd.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_common/logger.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_common/version.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_guarder/guarder.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/__init__.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/config/sample_cfg.yaml +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/config/sample_lavacli.yaml +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/config/sample_resource.yaml +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/core/__init__.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/core/config.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/core/decorators.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/core/plugin.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/management/__init__.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/management/cmd_online_lava_devices.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/management/common.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/plugins/__init__.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/plugins/labgrid.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/plugins/lava.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/plugins/utils/__init__.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/plugins/utils/labgrid.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/plugins/utils/lava.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/server.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server.egg-info/SOURCES.txt +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server.egg-info/dependency_links.txt +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server.egg-info/entry_points.txt +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server.egg-info/requires.txt +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server.egg-info/top_level.txt +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server_daemon/__init__.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/fc_server_daemon/server_daemon.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/requirements/ci-requirements.txt +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/requirements/client-requirements.txt +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/requirements/doc-requirements.txt +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/requirements/server-requirements.txt +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/requirements.txt +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/setup.cfg +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/setup.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/tests/conftest.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_client/test_client.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_guarder/conftest.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_guarder/test_guarder.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_server/config/cfg.yaml +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_server/conftest.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_server/test_config.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_server/test_coordinator.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_server/test_misc.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_server/test_plugin_labgrid.py +0 -0
- {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_server/test_plugin_lava.py +0 -0
|
@@ -516,6 +516,52 @@ class Client:
|
|
|
516
516
|
else:
|
|
517
517
|
sys.exit("No resource specified.")
|
|
518
518
|
|
|
519
|
+
@staticmethod
|
|
520
|
+
def monitor(args):
|
|
521
|
+
records = set()
|
|
522
|
+
|
|
523
|
+
async def subscribe(instance_meta):
|
|
524
|
+
fc_server_name = instance_meta[0]
|
|
525
|
+
fc_server = instance_meta[1].get("fc", None)
|
|
526
|
+
print(f"Subscribing to {fc_server} for events...")
|
|
527
|
+
records.add(fc_server)
|
|
528
|
+
|
|
529
|
+
try:
|
|
530
|
+
async with aiohttp.ClientSession() as session:
|
|
531
|
+
async with session.ws_connect(
|
|
532
|
+
f"{fc_server}/ws"
|
|
533
|
+
) as ws: # pylint: disable=invalid-name
|
|
534
|
+
async for msg in ws:
|
|
535
|
+
if msg.type == aiohttp.WSMsgType.TEXT:
|
|
536
|
+
print(f"{fc_server_name}({fc_server}) - {msg.data}")
|
|
537
|
+
if "callback" in args and callable(args.callback):
|
|
538
|
+
if asyncio.iscoroutinefunction(args.callback):
|
|
539
|
+
await args.callback(msg.data)
|
|
540
|
+
else:
|
|
541
|
+
args.callback(msg.data)
|
|
542
|
+
except aiohttp.ClientError as exc:
|
|
543
|
+
print(f"Error connecting to {fc_server}: {exc}")
|
|
544
|
+
|
|
545
|
+
print(f"Unsubscribing from {fc_server}")
|
|
546
|
+
records.remove(fc_server)
|
|
547
|
+
await session.close()
|
|
548
|
+
|
|
549
|
+
async def start_monitor():
|
|
550
|
+
while True:
|
|
551
|
+
metadata = Client.fetch_metadata("all")
|
|
552
|
+
for instance_meta in metadata.items():
|
|
553
|
+
fc_server = instance_meta[1]["fc"]
|
|
554
|
+
if fc_server not in records:
|
|
555
|
+
asyncio.create_task(subscribe(instance_meta))
|
|
556
|
+
|
|
557
|
+
await asyncio.sleep(60)
|
|
558
|
+
|
|
559
|
+
loop = asyncio.get_event_loop()
|
|
560
|
+
if loop.is_running():
|
|
561
|
+
asyncio.create_task(start_monitor())
|
|
562
|
+
else:
|
|
563
|
+
loop.run_until_complete(start_monitor())
|
|
564
|
+
|
|
519
565
|
|
|
520
566
|
class VerbosityAction(argparse.Action):
|
|
521
567
|
def __call__(self, parser, namespace, values, option_string=None):
|
|
@@ -567,6 +613,8 @@ def main():
|
|
|
567
613
|
"c",
|
|
568
614
|
"init",
|
|
569
615
|
"i",
|
|
616
|
+
"monitor",
|
|
617
|
+
"m",
|
|
570
618
|
]
|
|
571
619
|
or not args.resource
|
|
572
620
|
):
|
|
@@ -612,6 +660,11 @@ def main():
|
|
|
612
660
|
subparser = subparsers.add_parser("init", aliases=("i",), help="init fc-client")
|
|
613
661
|
subparser.set_defaults(func=Client.init)
|
|
614
662
|
|
|
663
|
+
subparser = subparsers.add_parser(
|
|
664
|
+
"monitor", aliases=("m",), help="monitor event"
|
|
665
|
+
)
|
|
666
|
+
subparser.set_defaults(func=Client.monitor)
|
|
667
|
+
|
|
615
668
|
if len(extras) > 0 and extras[0] in ["init", "i"]:
|
|
616
669
|
args, extras = parser.parse_known_args(extras, namespace=args)
|
|
617
670
|
Client.action(args.func, extras)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.7.3
|
|
@@ -433,6 +433,8 @@ class ApiSvr(AsyncRunMixin):
|
|
|
433
433
|
request.app["ws"].discard(ws_resp)
|
|
434
434
|
logger.info(f"Subscriber {request.remote} leave")
|
|
435
435
|
|
|
436
|
+
return ws_resp
|
|
437
|
+
|
|
436
438
|
async def publisher(self, app):
|
|
437
439
|
logger = app["logger"]
|
|
438
440
|
|
|
@@ -442,7 +444,14 @@ class ApiSvr(AsyncRunMixin):
|
|
|
442
444
|
candidates = []
|
|
443
445
|
for ws_resp in set(app["ws"]):
|
|
444
446
|
logger.info(f"Send {msg} to subscriber")
|
|
445
|
-
|
|
447
|
+
msg_str = msg if isinstance(msg, str) else None
|
|
448
|
+
if msg_str is None:
|
|
449
|
+
try:
|
|
450
|
+
msg_str = json.dumps(msg)
|
|
451
|
+
except (TypeError, ValueError) as exc:
|
|
452
|
+
logger.error(f"Failed to serialize message: {exc}")
|
|
453
|
+
continue
|
|
454
|
+
candidates.append(ws_resp.send_str(msg_str))
|
|
446
455
|
await asyncio.gather(*candidates)
|
|
447
456
|
|
|
448
457
|
async def on_startup(self, app):
|
|
@@ -322,7 +322,7 @@ class Coordinator:
|
|
|
322
322
|
def __set_resource_status(self, resource, status):
|
|
323
323
|
self.__managed_resources_status[resource] = status
|
|
324
324
|
self.logger.info("* %s now belongs to %s", resource, status)
|
|
325
|
-
asyncio.create_task(self.publisher_queue.put(resource
|
|
325
|
+
asyncio.create_task(self.publisher_queue.put({resource: status}))
|
|
326
326
|
|
|
327
327
|
async def return_resource(self, resource):
|
|
328
328
|
if (
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.7.2
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|