summaryrefslogtreecommitdiffstats
path: root/src/lib/Bcfg2/Server/Plugins/DBMetadata.py
blob: 16a6e0dcc560e9cb3342edcff7e8e1124e1231a2 (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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import os
import sys
from UserDict import DictMixin
from django.db import models
import Bcfg2.Server.Lint
import Bcfg2.Server.Plugin
from Bcfg2.Server.Plugins.Metadata import *

class MetadataClientModel(models.Model,
                          Bcfg2.Server.Plugin.PluginDatabaseModel):
    hostname = models.CharField(max_length=255, primary_key=True)
    version = models.CharField(max_length=31, null=True)


class ClientVersions(DictMixin):
    def __getitem__(self, key):
        try:
            return MetadataClientModel.objects.get(hostname=key).version
        except MetadataClientModel.DoesNotExist:
            raise KeyError(key)

    def __setitem__(self, key, value):
        client = MetadataClientModel.objects.get_or_create(hostname=key)[0]
        client.version = value
        client.save()

    def keys(self):
        return [c.hostname for c in MetadataClientModel.objects.all()]

    def __contains__(self, key):
        try:
            client = MetadataClientModel.objects.get(hostname=key)
            return True
        except MetadataClientModel.DoesNotExist:
            return False


class DBMetadata(Metadata, Bcfg2.Server.Plugin.DatabaseBacked):
    __files__ = ["groups.xml"]
    experimental = True
    conflicts = ['Metadata']

    def __init__(self, core, datastore, watch_clients=True):
        Metadata.__init__(self, core, datastore, watch_clients=watch_clients)
        Bcfg2.Server.Plugin.DatabaseBacked.__init__(self)
        if os.path.exists(os.path.join(self.data, "clients.xml")):
            self.logger.warning("DBMetadata: clients.xml found, parsing in "
                                "compatibility mode")
            self._handle_file("clients.xml")
        self.versions = ClientVersions()

    def add_group(self, group_name, attribs):
        msg = "DBMetadata does not support adding groups"
        self.logger.error(msg)
        raise Bcfg2.Server.Plugin.PluginExecutionError(msg)

    def add_bundle(self, bundle_name):
        msg = "DBMetadata does not support adding bundles"
        self.logger.error(msg)
        raise Bcfg2.Server.Plugin.PluginExecutionError(msg)

    def add_client(self, client_name):
        """Add client to clients database."""
        client = MetadataClientModel(hostname=client_name)
        client.save()
        self.clients = self.list_clients()
        return client

    def update_group(self, group_name, attribs):
        msg = "DBMetadata does not support updating groups"
        self.logger.error(msg)
        raise Bcfg2.Server.Plugin.PluginExecutionError(msg)

    def update_bundle(self, bundle_name):
        msg = "DBMetadata does not support updating bundles"
        self.logger.error(msg)
        raise Bcfg2.Server.Plugin.PluginExecutionError(msg)

    def update_client(self, client_name, attribs):
        msg = "DBMetadata does not support updating clients"
        self.logger.error(msg)
        raise Bcfg2.Server.Plugin.PluginExecutionError(msg)

    def list_clients(self):
        """ List all clients in client database """
        return set([c.hostname for c in MetadataClientModel.objects.all()])

    def remove_group(self, group_name, attribs):
        msg = "DBMetadata does not support removing groups"
        self.logger.error(msg)
        raise Bcfg2.Server.Plugin.PluginExecutionError(msg)

    def remove_bundle(self, bundle_name):
        msg = "DBMetadata does not support removing bundles"
        self.logger.error(msg)
        raise Bcfg2.Server.Plugin.PluginExecutionError(msg)

    def remove_client(self, client_name):
        """Remove a client"""
        try:
            client = MetadataClientModel.objects.get(hostname=client_name)
        except MetadataClientModel.DoesNotExist:
            msg = "Client %s does not exist" % client_name
            self.logger.warning(msg)
            raise MetadataConsistencyError(msg)
        client.delete()
        self.clients = self.list_clients()

    def _set_profile(self, client, profile, addresspair):
        if client not in self.clients:
            # adding a new client
            self.add_client(client)
            if client not in self.clientgroups:
                self.clientgroups[client] = [profile]
        else:
            msg = "DBMetadata does not support asserting client profiles"
            self.logger.error(msg)
            raise Bcfg2.Server.Plugin.PluginExecutionError(msg)

    def _handle_clients_xml_event(self, event):
        # clients.xml is parsed and the options specified in it are
        # understood, but it does _not_ assert client existence.
        Metadata._handle_clients_xml_event(self, event)
        self.clients = self.list_clients()


class DBMetadataLint(MetadataLint):
    pass