Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (16.9 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 9835a70d Christos Stavrakakis
                              ASTAKOS_AUTH_URL)
40 d5a4a8d1 Christos Stavrakakis
from synnefo.db.models import Backend, pooled_rapi_client
41 e4758367 Dionysis Grigoropoulos
from synnefo.db.pools import bitarray_to_map
42 e4758367 Dionysis Grigoropoulos
43 d5a4a8d1 Christos Stavrakakis
from synnefo.logic.rapi import GanetiApiError
44 ac6a221f Christos Stavrakakis
from synnefo.logic.reconciliation import (nics_from_instance,
45 ac6a221f Christos Stavrakakis
                                          disks_from_instance)
46 8b178e6b Christos Stavrakakis
from synnefo.management.common import get_image
47 d5a4a8d1 Christos Stavrakakis
48 d5a4a8d1 Christos Stavrakakis
49 d5a4a8d1 Christos Stavrakakis
def pprint_network(network, display_mails=False, stdout=None, title=None):
50 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
51 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
52 d5a4a8d1 Christos Stavrakakis
    if title is None:
53 d5a4a8d1 Christos Stavrakakis
        title = "State of Network %s in DB" % network.id
54 d5a4a8d1 Christos Stavrakakis
55 9835a70d Christos Stavrakakis
    ucache = UserCache(ASTAKOS_AUTH_URL, ASTAKOS_TOKEN)
56 d5a4a8d1 Christos Stavrakakis
    userid = network.userid
57 d5a4a8d1 Christos Stavrakakis
58 d5a4a8d1 Christos Stavrakakis
    db_network = OrderedDict([
59 d5a4a8d1 Christos Stavrakakis
        ("name", network.name),
60 d5a4a8d1 Christos Stavrakakis
        ("backend-name", network.backend_id),
61 d5a4a8d1 Christos Stavrakakis
        ("state", network.state),
62 d5a4a8d1 Christos Stavrakakis
        ("userid", userid),
63 8b178e6b Christos Stavrakakis
        ("username", ucache.get_name(userid) if display_mails else None),
64 d5a4a8d1 Christos Stavrakakis
        ("public", network.public),
65 d5a4a8d1 Christos Stavrakakis
        ("floating_ip_pool", network.floating_ip_pool),
66 d5a4a8d1 Christos Stavrakakis
        ("external_router", network.external_router),
67 d5a4a8d1 Christos Stavrakakis
        ("drained", network.drained),
68 d5a4a8d1 Christos Stavrakakis
        ("MAC prefix", network.mac_prefix),
69 d5a4a8d1 Christos Stavrakakis
        ("flavor", network.flavor),
70 d5a4a8d1 Christos Stavrakakis
        ("link", network.link),
71 d5a4a8d1 Christos Stavrakakis
        ("mode", network.mode),
72 d5a4a8d1 Christos Stavrakakis
        ("deleted", network.deleted),
73 d5a4a8d1 Christos Stavrakakis
        ("tags", "), ".join(network.backend_tag)),
74 d5a4a8d1 Christos Stavrakakis
        ("action", network.action)])
75 d5a4a8d1 Christos Stavrakakis
76 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, db_network.items(), None, separator=" | ",
77 d5a4a8d1 Christos Stavrakakis
                 title=title)
78 d5a4a8d1 Christos Stavrakakis
79 d5a4a8d1 Christos Stavrakakis
80 d5a4a8d1 Christos Stavrakakis
def pprint_network_subnets(network, stdout=None, title=None):
81 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
82 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
83 d5a4a8d1 Christos Stavrakakis
    if title is None:
84 d5a4a8d1 Christos Stavrakakis
        title = "Subnets of network %s" % network.id
85 d5a4a8d1 Christos Stavrakakis
86 d5a4a8d1 Christos Stavrakakis
    subnets = list(network.subnets.values_list("id", "name", "ipversion",
87 d5a4a8d1 Christos Stavrakakis
                                               "cidr", "gateway", "dhcp",
88 d5a4a8d1 Christos Stavrakakis
                                               "deleted"))
89 d5a4a8d1 Christos Stavrakakis
    headers = ["ID", "Name", "Version", "CIDR", "Gateway", "DHCP",
90 d5a4a8d1 Christos Stavrakakis
               "Deleted"]
91 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, subnets, headers, separator=" | ",
92 d5a4a8d1 Christos Stavrakakis
                 title=title)
93 d5a4a8d1 Christos Stavrakakis
94 d5a4a8d1 Christos Stavrakakis
95 d5a4a8d1 Christos Stavrakakis
def pprint_network_backends(network, stdout=None, title=None):
96 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
97 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
98 d5a4a8d1 Christos Stavrakakis
    if title is None:
99 d5a4a8d1 Christos Stavrakakis
        title = "State of Network %s in DB for each backend" % network.id
100 d5a4a8d1 Christos Stavrakakis
    bnets = list(network.backend_networks.values_list(
101 d5a4a8d1 Christos Stavrakakis
        "backend__clustername",
102 d5a4a8d1 Christos Stavrakakis
        "operstate", "deleted", "backendjobid",
103 d5a4a8d1 Christos Stavrakakis
        "backendopcode", "backendjobstatus"))
104 d5a4a8d1 Christos Stavrakakis
    headers = ["Backend", "State", "Deleted", "JobID", "Opcode",
105 d5a4a8d1 Christos Stavrakakis
               "JobStatus"]
106 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, bnets, headers, separator=" | ",
107 d5a4a8d1 Christos Stavrakakis
                 title=title)
108 d5a4a8d1 Christos Stavrakakis
109 d5a4a8d1 Christos Stavrakakis
110 d5a4a8d1 Christos Stavrakakis
def pprint_network_in_ganeti(network, stdout=None):
111 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
112 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
113 d5a4a8d1 Christos Stavrakakis
    for backend in Backend.objects.exclude(offline=True):
114 d5a4a8d1 Christos Stavrakakis
        with pooled_rapi_client(backend) as client:
115 d5a4a8d1 Christos Stavrakakis
            try:
116 d5a4a8d1 Christos Stavrakakis
                g_net = client.GetNetwork(network.backend_id)
117 d5a4a8d1 Christos Stavrakakis
                ip_map = g_net.pop("map")
118 d5a4a8d1 Christos Stavrakakis
                pprint_table(stdout, g_net.items(), None,
119 d5a4a8d1 Christos Stavrakakis
                             title="State of network in backend: %s" %
120 d5a4a8d1 Christos Stavrakakis
                                   backend.clustername)
121 bac6ed1e Christos Stavrakakis
                if network.subnet4 is not None:
122 bac6ed1e Christos Stavrakakis
                    pprint_pool(None, ip_map, 80, stdout)
123 d5a4a8d1 Christos Stavrakakis
            except GanetiApiError as e:
124 d5a4a8d1 Christos Stavrakakis
                if e.code == 404:
125 d5a4a8d1 Christos Stavrakakis
                    stdout.write('Network does not exist in backend %s\n' %
126 d5a4a8d1 Christos Stavrakakis
                                 backend.clustername)
127 d5a4a8d1 Christos Stavrakakis
                else:
128 d5a4a8d1 Christos Stavrakakis
                    raise e
129 d5a4a8d1 Christos Stavrakakis
130 d5a4a8d1 Christos Stavrakakis
131 e4758367 Dionysis Grigoropoulos
def pprint_subnet_in_db(subnet, stdout=None, title=None):
132 e4758367 Dionysis Grigoropoulos
    if stdout is None:
133 e4758367 Dionysis Grigoropoulos
        stdout = sys.stdout
134 e4758367 Dionysis Grigoropoulos
    if title is None:
135 e4758367 Dionysis Grigoropoulos
        title = "State of Subnet %s in DB" % subnet.id
136 e4758367 Dionysis Grigoropoulos
    info = OrderedDict([("ID", subnet.id),
137 e4758367 Dionysis Grigoropoulos
                        ("Network_ID", subnet.network.id),
138 e4758367 Dionysis Grigoropoulos
                        # If a user names his subnet "-", what happens then?
139 6a439d95 Dionysis Grigoropoulos
                        ("User_ID", subnet.userid),
140 e4758367 Dionysis Grigoropoulos
                        ("Name", "-" if subnet.name == "" else subnet.name),
141 e4758367 Dionysis Grigoropoulos
                        ("IP_Version", subnet.ipversion),
142 e4758367 Dionysis Grigoropoulos
                        ("CIDR", subnet.cidr),
143 e4758367 Dionysis Grigoropoulos
                        ("Gateway", subnet.gateway),
144 6a439d95 Dionysis Grigoropoulos
                        ("Public", subnet.public),
145 e4758367 Dionysis Grigoropoulos
                        ("DHCP/SLAAC", subnet.dhcp),
146 e4758367 Dionysis Grigoropoulos
                        ("Host_Routes", subnet.host_routes),
147 e4758367 Dionysis Grigoropoulos
                        ("DNS_Nameservers", subnet.dns_nameservers)])
148 e4758367 Dionysis Grigoropoulos
    pprint_table(stdout, info.items(), None, separator=" | ", title=title)
149 e4758367 Dionysis Grigoropoulos
150 e4758367 Dionysis Grigoropoulos
151 e4758367 Dionysis Grigoropoulos
def pprint_ippool(subnet, stdout=None, title=None):
152 e4758367 Dionysis Grigoropoulos
    """Pretty print IP Pools of a subnet. Only IPv4 subnets have IP Pools"""
153 e4758367 Dionysis Grigoropoulos
154 e4758367 Dionysis Grigoropoulos
    if int(subnet.ipversion) != 4:
155 e4758367 Dionysis Grigoropoulos
        return 0
156 e4758367 Dionysis Grigoropoulos
157 e4758367 Dionysis Grigoropoulos
    if stdout is None:
158 e4758367 Dionysis Grigoropoulos
        stdout = sys.stdout
159 e4758367 Dionysis Grigoropoulos
160 aab200c6 Dionysis Grigoropoulos
    stdout.write("IP Pools of subnet %s:\n\n" % subnet.id)
161 e4758367 Dionysis Grigoropoulos
162 e4758367 Dionysis Grigoropoulos
    for pool in subnet.get_ip_pools():
163 e4758367 Dionysis Grigoropoulos
        size = pool.pool_size
164 e4758367 Dionysis Grigoropoulos
        available = pool.available.count()
165 e4758367 Dionysis Grigoropoulos
        info = OrderedDict([("First_IP", pool.return_start()),
166 e4758367 Dionysis Grigoropoulos
                            ("Last_IP", pool.return_end()),
167 e4758367 Dionysis Grigoropoulos
                            ("Size", size),
168 e4758367 Dionysis Grigoropoulos
                            ("Available", available)])
169 e4758367 Dionysis Grigoropoulos
        pprint_table(stdout, info.items(), None, separator=" | ", title=None)
170 501d0f38 Dionysis Grigoropoulos
171 501d0f38 Dionysis Grigoropoulos
        reserved = [pool.index_to_value(index)
172 501d0f38 Dionysis Grigoropoulos
                    for index, ip in enumerate(pool.reserved[:size])
173 501d0f38 Dionysis Grigoropoulos
                    if ip is False]
174 501d0f38 Dionysis Grigoropoulos
175 501d0f38 Dionysis Grigoropoulos
        if reserved != []:
176 501d0f38 Dionysis Grigoropoulos
            stdout.write("\nExternally Reserved IPs:\n\n")
177 501d0f38 Dionysis Grigoropoulos
            stdout.write(", ".join(reserved) + "\n")
178 501d0f38 Dionysis Grigoropoulos
179 501d0f38 Dionysis Grigoropoulos
        ip_sum = pool.available[:size] & pool.reserved[:size]
180 501d0f38 Dionysis Grigoropoulos
        pprint_pool(None, bitarray_to_map(ip_sum), 80, stdout)
181 e4758367 Dionysis Grigoropoulos
        stdout.write("\n\n")
182 e4758367 Dionysis Grigoropoulos
183 e4758367 Dionysis Grigoropoulos
184 d5a4a8d1 Christos Stavrakakis
def pool_map_chunks(smap, step=64):
185 d5a4a8d1 Christos Stavrakakis
    for i in xrange(0, len(smap), step):
186 d5a4a8d1 Christos Stavrakakis
        yield smap[i:i + step]
187 d5a4a8d1 Christos Stavrakakis
188 d5a4a8d1 Christos Stavrakakis
189 d5a4a8d1 Christos Stavrakakis
def splitPoolMap(s, count):
190 d5a4a8d1 Christos Stavrakakis
    chunks = pool_map_chunks(s, count)
191 d5a4a8d1 Christos Stavrakakis
    acc = []
192 d5a4a8d1 Christos Stavrakakis
    count = 0
193 d5a4a8d1 Christos Stavrakakis
    for chunk in chunks:
194 d5a4a8d1 Christos Stavrakakis
        chunk_len = len(chunk)
195 d5a4a8d1 Christos Stavrakakis
        acc.append(str(count).rjust(3) + ' ' + chunk + ' ' +
196 d5a4a8d1 Christos Stavrakakis
                   str(count + chunk_len - 1).ljust(4))
197 d5a4a8d1 Christos Stavrakakis
        count += chunk_len
198 d5a4a8d1 Christos Stavrakakis
    return '\n' + '\n'.join(acc)
199 d5a4a8d1 Christos Stavrakakis
200 d5a4a8d1 Christos Stavrakakis
201 d5a4a8d1 Christos Stavrakakis
def pprint_pool(name, pool_map, step=80, stdout=None):
202 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
203 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
204 d5a4a8d1 Christos Stavrakakis
    if name is not None:
205 d5a4a8d1 Christos Stavrakakis
        stdout.write("Pool: %s\n" % name)
206 d5a4a8d1 Christos Stavrakakis
    stdout.write(splitPoolMap(pool_map, count=step))
207 d5a4a8d1 Christos Stavrakakis
    stdout.write("\n")
208 d5a4a8d1 Christos Stavrakakis
209 d5a4a8d1 Christos Stavrakakis
210 d5a4a8d1 Christos Stavrakakis
def pprint_port(port, stdout=None, title=None):
211 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
212 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
213 d5a4a8d1 Christos Stavrakakis
    if title is None:
214 d5a4a8d1 Christos Stavrakakis
        title = "State of Port %s in DB" % port.id
215 d5a4a8d1 Christos Stavrakakis
    port = OrderedDict([
216 d5a4a8d1 Christos Stavrakakis
        ("id", port.id),
217 d5a4a8d1 Christos Stavrakakis
        ("name", port.name),
218 d5a4a8d1 Christos Stavrakakis
        ("userid", port.userid),
219 d5a4a8d1 Christos Stavrakakis
        ("server", port.machine_id),
220 d5a4a8d1 Christos Stavrakakis
        ("network", port.network_id),
221 d5a4a8d1 Christos Stavrakakis
        ("device_owner", port.device_owner),
222 d5a4a8d1 Christos Stavrakakis
        ("mac", port.mac),
223 d5a4a8d1 Christos Stavrakakis
        ("state", port.state)])
224 d5a4a8d1 Christos Stavrakakis
225 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, port.items(), None, separator=" | ",
226 d5a4a8d1 Christos Stavrakakis
                 title=title)
227 d5a4a8d1 Christos Stavrakakis
228 d5a4a8d1 Christos Stavrakakis
229 d5a4a8d1 Christos Stavrakakis
def pprint_port_ips(port, stdout=None, title=None):
230 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
231 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
232 d5a4a8d1 Christos Stavrakakis
    if title is None:
233 d5a4a8d1 Christos Stavrakakis
        title = "IP Addresses of Port %s" % port.id
234 d5a4a8d1 Christos Stavrakakis
    ips = list(port.ips.values_list("address", "network_id", "subnet_id",
235 d5a4a8d1 Christos Stavrakakis
                                    "subnet__cidr", "floating_ip"))
236 d5a4a8d1 Christos Stavrakakis
    headers = ["Address", "Network", "Subnet", "CIDR", "is_floating"]
237 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, ips, headers, separator=" | ",
238 d5a4a8d1 Christos Stavrakakis
                 title=title)
239 d5a4a8d1 Christos Stavrakakis
240 d5a4a8d1 Christos Stavrakakis
241 d5a4a8d1 Christos Stavrakakis
def pprint_port_in_ganeti(port, stdout=None, title=None):
242 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
243 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
244 d5a4a8d1 Christos Stavrakakis
    if title is None:
245 d5a4a8d1 Christos Stavrakakis
        title = "State of Port %s in Ganeti" % port.id
246 d5a4a8d1 Christos Stavrakakis
247 d5a4a8d1 Christos Stavrakakis
    vm = port.machine
248 d5a4a8d1 Christos Stavrakakis
    if vm is None:
249 d5a4a8d1 Christos Stavrakakis
        stdout.write("Port is not attached to any instance.\n")
250 d5a4a8d1 Christos Stavrakakis
        return
251 d5a4a8d1 Christos Stavrakakis
252 d5a4a8d1 Christos Stavrakakis
    client = vm.get_client()
253 d5a4a8d1 Christos Stavrakakis
    try:
254 d5a4a8d1 Christos Stavrakakis
        vm_info = client.GetInstance(vm.backend_vm_id)
255 d5a4a8d1 Christos Stavrakakis
    except GanetiApiError as e:
256 d5a4a8d1 Christos Stavrakakis
        if e.code == 404:
257 a9c1db43 Christos Stavrakakis
            stdout.write("Port seems attached to server %s, but"
258 d5a4a8d1 Christos Stavrakakis
                         " server does not exist in backend.\n"
259 d5a4a8d1 Christos Stavrakakis
                         % vm)
260 d5a4a8d1 Christos Stavrakakis
            return
261 d5a4a8d1 Christos Stavrakakis
        raise e
262 d5a4a8d1 Christos Stavrakakis
263 f4d3172f Christos Stavrakakis
    nics = nics_from_instance(vm_info)
264 d5a4a8d1 Christos Stavrakakis
    try:
265 f4d3172f Christos Stavrakakis
        gnt_nic = filter(lambda nic: nic.get("name") == port.backend_uuid,
266 f4d3172f Christos Stavrakakis
                         nics)[0]
267 f4d3172f Christos Stavrakakis
        gnt_nic["instance"] = vm_info["name"]
268 d5a4a8d1 Christos Stavrakakis
    except IndexError:
269 702b2fe6 Christos Stavrakakis
        stdout.write("Port %s is not attached to instance %s\n" %
270 702b2fe6 Christos Stavrakakis
                     (port.id, vm.id))
271 d5a4a8d1 Christos Stavrakakis
        return
272 f4d3172f Christos Stavrakakis
    pprint_table(stdout, gnt_nic.items(), None, separator=" | ",
273 d5a4a8d1 Christos Stavrakakis
                 title=title)
274 d5a4a8d1 Christos Stavrakakis
275 d5a4a8d1 Christos Stavrakakis
    vm.put_client(client)
276 8b178e6b Christos Stavrakakis
277 8b178e6b Christos Stavrakakis
278 8b178e6b Christos Stavrakakis
def pprint_server(server, display_mails=False, stdout=None, title=None):
279 8b178e6b Christos Stavrakakis
    if stdout is None:
280 8b178e6b Christos Stavrakakis
        stdout = sys.stdout
281 8b178e6b Christos Stavrakakis
    if title is None:
282 8b178e6b Christos Stavrakakis
        title = "State of Server %s in DB" % server.id
283 8b178e6b Christos Stavrakakis
284 9835a70d Christos Stavrakakis
    ucache = UserCache(ASTAKOS_AUTH_URL, ASTAKOS_TOKEN)
285 8b178e6b Christos Stavrakakis
    userid = server.userid
286 8b178e6b Christos Stavrakakis
287 8b178e6b Christos Stavrakakis
    try:
288 8b178e6b Christos Stavrakakis
        image = get_image(server.imageid, server.userid)['name']
289 8b178e6b Christos Stavrakakis
    except:
290 8b178e6b Christos Stavrakakis
        image = server.imageid
291 8b178e6b Christos Stavrakakis
292 8b178e6b Christos Stavrakakis
    server_dict = OrderedDict([
293 8b178e6b Christos Stavrakakis
        ("id", server.id),
294 8b178e6b Christos Stavrakakis
        ("name", server.name),
295 8b178e6b Christos Stavrakakis
        ("userid", server.userid),
296 8b178e6b Christos Stavrakakis
        ("username", ucache.get_name(userid) if display_mails else None),
297 8b178e6b Christos Stavrakakis
        ("flavor_id", server.flavor_id),
298 8b178e6b Christos Stavrakakis
        ("flavor_name", server.flavor.name),
299 8b178e6b Christos Stavrakakis
        ("imageid", server.imageid),
300 8b178e6b Christos Stavrakakis
        ("image_name", image),
301 8b178e6b Christos Stavrakakis
        ("state", server.operstate),
302 8b178e6b Christos Stavrakakis
        ("backend", server.backend),
303 8b178e6b Christos Stavrakakis
        ("deleted", server.deleted),
304 8b178e6b Christos Stavrakakis
        ("action", server.action),
305 8b178e6b Christos Stavrakakis
        ("task", server.task),
306 8b178e6b Christos Stavrakakis
        ("task_job_id", server.task_job_id),
307 8b178e6b Christos Stavrakakis
        ("backendjobid", server.backendjobid),
308 8b178e6b Christos Stavrakakis
        ("backendopcode", server.backendopcode),
309 8b178e6b Christos Stavrakakis
        ("backendjobstatus", server.backendjobstatus),
310 8b178e6b Christos Stavrakakis
        ("backend_time", server.backendtime),
311 8b178e6b Christos Stavrakakis
        ])
312 8b178e6b Christos Stavrakakis
313 8b178e6b Christos Stavrakakis
    pprint_table(stdout, server_dict.items(), None, separator=" | ",
314 8b178e6b Christos Stavrakakis
                 title=title)
315 8b178e6b Christos Stavrakakis
316 8b178e6b Christos Stavrakakis
317 8b178e6b Christos Stavrakakis
def pprint_server_nics(server, stdout=None, title=None):
318 8b178e6b Christos Stavrakakis
    if title is None:
319 a9c1db43 Christos Stavrakakis
        title = "Ports of Server %s" % server.id
320 8b178e6b Christos Stavrakakis
    if stdout is None:
321 8b178e6b Christos Stavrakakis
        stdout = sys.stdout
322 8b178e6b Christos Stavrakakis
323 8b178e6b Christos Stavrakakis
    nics = []
324 8b178e6b Christos Stavrakakis
    for nic in server.nics.all():
325 db908bb1 Christos Stavrakakis
        nics.append((nic.id, nic.name, nic.index, nic.mac, nic.ipv4_address,
326 8b178e6b Christos Stavrakakis
                     nic.ipv6_address, nic.network, nic.firewall_profile,
327 8b178e6b Christos Stavrakakis
                     nic.state))
328 8b178e6b Christos Stavrakakis
329 db908bb1 Christos Stavrakakis
    headers = ["ID", "Name", "Index", "MAC", "IPv4 Address", "IPv6 Address",
330 8b178e6b Christos Stavrakakis
               "Network", "Firewall", "State"]
331 8b178e6b Christos Stavrakakis
    pprint_table(stdout, nics, headers, separator=" | ",
332 8b178e6b Christos Stavrakakis
                 title=title)
333 8b178e6b Christos Stavrakakis
334 8b178e6b Christos Stavrakakis
335 f4d3172f Christos Stavrakakis
def pprint_server_volumes(server, stdout=None, title=None):
336 f4d3172f Christos Stavrakakis
    if title is None:
337 f4d3172f Christos Stavrakakis
        title = "Volumes of Server %s" % server.id
338 f4d3172f Christos Stavrakakis
    if stdout is None:
339 f4d3172f Christos Stavrakakis
        stdout = sys.stdout
340 f4d3172f Christos Stavrakakis
341 f4d3172f Christos Stavrakakis
    vols = []
342 f4d3172f Christos Stavrakakis
    for vol in server.volumes.filter(deleted=False):
343 f4d3172f Christos Stavrakakis
        vols.append((vol.id, vol.name, vol.index, vol.size, vol.template,
344 f4d3172f Christos Stavrakakis
                     vol.provider, vol.status, vol.source))
345 f4d3172f Christos Stavrakakis
346 f4d3172f Christos Stavrakakis
    headers = ["ID", "Name", "Index", "Size", "Template", "Provider",
347 f4d3172f Christos Stavrakakis
               "Status", "Source"]
348 f4d3172f Christos Stavrakakis
    pprint_table(stdout, vols, headers, separator=" | ",
349 f4d3172f Christos Stavrakakis
                 title=title)
350 f4d3172f Christos Stavrakakis
351 f4d3172f Christos Stavrakakis
352 8b178e6b Christos Stavrakakis
def pprint_server_in_ganeti(server, print_jobs=False, stdout=None, title=None):
353 8b178e6b Christos Stavrakakis
    if stdout is None:
354 8b178e6b Christos Stavrakakis
        stdout = sys.stdout
355 8b178e6b Christos Stavrakakis
    if title is None:
356 8b178e6b Christos Stavrakakis
        title = "State of Server %s in Ganeti" % server.id
357 8b178e6b Christos Stavrakakis
358 8b178e6b Christos Stavrakakis
    client = server.get_client()
359 8b178e6b Christos Stavrakakis
    try:
360 8b178e6b Christos Stavrakakis
        server_info = client.GetInstance(server.backend_vm_id)
361 8b178e6b Christos Stavrakakis
    except GanetiApiError as e:
362 8b178e6b Christos Stavrakakis
        if e.code == 404:
363 a9c1db43 Christos Stavrakakis
            stdout.write("Server '%s' does not exist in backend '%s'\n"
364 a9c1db43 Christos Stavrakakis
                         % (server.id, server.backend.clustername))
365 8b178e6b Christos Stavrakakis
            return
366 8b178e6b Christos Stavrakakis
        raise e
367 8b178e6b Christos Stavrakakis
    server.put_client(client)
368 8b178e6b Christos Stavrakakis
369 8b178e6b Christos Stavrakakis
    GANETI_INSTANCE_FIELDS = ('name', 'oper_state', 'admin_state', 'status',
370 8b178e6b Christos Stavrakakis
                              'pnode', 'snode', 'network_port',
371 8b178e6b Christos Stavrakakis
                              'disk_template', 'disk_usage',
372 8b178e6b Christos Stavrakakis
                              'oper_ram', 'oper_vcpus', 'mtime')
373 8b178e6b Christos Stavrakakis
    server_dict = OrderedDict([(k, server_info.get(k))
374 8b178e6b Christos Stavrakakis
                              for k in GANETI_INSTANCE_FIELDS])
375 8b178e6b Christos Stavrakakis
376 8b178e6b Christos Stavrakakis
    pprint_table(stdout, server_dict.items(), None, separator=" | ",
377 a9c1db43 Christos Stavrakakis
                 title=title)
378 8b178e6b Christos Stavrakakis
    stdout.write("\n")
379 8b178e6b Christos Stavrakakis
380 8b178e6b Christos Stavrakakis
    nics = nics_from_instance(server_info)
381 8b178e6b Christos Stavrakakis
    nics_keys = ["ip", "mac", "name", "network"]
382 8b178e6b Christos Stavrakakis
    nics_values = [[nic[key] for key in nics_keys] for nic in nics]
383 8b178e6b Christos Stavrakakis
    pprint_table(stdout, nics_values, nics_keys, separator=" | ",
384 a9c1db43 Christos Stavrakakis
                 title="NICs of Server %s in Ganeti" % server.id)
385 8b178e6b Christos Stavrakakis
386 f4d3172f Christos Stavrakakis
    stdout.write("\n")
387 f4d3172f Christos Stavrakakis
    disks = disks_from_instance(server_info)
388 f4d3172f Christos Stavrakakis
    disks_keys = ["name", "size"]
389 f4d3172f Christos Stavrakakis
    disks_values = [[disk[key] for key in disks_keys] for disk in disks]
390 f4d3172f Christos Stavrakakis
    pprint_table(stdout, disks_values, disks_keys, separator=" | ",
391 f4d3172f Christos Stavrakakis
                 title="Disks of Server %s in Ganeti" % server.id)
392 f4d3172f Christos Stavrakakis
393 8b178e6b Christos Stavrakakis
    if not print_jobs:
394 8b178e6b Christos Stavrakakis
        return
395 8b178e6b Christos Stavrakakis
396 8b178e6b Christos Stavrakakis
    client = server.get_client()
397 8b178e6b Christos Stavrakakis
    jobs = client.GetJobs(bulk=True)
398 8b178e6b Christos Stavrakakis
    server_jobs = filter(
399 8b178e6b Christos Stavrakakis
        lambda x: server.backend_vm_id in (" ".join(x.get("summary"))), jobs)
400 8b178e6b Christos Stavrakakis
401 8b178e6b Christos Stavrakakis
    GANETI_JOB_FIELDS = ('id', 'status', 'summary', 'opresult', 'opstatus',
402 8b178e6b Christos Stavrakakis
                         'oplog', 'start_ts', 'end_ts')
403 8b178e6b Christos Stavrakakis
    for server_job in server_jobs:
404 8b178e6b Christos Stavrakakis
        stdout.write("\n")
405 8b178e6b Christos Stavrakakis
        values = [server_job.get(k) for k in GANETI_JOB_FIELDS]
406 8b178e6b Christos Stavrakakis
        pprint_table(stdout, zip(GANETI_JOB_FIELDS, values), None,
407 8b178e6b Christos Stavrakakis
                     separator=" | ",
408 8b178e6b Christos Stavrakakis
                     title="Ganeti Job %s" % server_job["id"])
409 8b178e6b Christos Stavrakakis
    server.put_client(client)
410 ac6a221f Christos Stavrakakis
411 ac6a221f Christos Stavrakakis
412 ac6a221f Christos Stavrakakis
def pprint_volume(volume, display_mails=False, stdout=None, title=None):
413 ac6a221f Christos Stavrakakis
    if stdout is None:
414 ac6a221f Christos Stavrakakis
        stdout = sys.stdout
415 ac6a221f Christos Stavrakakis
    if title is None:
416 ac6a221f Christos Stavrakakis
        title = "State of volume %s in DB" % volume.id
417 ac6a221f Christos Stavrakakis
418 ac6a221f Christos Stavrakakis
    ucache = UserCache(ASTAKOS_AUTH_URL, ASTAKOS_TOKEN)
419 ac6a221f Christos Stavrakakis
    userid = volume.userid
420 ac6a221f Christos Stavrakakis
421 ac6a221f Christos Stavrakakis
    volume_dict = OrderedDict([
422 ac6a221f Christos Stavrakakis
        ("id", volume.id),
423 ac6a221f Christos Stavrakakis
        ("size", volume.size),
424 a868c831 Christos Stavrakakis
        ("disk_template", volume.template),
425 a868c831 Christos Stavrakakis
        ("disk_provider", volume.provider),
426 ac6a221f Christos Stavrakakis
        ("server_id", volume.machine_id),
427 ac6a221f Christos Stavrakakis
        ("userid", volume.userid),
428 ac6a221f Christos Stavrakakis
        ("username", ucache.get_name(userid) if display_mails else None),
429 1040b85b Christos Stavrakakis
        ("index", volume.index),
430 ac6a221f Christos Stavrakakis
        ("name", volume.name),
431 ac6a221f Christos Stavrakakis
        ("state", volume.status),
432 a868c831 Christos Stavrakakis
        ("delete_on_termination", volume.delete_on_termination),
433 ac6a221f Christos Stavrakakis
        ("deleted", volume.deleted),
434 ac6a221f Christos Stavrakakis
        ("backendjobid", volume.backendjobid),
435 ac6a221f Christos Stavrakakis
        ])
436 ac6a221f Christos Stavrakakis
437 ac6a221f Christos Stavrakakis
    pprint_table(stdout, volume_dict.items(), None, separator=" | ",
438 ac6a221f Christos Stavrakakis
                 title=title)
439 ac6a221f Christos Stavrakakis
440 ac6a221f Christos Stavrakakis
441 ac6a221f Christos Stavrakakis
def pprint_volume_in_ganeti(volume, stdout=None, title=None):
442 ac6a221f Christos Stavrakakis
    if stdout is None:
443 ac6a221f Christos Stavrakakis
        stdout = sys.stdout
444 ac6a221f Christos Stavrakakis
    if title is None:
445 ac6a221f Christos Stavrakakis
        title = "State of volume %s in Ganeti" % volume.id
446 ac6a221f Christos Stavrakakis
447 ac6a221f Christos Stavrakakis
    vm = volume.machine
448 ac6a221f Christos Stavrakakis
    if vm is None:
449 ac6a221f Christos Stavrakakis
        stdout.write("volume is not attached to any instance.\n")
450 ac6a221f Christos Stavrakakis
        return
451 ac6a221f Christos Stavrakakis
452 ac6a221f Christos Stavrakakis
    client = vm.get_client()
453 ac6a221f Christos Stavrakakis
    try:
454 ac6a221f Christos Stavrakakis
        vm_info = client.GetInstance(vm.backend_vm_id)
455 ac6a221f Christos Stavrakakis
    except GanetiApiError as e:
456 ac6a221f Christos Stavrakakis
        if e.code == 404:
457 ac6a221f Christos Stavrakakis
            stdout.write("Volume seems attached to server %s, but"
458 ac6a221f Christos Stavrakakis
                         " server does not exist in backend.\n"
459 ac6a221f Christos Stavrakakis
                         % vm)
460 ac6a221f Christos Stavrakakis
            return
461 ac6a221f Christos Stavrakakis
        raise e
462 ac6a221f Christos Stavrakakis
463 ac6a221f Christos Stavrakakis
    disks = disks_from_instance(vm_info)
464 ac6a221f Christos Stavrakakis
    try:
465 ac6a221f Christos Stavrakakis
        gnt_disk = filter(lambda disk:
466 ac6a221f Christos Stavrakakis
                          disk.get("name") == volume.backend_volume_uuid,
467 ac6a221f Christos Stavrakakis
                          disks)[0]
468 ac6a221f Christos Stavrakakis
        gnt_disk["instance"] = vm_info["name"]
469 ac6a221f Christos Stavrakakis
    except IndexError:
470 ac6a221f Christos Stavrakakis
        stdout.write("Volume %s is not attached to instance %s\n" % (volume.id,
471 ac6a221f Christos Stavrakakis
                                                                     vm.id))
472 ac6a221f Christos Stavrakakis
        return
473 ac6a221f Christos Stavrakakis
    pprint_table(stdout, gnt_disk.items(), None, separator=" | ",
474 ac6a221f Christos Stavrakakis
                 title=title)
475 ac6a221f Christos Stavrakakis
476 ac6a221f Christos Stavrakakis
    vm.put_client(client)