Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (11.6 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 8b178e6b Christos Stavrakakis
from synnefo.management.common import get_image
44 d5a4a8d1 Christos Stavrakakis
45 d5a4a8d1 Christos Stavrakakis
46 d5a4a8d1 Christos Stavrakakis
def pprint_network(network, display_mails=False, stdout=None, title=None):
47 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
48 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
49 d5a4a8d1 Christos Stavrakakis
    if title is None:
50 d5a4a8d1 Christos Stavrakakis
        title = "State of Network %s in DB" % network.id
51 d5a4a8d1 Christos Stavrakakis
52 d5a4a8d1 Christos Stavrakakis
    ucache = UserCache(ASTAKOS_BASE_URL, ASTAKOS_TOKEN)
53 d5a4a8d1 Christos Stavrakakis
    userid = network.userid
54 d5a4a8d1 Christos Stavrakakis
55 d5a4a8d1 Christos Stavrakakis
    db_network = OrderedDict([
56 d5a4a8d1 Christos Stavrakakis
        ("name", network.name),
57 d5a4a8d1 Christos Stavrakakis
        ("backend-name", network.backend_id),
58 d5a4a8d1 Christos Stavrakakis
        ("state", network.state),
59 d5a4a8d1 Christos Stavrakakis
        ("userid", userid),
60 8b178e6b Christos Stavrakakis
        ("username", ucache.get_name(userid) if display_mails else None),
61 d5a4a8d1 Christos Stavrakakis
        ("public", network.public),
62 d5a4a8d1 Christos Stavrakakis
        ("floating_ip_pool", network.floating_ip_pool),
63 d5a4a8d1 Christos Stavrakakis
        ("external_router", network.external_router),
64 d5a4a8d1 Christos Stavrakakis
        ("drained", network.drained),
65 d5a4a8d1 Christos Stavrakakis
        ("MAC prefix", network.mac_prefix),
66 d5a4a8d1 Christos Stavrakakis
        ("flavor", network.flavor),
67 d5a4a8d1 Christos Stavrakakis
        ("link", network.link),
68 d5a4a8d1 Christos Stavrakakis
        ("mode", network.mode),
69 d5a4a8d1 Christos Stavrakakis
        ("deleted", network.deleted),
70 d5a4a8d1 Christos Stavrakakis
        ("tags", "), ".join(network.backend_tag)),
71 d5a4a8d1 Christos Stavrakakis
        ("action", network.action)])
72 d5a4a8d1 Christos Stavrakakis
73 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, db_network.items(), None, separator=" | ",
74 d5a4a8d1 Christos Stavrakakis
                 title=title)
75 d5a4a8d1 Christos Stavrakakis
76 d5a4a8d1 Christos Stavrakakis
77 d5a4a8d1 Christos Stavrakakis
def pprint_network_subnets(network, stdout=None, title=None):
78 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
79 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
80 d5a4a8d1 Christos Stavrakakis
    if title is None:
81 d5a4a8d1 Christos Stavrakakis
        title = "Subnets of network %s" % network.id
82 d5a4a8d1 Christos Stavrakakis
83 d5a4a8d1 Christos Stavrakakis
    subnets = list(network.subnets.values_list("id", "name", "ipversion",
84 d5a4a8d1 Christos Stavrakakis
                                               "cidr", "gateway", "dhcp",
85 d5a4a8d1 Christos Stavrakakis
                                               "deleted"))
86 d5a4a8d1 Christos Stavrakakis
    headers = ["ID", "Name", "Version", "CIDR", "Gateway", "DHCP",
87 d5a4a8d1 Christos Stavrakakis
               "Deleted"]
88 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, subnets, headers, separator=" | ",
89 d5a4a8d1 Christos Stavrakakis
                 title=title)
90 d5a4a8d1 Christos Stavrakakis
91 d5a4a8d1 Christos Stavrakakis
92 d5a4a8d1 Christos Stavrakakis
def pprint_network_backends(network, stdout=None, title=None):
93 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
94 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
95 d5a4a8d1 Christos Stavrakakis
    if title is None:
96 d5a4a8d1 Christos Stavrakakis
        title = "State of Network %s in DB for each backend" % network.id
97 d5a4a8d1 Christos Stavrakakis
    bnets = list(network.backend_networks.values_list(
98 d5a4a8d1 Christos Stavrakakis
        "backend__clustername",
99 d5a4a8d1 Christos Stavrakakis
        "operstate", "deleted", "backendjobid",
100 d5a4a8d1 Christos Stavrakakis
        "backendopcode", "backendjobstatus"))
101 d5a4a8d1 Christos Stavrakakis
    headers = ["Backend", "State", "Deleted", "JobID", "Opcode",
102 d5a4a8d1 Christos Stavrakakis
               "JobStatus"]
103 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, bnets, headers, separator=" | ",
104 d5a4a8d1 Christos Stavrakakis
                 title=title)
105 d5a4a8d1 Christos Stavrakakis
106 d5a4a8d1 Christos Stavrakakis
107 d5a4a8d1 Christos Stavrakakis
def pprint_network_in_ganeti(network, stdout=None):
108 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
109 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
110 d5a4a8d1 Christos Stavrakakis
    for backend in Backend.objects.exclude(offline=True):
111 d5a4a8d1 Christos Stavrakakis
        with pooled_rapi_client(backend) as client:
112 d5a4a8d1 Christos Stavrakakis
            try:
113 d5a4a8d1 Christos Stavrakakis
                g_net = client.GetNetwork(network.backend_id)
114 d5a4a8d1 Christos Stavrakakis
                ip_map = g_net.pop("map")
115 d5a4a8d1 Christos Stavrakakis
                pprint_table(stdout, g_net.items(), None,
116 d5a4a8d1 Christos Stavrakakis
                             title="State of network in backend: %s" %
117 d5a4a8d1 Christos Stavrakakis
                                   backend.clustername)
118 d5a4a8d1 Christos Stavrakakis
                pprint_pool(None, ip_map, 80, stdout)
119 d5a4a8d1 Christos Stavrakakis
            except GanetiApiError as e:
120 d5a4a8d1 Christos Stavrakakis
                if e.code == 404:
121 d5a4a8d1 Christos Stavrakakis
                    stdout.write('Network does not exist in backend %s\n' %
122 d5a4a8d1 Christos Stavrakakis
                                 backend.clustername)
123 d5a4a8d1 Christos Stavrakakis
                else:
124 d5a4a8d1 Christos Stavrakakis
                    raise e
125 d5a4a8d1 Christos Stavrakakis
126 d5a4a8d1 Christos Stavrakakis
127 d5a4a8d1 Christos Stavrakakis
def pool_map_chunks(smap, step=64):
128 d5a4a8d1 Christos Stavrakakis
    for i in xrange(0, len(smap), step):
129 d5a4a8d1 Christos Stavrakakis
        yield smap[i:i + step]
130 d5a4a8d1 Christos Stavrakakis
131 d5a4a8d1 Christos Stavrakakis
132 d5a4a8d1 Christos Stavrakakis
def splitPoolMap(s, count):
133 d5a4a8d1 Christos Stavrakakis
    chunks = pool_map_chunks(s, count)
134 d5a4a8d1 Christos Stavrakakis
    acc = []
135 d5a4a8d1 Christos Stavrakakis
    count = 0
136 d5a4a8d1 Christos Stavrakakis
    for chunk in chunks:
137 d5a4a8d1 Christos Stavrakakis
        chunk_len = len(chunk)
138 d5a4a8d1 Christos Stavrakakis
        acc.append(str(count).rjust(3) + ' ' + chunk + ' ' +
139 d5a4a8d1 Christos Stavrakakis
                   str(count + chunk_len - 1).ljust(4))
140 d5a4a8d1 Christos Stavrakakis
        count += chunk_len
141 d5a4a8d1 Christos Stavrakakis
    return '\n' + '\n'.join(acc)
142 d5a4a8d1 Christos Stavrakakis
143 d5a4a8d1 Christos Stavrakakis
144 d5a4a8d1 Christos Stavrakakis
def pprint_pool(name, pool_map, step=80, stdout=None):
145 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
146 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
147 d5a4a8d1 Christos Stavrakakis
    if name is not None:
148 d5a4a8d1 Christos Stavrakakis
        stdout.write("Pool: %s\n" % name)
149 d5a4a8d1 Christos Stavrakakis
    stdout.write(splitPoolMap(pool_map, count=step))
150 d5a4a8d1 Christos Stavrakakis
    stdout.write("\n")
151 d5a4a8d1 Christos Stavrakakis
152 d5a4a8d1 Christos Stavrakakis
153 d5a4a8d1 Christos Stavrakakis
def pprint_port(port, stdout=None, title=None):
154 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
155 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
156 d5a4a8d1 Christos Stavrakakis
    if title is None:
157 d5a4a8d1 Christos Stavrakakis
        title = "State of Port %s in DB" % port.id
158 d5a4a8d1 Christos Stavrakakis
    port = OrderedDict([
159 d5a4a8d1 Christos Stavrakakis
        ("id", port.id),
160 d5a4a8d1 Christos Stavrakakis
        ("name", port.name),
161 d5a4a8d1 Christos Stavrakakis
        ("userid", port.userid),
162 d5a4a8d1 Christos Stavrakakis
        ("server", port.machine_id),
163 d5a4a8d1 Christos Stavrakakis
        ("network", port.network_id),
164 d5a4a8d1 Christos Stavrakakis
        ("device_owner", port.device_owner),
165 d5a4a8d1 Christos Stavrakakis
        ("mac", port.mac),
166 d5a4a8d1 Christos Stavrakakis
        ("state", port.state)])
167 d5a4a8d1 Christos Stavrakakis
168 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, port.items(), None, separator=" | ",
169 d5a4a8d1 Christos Stavrakakis
                 title=title)
170 d5a4a8d1 Christos Stavrakakis
171 d5a4a8d1 Christos Stavrakakis
172 d5a4a8d1 Christos Stavrakakis
def pprint_port_ips(port, stdout=None, title=None):
173 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
174 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
175 d5a4a8d1 Christos Stavrakakis
    if title is None:
176 d5a4a8d1 Christos Stavrakakis
        title = "IP Addresses of Port %s" % port.id
177 d5a4a8d1 Christos Stavrakakis
    ips = list(port.ips.values_list("address", "network_id", "subnet_id",
178 d5a4a8d1 Christos Stavrakakis
                                    "subnet__cidr", "floating_ip"))
179 d5a4a8d1 Christos Stavrakakis
    headers = ["Address", "Network", "Subnet", "CIDR", "is_floating"]
180 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, ips, headers, separator=" | ",
181 d5a4a8d1 Christos Stavrakakis
                 title=title)
182 d5a4a8d1 Christos Stavrakakis
183 d5a4a8d1 Christos Stavrakakis
184 d5a4a8d1 Christos Stavrakakis
def pprint_port_in_ganeti(port, stdout=None, title=None):
185 d5a4a8d1 Christos Stavrakakis
    if stdout is None:
186 d5a4a8d1 Christos Stavrakakis
        stdout = sys.stdout
187 d5a4a8d1 Christos Stavrakakis
    if title is None:
188 d5a4a8d1 Christos Stavrakakis
        title = "State of Port %s in Ganeti" % port.id
189 d5a4a8d1 Christos Stavrakakis
190 d5a4a8d1 Christos Stavrakakis
    vm = port.machine
191 d5a4a8d1 Christos Stavrakakis
    if vm is None:
192 d5a4a8d1 Christos Stavrakakis
        stdout.write("Port is not attached to any instance.\n")
193 d5a4a8d1 Christos Stavrakakis
        return
194 d5a4a8d1 Christos Stavrakakis
195 d5a4a8d1 Christos Stavrakakis
    client = vm.get_client()
196 d5a4a8d1 Christos Stavrakakis
    try:
197 d5a4a8d1 Christos Stavrakakis
        vm_info = client.GetInstance(vm.backend_vm_id)
198 d5a4a8d1 Christos Stavrakakis
    except GanetiApiError as e:
199 d5a4a8d1 Christos Stavrakakis
        if e.code == 404:
200 d5a4a8d1 Christos Stavrakakis
            stdout.write("NIC seems attached to server %s, but"
201 d5a4a8d1 Christos Stavrakakis
                         " server does not exist in backend.\n"
202 d5a4a8d1 Christos Stavrakakis
                         % vm)
203 d5a4a8d1 Christos Stavrakakis
            return
204 d5a4a8d1 Christos Stavrakakis
        raise e
205 d5a4a8d1 Christos Stavrakakis
206 d5a4a8d1 Christos Stavrakakis
    nics = nics_from_instance(vm_info)
207 d5a4a8d1 Christos Stavrakakis
    try:
208 d5a4a8d1 Christos Stavrakakis
        gnt_nic = filter(lambda nic: nic.get("name") == port.backend_uuid,
209 d5a4a8d1 Christos Stavrakakis
                         nics)[0]
210 d5a4a8d1 Christos Stavrakakis
        gnt_nic["instance"] = vm_info["name"]
211 d5a4a8d1 Christos Stavrakakis
    except IndexError:
212 d5a4a8d1 Christos Stavrakakis
        stdout.write("NIC %s is not attached to instance %s" % (port, vm))
213 d5a4a8d1 Christos Stavrakakis
        return
214 d5a4a8d1 Christos Stavrakakis
    pprint_table(stdout, gnt_nic.items(), None, separator=" | ",
215 d5a4a8d1 Christos Stavrakakis
                 title=title)
216 d5a4a8d1 Christos Stavrakakis
217 d5a4a8d1 Christos Stavrakakis
    vm.put_client(client)
218 8b178e6b Christos Stavrakakis
219 8b178e6b Christos Stavrakakis
220 8b178e6b Christos Stavrakakis
def pprint_server(server, display_mails=False, stdout=None, title=None):
221 8b178e6b Christos Stavrakakis
    if stdout is None:
222 8b178e6b Christos Stavrakakis
        stdout = sys.stdout
223 8b178e6b Christos Stavrakakis
    if title is None:
224 8b178e6b Christos Stavrakakis
        title = "State of Server %s in DB" % server.id
225 8b178e6b Christos Stavrakakis
226 8b178e6b Christos Stavrakakis
    ucache = UserCache(ASTAKOS_BASE_URL, ASTAKOS_TOKEN)
227 8b178e6b Christos Stavrakakis
    userid = server.userid
228 8b178e6b Christos Stavrakakis
229 8b178e6b Christos Stavrakakis
    try:
230 8b178e6b Christos Stavrakakis
        image = get_image(server.imageid, server.userid)['name']
231 8b178e6b Christos Stavrakakis
    except:
232 8b178e6b Christos Stavrakakis
        image = server.imageid
233 8b178e6b Christos Stavrakakis
234 8b178e6b Christos Stavrakakis
    server_dict = OrderedDict([
235 8b178e6b Christos Stavrakakis
        ("id", server.id),
236 8b178e6b Christos Stavrakakis
        ("name", server.name),
237 8b178e6b Christos Stavrakakis
        ("userid", server.userid),
238 8b178e6b Christos Stavrakakis
        ("username", ucache.get_name(userid) if display_mails else None),
239 8b178e6b Christos Stavrakakis
        ("flavor_id", server.flavor_id),
240 8b178e6b Christos Stavrakakis
        ("flavor_name", server.flavor.name),
241 8b178e6b Christos Stavrakakis
        ("imageid", server.imageid),
242 8b178e6b Christos Stavrakakis
        ("image_name", image),
243 8b178e6b Christos Stavrakakis
        ("state", server.operstate),
244 8b178e6b Christos Stavrakakis
        ("backend", server.backend),
245 8b178e6b Christos Stavrakakis
        ("deleted", server.deleted),
246 8b178e6b Christos Stavrakakis
        ("action", server.action),
247 8b178e6b Christos Stavrakakis
        ("task", server.task),
248 8b178e6b Christos Stavrakakis
        ("task_job_id", server.task_job_id),
249 8b178e6b Christos Stavrakakis
        ("backendjobid", server.backendjobid),
250 8b178e6b Christos Stavrakakis
        ("backendopcode", server.backendopcode),
251 8b178e6b Christos Stavrakakis
        ("backendjobstatus", server.backendjobstatus),
252 8b178e6b Christos Stavrakakis
        ("backend_time", server.backendtime),
253 8b178e6b Christos Stavrakakis
        ])
254 8b178e6b Christos Stavrakakis
255 8b178e6b Christos Stavrakakis
    pprint_table(stdout, server_dict.items(), None, separator=" | ",
256 8b178e6b Christos Stavrakakis
                 title=title)
257 8b178e6b Christos Stavrakakis
258 8b178e6b Christos Stavrakakis
259 8b178e6b Christos Stavrakakis
def pprint_server_nics(server, stdout=None, title=None):
260 8b178e6b Christos Stavrakakis
    if title is None:
261 8b178e6b Christos Stavrakakis
        title = "NICs of Server %s" % server.id
262 8b178e6b Christos Stavrakakis
    if stdout is None:
263 8b178e6b Christos Stavrakakis
        stdout = sys.stdout
264 8b178e6b Christos Stavrakakis
265 8b178e6b Christos Stavrakakis
    nics = []
266 8b178e6b Christos Stavrakakis
    for nic in server.nics.all():
267 db908bb1 Christos Stavrakakis
        nics.append((nic.id, nic.name, nic.index, nic.mac, nic.ipv4_address,
268 8b178e6b Christos Stavrakakis
                     nic.ipv6_address, nic.network, nic.firewall_profile,
269 8b178e6b Christos Stavrakakis
                     nic.state))
270 8b178e6b Christos Stavrakakis
271 db908bb1 Christos Stavrakakis
    headers = ["ID", "Name", "Index", "MAC", "IPv4 Address", "IPv6 Address",
272 8b178e6b Christos Stavrakakis
               "Network", "Firewall", "State"]
273 8b178e6b Christos Stavrakakis
    pprint_table(stdout, nics, headers, separator=" | ",
274 8b178e6b Christos Stavrakakis
                 title=title)
275 8b178e6b Christos Stavrakakis
276 8b178e6b Christos Stavrakakis
277 8b178e6b Christos Stavrakakis
def pprint_server_in_ganeti(server, print_jobs=False, stdout=None, title=None):
278 8b178e6b Christos Stavrakakis
    if stdout is None:
279 8b178e6b Christos Stavrakakis
        stdout = sys.stdout
280 8b178e6b Christos Stavrakakis
    if title is None:
281 8b178e6b Christos Stavrakakis
        title = "State of Server %s in Ganeti" % server.id
282 8b178e6b Christos Stavrakakis
283 8b178e6b Christos Stavrakakis
    client = server.get_client()
284 8b178e6b Christos Stavrakakis
    try:
285 8b178e6b Christos Stavrakakis
        server_info = client.GetInstance(server.backend_vm_id)
286 8b178e6b Christos Stavrakakis
    except GanetiApiError as e:
287 8b178e6b Christos Stavrakakis
        if e.code == 404:
288 8b178e6b Christos Stavrakakis
            stdout.write("NIC seems attached to server %s, but"
289 8b178e6b Christos Stavrakakis
                         " server does not exist in backend.\n"
290 8b178e6b Christos Stavrakakis
                         % server)
291 8b178e6b Christos Stavrakakis
            return
292 8b178e6b Christos Stavrakakis
        raise e
293 8b178e6b Christos Stavrakakis
    server.put_client(client)
294 8b178e6b Christos Stavrakakis
295 8b178e6b Christos Stavrakakis
    GANETI_INSTANCE_FIELDS = ('name', 'oper_state', 'admin_state', 'status',
296 8b178e6b Christos Stavrakakis
                              'pnode', 'snode', 'network_port',
297 8b178e6b Christos Stavrakakis
                              'disk_template', 'disk_usage',
298 8b178e6b Christos Stavrakakis
                              'oper_ram', 'oper_vcpus', 'mtime')
299 8b178e6b Christos Stavrakakis
    server_dict = OrderedDict([(k, server_info.get(k))
300 8b178e6b Christos Stavrakakis
                              for k in GANETI_INSTANCE_FIELDS])
301 8b178e6b Christos Stavrakakis
302 8b178e6b Christos Stavrakakis
    pprint_table(stdout, server_dict.items(), None, separator=" | ",
303 8b178e6b Christos Stavrakakis
                 title="NICs of Server %s in Ganeti" % server.id)
304 8b178e6b Christos Stavrakakis
    stdout.write("\n")
305 8b178e6b Christos Stavrakakis
306 8b178e6b Christos Stavrakakis
    nics = nics_from_instance(server_info)
307 8b178e6b Christos Stavrakakis
    nics_keys = ["ip", "mac", "name", "network"]
308 8b178e6b Christos Stavrakakis
    nics_values = [[nic[key] for key in nics_keys] for nic in nics]
309 8b178e6b Christos Stavrakakis
    pprint_table(stdout, nics_values, nics_keys, separator=" | ",
310 8b178e6b Christos Stavrakakis
                 title=title)
311 8b178e6b Christos Stavrakakis
312 8b178e6b Christos Stavrakakis
    if not print_jobs:
313 8b178e6b Christos Stavrakakis
        return
314 8b178e6b Christos Stavrakakis
315 8b178e6b Christos Stavrakakis
    client = server.get_client()
316 8b178e6b Christos Stavrakakis
    jobs = client.GetJobs(bulk=True)
317 8b178e6b Christos Stavrakakis
    server_jobs = filter(
318 8b178e6b Christos Stavrakakis
        lambda x: server.backend_vm_id in (" ".join(x.get("summary"))), jobs)
319 8b178e6b Christos Stavrakakis
320 8b178e6b Christos Stavrakakis
    GANETI_JOB_FIELDS = ('id', 'status', 'summary', 'opresult', 'opstatus',
321 8b178e6b Christos Stavrakakis
                         'oplog', 'start_ts', 'end_ts')
322 8b178e6b Christos Stavrakakis
    for server_job in server_jobs:
323 8b178e6b Christos Stavrakakis
        stdout.write("\n")
324 8b178e6b Christos Stavrakakis
        values = [server_job.get(k) for k in GANETI_JOB_FIELDS]
325 8b178e6b Christos Stavrakakis
        pprint_table(stdout, zip(GANETI_JOB_FIELDS, values), None,
326 8b178e6b Christos Stavrakakis
                     separator=" | ",
327 8b178e6b Christos Stavrakakis
                     title="Ganeti Job %s" % server_job["id"])
328 8b178e6b Christos Stavrakakis
    server.put_client(client)