root / snf-cyclades-app / synnefo / logic / management / commands / network-inspect.py @ d7841399
History | View | Annotate | Download (4.5 kB)
1 | 00051a6a | Christos Stavrakakis | # Copyright 2012 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | 00051a6a | Christos Stavrakakis | #
|
3 | 00051a6a | Christos Stavrakakis | # Redistribution and use in source and binary forms, with or
|
4 | 00051a6a | Christos Stavrakakis | # without modification, are permitted provided that the following
|
5 | 00051a6a | Christos Stavrakakis | # conditions are met:
|
6 | 00051a6a | Christos Stavrakakis | #
|
7 | 00051a6a | Christos Stavrakakis | # 1. Redistributions of source code must retain the above
|
8 | 00051a6a | Christos Stavrakakis | # copyright notice, this list of conditions and the following
|
9 | 00051a6a | Christos Stavrakakis | # disclaimer.
|
10 | 00051a6a | Christos Stavrakakis | #
|
11 | 00051a6a | Christos Stavrakakis | # 2. Redistributions in binary form must reproduce the above
|
12 | 00051a6a | Christos Stavrakakis | # copyright notice, this list of conditions and the following
|
13 | 00051a6a | Christos Stavrakakis | # disclaimer in the documentation and/or other materials
|
14 | 00051a6a | Christos Stavrakakis | # provided with the distribution.
|
15 | 00051a6a | Christos Stavrakakis | #
|
16 | 00051a6a | Christos Stavrakakis | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | 00051a6a | Christos Stavrakakis | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | 00051a6a | Christos Stavrakakis | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | 00051a6a | Christos Stavrakakis | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | 00051a6a | Christos Stavrakakis | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | 00051a6a | Christos Stavrakakis | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | 00051a6a | Christos Stavrakakis | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | 00051a6a | Christos Stavrakakis | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | 00051a6a | Christos Stavrakakis | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | 00051a6a | Christos Stavrakakis | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | 00051a6a | Christos Stavrakakis | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | 00051a6a | Christos Stavrakakis | # POSSIBILITY OF SUCH DAMAGE.
|
28 | 00051a6a | Christos Stavrakakis | #
|
29 | 00051a6a | Christos Stavrakakis | # The views and conclusions contained in the software and
|
30 | 00051a6a | Christos Stavrakakis | # documentation are those of the authors and should not be
|
31 | 00051a6a | Christos Stavrakakis | # interpreted as representing official policies, either expressed
|
32 | 00051a6a | Christos Stavrakakis | # or implied, of GRNET S.A.
|
33 | 00051a6a | Christos Stavrakakis | |
34 | 00051a6a | Christos Stavrakakis | import json |
35 | 00051a6a | Christos Stavrakakis | |
36 | 00051a6a | Christos Stavrakakis | from django.core.management.base import BaseCommand, CommandError |
37 | b84ed662 | Christos Stavrakakis | from synnefo.management.common import get_network |
38 | 00051a6a | Christos Stavrakakis | |
39 | b84ed662 | Christos Stavrakakis | from synnefo.db.models import (Backend, BackendNetwork, |
40 | 3524241a | Christos Stavrakakis | pooled_rapi_client) |
41 | 3524241a | Christos Stavrakakis | from synnefo.logic.rapi import GanetiApiError |
42 | 5e1a5f9b | Christos Stavrakakis | from util import pool_map_chunks |
43 | 00051a6a | Christos Stavrakakis | |
44 | 3524241a | Christos Stavrakakis | |
45 | 00051a6a | Christos Stavrakakis | class Command(BaseCommand): |
46 | 00051a6a | Christos Stavrakakis | help = "Inspect a network on DB and Ganeti."
|
47 | 00051a6a | Christos Stavrakakis | |
48 | 00051a6a | Christos Stavrakakis | def handle(self, *args, **options): |
49 | 00051a6a | Christos Stavrakakis | if len(args) != 1: |
50 | 00051a6a | Christos Stavrakakis | raise CommandError("Please provide a network ID.") |
51 | 00051a6a | Christos Stavrakakis | |
52 | b84ed662 | Christos Stavrakakis | net = get_network(args[0])
|
53 | 00051a6a | Christos Stavrakakis | |
54 | 00051a6a | Christos Stavrakakis | sep = '-' * 80 + '\n' |
55 | 0b827aa4 | Christos Stavrakakis | labels = ('name', 'backend-name', 'state', 'owner', 'subnet', 'gateway', |
56 | dab038a2 | Christos Stavrakakis | 'mac_prefix', 'link', 'public', 'dhcp', 'type', 'deleted', |
57 | 439ff929 | Christos Stavrakakis | 'action', 'pool') |
58 | 0b827aa4 | Christos Stavrakakis | fields = (net.name, net.backend_id, net.state, str(net.userid),
|
59 | 0b827aa4 | Christos Stavrakakis | str(net.subnet), str(net.gateway), str(net.mac_prefix), |
60 | 0b827aa4 | Christos Stavrakakis | str(net.link), str(net.public), str(net.dhcp), |
61 | 439ff929 | Christos Stavrakakis | str(net.type), str(net.deleted), str(net.action), |
62 | fdc94944 | Christos Stavrakakis | str(splitPoolMap(net.get_pool().to_map(), 64))) |
63 | 00051a6a | Christos Stavrakakis | |
64 | 00051a6a | Christos Stavrakakis | self.stdout.write(sep)
|
65 | 00051a6a | Christos Stavrakakis | self.stdout.write('State of Network in DB\n') |
66 | 00051a6a | Christos Stavrakakis | self.stdout.write(sep)
|
67 | 00051a6a | Christos Stavrakakis | for l, f in zip(labels, fields): |
68 | 00051a6a | Christos Stavrakakis | self.stdout.write(l.ljust(20) + ': ' + f.ljust(20) + '\n') |
69 | 00051a6a | Christos Stavrakakis | |
70 | 00051a6a | Christos Stavrakakis | labels = ('Backend', 'State', 'Deleted', 'JobID', 'OpCode', |
71 | 00051a6a | Christos Stavrakakis | 'JobStatus')
|
72 | 00051a6a | Christos Stavrakakis | for back_net in BackendNetwork.objects.filter(network=net): |
73 | 00051a6a | Christos Stavrakakis | self.stdout.write('\n') |
74 | 00051a6a | Christos Stavrakakis | fields = (back_net.backend.clustername, back_net.operstate, |
75 | 00051a6a | Christos Stavrakakis | str(back_net.deleted), str(back_net.backendjobid), |
76 | 00051a6a | Christos Stavrakakis | str(back_net.backendopcode),
|
77 | 00051a6a | Christos Stavrakakis | str(back_net.backendjobstatus))
|
78 | 00051a6a | Christos Stavrakakis | for l, f in zip(labels, fields): |
79 | 00051a6a | Christos Stavrakakis | self.stdout.write(l.ljust(20) + ': ' + f.ljust(20) + '\n') |
80 | 00051a6a | Christos Stavrakakis | self.stdout.write('\n') |
81 | 00051a6a | Christos Stavrakakis | |
82 | 00051a6a | Christos Stavrakakis | self.stdout.write(sep)
|
83 | 00051a6a | Christos Stavrakakis | self.stdout.write('State of Network in Ganeti\n') |
84 | 00051a6a | Christos Stavrakakis | self.stdout.write(sep)
|
85 | 00051a6a | Christos Stavrakakis | |
86 | 00051a6a | Christos Stavrakakis | for backend in Backend.objects.exclude(offline=True): |
87 | 3524241a | Christos Stavrakakis | with pooled_rapi_client(backend) as client: |
88 | 3524241a | Christos Stavrakakis | try:
|
89 | 3524241a | Christos Stavrakakis | g_net = client.GetNetwork(net.backend_id) |
90 | 3524241a | Christos Stavrakakis | self.stdout.write("Backend: %s\n" % backend.clustername) |
91 | 3524241a | Christos Stavrakakis | print json.dumps(g_net, indent=2) |
92 | 3524241a | Christos Stavrakakis | self.stdout.write(sep)
|
93 | 3524241a | Christos Stavrakakis | except GanetiApiError as e: |
94 | 3524241a | Christos Stavrakakis | if e.code == 404: |
95 | 3524241a | Christos Stavrakakis | self.stdout.write('Network does not exist in backend %s\n' % |
96 | 3524241a | Christos Stavrakakis | backend.clustername) |
97 | 3524241a | Christos Stavrakakis | else:
|
98 | 3524241a | Christos Stavrakakis | raise e
|
99 | 439ff929 | Christos Stavrakakis | |
100 | 439ff929 | Christos Stavrakakis | |
101 | 439ff929 | Christos Stavrakakis | def splitPoolMap(s, count): |
102 | 5e1a5f9b | Christos Stavrakakis | chunks = pool_map_chunks(s, count) |
103 | 439ff929 | Christos Stavrakakis | acc = [] |
104 | 5e1a5f9b | Christos Stavrakakis | count = 0
|
105 | 5e1a5f9b | Christos Stavrakakis | for chunk in chunks: |
106 | 5e1a5f9b | Christos Stavrakakis | chunk_len = len(chunk)
|
107 | 5e1a5f9b | Christos Stavrakakis | acc.append(str(count).rjust(3) + ' ' + chunk + ' ' + |
108 | 5e1a5f9b | Christos Stavrakakis | str(count + chunk_len - 1).ljust(4)) |
109 | 5e1a5f9b | Christos Stavrakakis | count += chunk_len |
110 | 439ff929 | Christos Stavrakakis | return '\n' + '\n'.join(acc) |