83 lines
2.9 KiB
Python
Executable File
83 lines
2.9 KiB
Python
Executable File
# Copyright 2012 Openstack LLC.
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import amqplib.client_0_8 as amqp
|
|
import json
|
|
import socket
|
|
import time
|
|
|
|
from stacktach import models, views
|
|
|
|
|
|
class NovaConsumer(object):
|
|
def __init__(self, channel, tenant_id, logger):
|
|
self.channel = channel
|
|
self.tenant = models.Tenant.objects.get(tenant_id=tenant_id)
|
|
self.logger = logger
|
|
channel.basic_consume('monitor.info', callback=self.onMessage)
|
|
channel.basic_consume('monitor.error', callback=self.onMessage)
|
|
|
|
def onMessage(self, message):
|
|
routing_key = message.delivery_info['routing_key']
|
|
args = (routing_key, json.loads(message.body))
|
|
asJson = json.dumps(args)
|
|
|
|
#from pprint import pformat
|
|
#self.logger.debug("Saving %s", pformat(args))
|
|
views._parse(self.tenant, args, asJson)
|
|
self.logger.debug("Recorded %s ", routing_key)
|
|
self.channel.basic_ack(message.delivery_tag)
|
|
|
|
|
|
def run(deployment, logger):
|
|
tenant_id = deployment.get('tenant_id', 1)
|
|
host = deployment.get('rabbit_host', 'localhost')
|
|
port = deployment.get('rabbit_port', 5672)
|
|
user_id = deployment.get('rabbit_userid', 'rabbit')
|
|
password = deployment.get('rabbit_password', 'rabbit')
|
|
virtual_host = deployment.get('rabbit_virtual_host', '/')
|
|
|
|
logger.info("Rabbit: %s %s %s %s" %
|
|
(host, port, user_id, virtual_host))
|
|
|
|
|
|
while 1:
|
|
try:
|
|
conn = amqp.Connection(host, userid=user_id, password=password, virtual_host=virtual_host)
|
|
|
|
ch = conn.channel()
|
|
ch.access_request(virtual_host, active=True, read=True)
|
|
|
|
ch.exchange_declare('nova', type='topic', durable=True, auto_delete=False)
|
|
ch.queue_declare('monitor.info', durable=True, auto_delete=False, exclusive=False)
|
|
ch.queue_declare('monitor.error', durable=True, auto_delete=False, exclusive=False)
|
|
ch.queue_bind('monitor.info', 'nova')
|
|
ch.queue_bind('monitor.error', 'nova')
|
|
consumer = NovaConsumer(ch, tenant_id, logger)
|
|
#
|
|
# Loop as long as the channel has callbacks registered
|
|
#
|
|
while ch.callbacks:
|
|
ch.wait()
|
|
break
|
|
except socket.error, e:
|
|
logger.warn("Socket error: %s" % e)
|
|
time.sleep(5)
|
|
continue
|
|
|
|
ch.close()
|
|
conn.close()
|
|
logger.info("Finished")
|