summaryrefslogtreecommitdiffstats
path: root/tools/upgrade/1.3/migrate_probe_groups_to_db.py
blob: f9abbf9822d9177d023484c6e437930acbd2ebac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/bin/env python
""" Migrate Probe host and group data from XML to DB backend for Metadata
and Probe plugins. Does not migrate individual probe return data. Assumes
migration to BOTH Metadata and Probe to database backends. """

import os
import sys
import lxml.etree
import Bcfg2.Options
import Bcfg2.DBSettings


def migrate(xclient, MetadataClientModel, ProbesGroupsModel):
    """ Helper to do the migration given a <Client/> XML element """
    client_name = xclient.get('name')
    try:
        try:
            client = MetadataClientModel.objects.get(hostname=client_name)
        except MetadataClientModel.DoesNotExist:
            client = MetadataClientModel(hostname=client_name)
            client.save()
    except:
        print("Failed to migrate client %s" % (client))
        return False

    try:
        cgroups = []
        for xgroup in xclient.findall('Group'):
            group_name = xgroup.get('name')
            cgroups.append(group_name)
            try:
                group = ProbesGroupsModel.objects.get(hostname=client_name,
                                                      group=group_name)
            except ProbesGroupsModel.DoesNotExist:
                group = ProbesGroupsModel(hostname=client_name,
                                          group=group_name)
                group.save()

        ProbesGroupsModel.objects.filter(
            hostname=client.hostname).exclude(
            group__in=cgroups).delete()

    except:
        print("Failed to migrate groups")
        return False
    return True


def main():
    """ Main """
    opts = dict(repo=Bcfg2.Options.SERVER_REPOSITORY)
    setup = Bcfg2.Options.OptionParser(opts)
    setup.parse(sys.argv[1:])

    probefile = os.path.join(setup['repo'], 'Probes', "probed.xml")

    try:
        xdata = lxml.etree.parse(probefile)
    except lxml.etree.XMLSyntaxError:
        err = sys.exc_info()[1]
        print("Could not parse %s, skipping: %s" % (probefile, err))

    # these must be loaded after option parsing is complete
    from Bcfg2.Server.Plugins.Metadata import MetadataClientModel
    from Bcfg2.Server.Plugins.Probes import ProbesGroupsModel

    for xclient in xdata.findall('Client'):
        print("Migrating Metadata and Probe groups for %s" %
              xclient.get('name'))
        migrate(xclient, MetadataClientModel, ProbesGroupsModel)

if __name__ == '__main__':
    sys.exit(main())