#!/usr/bin/env python
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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 optparse, traceback
from qpid.messaging import *
from qpid.log import enable, DEBUG, WARN
from common import *

parser = optparse.OptionParser(usage="usage: %prog [options]",
                               description="machine inventory agent")
parser.add_option("-b", "--broker", default="localhost",
                  help="connect to specified BROKER (default %default)")
parser.add_option("-d", "--database",
                  help="database file for persistent machine status")
parser.add_option("-a", "--address", default="reservations",
                  help="address for reservation requests")
parser.add_option("-v", dest="verbose", action="store_true",
                  help="enable verbose logging")

opts, args = parser.parse_args()

if opts.verbose:
  enable("qpid", DEBUG)
else:
  enable("qpid", WARN)

conn = Connection.establish(opts.broker, reconnect=True, reconnect_interval=1)

class Inventory(Dispatcher):

  def __init__(self):
    self.agents = {}

  def running(self):
    return True

  def do_status(self, msg):
    id, status, owner = get_status(msg)
    self.agents[id] = (status, owner)

  def do_query(self, msg):
    patterns = msg.content["identity"]
    result = []
    for id, (status, owner) in self.agents.items():
      if match(id, patterns):
        r = Message(properties = {
            "type": "status"
            },
                    content = {
            "identity": id,
            "status": status,
            "owner": owner
            })
        result.append((msg.reply_to, r))
        continue
    if not result:
      result.append((msg.reply_to,
                     Message(properties = {"type": "empty"})))
    return result

  def ignored(self, msg):
    type = msg.properties.get("type")
    return type not in ("status", "query")

try:
  ssn = conn.session()
  rcv = ssn.receiver(opts.address, capacity = 10)
  snd = ssn.sender(opts.address)
  snd.send(Message(reply_to = opts.address,
                   properties = {"type": "discover", "identity": ["*"]}))

  inv = Inventory()
  inv.run(ssn)
except KeyboardInterrupt:
  pass
finally:
  conn.close()
