Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / management / pprint.py @ 8b388efe

History | View | Annotate | Download (7.7 kB)

1 d5a4a8d1 Christos Stavrakakis
#Copyright (C) 2013 GRNET S.A. All rights reserved.
2 d5a4a8d1 Christos Stavrakakis
#
3 d5a4a8d1 Christos Stavrakakis
#Redistribution and use in source and binary forms, with or
4 d5a4a8d1 Christos Stavrakakis
#without modification, are permitted provided that the following
5 d5a4a8d1 Christos Stavrakakis
#conditions are met:
6 d5a4a8d1 Christos Stavrakakis
#
7 d5a4a8d1 Christos Stavrakakis
#  1. Redistributions of source code must retain the above
8 d5a4a8d1 Christos Stavrakakis
#     copyright notice, this list of conditions and the following
9 d5a4a8d1 Christos Stavrakakis
#     disclaimer.
10 d5a4a8d1 Christos Stavrakakis
#
11 d5a4a8d1 Christos Stavrakakis
#  2. Redistributions in binary form must reproduce the above
12 d5a4a8d1 Christos Stavrakakis
#     copyright notice, this list of conditions and the following
13 d5a4a8d1 Christos Stavrakakis
#     disclaimer in the documentation and/or other materials
14 d5a4a8d1 Christos Stavrakakis
#     provided with the distribution.
15 d5a4a8d1 Christos Stavrakakis
#
16 d5a4a8d1 Christos Stavrakakis
#THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 d5a4a8d1 Christos Stavrakakis
#OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 d5a4a8d1 Christos Stavrakakis
#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 d5a4a8d1 Christos Stavrakakis
#PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A. OR
20 d5a4a8d1 Christos Stavrakakis
#CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 d5a4a8d1 Christos Stavrakakis
#SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 d5a4a8d1 Christos Stavrakakis
#LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 d5a4a8d1 Christos Stavrakakis
#USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 d5a4a8d1 Christos Stavrakakis
#AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 d5a4a8d1 Christos Stavrakakis
#LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 d5a4a8d1 Christos Stavrakakis
#ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 d5a4a8d1 Christos Stavrakakis
#POSSIBILITY OF SUCH DAMAGE.
28 d5a4a8d1 Christos Stavrakakis
#
29 d5a4a8d1 Christos Stavrakakis
#The views and conclusions contained in the software and
30 d5a4a8d1 Christos Stavrakakis
#documentation are those of the authors and should not be
31 d5a4a8d1 Christos Stavrakakis
#interpreted as representing official policies, either expressed
32 d5a4a8d1 Christos Stavrakakis
#or implied, of GRNET S.A.
33 d5a4a8d1 Christos Stavrakakis
34 d5a4a8d1 Christos Stavrakakis
import sys
35 d5a4a8d1 Christos Stavrakakis
from snf_django.management.utils import pprint_table
36 d5a4a8d1 Christos Stavrakakis
from synnefo.lib.ordereddict import OrderedDict
37 d5a4a8d1 Christos Stavrakakis
from snf_django.lib.astakos import UserCache
38 d5a4a8d1 Christos Stavrakakis
from synnefo.settings import (CYCLADES_SERVICE_TOKEN as ASTAKOS_TOKEN,
39 d5a4a8d1 Christos Stavrakakis
                              ASTAKOS_BASE_URL)
40 d5a4a8d1 Christos Stavrakakis
from synnefo.db.models import Backend, pooled_rapi_client
41 d5a4a8d1 Christos Stavrakakis
from synnefo.logic.rapi import GanetiApiError
42 d5a4a8d1 Christos Stavrakakis
from synnefo.logic.reconciliation import nics_from_instance
43 d5a4a8d1 Christos Stavrakakis
44 d5a4a8d1 Christos Stavrakakis
45 d5a4a8d1 Christos Stavrakakis
def pprint_network(network, display_mails=False, stdout=None, title=None):
46 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
47 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
48 d5a4a8d1 Christos Stavrakakis
    if title is None:
49 d5a4a8d1 Christos Stavrakakis
        title = "State of Network %s in DB" % network.id
50 d5a4a8d1 Christos Stavrakakis
51 d5a4a8d1 Christos Stavrakakis
    ucache = UserCache(ASTAKOS_BASE_URL, ASTAKOS_TOKEN)
52 d5a4a8d1 Christos Stavrakakis
    userid = network.userid
53 d5a4a8d1 Christos Stavrakakis
54 d5a4a8d1 Christos Stavrakakis
    db_network = OrderedDict([
55 d5a4a8d1 Christos Stavrakakis
        ("name", network.name),
56 d5a4a8d1 Christos Stavrakakis
        ("backend-name", network.backend_id),
57 d5a4a8d1 Christos Stavrakakis
        ("state", network.state),
58 d5a4a8d1 Christos Stavrakakis
        ("userid", userid),
59 d5a4a8d1 Christos Stavrakakis
        ("username", ucache.get_name(userid) if display_mails else userid),
60 d5a4a8d1 Christos Stavrakakis
        ("public", network.public),
61 d5a4a8d1 Christos Stavrakakis
        ("floating_ip_pool", network.floating_ip_pool),
62 d5a4a8d1 Christos Stavrakakis
        ("external_router", network.external_router),
63 d5a4a8d1 Christos Stavrakakis
        ("drained", network.drained),
64 d5a4a8d1 Christos Stavrakakis
        ("MAC prefix", network.mac_prefix),
65 d5a4a8d1 Christos Stavrakakis
        ("flavor", network.flavor),
66 d5a4a8d1 Christos Stavrakakis
        ("link", network.link),
67 d5a4a8d1 Christos Stavrakakis
        ("mode", network.mode),
68 d5a4a8d1 Christos Stavrakakis
        ("deleted", network.deleted),
69 d5a4a8d1 Christos Stavrakakis
        ("tags", "), ".join(network.backend_tag)),
70 d5a4a8d1 Christos Stavrakakis
        ("action", network.action)])
71 d5a4a8d1 Christos Stavrakakis
72 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, db_network.items(), None, separator=" | ",
73 d5a4a8d1 Christos Stavrakakis
                 title=title)
74 d5a4a8d1 Christos Stavrakakis
75 d5a4a8d1 Christos Stavrakakis
76 d5a4a8d1 Christos Stavrakakis
def pprint_network_subnets(network, stdout=None, title=None):
77 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
78 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
79 d5a4a8d1 Christos Stavrakakis
    if title is None:
80 d5a4a8d1 Christos Stavrakakis
        title = "Subnets of network %s" % network.id
81 d5a4a8d1 Christos Stavrakakis
82 d5a4a8d1 Christos Stavrakakis
    subnets = list(network.subnets.values_list("id", "name", "ipversion",
83 d5a4a8d1 Christos Stavrakakis
                                               "cidr", "gateway", "dhcp",
84 d5a4a8d1 Christos Stavrakakis
                                               "deleted"))
85 d5a4a8d1 Christos Stavrakakis
    headers = ["ID", "Name", "Version", "CIDR", "Gateway", "DHCP",
86 d5a4a8d1 Christos Stavrakakis
               "Deleted"]
87 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, subnets, headers, separator=" | ",
88 d5a4a8d1 Christos Stavrakakis
                 title=title)
89 d5a4a8d1 Christos Stavrakakis
90 d5a4a8d1 Christos Stavrakakis
91 d5a4a8d1 Christos Stavrakakis
def pprint_network_backends(network, stdout=None, title=None):
92 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
93 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
94 d5a4a8d1 Christos Stavrakakis
    if title is None:
95 d5a4a8d1 Christos Stavrakakis
        title = "State of Network %s in DB for each backend" % network.id
96 d5a4a8d1 Christos Stavrakakis
    bnets = list(network.backend_networks.values_list(
97 d5a4a8d1 Christos Stavrakakis
        "backend__clustername",
98 d5a4a8d1 Christos Stavrakakis
        "operstate", "deleted", "backendjobid",
99 d5a4a8d1 Christos Stavrakakis
        "backendopcode", "backendjobstatus"))
100 d5a4a8d1 Christos Stavrakakis
    headers = ["Backend", "State", "Deleted", "JobID", "Opcode",
101 d5a4a8d1 Christos Stavrakakis
               "JobStatus"]
102 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, bnets, headers, separator=" | ",
103 d5a4a8d1 Christos Stavrakakis
                 title=title)
104 d5a4a8d1 Christos Stavrakakis
105 d5a4a8d1 Christos Stavrakakis
106 d5a4a8d1 Christos Stavrakakis
def pprint_network_in_ganeti(network, stdout=None):
107 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
108 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
109 d5a4a8d1 Christos Stavrakakis
    for backend in Backend.objects.exclude(offline=True):
110 d5a4a8d1 Christos Stavrakakis
        with pooled_rapi_client(backend) as client:
111 d5a4a8d1 Christos Stavrakakis
            try:
112 d5a4a8d1 Christos Stavrakakis
                g_net = client.GetNetwork(network.backend_id)
113 d5a4a8d1 Christos Stavrakakis
                ip_map = g_net.pop("map")
114 d5a4a8d1 Christos Stavrakakis
                pprint_table(stdout, g_net.items(), None,
115 d5a4a8d1 Christos Stavrakakis
                             title="State of network in backend: %s" %
116 d5a4a8d1 Christos Stavrakakis
                                   backend.clustername)
117 d5a4a8d1 Christos Stavrakakis
                pprint_pool(None, ip_map, 80, stdout)
118 d5a4a8d1 Christos Stavrakakis
            except GanetiApiError as e:
119 d5a4a8d1 Christos Stavrakakis
                if e.code == 404:
120 d5a4a8d1 Christos Stavrakakis
                    stdout.write('Network does not exist in backend %s\n' %
121 d5a4a8d1 Christos Stavrakakis
                                 backend.clustername)
122 d5a4a8d1 Christos Stavrakakis
                else:
123 d5a4a8d1 Christos Stavrakakis
                    raise e
124 d5a4a8d1 Christos Stavrakakis
125 d5a4a8d1 Christos Stavrakakis
126 d5a4a8d1 Christos Stavrakakis
def pool_map_chunks(smap, step=64):
127 d5a4a8d1 Christos Stavrakakis
    for i in xrange(0, len(smap), step):
128 d5a4a8d1 Christos Stavrakakis
        yield smap[i:i + step]
129 d5a4a8d1 Christos Stavrakakis
130 d5a4a8d1 Christos Stavrakakis
131 d5a4a8d1 Christos Stavrakakis
def splitPoolMap(s, count):
132 d5a4a8d1 Christos Stavrakakis
    chunks = pool_map_chunks(s, count)
133 d5a4a8d1 Christos Stavrakakis
    acc = []
134 d5a4a8d1 Christos Stavrakakis
    count = 0
135 d5a4a8d1 Christos Stavrakakis
    for chunk in chunks:
136 d5a4a8d1 Christos Stavrakakis
        chunk_len = len(chunk)
137 d5a4a8d1 Christos Stavrakakis
        acc.append(str(count).rjust(3) + ' ' + chunk + ' ' +
138 d5a4a8d1 Christos Stavrakakis
                   str(count + chunk_len - 1).ljust(4))
139 d5a4a8d1 Christos Stavrakakis
        count += chunk_len
140 d5a4a8d1 Christos Stavrakakis
    return '\n' + '\n'.join(acc)
141 d5a4a8d1 Christos Stavrakakis
142 d5a4a8d1 Christos Stavrakakis
143 d5a4a8d1 Christos Stavrakakis
def pprint_pool(name, pool_map, step=80, stdout=None):
144 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
145 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
146 d5a4a8d1 Christos Stavrakakis
    if name is not None:
147 d5a4a8d1 Christos Stavrakakis
        stdout.write("Pool: %s\n" % name)
148 d5a4a8d1 Christos Stavrakakis
    stdout.write(splitPoolMap(pool_map, count=step))
149 d5a4a8d1 Christos Stavrakakis
    stdout.write("\n")
150 d5a4a8d1 Christos Stavrakakis
151 d5a4a8d1 Christos Stavrakakis
152 d5a4a8d1 Christos Stavrakakis
def pprint_port(port, stdout=None, title=None):
153 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
154 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
155 d5a4a8d1 Christos Stavrakakis
    if title is None:
156 d5a4a8d1 Christos Stavrakakis
        title = "State of Port %s in DB" % port.id
157 d5a4a8d1 Christos Stavrakakis
    port = OrderedDict([
158 d5a4a8d1 Christos Stavrakakis
        ("id", port.id),
159 d5a4a8d1 Christos Stavrakakis
        ("name", port.name),
160 d5a4a8d1 Christos Stavrakakis
        ("userid", port.userid),
161 d5a4a8d1 Christos Stavrakakis
        ("server", port.machine_id),
162 d5a4a8d1 Christos Stavrakakis
        ("network", port.network_id),
163 d5a4a8d1 Christos Stavrakakis
        ("device_owner", port.device_owner),
164 d5a4a8d1 Christos Stavrakakis
        ("mac", port.mac),
165 d5a4a8d1 Christos Stavrakakis
        ("state", port.state)])
166 d5a4a8d1 Christos Stavrakakis
167 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, port.items(), None, separator=" | ",
168 d5a4a8d1 Christos Stavrakakis
                 title=title)
169 d5a4a8d1 Christos Stavrakakis
170 d5a4a8d1 Christos Stavrakakis
171 d5a4a8d1 Christos Stavrakakis
def pprint_port_ips(port, stdout=None, title=None):
172 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
173 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
174 d5a4a8d1 Christos Stavrakakis
    if title is None:
175 d5a4a8d1 Christos Stavrakakis
        title = "IP Addresses of Port %s" % port.id
176 d5a4a8d1 Christos Stavrakakis
    ips = list(port.ips.values_list("address", "network_id", "subnet_id",
177 d5a4a8d1 Christos Stavrakakis
                                    "subnet__cidr", "floating_ip"))
178 d5a4a8d1 Christos Stavrakakis
    headers = ["Address", "Network", "Subnet", "CIDR", "is_floating"]
179 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, ips, headers, separator=" | ",
180 d5a4a8d1 Christos Stavrakakis
                 title=title)
181 d5a4a8d1 Christos Stavrakakis
182 d5a4a8d1 Christos Stavrakakis
183 d5a4a8d1 Christos Stavrakakis
def pprint_port_in_ganeti(port, stdout=None, title=None):
184 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
185 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
186 d5a4a8d1 Christos Stavrakakis
    if title is None:
187 d5a4a8d1 Christos Stavrakakis
        title = "State of Port %s in Ganeti" % port.id
188 d5a4a8d1 Christos Stavrakakis
189 d5a4a8d1 Christos Stavrakakis
    vm = port.machine
190 d5a4a8d1 Christos Stavrakakis
    if vm is None:
191 d5a4a8d1 Christos Stavrakakis
        stdout.write("Port is not attached to any instance.\n")
192 d5a4a8d1 Christos Stavrakakis
        return
193 d5a4a8d1 Christos Stavrakakis
194 d5a4a8d1 Christos Stavrakakis
    client = vm.get_client()
195 d5a4a8d1 Christos Stavrakakis
    try:
196 d5a4a8d1 Christos Stavrakakis
        vm_info = client.GetInstance(vm.backend_vm_id)
197 d5a4a8d1 Christos Stavrakakis
    except GanetiApiError as e:
198 d5a4a8d1 Christos Stavrakakis
        if e.code == 404:
199 d5a4a8d1 Christos Stavrakakis
            stdout.write("NIC seems attached to server %s, but"
200 d5a4a8d1 Christos Stavrakakis
                         " server does not exist in backend.\n"
201 d5a4a8d1 Christos Stavrakakis
                         % vm)
202 d5a4a8d1 Christos Stavrakakis
            return
203 d5a4a8d1 Christos Stavrakakis
        raise e
204 d5a4a8d1 Christos Stavrakakis
205 d5a4a8d1 Christos Stavrakakis
    nics = nics_from_instance(vm_info)
206 d5a4a8d1 Christos Stavrakakis
    try:
207 d5a4a8d1 Christos Stavrakakis
        gnt_nic = filter(lambda nic: nic.get("name") == port.backend_uuid,
208 d5a4a8d1 Christos Stavrakakis
                         nics)[0]
209 d5a4a8d1 Christos Stavrakakis
        gnt_nic["instance"] = vm_info["name"]
210 d5a4a8d1 Christos Stavrakakis
    except IndexError:
211 d5a4a8d1 Christos Stavrakakis
        stdout.write("NIC %s is not attached to instance %s" % (port, vm))
212 d5a4a8d1 Christos Stavrakakis
        return
213 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, gnt_nic.items(), None, separator=" | ",
214 d5a4a8d1 Christos Stavrakakis
                 title=title)
215 d5a4a8d1 Christos Stavrakakis
216 d5a4a8d1 Christos Stavrakakis
    vm.put_client(client)