97 lines
2.2 KiB
Python
97 lines
2.2 KiB
Python
try:
|
|
from cam_server_client import PipelineClient
|
|
except ImportError:
|
|
from fake import PipelineClient
|
|
|
|
|
|
|
|
class Pipelines:
|
|
|
|
def __init__(self, addr="http://sf-daqsync-01:8889"):
|
|
self.pc = PipelineClient(addr)
|
|
self.refresh()
|
|
|
|
|
|
def refresh(self):
|
|
pc = self.pc
|
|
|
|
all_pls = pc.get_pipelines()
|
|
|
|
si = pc.get_server_info()
|
|
active_pls = si["active_instances"]
|
|
|
|
offline_pls = set(all_pls) - set(active_pls)
|
|
|
|
# spec_pls = (i for i in pls if "spec_db" in i)
|
|
|
|
self.all = sorted(all_pls)
|
|
self.active = sorted(active_pls)
|
|
self.offline = sorted(offline_pls)
|
|
|
|
|
|
def __iter__(self):
|
|
return (Pipeline(n, self) for n in self.all)
|
|
|
|
def __getitem__(self, name):
|
|
if name not in self.all:
|
|
raise RuntimeError(f"pipeline \"{name}\" does not exist")
|
|
return Pipeline(name, self)
|
|
|
|
|
|
|
|
class Pipeline:
|
|
|
|
def __init__(self, name, pls):
|
|
self.name = name
|
|
self.pls = pls
|
|
|
|
def __repr__(self):
|
|
return f"\"{self.name}\" is \"{self.state}\""
|
|
|
|
|
|
@property
|
|
def state(self):
|
|
pls = self.pls
|
|
name = self.name
|
|
pls.refresh()
|
|
|
|
if name not in pls.all:
|
|
raise RuntimeError(f"pipeline \"{name}\" does not exist")
|
|
if name in pls.active:
|
|
return "active"
|
|
if name in pls.offline:
|
|
return "offline"
|
|
|
|
raise RuntimeError(f"existing pipeline \"{name}\" is neither active nor offline")
|
|
|
|
|
|
def get(self):
|
|
pc = self.pls.pc
|
|
name = self.name
|
|
state = self.state
|
|
|
|
if state == "active":
|
|
return pc.get_instance_config(name)
|
|
if state == "offline":
|
|
return pc.get_config(name)
|
|
|
|
raise ValueError(f"state \"{state}\" for pipeline \"{name}\" not understood")
|
|
|
|
|
|
def set(self, cfg):
|
|
pc = self.pls.pc
|
|
name = self.name
|
|
state = self.state
|
|
|
|
if state == "active":
|
|
return pc.set_instance_config(name, cfg)
|
|
if state == "offline":
|
|
current = pc.get_config(name)
|
|
current.update(cfg)
|
|
return pc.set_config(name, current)
|
|
|
|
raise ValueError(f"state \"{state}\" for pipeline \"{name}\" not understood")
|
|
|
|
|
|
|