root / snf-cyclades-app / synnefo / logic / management / commands / network-inspect.py @ 12cb6933
History | View | Annotate | Download (5.3 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 | 76a13815 | Christos Stavrakakis | from synnefo.management.common import get_network, Omit |
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 | 04a1b675 | Christos Stavrakakis | from snf_django.lib.astakos import UserCache |
45 | 18c4414d | Giorgos Korfiatis | from synnefo.settings import (CYCLADES_SERVICE_TOKEN as ASTAKOS_TOKEN, |
46 | e3ff6830 | Georgios D. Tsoukalas | ASTAKOS_BASE_URL) |
47 | 5e1a5f9b | Christos Stavrakakis | from util import pool_map_chunks |
48 | 00051a6a | Christos Stavrakakis | |
49 | 3524241a | Christos Stavrakakis | |
50 | 00051a6a | Christos Stavrakakis | class Command(BaseCommand): |
51 | 00051a6a | Christos Stavrakakis | help = "Inspect a network on DB and Ganeti."
|
52 | 00051a6a | Christos Stavrakakis | |
53 | c51f3a08 | Stratos Psomadakis | option_list = BaseCommand.option_list + ( |
54 | 9621c777 | Christos Stavrakakis | make_option( |
55 | e6c4bd78 | Christos Stavrakakis | '--displayname',
|
56 | c51f3a08 | Stratos Psomadakis | action='store_true',
|
57 | 4500650c | Stratos Psomadakis | dest='displayname',
|
58 | c51f3a08 | Stratos Psomadakis | default=False,
|
59 | 4500650c | Stratos Psomadakis | help="Display both uuid and display name"),
|
60 | 9621c777 | Christos Stavrakakis | ) |
61 | c51f3a08 | Stratos Psomadakis | |
62 | 00051a6a | Christos Stavrakakis | def handle(self, *args, **options): |
63 | cc92b70f | Christos Stavrakakis | write = self.stdout.write
|
64 | 00051a6a | Christos Stavrakakis | if len(args) != 1: |
65 | 00051a6a | Christos Stavrakakis | raise CommandError("Please provide a network ID.") |
66 | 00051a6a | Christos Stavrakakis | |
67 | b84ed662 | Christos Stavrakakis | net = get_network(args[0])
|
68 | 00051a6a | Christos Stavrakakis | |
69 | e3ff6830 | Georgios D. Tsoukalas | ucache = UserCache(ASTAKOS_BASE_URL, ASTAKOS_TOKEN) |
70 | 4500650c | Stratos Psomadakis | |
71 | 4500650c | Stratos Psomadakis | displayname = options['displayname']
|
72 | 4500650c | Stratos Psomadakis | |
73 | 00051a6a | Christos Stavrakakis | sep = '-' * 80 + '\n' |
74 | 4500650c | Stratos Psomadakis | labels = filter(lambda x: x is not Omit, |
75 | 4500650c | Stratos Psomadakis | ['name', 'backend-name', 'state', 'owner uuid', |
76 | 4500650c | Stratos Psomadakis | 'owner_name' if displayname else Omit, 'subnet', |
77 | 4500650c | Stratos Psomadakis | 'gateway', 'mac_prefix', 'link', 'public', 'dhcp', |
78 | 4500650c | Stratos Psomadakis | 'flavor', 'deleted', 'action', 'pool']) |
79 | 4500650c | Stratos Psomadakis | |
80 | 4500650c | Stratos Psomadakis | uuid = net.userid |
81 | 4500650c | Stratos Psomadakis | if displayname:
|
82 | 8283d6c1 | Stratos Psomadakis | dname = ucache.get_name(uuid) |
83 | 4500650c | Stratos Psomadakis | |
84 | 4500650c | Stratos Psomadakis | fields = filter(lambda x: x is not Omit, |
85 | 4500650c | Stratos Psomadakis | [net.name, net.backend_id, net.state, uuid or '-', |
86 | 4500650c | Stratos Psomadakis | dname or '-' if displayname else Omit, |
87 | e6c4bd78 | Christos Stavrakakis | str(net.subnet), str(net.gateway), |
88 | e6c4bd78 | Christos Stavrakakis | str(net.mac_prefix),
|
89 | 4500650c | Stratos Psomadakis | str(net.link), str(net.public), str(net.dhcp), |
90 | 4500650c | Stratos Psomadakis | str(net.flavor), str(net.deleted), str(net.action), |
91 | 4500650c | Stratos Psomadakis | str(splitPoolMap(net.get_pool().to_map(), 64))]) |
92 | 00051a6a | Christos Stavrakakis | |
93 | cc92b70f | Christos Stavrakakis | write(sep) |
94 | cc92b70f | Christos Stavrakakis | write('State of Network in DB\n')
|
95 | cc92b70f | Christos Stavrakakis | write(sep) |
96 | 00051a6a | Christos Stavrakakis | for l, f in zip(labels, fields): |
97 | cc92b70f | Christos Stavrakakis | write(l.ljust(20) + ': ' + f.ljust(20) + '\n') |
98 | 00051a6a | Christos Stavrakakis | |
99 | 00051a6a | Christos Stavrakakis | labels = ('Backend', 'State', 'Deleted', 'JobID', 'OpCode', |
100 | 00051a6a | Christos Stavrakakis | 'JobStatus')
|
101 | 00051a6a | Christos Stavrakakis | for back_net in BackendNetwork.objects.filter(network=net): |
102 | cc92b70f | Christos Stavrakakis | write('\n')
|
103 | 00051a6a | Christos Stavrakakis | fields = (back_net.backend.clustername, back_net.operstate, |
104 | cc92b70f | Christos Stavrakakis | str(back_net.deleted), str(back_net.backendjobid), |
105 | cc92b70f | Christos Stavrakakis | str(back_net.backendopcode),
|
106 | cc92b70f | Christos Stavrakakis | str(back_net.backendjobstatus))
|
107 | 00051a6a | Christos Stavrakakis | for l, f in zip(labels, fields): |
108 | cc92b70f | Christos Stavrakakis | write(l.ljust(20) + ': ' + f.ljust(20) + '\n') |
109 | cc92b70f | Christos Stavrakakis | write('\n')
|
110 | 00051a6a | Christos Stavrakakis | |
111 | cc92b70f | Christos Stavrakakis | write(sep) |
112 | cc92b70f | Christos Stavrakakis | write('State of Network in Ganeti\n')
|
113 | cc92b70f | Christos Stavrakakis | write(sep) |
114 | 00051a6a | Christos Stavrakakis | |
115 | 00051a6a | Christos Stavrakakis | for backend in Backend.objects.exclude(offline=True): |
116 | 3524241a | Christos Stavrakakis | with pooled_rapi_client(backend) as client: |
117 | 3524241a | Christos Stavrakakis | try:
|
118 | 3524241a | Christos Stavrakakis | g_net = client.GetNetwork(net.backend_id) |
119 | cc92b70f | Christos Stavrakakis | write("Backend: %s\n" % backend.clustername)
|
120 | 3524241a | Christos Stavrakakis | print json.dumps(g_net, indent=2) |
121 | cc92b70f | Christos Stavrakakis | write(sep) |
122 | 3524241a | Christos Stavrakakis | except GanetiApiError as e: |
123 | 3524241a | Christos Stavrakakis | if e.code == 404: |
124 | cc92b70f | Christos Stavrakakis | write('Network does not exist in backend %s\n' %
|
125 | cc92b70f | Christos Stavrakakis | backend.clustername) |
126 | 3524241a | Christos Stavrakakis | else:
|
127 | 3524241a | Christos Stavrakakis | raise e
|
128 | 439ff929 | Christos Stavrakakis | |
129 | 439ff929 | Christos Stavrakakis | |
130 | 439ff929 | Christos Stavrakakis | def splitPoolMap(s, count): |
131 | 5e1a5f9b | Christos Stavrakakis | chunks = pool_map_chunks(s, count) |
132 | 439ff929 | Christos Stavrakakis | acc = [] |
133 | 5e1a5f9b | Christos Stavrakakis | count = 0
|
134 | 5e1a5f9b | Christos Stavrakakis | for chunk in chunks: |
135 | 5e1a5f9b | Christos Stavrakakis | chunk_len = len(chunk)
|
136 | 5e1a5f9b | Christos Stavrakakis | acc.append(str(count).rjust(3) + ' ' + chunk + ' ' + |
137 | 5e1a5f9b | Christos Stavrakakis | str(count + chunk_len - 1).ljust(4)) |
138 | 5e1a5f9b | Christos Stavrakakis | count += chunk_len |
139 | 439ff929 | Christos Stavrakakis | return '\n' + '\n'.join(acc) |