Statistics
| Branch: | Tag: | Revision:

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

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