Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (6.4 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 b7d38981 Dimitris Aragiorgis
36 14fd6983 Christos Stavrakakis
37 14fd6983 Christos Stavrakakis
class Command(BaseCommand):
38 14fd6983 Christos Stavrakakis
    help = 'Check consistency of unique resources.'
39 14fd6983 Christos Stavrakakis
40 14fd6983 Christos Stavrakakis
    def handle(self, **options):
41 14fd6983 Christos Stavrakakis
        self.detect_bridges()
42 14fd6983 Christos Stavrakakis
        self.detect_mac_prefixes()
43 14fd6983 Christos Stavrakakis
        self.detect_unique_mac_prefixes()
44 14fd6983 Christos Stavrakakis
45 14fd6983 Christos Stavrakakis
    def detect_bridges(self):
46 14fd6983 Christos Stavrakakis
        write = self.stdout.write
47 14fd6983 Christos Stavrakakis
48 14fd6983 Christos Stavrakakis
        write("---------------------------------------\n")
49 14fd6983 Christos Stavrakakis
        write("Checking consistency of the Bridge Pool\n")
50 14fd6983 Christos Stavrakakis
        write("---------------------------------------\n")
51 14fd6983 Christos Stavrakakis
52 9727ac2f Christos Stavrakakis
        try:
53 9727ac2f Christos Stavrakakis
            bridge_pool = BridgePoolTable.get_pool()
54 9727ac2f Christos Stavrakakis
        except EmptyPool:
55 9727ac2f Christos Stavrakakis
            write("No Bridge Pool\n")
56 9727ac2f Christos Stavrakakis
            return
57 03992c72 Christos Stavrakakis
        bridges = []
58 03992c72 Christos Stavrakakis
        for i in xrange(0, bridge_pool.size()):
59 03992c72 Christos Stavrakakis
            if not bridge_pool.is_available(i, index=True) and \
60 cc92b70f Christos Stavrakakis
                not bridge_pool.is_reserved(i, index=True):
61 cc92b70f Christos Stavrakakis
                    bridges.append(bridge_pool.index_to_value(i))
62 14fd6983 Christos Stavrakakis
63 03992c72 Christos Stavrakakis
        write("Used bridges from Pool: %d\n" % len(bridges))
64 14fd6983 Christos Stavrakakis
65 b7d38981 Dimitris Aragiorgis
        network_bridges = Network.objects.filter(flavor='PHYSICAL_VLAN',
66 cc92b70f Christos Stavrakakis
                                                 deleted=False)\
67 14fd6983 Christos Stavrakakis
                                         .values_list('link', flat=True)
68 14fd6983 Christos Stavrakakis
69 cc92b70f Christos Stavrakakis
        write("Used bridges from Networks: %d\n" % len(network_bridges))
70 14fd6983 Christos Stavrakakis
71 14fd6983 Christos Stavrakakis
        set_network_bridges = set(network_bridges)
72 14fd6983 Christos Stavrakakis
        if len(network_bridges) > len(set_network_bridges):
73 14fd6983 Christos Stavrakakis
            write("Found duplicated bridges:\n")
74 14fd6983 Christos Stavrakakis
            duplicates = list(network_bridges)
75 14fd6983 Christos Stavrakakis
            for bridge in set_network_bridges:
76 14fd6983 Christos Stavrakakis
                duplicates.remove(bridge)
77 14fd6983 Christos Stavrakakis
            for bridge in set(duplicates):
78 14fd6983 Christos Stavrakakis
                write("Duplicated bridge: %s. " % bridge)
79 14fd6983 Christos Stavrakakis
                write("Used by the following Networks:\n")
80 14fd6983 Christos Stavrakakis
                nets = Network.objects.filter(deleted=False, link=bridge)
81 cc92b70f Christos Stavrakakis
                write("  " + "\n  ".join([str(net.id) for net in nets]) + "\n")
82 14fd6983 Christos Stavrakakis
83 14fd6983 Christos Stavrakakis
    def detect_mac_prefixes(self):
84 14fd6983 Christos Stavrakakis
        write = self.stdout.write
85 14fd6983 Christos Stavrakakis
86 14fd6983 Christos Stavrakakis
        write("---------------------------------------\n")
87 14fd6983 Christos Stavrakakis
        write("Checking consistency of the MAC Prefix Pool\n")
88 14fd6983 Christos Stavrakakis
        write("---------------------------------------\n")
89 14fd6983 Christos Stavrakakis
90 9727ac2f Christos Stavrakakis
        try:
91 9727ac2f Christos Stavrakakis
            macp_pool = MacPrefixPoolTable.get_pool()
92 9727ac2f Christos Stavrakakis
        except EmptyPool:
93 9727ac2f Christos Stavrakakis
            write("No mac-prefix pool\n")
94 9727ac2f Christos Stavrakakis
            return
95 9727ac2f Christos Stavrakakis
96 03992c72 Christos Stavrakakis
        macs = []
97 b7d38981 Dimitris Aragiorgis
        for i in xrange(1, macp_pool.size()):
98 03992c72 Christos Stavrakakis
            if not macp_pool.is_available(i, index=True) and \
99 03992c72 Christos Stavrakakis
               not macp_pool.is_reserved(i, index=True):
100 af6a3bc5 Christos Stavrakakis
                value = macp_pool.index_to_value(i)
101 b7d38981 Dimitris Aragiorgis
                macs.append(value)
102 14fd6983 Christos Stavrakakis
103 03992c72 Christos Stavrakakis
        write("Used MAC prefixes from Pool: %d\n" % len(macs))
104 14fd6983 Christos Stavrakakis
105 af6a3bc5 Christos Stavrakakis
        network_mac_prefixes = \
106 b7d38981 Dimitris Aragiorgis
            Network.objects.filter(deleted=False, flavor='MAC_FILTERED')\
107 cc92b70f Christos Stavrakakis
                           .values_list('mac_prefix', flat=True)
108 14fd6983 Christos Stavrakakis
        write("Used MAC prefixes from Networks: %d\n" %
109 cc92b70f Christos Stavrakakis
              len(network_mac_prefixes))
110 14fd6983 Christos Stavrakakis
111 14fd6983 Christos Stavrakakis
        set_network_mac_prefixes = set(network_mac_prefixes)
112 14fd6983 Christos Stavrakakis
        if len(network_mac_prefixes) > len(set_network_mac_prefixes):
113 14fd6983 Christos Stavrakakis
            write("Found duplicated mac_prefixes:\n")
114 14fd6983 Christos Stavrakakis
            duplicates = list(network_mac_prefixes)
115 14fd6983 Christos Stavrakakis
            for mac_prefix in set_network_mac_prefixes:
116 14fd6983 Christos Stavrakakis
                duplicates.remove(mac_prefix)
117 14fd6983 Christos Stavrakakis
            for mac_prefix in set(duplicates):
118 14fd6983 Christos Stavrakakis
                write("Duplicated mac_prefix: %s. " % mac_prefix)
119 14fd6983 Christos Stavrakakis
                write("Used by the following Networks:\n")
120 03992c72 Christos Stavrakakis
                nets = Network.objects.filter(deleted=False,
121 03992c72 Christos Stavrakakis
                                              mac_prefix=mac_prefix)
122 cc92b70f Christos Stavrakakis
                write("  " + "\n  ".join([str(net.id) for net in nets]) + "\n")
123 14fd6983 Christos Stavrakakis
124 14fd6983 Christos Stavrakakis
    def detect_unique_mac_prefixes(self):
125 14fd6983 Christos Stavrakakis
        write = self.stdout.write
126 14fd6983 Christos Stavrakakis
127 14fd6983 Christos Stavrakakis
        write("---------------------------------------\n")
128 14fd6983 Christos Stavrakakis
        write("Checking uniqueness of BackendNetwork prefixes.\n")
129 14fd6983 Christos Stavrakakis
        write("---------------------------------------\n")
130 14fd6983 Christos Stavrakakis
131 cc92b70f Christos Stavrakakis
        back_networks = BackendNetwork.objects
132 cc92b70f Christos Stavrakakis
        mac_prefixes = back_networks.filter(deleted=False,
133 cc92b70f Christos Stavrakakis
                                            network__flavor='MAC_FILTERED')\
134 cc92b70f Christos Stavrakakis
                                    .values_list('mac_prefix', flat=True)
135 14fd6983 Christos Stavrakakis
        set_mac_prefixes = set(mac_prefixes)
136 14fd6983 Christos Stavrakakis
        if len(mac_prefixes) > len(set_mac_prefixes):
137 14fd6983 Christos Stavrakakis
            write("Found duplicated mac_prefixes:\n")
138 14fd6983 Christos Stavrakakis
            duplicates = list(mac_prefixes)
139 14fd6983 Christos Stavrakakis
            for mac_prefix in set_mac_prefixes:
140 14fd6983 Christos Stavrakakis
                duplicates.remove(mac_prefix)
141 14fd6983 Christos Stavrakakis
            for mac_prefix in set(duplicates):
142 14fd6983 Christos Stavrakakis
                write("Duplicated mac_prefix: %s. " % mac_prefix)
143 14fd6983 Christos Stavrakakis
                write("Used by the following BackendNetworks:\n")
144 03992c72 Christos Stavrakakis
                nets = BackendNetwork.objects.filter(deleted=False,
145 03992c72 Christos Stavrakakis
                                                     mac_prefix=mac_prefix)
146 cc92b70f Christos Stavrakakis
                write("  " + "\n  ".join([str(net.id) for net in nets]) + "\n")