From 9f129bdd9f08139a5cb1cd7d1bd3c05ce0cfe9da Mon Sep 17 00:00:00 2001 From: Joey Hagedorn Date: Wed, 2 Aug 2006 19:32:13 +0000 Subject: New Reports: support for new pinging structure; this one works. git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@2028 ce84e21b-d406-0410-9b95-82705330c041 --- reports/brpt/reports/models.py | 34 ++++++++++++++----- .../reports/templates/clients/client-nodebox.html | 6 ++-- reports/brpt/reports/views.py | 38 +++++++++------------- 3 files changed, 45 insertions(+), 33 deletions(-) (limited to 'reports') diff --git a/reports/brpt/reports/models.py b/reports/brpt/reports/models.py index 82a4899fc..c1818fd66 100644 --- a/reports/brpt/reports/models.py +++ b/reports/brpt/reports/models.py @@ -11,7 +11,11 @@ KIND_CHOICES = ( ('Directory', 'Directory'), ('Permissions','Permissions'), ) - +PING_CHOICES = ( + #These are possible ping states + ('Up (Y)', 'Y'), + ('Down (N)', 'N') +) class Client(models.Model): '''object representing every client we have seen stats for''' creation = models.DateTimeField() @@ -19,6 +23,7 @@ class Client(models.Model): current_interaction = models.ForeignKey('Interaction', null=True, blank=True, related_name="parent_client") + expiration = models.DateTimeField() def __str__(self): return self.name @@ -27,19 +32,31 @@ class Client(models.Model): pass class Metadata(models.Model): + '''insert magical interface to client metadata here''' client = models.ForeignKey(Client) timestamp = models.DateTimeField() - #INSERT magic interface to Metadata HERE def __str__(self): return self.timestamp class Repository(models.Model): + '''insert magical interface to subversioned repository here''' timestamp = models.DateTimeField() - #INSERT magic interface to repo (SVN'd version) here def __str__(self): return self.timestamp +class Ping(models.Model): + '''represents a ping of a client (sparsely)''' + client = models.ForeignKey(Client, related_name="pings") + starttime = models.DateTimeField() + endtime = models.DateTimeField() + status = models.CharField(maxlength=4, choices=PING_CHOICES)#up/down + + class Meta: + get_latest_by = 'endtime' + class InteractiveManager(models.Manager): + '''manages interactions objects''' + '''returns most recent interaction as of specified timestamp in format: '2006-01-01 00:00:00' or 'now' or None->'now' ''' def interaction_per_client(self, maxdate = None): @@ -47,16 +64,17 @@ class InteractiveManager(models.Manager): cursor = connection.cursor() #in order to prevent traceback when zero records are returned. - #this could mask unsupported database errors + #this could mask some database errors try: if (maxdate == 'now' or maxdate == None): cursor.execute("select reports_interaction.id, x.client_id from (select client_id, MAX(timestamp) "+ - "as timer from reports_interaction GROUP BY client_id) x, reports_interaction where "+ - "reports_interaction.client_id = x.client_id AND reports_interaction.timestamp = x.timer") + "as timer from reports_interaction GROUP BY client_id) x, reports_interaction where "+ + "reports_interaction.client_id = x.client_id AND reports_interaction.timestamp = x.timer") else: cursor.execute("select reports_interaction.id, x.client_id from (select client_id, timestamp, MAX(timestamp) "+ - "as timer from reports_interaction WHERE timestamp < %s GROUP BY client_id) x, reports_interaction where "+ - "reports_interaction.client_id = x.client_id AND reports_interaction.timestamp = x.timer", [maxdate]) + "as timer from reports_interaction WHERE timestamp < %s GROUP BY client_id) x, reports_interaction where "+ + "reports_interaction.client_id = x.client_id AND reports_interaction.timestamp = x.timer", + [maxdate]) in_idents = [item[0] for item in cursor.fetchall()] except: in_idents = [] diff --git a/reports/brpt/reports/templates/clients/client-nodebox.html b/reports/brpt/reports/templates/clients/client-nodebox.html index e92a5a874..dade598cf 100644 --- a/reports/brpt/reports/templates/clients/client-nodebox.html +++ b/reports/brpt/reports/templates/clients/client-nodebox.html @@ -31,7 +31,7 @@
{{interaction.bad_items.count}} items did not verify and are considered Dirty.
    - {% for bad in interaction.bad_items.all|sortwell %} {% comment %}HOWDOI? order_by('kind', 'name'){% endcomment %} + {% for bad in interaction.bad_items.all|sortwell %}
  • {{bad.kind}}: {{bad.name}}
  • {% endfor %}
@@ -41,7 +41,7 @@
{{interaction.modified_items.count}} items were modified in the last run.
    - {% for modified in interaction.modified_items.all|sortwell %} {% comment %}HOWDOI? order_by('kind', 'name'){% endcomment %} + {% for modified in interaction.modified_items.all|sortwell %}
  • {{modified.kind}}: {{modified.name}}
  • {% endfor %}
@@ -51,7 +51,7 @@
{{interaction.extra_items.count}} extra configuration elements on the node.
    - {% for extra in interaction.extra_items.all|sortwell %} {% comment %}HOWDOI? order_by('kind', 'name'){% endcomment %} + {% for extra in interaction.extra_items.all|sortwell %}
  • {{extra.kind}}: {{extra.name}}
  • {% endfor %}
diff --git a/reports/brpt/reports/views.py b/reports/brpt/reports/views.py index be61910f8..1c2d09e70 100644 --- a/reports/brpt/reports/views.py +++ b/reports/brpt/reports/views.py @@ -41,9 +41,6 @@ def config_item_modified(request, eyedee =None, timestamp = 'now'): if timestamp == 'now': timestamp = datetime.now().isoformat('@') - for q in connection.queries: - print q - return render_to_response('config_items/index.html', {'item':item, 'mod_or_bad':mod_or_bad, 'associated_client_list':associated_client_list, @@ -79,10 +76,6 @@ def config_item_bad(request, eyedee = None, timestamp = 'now'): if timestamp == 'now': timestamp = datetime.now().isoformat('@') - - for q in connection.queries: - print q - return render_to_response('config_items/index.html', {'item':item, 'mod_or_bad':mod_or_bad, 'associated_client_list':associated_client_list, @@ -106,29 +99,16 @@ def client_detail(request, hostname = None, pk = None): interaction = client.current_interaction else: interaction = client.interactions.get(pk=pk)#can this be a get object or 404? - - #for q in connection.queries: - # print q - return render_to_response('clients/detail.html', {'client': client, 'interaction': interaction}) def display_sys_view(request, timestamp = 'now'): client_lists = prepare_client_lists(request, timestamp) - - #for q in connection.queries: - # print q - - return render_to_response('displays/sys_view.html', client_lists) def display_summary(request, timestamp = 'now'): client_lists = prepare_client_lists(request, timestamp) #this returns timestamp and the timestamp parts too - - #for q in connection.queries: - # print q - return render_to_response('displays/summary.html', client_lists) def display_timing(request, timestamp = 'now'): @@ -213,7 +193,21 @@ def prepare_client_lists(request, timestamp = 'now'): [clean_client_list.append(x) for x in Client.objects.filter(id__in=[y.client_id for y in interact_queryset.filter(state='clean')])] [bad_client_list.append(x) for x in Client.objects.filter(id__in=[y.client_id for y in interact_queryset.filter(state='dirty')])] - [down_client_list.append(x) for x in Client.objects.filter(id__in=[y.client_id for y in interact_queryset.filter(pingable='N')])]#need to change the PINGING data structure + + client_ping_dict = {} + [client_ping_dict.__setitem__(x,'Y') for x in client_interaction_dict.keys()]#unless we know otherwise... + + try: + cursor.execute("select reports_ping.status, x.client_id from (select client_id, MAX(endtime) "+ + "as timer from reports_ping GROUP BY client_id) x, reports_ping where "+ + "reports_ping.client_id = x.client_id AND reports_ping.endtime = x.timer") + [client_ping_dict.__setitem__(x[1],x[0]) for x in cursor.fetchall()] + except: + pass #This is to fix problems when you have only zero records returned + + client_down_ids = [y for y in client_ping_dict.keys() if client_ping_dict[y]=='N'] + if not client_down_ids == []: + [down_client_list.append(x) for x in Client.objects.filter(id__in=client_down_ids)] if (timestamp == 'now' or timestamp == None): cursor.execute("select client_id, MAX(timestamp) as timestamp from reports_interaction GROUP BY client_id") @@ -225,7 +219,7 @@ def prepare_client_lists(request, timestamp = 'now'): datetimestamp = datetime(t[0], t[1], t[2], t[3], t[4], t[5]) stale_all_client_list = Client.objects.filter(id__in=[x[0] for x in cursor.fetchall() if datetimestamp - x[1] > timedelta(days=1)]) - [stale_up_client_list.append(x) for x in stale_all_client_list if client_interaction_dict[x.id].pingable=='Y'] + [stale_up_client_list.append(x) for x in stale_all_client_list if not client_ping_dict[x.id]=='N'] cursor.execute("SELECT reports_client.id FROM reports_client, reports_interaction, reports_modified_interactions WHERE reports_client.id=reports_interaction.client_id AND reports_interaction.id = reports_modified_interactions.interaction_id GROUP BY reports_client.id") -- cgit v1.2.3-1-g7c22