##############################################################################
#
# Crossbar.io Database
# Copyright (c) typedef int GmbH. Licensed under MIT.
#
##############################################################################
from zlmdb import (
MapStringStringStringUuid,
MapStringUuid,
MapUuidCbor,
MapUuidStringUuid,
MapUuidTimestampUuid,
MapUuidUuidCbor,
MapUuidUuidUuid,
MapUuidUuidUuidStringUuid,
MapUuidUuidUuidUuid,
table,
)
from cfxdb.log import MNodeLogs, MWorkerLogs
from cfxdb.mrealm import (
ApplicationRealm,
ApplicationRealmRoleAssociation,
Credential,
Permission,
Principal,
Role,
RouterCluster,
RouterClusterNodeMembership,
RouterWorkerGroup,
RouterWorkerGroupClusterPlacement,
WebCluster,
WebClusterNodeMembership,
WebService,
)
__all__ = ("MrealmSchema",)
#
# Application Realms
#
@table("7099565b-7b44-4891-a0c8-83c7dbb60883", marshal=ApplicationRealm.marshal, parse=ApplicationRealm.parse)
[docs]
class ApplicationRealms(MapUuidCbor):
"""
Application realms defined for user application routing (``arealm_oid -> arealm``).
"""
@table("89f3073a-32d5-497e-887d-7e930e9c26e6")
[docs]
class IndexApplicationRealmByName(MapStringUuid):
"""
Index of application realms by realm name (``arealm_name -> arealm_oid``).
"""
@table("0275b858-890c-4879-945c-720235b093d7")
[docs]
class IndexApplicationRealmByWebCluster(MapUuidStringUuid):
"""
Index of application realms by webclusters and realm names (``(webcluster_oid, arealm_name) -> arealm_oid``).
"""
#
# Principals
#
@table("9808cb0b-1b55-4b3f-858e-39004cb11135", marshal=Principal.marshal, parse=Principal.parse)
[docs]
class Principals(MapUuidCbor):
"""
Principals created for use with WAMP authentication (``principal_oid -> principal``).
"""
@table("212f3455-6d4c-43ec-843d-53cd17e31974")
[docs]
class IndexPrincipalByName(MapUuidStringUuid):
"""
Index of principals by application realms and principal names (``(arealm_oid, principal_name) -> principal_oid``).
"""
#
# Credentials
#
@table("251c8620-425a-4eeb-ade9-4284e8670080", marshal=Credential.marshal, parse=Credential.parse)
[docs]
class Credentials(MapUuidCbor):
"""
Credentials created for use with WAMP authentication (``credential_oid -> credential``).
"""
@table("45490b42-b167-4df6-ab1c-41d434390397")
[docs]
class IndexCredentialsByAuth(MapStringStringStringUuid):
"""
Index of credentials by authentication method, realm name and authentication ID (``(authmethod, realm_name, authid) -> credential_oid``).
"""
@table("ed0da771-e331-4d93-b50c-d371391cd7b9")
[docs]
class IndexCredentialsByPrincipal(MapUuidTimestampUuid):
"""
Index of credentials by principals and modification date (``(principal_oid, modified) -> credential_oid``).
"""
#
# Roles
#
@table("341083bb-edeb-461c-a6d4-38dddcda6ec9", marshal=Role.marshal, parse=Role.parse)
[docs]
class Roles(MapUuidCbor):
"""
Roles created for use with application-level authorization and permissions in application realms (``role_oid -> role``).
"""
@table("71b990d1-4525-44cd-9ef8-3569de8b4c80")
[docs]
class IndexRoleByName(MapStringUuid):
"""
Index of roles by role names (``role_name -> role_oid``).
"""
#
# Permissions
#
@table("f98ed35b-f8fb-47ba-81e1-3c014101464d", marshal=Permission.marshal, parse=Permission.parse)
[docs]
class Permissions(MapUuidCbor):
"""
Role permission database object (``permission_oid -> permission``).
"""
@table("6cdc21bf-353d-4477-8631-8eb039142ae9")
[docs]
class IndexPermissionByUri(MapUuidStringUuid):
"""
Index of role permissions by roles and URIs (``(role_oid, uri) -> permission_oid``).
"""
#
# Application Realm Role Associations
#
@table(
"5eabdb63-9c31-4c97-b514-7e8fbac7e143",
marshal=ApplicationRealmRoleAssociation.marshal,
parse=ApplicationRealmRoleAssociation.parse,
)
[docs]
class ApplicationRealmRoleAssociations(MapUuidUuidCbor):
"""
Association of a role with an application realm (``(arealm_oid, role_oid) -> arealm_role_association``).
"""
#
# Router clusters
#
@table("b054a230-c370-4c29-b5de-7e0148321b0a", marshal=RouterCluster.marshal, parse=RouterCluster.parse)
[docs]
class RouterClusters(MapUuidCbor):
"""
A router cluster is able to run (application) realms, and is hosted on a groups of router workers
kept in sync and meshed via router-to-router links (``routercluster_oid -> routercluster``).
"""
@table("0c80c7a8-7536-4a74-8916-4922c0b72cb7")
[docs]
class IndexRouterClusterByName(MapStringUuid):
"""
Index of router clusters by router cluster names (``routercluster_name -> routercluster_oid``).
"""
#
# Router cluster node memberships
#
@table(
"a091bad6-f14c-437c-8e30-e9be84380658",
marshal=RouterClusterNodeMembership.marshal,
parse=RouterClusterNodeMembership.parse,
)
[docs]
class RouterClusterNodeMemberships(MapUuidUuidCbor):
"""
Membership of a managed node (paired within a management realm) to a router cluster (``(cluster_oid, node_oid) -> cluster_node_membership``).
"""
#
# Router worker groups
#
@table("c019457b-d499-454f-9bf2-4f7e85079d8f", marshal=RouterWorkerGroup.marshal, parse=RouterWorkerGroup.parse)
[docs]
class RouterWorkerGroups(MapUuidCbor):
"""
Router worker group database configuration object (``workergroup_oid -> workergroup``).
"""
@table("4bb8ec14-4820-4061-8b2c-d1841e2686e1")
[docs]
class IndexWorkerGroupByCluster(MapUuidStringUuid):
"""
Index of router worker groups by router clusters and group names (``(cluster_oid, workergroup_name) -> workergroup_oid``).
"""
@table("4c7d184b-2303-492d-822d-ed12516050a9")
[docs]
class IndexWorkerGroupByPlacement(MapUuidUuidUuidUuid):
"""
Index of router worker groups by cluster, node and placement (``(cluster_oid, node_oid, placement_oid) -> workergroup_oid``).
"""
#
# Router worker groups to cluster node placements
#
@table(
"e3d326d2-6140-47a9-adf9-8e93b832717b",
marshal=RouterWorkerGroupClusterPlacement.marshal,
parse=RouterWorkerGroupClusterPlacement.parse,
)
[docs]
class RouterWorkerGroupClusterPlacements(MapUuidCbor):
"""
Router worker group placements of workers (``placement_oid -> placement``).
"""
@table("1a18739f-7224-4459-a446-6f1fedd760a7")
[docs]
class IndexClusterPlacementByWorkerName(MapUuidUuidUuidStringUuid):
"""
Index of router worker group placements by worker group, cluster, node and worker name (``(workergroup_oid, cluster_oid, node_oid, worker_name) -> placement_oid``).
"""
#
# Web clusters
#
@table("719d029f-e9d5-4b25-98e0-cf04d5a2648b", marshal=WebCluster.marshal, parse=WebCluster.parse)
[docs]
class WebClusters(MapUuidCbor):
"""
Web cluster database configuration object (``webcluster_oid -> webcluster``).
"""
@table("296c7d17-4769-4e40-8cb7-e6c394b93335")
[docs]
class IndexWebClusterByName(MapStringUuid):
"""
Index of web clusters by cluster name (``webcluster_name -> webcluster_oid``).
"""
#
# Web cluster node memberships
#
@table(
"e9801077-a629-470b-a4c9-4292a1f00d43",
marshal=WebClusterNodeMembership.marshal,
parse=WebClusterNodeMembership.parse,
)
[docs]
class WebClusterNodeMemberships(MapUuidUuidCbor):
"""
Information about memberships of nodes in web clusters (``(webcluster_oid, node_oid) -> webcluster_node_membership``).
"""
#
# Web cluster services
#
@table("a8803ca3-09a0-4d72-8728-2469de8d50ac", marshal=WebService.marshal, parse=WebService.parse)
[docs]
class WebServices(MapUuidCbor):
"""
Web cluster services (``webservice_oid -> webservice``).
"""
@table("d23d4dbb-5d5c-4ccc-b72a-0ff18363169f")
[docs]
class IndexWebClusterWebServices(MapUuidUuidUuid):
"""
Index of web services by web cluster and web service (``(webcluster_oid, webservice_oid) -> webservice_oid``).
"""
@table("f0b05bcf-f682-49bb-929e-ac252e9867fa")
[docs]
class IndexWebServiceByPath(MapUuidStringUuid):
"""
Index of web services by web cluster and web service name (``(webcluster_oid, webservice_name) -> webservice_oid``).
"""
@table("62d0841c-602e-473e-a6d5-3d8ce01e9e06")
class IndexWebClusterPathToWebService(MapUuidStringUuid):
"""
Index of web services by web cluster and web path (``(webcluster_oid, path) -> webservice_oid``).
"""
[docs]
class MrealmSchema(object):
"""
Management realm database schema.
"""
def __init__(self, db):
"""
Application realm client principals.
"""
[docs]
idx_principals_by_name: IndexPrincipalByName
"""
Index on principals (by name).
"""
[docs]
credentials: Credentials
"""
WAMP client authentication credentials, used for mapping ``(authmethod, realm, authid) -> principal``.
"""
[docs]
idx_credentials_by_auth: IndexCredentialsByAuth
"""
Index on credentials (by WAMP auth information).
"""
[docs]
idx_credentials_by_principal: IndexCredentialsByPrincipal
"""
Index on credentials (by principal_oid, modified).
"""
"""
Roles for used in authorization with application routing.
"""
[docs]
idx_roles_by_name: IndexRoleByName
"""
Index on roles (by name).
"""
[docs]
permissions: Permissions
"""
Permissions defined on roles.
"""
[docs]
idx_permissions_by_uri: IndexPermissionByUri
"""
Index on permissions: by URI.
"""
[docs]
arealms: ApplicationRealms
"""
Application realms defined in this management realm.
"""
[docs]
idx_arealms_by_name: IndexApplicationRealmByName
"""
Index on application realms: by name.
"""
[docs]
idx_arealm_by_webcluster: IndexApplicationRealmByWebCluster
"""
Index on application realms: by web cluster.
"""
[docs]
arealm_role_associations: ApplicationRealmRoleAssociations
"""
Association of roles to application realms.
"""
[docs]
routerclusters: RouterClusters
"""
Router clusters defined in this management realm.
"""
[docs]
idx_routerclusters_by_name: IndexRouterClusterByName
"""
Index on router clusters: by name.
"""
[docs]
routercluster_node_memberships: RouterClusterNodeMemberships
"""
Node membership in router clusters.
"""
[docs]
router_workergroups: RouterWorkerGroups
"""
Router worker groups.
"""
[docs]
idx_workergroup_by_cluster: IndexWorkerGroupByCluster
"""
Index on worker groups: by cluster.
"""
[docs]
idx_workergroup_by_placement: IndexWorkerGroupByPlacement
"""
Index on worker groups: by placement.
"""
[docs]
router_workergroup_placements: RouterWorkerGroupClusterPlacements
"""
Router worker cluster placements.
"""
[docs]
idx_clusterplacement_by_workername: IndexClusterPlacementByWorkerName
"""
Index on router worker placements: by worker name.
"""
[docs]
webclusters: WebClusters
"""
Web clusters.
"""
[docs]
idx_webclusters_by_name: IndexWebClusterByName
"""
Index of web clusters: by name.
"""
[docs]
webcluster_node_memberships: WebClusterNodeMemberships
"""
Node membership in web clusters.
"""
[docs]
webservices: WebServices
"""
Web service added to web clusters.
"""
[docs]
idx_webservices_by_path: IndexWebServiceByPath
"""
Index on web services: by HTTP path.
"""
[docs]
idx_webcluster_webservices: IndexWebClusterWebServices
"""
Index on web service: by ...
"""
"""
Managed node log records.
"""
[docs]
mworker_logs: MWorkerLogs
"""
Managed node worker log records.
"""
@staticmethod
[docs]
def attach(db):
"""
Factory to create a schema from attaching to a database. The schema tables
will be automatically mapped as persistant maps and attached to the
database slots.
:param db: zlmdb.Database
:return: object of Schema
"""
schema = MrealmSchema(db)
# application realms
schema.arealms = db.attach_table(ApplicationRealms)
schema.idx_arealms_by_name = db.attach_table(IndexApplicationRealmByName)
schema.arealms.attach_index("idx1", schema.idx_arealms_by_name, lambda arealm: arealm.name)
schema.idx_arealm_by_webcluster = db.attach_table(IndexApplicationRealmByWebCluster)
schema.arealms.attach_index(
"idx2", schema.idx_arealm_by_webcluster, lambda arealm: (arealm.webcluster_oid, arealm.name), nullable=True
)
# principals
schema.principals = db.attach_table(Principals)
schema.idx_principals_by_name = db.attach_table(IndexPrincipalByName)
schema.principals.attach_index(
"idx1", schema.idx_principals_by_name, lambda principal: (principal.arealm_oid, principal.authid)
)
# credentials
schema.credentials = db.attach_table(Credentials)
schema.idx_credentials_by_auth = db.attach_table(IndexCredentialsByAuth)
schema.credentials.attach_index(
"idx1",
schema.idx_credentials_by_auth,
lambda credential: (credential.authmethod, credential.realm, credential.authid),
)
schema.idx_credentials_by_principal = db.attach_table(IndexCredentialsByPrincipal)
schema.credentials.attach_index(
"idx2",
schema.idx_credentials_by_principal,
lambda credential: (credential.principal_oid, credential.created),
)
# roles
schema.roles = db.attach_table(Roles)
schema.idx_roles_by_name = db.attach_table(IndexRoleByName)
schema.roles.attach_index("idx1", schema.idx_roles_by_name, lambda role: role.name)
schema.arealm_role_associations = db.attach_table(ApplicationRealmRoleAssociations)
# permissions
schema.permissions = db.attach_table(Permissions)
schema.idx_permissions_by_uri = db.attach_table(IndexPermissionByUri)
schema.permissions.attach_index(
"idx1", schema.idx_permissions_by_uri, lambda permission: (permission.role_oid, permission.uri)
)
# router clusters
schema.routerclusters = db.attach_table(RouterClusters)
schema.idx_routerclusters_by_name = db.attach_table(IndexRouterClusterByName)
schema.routerclusters.attach_index(
"idx1", schema.idx_routerclusters_by_name, lambda routercluster: routercluster.name
)
schema.routercluster_node_memberships = db.attach_table(RouterClusterNodeMemberships)
# router worker groups
schema.router_workergroups = db.attach_table(RouterWorkerGroups)
schema.idx_workergroup_by_cluster = db.attach_table(IndexWorkerGroupByCluster)
schema.router_workergroups.attach_index(
"idx1", schema.idx_workergroup_by_cluster, lambda wg: (wg.cluster_oid, wg.name)
)
# router worker group placements
schema.router_workergroup_placements = db.attach_table(RouterWorkerGroupClusterPlacements)
# index: (workergroup_oid, cluster_oid, node_oid, worker_name) -> placement_oid
schema.idx_clusterplacement_by_workername = db.attach_table(IndexClusterPlacementByWorkerName)
schema.router_workergroup_placements.attach_index(
"idx1",
schema.idx_clusterplacement_by_workername,
lambda p: (p.worker_group_oid, p.cluster_oid, p.node_oid, p.worker_name),
)
# index: (cluster_oid, node_oid, placement_oid) -> placement_oid
schema.idx_workergroup_by_placement = db.attach_table(IndexWorkerGroupByPlacement)
schema.router_workergroup_placements.attach_index(
"idx2", schema.idx_workergroup_by_placement, lambda p: (p.cluster_oid, p.node_oid, p.oid)
)
# web clusters
schema.webclusters = db.attach_table(WebClusters)
schema.idx_webclusters_by_name = db.attach_table(IndexWebClusterByName)
schema.webclusters.attach_index("idx1", schema.idx_webclusters_by_name, lambda webcluster: webcluster.name)
schema.webcluster_node_memberships = db.attach_table(WebClusterNodeMemberships)
# web services
schema.webservices = db.attach_table(WebServices)
schema.idx_webservices_by_path = db.attach_table(IndexWebServiceByPath)
schema.webservices.attach_index(
"idx1", schema.idx_webservices_by_path, lambda webservice: (webservice.webcluster_oid, webservice.path)
)
schema.idx_webcluster_webservices = db.attach_table(IndexWebClusterWebServices)
schema.webservices.attach_index(
"idx2", schema.idx_webcluster_webservices, lambda webservice: (webservice.webcluster_oid, webservice.oid)
)
schema.mnode_logs = db.attach_table(MNodeLogs)
schema.mworker_logs = db.attach_table(MWorkerLogs)
return schema