Statistics
| Branch: | Tag: | Revision:

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)