Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-gtools / synnefo / ganeti / progress_monitor.py @ 0827883e

History | View | Annotate | Download (3.4 kB)

1 dcb4a587 Vangelis Koukis
#!/usr/bin/env python
2 dcb4a587 Vangelis Koukis
# -*- coding: utf-8 -*-
3 dcb4a587 Vangelis Koukis
#
4 0827883e Nikos Skalkotos
# Copyright 2011, 2012 GRNET S.A. All rights reserved.
5 dcb4a587 Vangelis Koukis
#
6 dcb4a587 Vangelis Koukis
# Redistribution and use in source and binary forms, with or
7 dcb4a587 Vangelis Koukis
# without modification, are permitted provided that the following
8 dcb4a587 Vangelis Koukis
# conditions are met:
9 dcb4a587 Vangelis Koukis
#
10 dcb4a587 Vangelis Koukis
#   1. Redistributions of source code must retain the above
11 dcb4a587 Vangelis Koukis
#      copyright notice, this list of conditions and the following
12 dcb4a587 Vangelis Koukis
#      disclaimer.
13 dcb4a587 Vangelis Koukis
#
14 dcb4a587 Vangelis Koukis
#   2. Redistributions in binary form must reproduce the above
15 dcb4a587 Vangelis Koukis
#      copyright notice, this list of conditions and the following
16 dcb4a587 Vangelis Koukis
#      disclaimer in the documentation and/or other materials
17 dcb4a587 Vangelis Koukis
#      provided with the distribution.
18 dcb4a587 Vangelis Koukis
#
19 dcb4a587 Vangelis Koukis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
20 dcb4a587 Vangelis Koukis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 dcb4a587 Vangelis Koukis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 dcb4a587 Vangelis Koukis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
23 dcb4a587 Vangelis Koukis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 dcb4a587 Vangelis Koukis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 dcb4a587 Vangelis Koukis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26 dcb4a587 Vangelis Koukis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27 dcb4a587 Vangelis Koukis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 dcb4a587 Vangelis Koukis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29 dcb4a587 Vangelis Koukis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 dcb4a587 Vangelis Koukis
# POSSIBILITY OF SUCH DAMAGE.
31 dcb4a587 Vangelis Koukis
#
32 dcb4a587 Vangelis Koukis
# The views and conclusions contained in the software and
33 dcb4a587 Vangelis Koukis
# documentation are those of the authors and should not be
34 dcb4a587 Vangelis Koukis
# interpreted as representing official policies, either expressed
35 dcb4a587 Vangelis Koukis
# or implied, of GRNET S.A.
36 dcb4a587 Vangelis Koukis
#
37 45ebfd48 Vangelis Koukis
"""Utility to monitor the progress of image deployment
38 45ebfd48 Vangelis Koukis

39 0827883e Nikos Skalkotos
A small utility that collects various monitoring messages from snf-image and
40 0827883e Nikos Skalkotos
forwards them to the rest of the Synnefo infrastructure over AMQP.
41 45ebfd48 Vangelis Koukis
"""
42 45ebfd48 Vangelis Koukis
43 dcb4a587 Vangelis Koukis
import os
44 dcb4a587 Vangelis Koukis
import sys
45 dcb4a587 Vangelis Koukis
import time
46 dcb4a587 Vangelis Koukis
import json
47 dcb4a587 Vangelis Koukis
48 6d6b8f88 Kostas Papadimitriou
from synnefo import settings
49 c4e55622 Christos Stavrakakis
from synnefo.lib.amqp import AMQPClient
50 c4e55622 Christos Stavrakakis
from synnefo.lib.utils import split_time
51 dcb4a587 Vangelis Koukis
52 0827883e Nikos Skalkotos
PROGNAME = os.path.basename(sys.argv[0])
53 dcb4a587 Vangelis Koukis
54 dcb4a587 Vangelis Koukis
55 0827883e Nikos Skalkotos
def jsonstream(file):
56 0827883e Nikos Skalkotos
    buf = ""
57 0827883e Nikos Skalkotos
    decoder = json.JSONDecoder()
58 0827883e Nikos Skalkotos
    while True:
59 0827883e Nikos Skalkotos
        new_data = os.read(file.fileno(), 512)
60 0827883e Nikos Skalkotos
        if not len(new_data):
61 0827883e Nikos Skalkotos
            break
62 0827883e Nikos Skalkotos
63 0827883e Nikos Skalkotos
        buf += new_data.strip()
64 0827883e Nikos Skalkotos
        while 1:
65 0827883e Nikos Skalkotos
            try:
66 0827883e Nikos Skalkotos
                msg, idx = decoder.raw_decode(buf)
67 0827883e Nikos Skalkotos
            except ValueError:
68 0827883e Nikos Skalkotos
                break
69 0827883e Nikos Skalkotos
            yield msg
70 0827883e Nikos Skalkotos
            buf = buf[idx:].strip()
71 dcb4a587 Vangelis Koukis
72 dcb4a587 Vangelis Koukis
def main():
73 0827883e Nikos Skalkotos
74 0827883e Nikos Skalkotos
    usage = "Usage: %s <instance_name>\n" % PROGNAME
75 0827883e Nikos Skalkotos
76 0827883e Nikos Skalkotos
    if len(sys.argv) != 2:
77 0827883e Nikos Skalkotos
        sys.stderr.write(usage)
78 0827883e Nikos Skalkotos
        return 1
79 0827883e Nikos Skalkotos
80 0827883e Nikos Skalkotos
    instance_name = sys.argv[1]
81 dcb4a587 Vangelis Koukis
82 dcb4a587 Vangelis Koukis
    # WARNING: This assumes that instance names
83 dcb4a587 Vangelis Koukis
    # are of the form prefix-id, and uses prefix to
84 dcb4a587 Vangelis Koukis
    # determine the routekey for AMPQ
85 0827883e Nikos Skalkotos
    prefix = instance_name.split('-')[0]
86 dcb4a587 Vangelis Koukis
    routekey = "ganeti.%s.event.progress" % prefix
87 996e5d53 Christos Stavrakakis
    amqp_client = AMQPClient(hosts=settings.AMQP_HOSTS, confirm_buffer=2)
88 c4e55622 Christos Stavrakakis
    amqp_client.connect()
89 996e5d53 Christos Stavrakakis
    amqp_client.exchange_declare(settings.EXCHANGE_GANETI, type='topic')
90 dcb4a587 Vangelis Koukis
91 0827883e Nikos Skalkotos
    for msg in jsonstream(sys.stdin):
92 c4e55622 Christos Stavrakakis
        msg['event_time'] = split_time(time.time())
93 0827883e Nikos Skalkotos
        msg['instance'] = instance_name
94 dcb4a587 Vangelis Koukis
95 dcb4a587 Vangelis Koukis
        # and send it over AMQP
96 c4e55622 Christos Stavrakakis
        amqp_client.basic_publish(exchange=settings.EXCHANGE_GANETI,
97 c4e55622 Christos Stavrakakis
                                  routing_key=routekey,
98 c4e55622 Christos Stavrakakis
                                  body=json.dumps(msg))
99 3db5ad86 Vangelis Koukis
100 996e5d53 Christos Stavrakakis
    amqp_client.close()
101 0827883e Nikos Skalkotos
    return 0
102 dcb4a587 Vangelis Koukis
103 dcb4a587 Vangelis Koukis
if __name__ == "__main__":
104 dcb4a587 Vangelis Koukis
    sys.exit(main())
105 0827883e Nikos Skalkotos
106 0827883e Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :