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.
Files changed (99) hide show
  1. {fc-server-0.7.2 → fc-server-0.7.3}/PKG-INFO +1 -1
  2. {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_client/Dockerfile +1 -1
  3. {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_guarder/Dockerfile +1 -1
  4. {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_server/Dockerfile +1 -1
  5. {fc-server-0.7.2 → fc-server-0.7.3}/fc_client/client.py +53 -0
  6. fc-server-0.7.3/fc_common/VERSION +1 -0
  7. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/core/api_svr.py +10 -1
  8. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/core/coordinator.py +1 -1
  9. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server.egg-info/PKG-INFO +1 -1
  10. fc-server-0.7.2/fc_common/VERSION +0 -1
  11. {fc-server-0.7.2 → fc-server-0.7.3}/.QualityGate +0 -0
  12. {fc-server-0.7.2 → fc-server-0.7.3}/.github/workflows/main.yml +0 -0
  13. {fc-server-0.7.2 → fc-server-0.7.3}/.gitignore +0 -0
  14. {fc-server-0.7.2 → fc-server-0.7.3}/.pylintrc +0 -0
  15. {fc-server-0.7.2 → fc-server-0.7.3}/.readthedocs.yaml +0 -0
  16. {fc-server-0.7.2 → fc-server-0.7.3}/LICENSE +0 -0
  17. {fc-server-0.7.2 → fc-server-0.7.3}/README.rst +0 -0
  18. {fc-server-0.7.2 → fc-server-0.7.3}/SCR-fc.txt +0 -0
  19. {fc-server-0.7.2 → fc-server-0.7.3}/ci/black.sh +0 -0
  20. {fc-server-0.7.2 → fc-server-0.7.3}/ci/docker.sh +0 -0
  21. {fc-server-0.7.2 → fc-server-0.7.3}/ci/package.sh +0 -0
  22. {fc-server-0.7.2 → fc-server-0.7.3}/ci/publish_docker.sh +0 -0
  23. {fc-server-0.7.2 → fc-server-0.7.3}/ci/pylint.sh +0 -0
  24. {fc-server-0.7.2 → fc-server-0.7.3}/ci/pytest.sh +0 -0
  25. {fc-server-0.7.2 → fc-server-0.7.3}/ci/setup.sh +0 -0
  26. {fc-server-0.7.2 → fc-server-0.7.3}/doc/Makefile +0 -0
  27. {fc-server-0.7.2 → fc-server-0.7.3}/doc/conf.py +0 -0
  28. {fc-server-0.7.2 → fc-server-0.7.3}/doc/configuration.rst +0 -0
  29. {fc-server-0.7.2 → fc-server-0.7.3}/doc/css/css-style.css +0 -0
  30. {fc-server-0.7.2 → fc-server-0.7.3}/doc/images/architecture.svg +0 -0
  31. {fc-server-0.7.2 → fc-server-0.7.3}/doc/images/era.svg +0 -0
  32. {fc-server-0.7.2 → fc-server-0.7.3}/doc/images/fc.png +0 -0
  33. {fc-server-0.7.2 → fc-server-0.7.3}/doc/images/flowchart.svg +0 -0
  34. {fc-server-0.7.2 → fc-server-0.7.3}/doc/images/principle.svg +0 -0
  35. {fc-server-0.7.2 → fc-server-0.7.3}/doc/index.rst +0 -0
  36. {fc-server-0.7.2 → fc-server-0.7.3}/doc/make.bat +0 -0
  37. {fc-server-0.7.2 → fc-server-0.7.3}/doc/overview.rst +0 -0
  38. {fc-server-0.7.2 → fc-server-0.7.3}/doc/quickstart.rst +0 -0
  39. {fc-server-0.7.2 → fc-server-0.7.3}/doc/support.rst +0 -0
  40. {fc-server-0.7.2 → fc-server-0.7.3}/doc/usage.rst +0 -0
  41. {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_client/fc-client +0 -0
  42. {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_guarder/docker-compose.yaml +0 -0
  43. {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_guarder/entrypoint.sh +0 -0
  44. {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_guarder/sample.env +0 -0
  45. {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_server/docker-compose.yaml +0 -0
  46. {fc-server-0.7.2 → fc-server-0.7.3}/docker/fc_server/entrypoint.sh +0 -0
  47. {fc-server-0.7.2 → fc-server-0.7.3}/fc_client/sample_client.env +0 -0
  48. {fc-server-0.7.2 → fc-server-0.7.3}/fc_client_daemon/client_daemon.py +0 -0
  49. {fc-server-0.7.2 → fc-server-0.7.3}/fc_client_docker/__init__.py +0 -0
  50. {fc-server-0.7.2 → fc-server-0.7.3}/fc_client_docker/fc_client_docker +0 -0
  51. {fc-server-0.7.2 → fc-server-0.7.3}/fc_common/__init__.py +0 -0
  52. {fc-server-0.7.2 → fc-server-0.7.3}/fc_common/config.py +0 -0
  53. {fc-server-0.7.2 → fc-server-0.7.3}/fc_common/etcd.py +0 -0
  54. {fc-server-0.7.2 → fc-server-0.7.3}/fc_common/logger.py +0 -0
  55. {fc-server-0.7.2 → fc-server-0.7.3}/fc_common/version.py +0 -0
  56. {fc-server-0.7.2 → fc-server-0.7.3}/fc_guarder/guarder.py +0 -0
  57. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/__init__.py +0 -0
  58. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/config/sample_cfg.yaml +0 -0
  59. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/config/sample_lavacli.yaml +0 -0
  60. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/config/sample_resource.yaml +0 -0
  61. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/core/__init__.py +0 -0
  62. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/core/config.py +0 -0
  63. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/core/decorators.py +0 -0
  64. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/core/plugin.py +0 -0
  65. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/management/__init__.py +0 -0
  66. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/management/cmd_online_lava_devices.py +0 -0
  67. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/management/common.py +0 -0
  68. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/plugins/__init__.py +0 -0
  69. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/plugins/labgrid.py +0 -0
  70. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/plugins/lava.py +0 -0
  71. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/plugins/utils/__init__.py +0 -0
  72. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/plugins/utils/labgrid.py +0 -0
  73. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/plugins/utils/lava.py +0 -0
  74. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server/server.py +0 -0
  75. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server.egg-info/SOURCES.txt +0 -0
  76. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server.egg-info/dependency_links.txt +0 -0
  77. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server.egg-info/entry_points.txt +0 -0
  78. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server.egg-info/requires.txt +0 -0
  79. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server.egg-info/top_level.txt +0 -0
  80. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server_daemon/__init__.py +0 -0
  81. {fc-server-0.7.2 → fc-server-0.7.3}/fc_server_daemon/server_daemon.py +0 -0
  82. {fc-server-0.7.2 → fc-server-0.7.3}/requirements/ci-requirements.txt +0 -0
  83. {fc-server-0.7.2 → fc-server-0.7.3}/requirements/client-requirements.txt +0 -0
  84. {fc-server-0.7.2 → fc-server-0.7.3}/requirements/doc-requirements.txt +0 -0
  85. {fc-server-0.7.2 → fc-server-0.7.3}/requirements/server-requirements.txt +0 -0
  86. {fc-server-0.7.2 → fc-server-0.7.3}/requirements.txt +0 -0
  87. {fc-server-0.7.2 → fc-server-0.7.3}/setup.cfg +0 -0
  88. {fc-server-0.7.2 → fc-server-0.7.3}/setup.py +0 -0
  89. {fc-server-0.7.2 → fc-server-0.7.3}/tests/conftest.py +0 -0
  90. {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_client/test_client.py +0 -0
  91. {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_guarder/conftest.py +0 -0
  92. {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_guarder/test_guarder.py +0 -0
  93. {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_server/config/cfg.yaml +0 -0
  94. {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_server/conftest.py +0 -0
  95. {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_server/test_config.py +0 -0
  96. {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_server/test_coordinator.py +0 -0
  97. {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_server/test_misc.py +0 -0
  98. {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_server/test_plugin_labgrid.py +0 -0
  99. {fc-server-0.7.2 → fc-server-0.7.3}/tests/fc_server/test_plugin_lava.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fc-server
3
- Version: 0.7.2
3
+ Version: 0.7.3
4
4
  Home-page: https://fc.readthedocs.io/
5
5
  Author: Larry Shen
6
6
  Author-email: larry.shen@nxp.com
@@ -1,4 +1,4 @@
1
- FROM python:3.9-buster
1
+ FROM python:3.9-bullseye
2
2
 
3
3
  WORKDIR /fc
4
4
 
@@ -1,4 +1,4 @@
1
- FROM python:3.9-buster
1
+ FROM python:3.9-bullseye
2
2
 
3
3
  WORKDIR /fc
4
4
 
@@ -1,4 +1,4 @@
1
- FROM python:3.9-buster
1
+ FROM python:3.9-bullseye
2
2
 
3
3
  WORKDIR /fc
4
4
 
@@ -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
- candidates.append(ws_resp.send_str(msg))
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 + ":" + status))
325
+ asyncio.create_task(self.publisher_queue.put({resource: status}))
326
326
 
327
327
  async def return_resource(self, resource):
328
328
  if (
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fc-server
3
- Version: 0.7.2
3
+ Version: 0.7.3
4
4
  Home-page: https://fc.readthedocs.io/
5
5
  Author: Larry Shen
6
6
  Author-email: larry.shen@nxp.com
@@ -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