root / snf-cyclades-app / synnefo / logic / management / commands / network-inspect.py @ c51f3a08
History | View | Annotate | Download (4.8 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 | c51f3a08 | Stratos Psomadakis | from optparse import make_option |
37 | c51f3a08 | Stratos Psomadakis | |
38 | 00051a6a | Christos Stavrakakis | from django.core.management.base import BaseCommand, CommandError |
39 | c51f3a08 | Stratos Psomadakis | from synnefo.management.common import get_network, UUIDCache |
40 | 00051a6a | Christos Stavrakakis | |
41 | b84ed662 | Christos Stavrakakis | from synnefo.db.models import (Backend, BackendNetwork, |
42 | 3524241a | Christos Stavrakakis | pooled_rapi_client) |
43 | 3524241a | Christos Stavrakakis | from synnefo.logic.rapi import GanetiApiError |
44 | 5e1a5f9b | Christos Stavrakakis | from util import pool_map_chunks |
45 | 00051a6a | Christos Stavrakakis | |
46 | 3524241a | Christos Stavrakakis | |
47 | 00051a6a | Christos Stavrakakis | class Command(BaseCommand): |
48 | 00051a6a | Christos Stavrakakis | help = "Inspect a network on DB and Ganeti."
|
49 | 00051a6a | Christos Stavrakakis | |
50 | c51f3a08 | Stratos Psomadakis | option_list = BaseCommand.option_list + ( |
51 | c51f3a08 | Stratos Psomadakis | make_option('--uuids',
|
52 | c51f3a08 | Stratos Psomadakis | action='store_true',
|
53 | c51f3a08 | Stratos Psomadakis | dest='use_uuids',
|
54 | c51f3a08 | Stratos Psomadakis | default=False,
|
55 | c51f3a08 | Stratos Psomadakis | help="Display UUIDs instead of user emails"),
|
56 | c51f3a08 | Stratos Psomadakis | ) |
57 | c51f3a08 | Stratos Psomadakis | |
58 | 00051a6a | Christos Stavrakakis | def handle(self, *args, **options): |
59 | cc92b70f | Christos Stavrakakis | write = self.stdout.write
|
60 | 00051a6a | Christos Stavrakakis | if len(args) != 1: |
61 | 00051a6a | Christos Stavrakakis | raise CommandError("Please provide a network ID.") |
62 | 00051a6a | Christos Stavrakakis | |
63 | b84ed662 | Christos Stavrakakis | net = get_network(args[0])
|
64 | 00051a6a | Christos Stavrakakis | |
65 | 00051a6a | Christos Stavrakakis | sep = '-' * 80 + '\n' |
66 | cc92b70f | Christos Stavrakakis | labels = ('name', 'backend-name', 'state', 'owner', 'subnet', |
67 | cc92b70f | Christos Stavrakakis | 'gateway', 'mac_prefix', 'link', 'public', 'dhcp', 'flavor', |
68 | cc92b70f | Christos Stavrakakis | 'deleted', 'action', 'pool') |
69 | c51f3a08 | Stratos Psomadakis | |
70 | c51f3a08 | Stratos Psomadakis | user = net.userid |
71 | c51f3a08 | Stratos Psomadakis | if options['use_uuids'] is False: |
72 | c51f3a08 | Stratos Psomadakis | ucache = UUIDCache() |
73 | c51f3a08 | Stratos Psomadakis | user = ucache.get_user(net.userid) |
74 | c51f3a08 | Stratos Psomadakis | |
75 | c51f3a08 | Stratos Psomadakis | fields = (net.name, net.backend_id, net.state, user or '', |
76 | 0b827aa4 | Christos Stavrakakis | str(net.subnet), str(net.gateway), str(net.mac_prefix), |
77 | 0b827aa4 | Christos Stavrakakis | str(net.link), str(net.public), str(net.dhcp), |
78 | bed3cd0b | Christos Stavrakakis | str(net.flavor), str(net.deleted), str(net.action), |
79 | fdc94944 | Christos Stavrakakis | str(splitPoolMap(net.get_pool().to_map(), 64))) |
80 | 00051a6a | Christos Stavrakakis | |
81 | cc92b70f | Christos Stavrakakis | write(sep) |
82 | cc92b70f | Christos Stavrakakis | write('State of Network in DB\n')
|
83 | cc92b70f | Christos Stavrakakis | write(sep) |
84 | 00051a6a | Christos Stavrakakis | for l, f in zip(labels, fields): |
85 | cc92b70f | Christos Stavrakakis | write(l.ljust(20) + ': ' + f.ljust(20) + '\n') |
86 | 00051a6a | Christos Stavrakakis | |
87 | 00051a6a | Christos Stavrakakis | labels = ('Backend', 'State', 'Deleted', 'JobID', 'OpCode', |
88 | 00051a6a | Christos Stavrakakis | 'JobStatus')
|
89 | 00051a6a | Christos Stavrakakis | for back_net in BackendNetwork.objects.filter(network=net): |
90 | cc92b70f | Christos Stavrakakis | write('\n')
|
91 | 00051a6a | Christos Stavrakakis | fields = (back_net.backend.clustername, back_net.operstate, |
92 | cc92b70f | Christos Stavrakakis | str(back_net.deleted), str(back_net.backendjobid), |
93 | cc92b70f | Christos Stavrakakis | str(back_net.backendopcode),
|
94 | cc92b70f | Christos Stavrakakis | str(back_net.backendjobstatus))
|
95 | 00051a6a | Christos Stavrakakis | for l, f in zip(labels, fields): |
96 | cc92b70f | Christos Stavrakakis | write(l.ljust(20) + ': ' + f.ljust(20) + '\n') |
97 | cc92b70f | Christos Stavrakakis | write('\n')
|
98 | 00051a6a | Christos Stavrakakis | |
99 | cc92b70f | Christos Stavrakakis | write(sep) |
100 | cc92b70f | Christos Stavrakakis | write('State of Network in Ganeti\n')
|
101 | cc92b70f | Christos Stavrakakis | write(sep) |
102 | 00051a6a | Christos Stavrakakis | |
103 | 00051a6a | Christos Stavrakakis | for backend in Backend.objects.exclude(offline=True): |
104 | 3524241a | Christos Stavrakakis | with pooled_rapi_client(backend) as client: |
105 | 3524241a | Christos Stavrakakis | try:
|
106 | 3524241a | Christos Stavrakakis | g_net = client.GetNetwork(net.backend_id) |
107 | cc92b70f | Christos Stavrakakis | write("Backend: %s\n" % backend.clustername)
|
108 | 3524241a | Christos Stavrakakis | print json.dumps(g_net, indent=2) |
109 | cc92b70f | Christos Stavrakakis | write(sep) |
110 | 3524241a | Christos Stavrakakis | except GanetiApiError as e: |
111 | 3524241a | Christos Stavrakakis | if e.code == 404: |
112 | cc92b70f | Christos Stavrakakis | write('Network does not exist in backend %s\n' %
|
113 | cc92b70f | Christos Stavrakakis | backend.clustername) |
114 | 3524241a | Christos Stavrakakis | else:
|
115 | 3524241a | Christos Stavrakakis | raise e
|
116 | 439ff929 | Christos Stavrakakis | |
117 | 439ff929 | Christos Stavrakakis | |
118 | 439ff929 | Christos Stavrakakis | def splitPoolMap(s, count): |
119 | 5e1a5f9b | Christos Stavrakakis | chunks = pool_map_chunks(s, count) |
120 | 439ff929 | Christos Stavrakakis | acc = [] |
121 | 5e1a5f9b | Christos Stavrakakis | count = 0
|
122 | 5e1a5f9b | Christos Stavrakakis | for chunk in chunks: |
123 | 5e1a5f9b | Christos Stavrakakis | chunk_len = len(chunk)
|
124 | 5e1a5f9b | Christos Stavrakakis | acc.append(str(count).rjust(3) + ' ' + chunk + ' ' + |
125 | 5e1a5f9b | Christos Stavrakakis | str(count + chunk_len - 1).ljust(4)) |
126 | 5e1a5f9b | Christos Stavrakakis | count += chunk_len |
127 | 439ff929 | Christos Stavrakakis | return '\n' + '\n'.join(acc) |