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 : |