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
