Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / management / commands / reconcile-pools.py @ d7841399

History | View | Annotate | Download (6.7 kB)

1 14fd6983 Christos Stavrakakis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 14fd6983 Christos Stavrakakis
#
3 14fd6983 Christos Stavrakakis
# Redistribution and use in source and binary forms, with or without
4 14fd6983 Christos Stavrakakis
# modification, are permitted provided that the following conditions
5 14fd6983 Christos Stavrakakis
# are met:
6 14fd6983 Christos Stavrakakis
#
7 14fd6983 Christos Stavrakakis
#   1. Redistributions of source code must retain the above copyright
8 14fd6983 Christos Stavrakakis
#      notice, this list of conditions and the following disclaimer.
9 14fd6983 Christos Stavrakakis
#
10 14fd6983 Christos Stavrakakis
#  2. Redistributions in binary form must reproduce the above copyright
11 14fd6983 Christos Stavrakakis
#     notice, this list of conditions and the following disclaimer in the
12 14fd6983 Christos Stavrakakis
#     documentation and/or other materials provided with the distribution.
13 14fd6983 Christos Stavrakakis
#
14 14fd6983 Christos Stavrakakis
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
15 14fd6983 Christos Stavrakakis
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 14fd6983 Christos Stavrakakis
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 14fd6983 Christos Stavrakakis
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
18 14fd6983 Christos Stavrakakis
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 14fd6983 Christos Stavrakakis
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 14fd6983 Christos Stavrakakis
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 14fd6983 Christos Stavrakakis
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 14fd6983 Christos Stavrakakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 14fd6983 Christos Stavrakakis
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 14fd6983 Christos Stavrakakis
# SUCH DAMAGE.
25 14fd6983 Christos Stavrakakis
#
26 14fd6983 Christos Stavrakakis
# The views and conclusions contained in the software and documentation are
27 14fd6983 Christos Stavrakakis
# those of the authors and should not be interpreted as representing official
28 14fd6983 Christos Stavrakakis
# policies, either expressed or implied, of GRNET S.A.
29 14fd6983 Christos Stavrakakis
#
30 14fd6983 Christos Stavrakakis
from django.core.management.base import BaseCommand
31 14fd6983 Christos Stavrakakis
32 14fd6983 Christos Stavrakakis
from synnefo.db.models import (Network, BackendNetwork,
33 03992c72 Christos Stavrakakis
                               BridgePoolTable, MacPrefixPoolTable)
34 9727ac2f Christos Stavrakakis
from synnefo.db.pools import EmptyPool
35 af6a3bc5 Christos Stavrakakis
from synnefo.settings import MAC_POOL_BASE
36 14fd6983 Christos Stavrakakis
37 14fd6983 Christos Stavrakakis
38 14fd6983 Christos Stavrakakis
class Command(BaseCommand):
39 14fd6983 Christos Stavrakakis
    help = 'Check consistency of unique resources.'
40 14fd6983 Christos Stavrakakis
41 14fd6983 Christos Stavrakakis
    def handle(self, **options):
42 14fd6983 Christos Stavrakakis
        self.detect_bridges()
43 14fd6983 Christos Stavrakakis
        self.detect_mac_prefixes()
44 14fd6983 Christos Stavrakakis
        self.detect_unique_mac_prefixes()
45 14fd6983 Christos Stavrakakis
46 14fd6983 Christos Stavrakakis
    def detect_bridges(self):
47 14fd6983 Christos Stavrakakis
        write = self.stdout.write
48 14fd6983 Christos Stavrakakis
49 14fd6983 Christos Stavrakakis
        write("---------------------------------------\n")
50 14fd6983 Christos Stavrakakis
        write("Checking consistency of the Bridge Pool\n")
51 14fd6983 Christos Stavrakakis
        write("---------------------------------------\n")
52 14fd6983 Christos Stavrakakis
53 9727ac2f Christos Stavrakakis
        try:
54 9727ac2f Christos Stavrakakis
            bridge_pool = BridgePoolTable.get_pool()
55 9727ac2f Christos Stavrakakis
        except EmptyPool:
56 9727ac2f Christos Stavrakakis
            write("No Bridge Pool\n")
57 9727ac2f Christos Stavrakakis
            return
58 03992c72 Christos Stavrakakis
        bridges = []
59 03992c72 Christos Stavrakakis
        for i in xrange(0, bridge_pool.size()):
60 03992c72 Christos Stavrakakis
            if not bridge_pool.is_available(i, index=True) and \
61 03992c72 Christos Stavrakakis
               not bridge_pool.is_reserved(i, index=True):
62 03992c72 Christos Stavrakakis
                bridges.append(bridge_pool.index_to_value(i))
63 14fd6983 Christos Stavrakakis
64 03992c72 Christos Stavrakakis
        write("Used bridges from Pool: %d\n" % len(bridges))
65 14fd6983 Christos Stavrakakis
66 14fd6983 Christos Stavrakakis
        network_bridges = Network.objects.filter(type='PRIVATE_PHYSICAL_VLAN',
67 14fd6983 Christos Stavrakakis
                                                deleted=False)\
68 14fd6983 Christos Stavrakakis
                                         .values_list('link', flat=True)
69 14fd6983 Christos Stavrakakis
70 14fd6983 Christos Stavrakakis
        write("Used bridges from Networks: %d\n" %
71 14fd6983 Christos Stavrakakis
                          len(network_bridges))
72 14fd6983 Christos Stavrakakis
73 14fd6983 Christos Stavrakakis
        set_network_bridges = set(network_bridges)
74 14fd6983 Christos Stavrakakis
        if len(network_bridges) > len(set_network_bridges):
75 14fd6983 Christos Stavrakakis
            write("Found duplicated bridges:\n")
76 14fd6983 Christos Stavrakakis
            duplicates = list(network_bridges)
77 14fd6983 Christos Stavrakakis
            for bridge in set_network_bridges:
78 14fd6983 Christos Stavrakakis
                duplicates.remove(bridge)
79 14fd6983 Christos Stavrakakis
            for bridge in set(duplicates):
80 14fd6983 Christos Stavrakakis
                write("Duplicated bridge: %s. " % bridge)
81 14fd6983 Christos Stavrakakis
                write("Used by the following Networks:\n")
82 14fd6983 Christos Stavrakakis
                nets = Network.objects.filter(deleted=False, link=bridge)
83 14fd6983 Christos Stavrakakis
                write("  " + "\n  ".join([str(net.id) for net in nets])\
84 14fd6983 Christos Stavrakakis
                                  + "\n")
85 14fd6983 Christos Stavrakakis
86 14fd6983 Christos Stavrakakis
    def detect_mac_prefixes(self):
87 14fd6983 Christos Stavrakakis
        write = self.stdout.write
88 14fd6983 Christos Stavrakakis
89 14fd6983 Christos Stavrakakis
        write("---------------------------------------\n")
90 14fd6983 Christos Stavrakakis
        write("Checking consistency of the MAC Prefix Pool\n")
91 14fd6983 Christos Stavrakakis
        write("---------------------------------------\n")
92 14fd6983 Christos Stavrakakis
93 9727ac2f Christos Stavrakakis
        try:
94 9727ac2f Christos Stavrakakis
            macp_pool = MacPrefixPoolTable.get_pool()
95 9727ac2f Christos Stavrakakis
        except EmptyPool:
96 9727ac2f Christos Stavrakakis
            write("No mac-prefix pool\n")
97 9727ac2f Christos Stavrakakis
            return
98 9727ac2f Christos Stavrakakis
99 03992c72 Christos Stavrakakis
        macs = []
100 03992c72 Christos Stavrakakis
        for i in xrange(0, macp_pool.size()):
101 03992c72 Christos Stavrakakis
            if not macp_pool.is_available(i, index=True) and \
102 03992c72 Christos Stavrakakis
               not macp_pool.is_reserved(i, index=True):
103 af6a3bc5 Christos Stavrakakis
                value = macp_pool.index_to_value(i)
104 af6a3bc5 Christos Stavrakakis
                if value != MAC_POOL_BASE:
105 af6a3bc5 Christos Stavrakakis
                    macs.append(macp_pool.index_to_value(i))
106 14fd6983 Christos Stavrakakis
107 03992c72 Christos Stavrakakis
        write("Used MAC prefixes from Pool: %d\n" % len(macs))
108 14fd6983 Christos Stavrakakis
109 af6a3bc5 Christos Stavrakakis
        network_mac_prefixes = \
110 af6a3bc5 Christos Stavrakakis
            Network.objects.filter(deleted=False)\
111 af6a3bc5 Christos Stavrakakis
                            .exclude(mac_prefix=MAC_POOL_BASE) \
112 af6a3bc5 Christos Stavrakakis
                            .values_list('mac_prefix', flat=True)
113 14fd6983 Christos Stavrakakis
        write("Used MAC prefixes from Networks: %d\n" %
114 14fd6983 Christos Stavrakakis
                          len(network_mac_prefixes))
115 14fd6983 Christos Stavrakakis
116 14fd6983 Christos Stavrakakis
        set_network_mac_prefixes = set(network_mac_prefixes)
117 14fd6983 Christos Stavrakakis
        if len(network_mac_prefixes) > len(set_network_mac_prefixes):
118 14fd6983 Christos Stavrakakis
            write("Found duplicated mac_prefixes:\n")
119 14fd6983 Christos Stavrakakis
            duplicates = list(network_mac_prefixes)
120 14fd6983 Christos Stavrakakis
            for mac_prefix in set_network_mac_prefixes:
121 14fd6983 Christos Stavrakakis
                duplicates.remove(mac_prefix)
122 14fd6983 Christos Stavrakakis
            for mac_prefix in set(duplicates):
123 14fd6983 Christos Stavrakakis
                write("Duplicated mac_prefix: %s. " % mac_prefix)
124 14fd6983 Christos Stavrakakis
                write("Used by the following Networks:\n")
125 03992c72 Christos Stavrakakis
                nets = Network.objects.filter(deleted=False,
126 03992c72 Christos Stavrakakis
                                              mac_prefix=mac_prefix)
127 14fd6983 Christos Stavrakakis
                write("  " + "\n  ".join([str(net.id) for net in nets])\
128 14fd6983 Christos Stavrakakis
                                  + "\n")
129 14fd6983 Christos Stavrakakis
130 14fd6983 Christos Stavrakakis
    def detect_unique_mac_prefixes(self):
131 14fd6983 Christos Stavrakakis
        write = self.stdout.write
132 14fd6983 Christos Stavrakakis
133 14fd6983 Christos Stavrakakis
        write("---------------------------------------\n")
134 14fd6983 Christos Stavrakakis
        write("Checking uniqueness of BackendNetwork prefixes.\n")
135 14fd6983 Christos Stavrakakis
        write("---------------------------------------\n")
136 14fd6983 Christos Stavrakakis
137 14fd6983 Christos Stavrakakis
        mac_prefixes = BackendNetwork.objects.filter(deleted=False)\
138 14fd6983 Christos Stavrakakis
                                      .values_list('mac_prefix', flat=True)
139 af6a3bc5 Christos Stavrakakis
        mac_prefixes = filter(lambda x: not x.startswith(MAC_POOL_BASE),
140 af6a3bc5 Christos Stavrakakis
                              mac_prefixes)
141 14fd6983 Christos Stavrakakis
        set_mac_prefixes = set(mac_prefixes)
142 14fd6983 Christos Stavrakakis
        if len(mac_prefixes) > len(set_mac_prefixes):
143 14fd6983 Christos Stavrakakis
            write("Found duplicated mac_prefixes:\n")
144 14fd6983 Christos Stavrakakis
            duplicates = list(mac_prefixes)
145 14fd6983 Christos Stavrakakis
            for mac_prefix in set_mac_prefixes:
146 14fd6983 Christos Stavrakakis
                duplicates.remove(mac_prefix)
147 14fd6983 Christos Stavrakakis
            for mac_prefix in set(duplicates):
148 14fd6983 Christos Stavrakakis
                write("Duplicated mac_prefix: %s. " % mac_prefix)
149 14fd6983 Christos Stavrakakis
                write("Used by the following BackendNetworks:\n")
150 03992c72 Christos Stavrakakis
                nets = BackendNetwork.objects.filter(deleted=False,
151 03992c72 Christos Stavrakakis
                                                     mac_prefix=mac_prefix)
152 14fd6983 Christos Stavrakakis
                write("  " + "\n  ".join([str(net.id) for net in nets])\
153 14fd6983 Christos Stavrakakis
                                  + "\n")