Cluster rule to compare ntp.conf files across a cluster

    ``shas`` is a Pandas DataFrame for the facts for each host
    by the fact ``ntp_sha256``.  See
    https://pandas.pydata.org/pandas-docs/stable/api.html#dataframe
    for information on available attributes and methods.

    ``meta`` is a dictionary that contains the information from the
    cluster topology file provided by the ``-i`` switch.  The dictionary
    keys are the sections, and the values are a list of the host
    information provided in the toplolgy file.

    Arguments:
        shas (pandas.DataFrame): Includes facts from ``ntp_sha256``
            fact with column "sha" and one row per host in the cluster.
        meta (dict): Keys are the sections in the topology file and
            values are a list of the values in the section.

def report(shas, meta):
    """
    Cluster rule to compare ntp.conf files across a cluster

    ``shas`` is a Pandas DataFrame for the facts for each host
    by the fact ``ntp_sha256``.  See
    https://pandas.pydata.org/pandas-docs/stable/api.html#dataframe
    for information on available attributes and methods.

    ``meta`` is a dictionary that contains the information from the
    cluster topology file provided by the ``-i`` switch.  The dictionary
    keys are the sections, and the values are a list of the host
    information provided in the toplolgy file.

    Arguments:
        shas (pandas.DataFrame): Includes facts from ``ntp_sha256``
            fact with column "sha" and one row per host in the cluster.
        meta (dict): Keys are the sections in the topology file and
            values are a list of the values in the section.
    """
    num_members = meta.num_members
    uniq = shas.sha.unique()
    if len(shas) != num_members or len(uniq) != 1:
        return make_fail("DISTINCT_NTP_CONFS", confs=len(uniq), nodes=num_members)

    return make_pass("MATCHING_NTP_CONFS", nodes=meta['nodes'], servers=meta['servers'])