Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / management / commands / network-inspect.py @ dab038a2

History | View | Annotate | Download (4.7 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 00051a6a Christos Stavrakakis
38 3524241a Christos Stavrakakis
from synnefo.db.models import (Backend, Network, BackendNetwork,
39 3524241a Christos Stavrakakis
                               pooled_rapi_client)
40 3524241a Christos Stavrakakis
from synnefo.logic.rapi import GanetiApiError
41 5e1a5f9b Christos Stavrakakis
from util import pool_map_chunks
42 00051a6a Christos Stavrakakis
43 3524241a Christos Stavrakakis
44 00051a6a Christos Stavrakakis
class Command(BaseCommand):
45 00051a6a Christos Stavrakakis
    help = "Inspect a network on DB and Ganeti."
46 00051a6a Christos Stavrakakis
47 00051a6a Christos Stavrakakis
    def handle(self, *args, **options):
48 00051a6a Christos Stavrakakis
        if len(args) != 1:
49 00051a6a Christos Stavrakakis
            raise CommandError("Please provide a network ID.")
50 00051a6a Christos Stavrakakis
        try:
51 00051a6a Christos Stavrakakis
            net_id = int(args[0])
52 00051a6a Christos Stavrakakis
        except ValueError:
53 00051a6a Christos Stavrakakis
            raise CommandError("Invalid network ID.")
54 00051a6a Christos Stavrakakis
55 00051a6a Christos Stavrakakis
        try:
56 00051a6a Christos Stavrakakis
            net = Network.objects.get(id=net_id)
57 00051a6a Christos Stavrakakis
        except Network.DoesNotExist:
58 00051a6a Christos Stavrakakis
            raise CommandError("Network not found in DB.")
59 00051a6a Christos Stavrakakis
60 00051a6a Christos Stavrakakis
        sep = '-' * 80 + '\n'
61 0b827aa4 Christos Stavrakakis
        labels = ('name', 'backend-name', 'state', 'owner', 'subnet', 'gateway',
62 dab038a2 Christos Stavrakakis
                  'mac_prefix', 'link', 'public', 'dhcp', 'type', 'deleted',
63 439ff929 Christos Stavrakakis
                  'action', 'pool')
64 0b827aa4 Christos Stavrakakis
        fields = (net.name, net.backend_id, net.state, str(net.userid),
65 0b827aa4 Christos Stavrakakis
                  str(net.subnet), str(net.gateway), str(net.mac_prefix),
66 0b827aa4 Christos Stavrakakis
                  str(net.link), str(net.public),  str(net.dhcp),
67 439ff929 Christos Stavrakakis
                  str(net.type), str(net.deleted), str(net.action),
68 fdc94944 Christos Stavrakakis
                  str(splitPoolMap(net.get_pool().to_map(), 64)))
69 00051a6a Christos Stavrakakis
70 00051a6a Christos Stavrakakis
        self.stdout.write(sep)
71 00051a6a Christos Stavrakakis
        self.stdout.write('State of Network in DB\n')
72 00051a6a Christos Stavrakakis
        self.stdout.write(sep)
73 00051a6a Christos Stavrakakis
        for l, f in zip(labels, fields):
74 00051a6a Christos Stavrakakis
            self.stdout.write(l.ljust(20) + ': ' + f.ljust(20) + '\n')
75 00051a6a Christos Stavrakakis
76 00051a6a Christos Stavrakakis
        labels = ('Backend', 'State', 'Deleted', 'JobID', 'OpCode',
77 00051a6a Christos Stavrakakis
                  'JobStatus')
78 00051a6a Christos Stavrakakis
        for back_net in BackendNetwork.objects.filter(network=net):
79 00051a6a Christos Stavrakakis
            self.stdout.write('\n')
80 00051a6a Christos Stavrakakis
            fields = (back_net.backend.clustername, back_net.operstate,
81 00051a6a Christos Stavrakakis
                     str(back_net.deleted),  str(back_net.backendjobid),
82 00051a6a Christos Stavrakakis
                     str(back_net.backendopcode),
83 00051a6a Christos Stavrakakis
                     str(back_net.backendjobstatus))
84 00051a6a Christos Stavrakakis
            for l, f in zip(labels, fields):
85 00051a6a Christos Stavrakakis
                self.stdout.write(l.ljust(20) + ': ' + f.ljust(20) + '\n')
86 00051a6a Christos Stavrakakis
        self.stdout.write('\n')
87 00051a6a Christos Stavrakakis
88 00051a6a Christos Stavrakakis
        self.stdout.write(sep)
89 00051a6a Christos Stavrakakis
        self.stdout.write('State of Network in Ganeti\n')
90 00051a6a Christos Stavrakakis
        self.stdout.write(sep)
91 00051a6a Christos Stavrakakis
92 00051a6a Christos Stavrakakis
        for backend in Backend.objects.exclude(offline=True):
93 3524241a Christos Stavrakakis
            with pooled_rapi_client(backend) as client:
94 3524241a Christos Stavrakakis
                try:
95 3524241a Christos Stavrakakis
                    g_net = client.GetNetwork(net.backend_id)
96 3524241a Christos Stavrakakis
                    self.stdout.write("Backend: %s\n" % backend.clustername)
97 3524241a Christos Stavrakakis
                    print json.dumps(g_net, indent=2)
98 3524241a Christos Stavrakakis
                    self.stdout.write(sep)
99 3524241a Christos Stavrakakis
                except GanetiApiError as e:
100 3524241a Christos Stavrakakis
                    if e.code == 404:
101 3524241a Christos Stavrakakis
                        self.stdout.write('Network does not exist in backend %s\n' %
102 3524241a Christos Stavrakakis
                                          backend.clustername)
103 3524241a Christos Stavrakakis
                    else:
104 3524241a Christos Stavrakakis
                        raise e
105 439ff929 Christos Stavrakakis
106 439ff929 Christos Stavrakakis
107 439ff929 Christos Stavrakakis
def splitPoolMap(s, count):
108 5e1a5f9b Christos Stavrakakis
    chunks = pool_map_chunks(s, count)
109 439ff929 Christos Stavrakakis
    acc = []
110 5e1a5f9b Christos Stavrakakis
    count = 0
111 5e1a5f9b Christos Stavrakakis
    for chunk in chunks:
112 5e1a5f9b Christos Stavrakakis
        chunk_len = len(chunk)
113 5e1a5f9b Christos Stavrakakis
        acc.append(str(count).rjust(3) + ' ' + chunk + ' ' +
114 5e1a5f9b Christos Stavrakakis
                   str(count + chunk_len - 1).ljust(4))
115 5e1a5f9b Christos Stavrakakis
        count += chunk_len
116 439ff929 Christos Stavrakakis
    return '\n' + '\n'.join(acc)