From 54f46a42ceb443528d54dd5734449dfeb5e79df4 Mon Sep 17 00:00:00 2001 From: Tim Laszlo Date: Wed, 6 Jun 2012 09:18:40 -0500 Subject: DBStats: Save interaction metadata Start saving group and bundle membership for interactions --- src/lib/Bcfg2/Server/Reports/importscript.py | 33 +++++++++++++++++- src/lib/Bcfg2/Server/Reports/reports/models.py | 48 ++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) (limited to 'src/lib/Bcfg2/Server/Reports') diff --git a/src/lib/Bcfg2/Server/Reports/importscript.py b/src/lib/Bcfg2/Server/Reports/importscript.py index 18500f0c1..2aade17b3 100755 --- a/src/lib/Bcfg2/Server/Reports/importscript.py +++ b/src/lib/Bcfg2/Server/Reports/importscript.py @@ -7,6 +7,7 @@ new statistics engine import binascii import os import sys +import traceback try: import Bcfg2.Server.Reports.settings except Exception: @@ -28,6 +29,7 @@ from getopt import getopt, GetoptError from datetime import datetime from time import strptime from django.db import connection +from Bcfg2.Server.Plugins.Metadata import ClientMetadata from Bcfg2.Server.Reports.Updater import update_database, UpdaterError import logging import Bcfg2.Logger @@ -93,7 +95,11 @@ def load_stats(sdata, encoding, vlevel, logger, quick=False, location=''): for statistics in node.findall('Statistics'): load_stat(name, statistics, encoding, vlevel, logger, quick, location) -def load_stat(client_name, statistics, encoding, vlevel, logger, quick, location): +def load_stat(cobj, statistics, encoding, vlevel, logger, quick, location): + if isinstance(cobj, ClientMetadata): + client_name = cobj.hostname + else: + client_name = cobj client, created = Client.objects.get_or_create(name=client_name) if created and vlevel > 0: logger.info("Client %s added to db" % client_name) @@ -125,6 +131,31 @@ def load_stat(client_name, statistics, encoding, vlevel, logger, quick, location logger.info("Interaction for %s at %s with id %s INSERTED in to db" % (client.id, timestamp, current_interaction.id)) + if isinstance(cobj, ClientMetadata): + try: + imeta = InteractionMetadata(interaction=current_interaction) + profile, created = Group.objects.get_or_create(name=cobj.profile) + imeta.profile = profile + imeta.save() # save here for m2m + + #FIXME - this should be more efficient + group_set = [] + for group_name in cobj.groups: + group, created = Group.objects.get_or_create(name=group_name) + if created: + logger.debug("Added group %s" % group) + imeta.groups.add(group) + for bundle_name in cobj.bundles: + bundle, created = Bundle.objects.get_or_create(name=bundle_name) + if created: + logger.debug("Added bundle %s" % bundle) + imeta.bundles.add(bundle) + imeta.save() + except: + logger.error("Failed to save interaction metadata for %s: %s" % + (client_name, traceback.format_exc().splitlines()[-1])) + + counter_fields = {TYPE_CHOICES[0]: 0, TYPE_CHOICES[1]: 0, TYPE_CHOICES[2]: 0} diff --git a/src/lib/Bcfg2/Server/Reports/reports/models.py b/src/lib/Bcfg2/Server/Reports/reports/models.py index 4983bad20..a9374bb7f 100644 --- a/src/lib/Bcfg2/Server/Reports/reports/models.py +++ b/src/lib/Bcfg2/Server/Reports/reports/models.py @@ -345,3 +345,51 @@ class InternalDatabaseVersion(models.Model): class Meta: get_latest_by = "version" + + +class Group(models.Model): + """ + Groups extracted from interactions + + name - The group name + + TODO - Most of this is for future use + TODO - set a default group + """ + + name = models.CharField(max_length=255, unique=True) + profile = models.BooleanField(default=False) + public = models.BooleanField(default=False) + category = models.CharField(max_length=1024, blank=True) + comment = models.TextField(blank=True) + + def __unicode__(self): + return self.name + + +class Bundle(models.Model): + """ + Bundles extracted from interactions + + name - The bundle name + """ + + name = models.CharField(max_length=255, unique=True) + + def __unicode__(self): + return self.name + + +class InteractionMetadata(models.Model): + """ + InteractionMetadata + + Hold extra data associated with the client and interaction + """ + + interaction = models.OneToOneField(Interaction, primary_key=True, related_name='metadata') + profile = models.ForeignKey(Group, related_name="+") + groups = models.ManyToManyField(Group) + bundles = models.ManyToManyField(Bundle) + + -- cgit v1.2.3-1-g7c22