1
0
mirror of https://github.com/checktheroads/hyperglass synced 2024-05-11 05:55:08 +00:00

Add directives to global state

This commit is contained in:
thatmattlove
2021-09-17 09:04:59 -07:00
parent 9a57e4a728
commit 7adb6ae0ec
9 changed files with 236 additions and 11 deletions

View File

@@ -14,6 +14,7 @@ from ..settings import Settings
if t.TYPE_CHECKING:
# Project
from hyperglass.models.ui import UIParameters
from hyperglass.models.directive import Directives
from hyperglass.models.config.params import Params
from hyperglass.models.config.devices import Devices
@@ -58,6 +59,11 @@ def use_state(attr: t.Literal["cache", "redis"]) -> "RedisManager":
"""Directly access hyperglass Redis cache manager."""
@t.overload
def use_state(attr: t.Literal["directives"]) -> "Directives":
"""Access all hyperglass directives."""
@t.overload
def use_state(attr=None) -> "HyperglassState":
"""Access entire global state.

View File

@@ -8,7 +8,6 @@ from redis import Redis, ConnectionPool
# Project
from hyperglass.util import repr_from_attrs
from hyperglass.configuration import params, devices, ui_params
# Local
from .redis import RedisManager
@@ -36,11 +35,6 @@ class StateManager:
redis = Redis(connection_pool=connection_pool)
self.redis = RedisManager(instance=redis, namespace=self._namespace)
# Add configuration objects.
self.redis.set("params", params)
self.redis.set("devices", devices)
self.redis.set("ui_params", ui_params)
def __repr__(self) -> str:
"""Represent state manager by name and namespace."""
return repr_from_attrs(self, ("redis", "namespace"))

View File

@@ -5,6 +5,9 @@ import codecs
import pickle
import typing as t
# Project
from hyperglass.configuration import params, devices, ui_params, directives
# Local
from .manager import StateManager
@@ -13,6 +16,7 @@ if t.TYPE_CHECKING:
from hyperglass.models.ui import UIParameters
from hyperglass.models.system import HyperglassSystem
from hyperglass.plugins._base import HyperglassPlugin
from hyperglass.models.directive import Directive, Directives
from hyperglass.models.config.params import Params
from hyperglass.models.config.devices import Devices
@@ -26,6 +30,13 @@ class HyperglassState(StateManager):
def __init__(self, *, settings: "HyperglassSystem") -> None:
"""Initialize state store and reset plugins."""
super().__init__(settings=settings)
# Add configuration objects.
self.redis.set("params", params)
self.redis.set("devices", devices)
self.redis.set("ui_params", ui_params)
self.redis.set("directives", directives)
# Ensure plugins are empty.
self.reset_plugins("output")
self.reset_plugins("input")
@@ -57,6 +68,12 @@ class HyperglassState(StateManager):
"""Remove all plugins of `_type`."""
self.redis.set(("plugins", _type), [])
def add_directive(self, *directives: t.Union["Directive", t.Dict[str, t.Any]]) -> None:
"""Add a directive."""
current = self.directives
current.add(*directives, unique_by="id")
self.redis.set("directives", current)
def clear(self) -> None:
"""Delete all cache keys."""
self.redis.instance.flushdb(asynchronous=True)
@@ -76,6 +93,11 @@ class HyperglassState(StateManager):
"""UI parameters, built from params."""
return self.redis.get("ui_params", raise_if_none=True)
@property
def directives(self) -> "Directives":
"""All directives."""
return self.redis.get("directives", raise_if_none=True)
def plugins(self, _type: str) -> t.List[PluginT]:
"""Get plugins by type."""
current = self.redis.get(("plugins", _type), raise_if_none=False, value_if_none=[])