This documents the redesign of the Metadata subsystem. Goals * Separate core metadata (groups, etc) functionality from augmentors * Enable metadata integration with external data sources * Make metadata features (group inclusion, categories) usable from external datasources The basic idea of this redesign is to split Metadata functions into two major components. One master MetadataPlugin instance handles client identification/authentication, profile assertion, group categories, and metadata instance construction. Multiple MetadataConnectorPlugin instances each contribute additional group memberships and a set of per-instance key/value pairs. This data is merged into the client metadata instance by the master MetadataPlugin. Use Cases * Mapping external data into client metadata instances ** Probes ** Properties ** External network management ** Monitoring ** LDAP data API * Bcfg2.Server.Core.Core ** build_metadata(client_name) * Bcfg2.Server.Plugin.MetadataPlugin ** get_initial_metadata(client_name) ** merge_additional_metadata(metadata, source, group, data_dict) * Bcfg2.Server.Plugin.MetadataConnectorPlugin ** get_additional_metadata(client_metadata) Metadata Resolution Control Flow * B.S.P.MP.resolve_client() -> canonical client name * B.S.C.C.build_metadata() ** B.S.P.MP.get_initial_metadata() -> partial ClientMetadata inst ** [B.S.P.MCP.get_additional_metadata()] -> [([group list], {data dictionary})] ** [B.S.P.MP.merge_additional_metadata()] Implementation Plan (done) * Define new plugin classes * Split Probe code out to discrete plugin * Implement connector support in Core * switch callers to Core.build_metadata * Implement group inheritance/category safety for Connector groups Next Steps * Figure out new version of properties * ICE integration? * zultron's host properties * other external data sources