Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / management / commands / port-inspect.py @ 9d1e6480

History | View | Annotate | Download (4.5 kB)

1 5fa91dc4 Marios Kogias
# Copyright 2012 GRNET S.A. All rights reserved.
2 5fa91dc4 Marios Kogias
#
3 5fa91dc4 Marios Kogias
# Redistribution and use in source and binary forms, with or
4 5fa91dc4 Marios Kogias
# without modification, are permitted provided that the following
5 5fa91dc4 Marios Kogias
# conditions are met:
6 5fa91dc4 Marios Kogias
#
7 5fa91dc4 Marios Kogias
#   1. Redistributions of source code must retain the above
8 5fa91dc4 Marios Kogias
#      copyright notice, this list of conditions and the following
9 5fa91dc4 Marios Kogias
#      disclaimer.
10 5fa91dc4 Marios Kogias
#
11 5fa91dc4 Marios Kogias
#   2. Redistributions in binary form must reproduce the above
12 5fa91dc4 Marios Kogias
#      copyright notice, this list of conditions and the following
13 5fa91dc4 Marios Kogias
#      disclaimer in the documentation and/or other materials
14 5fa91dc4 Marios Kogias
#      provided with the distribution.
15 5fa91dc4 Marios Kogias
#
16 5fa91dc4 Marios Kogias
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 5fa91dc4 Marios Kogias
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 5fa91dc4 Marios Kogias
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 5fa91dc4 Marios Kogias
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 5fa91dc4 Marios Kogias
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 5fa91dc4 Marios Kogias
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 5fa91dc4 Marios Kogias
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 5fa91dc4 Marios Kogias
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 5fa91dc4 Marios Kogias
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 5fa91dc4 Marios Kogias
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 5fa91dc4 Marios Kogias
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 5fa91dc4 Marios Kogias
# POSSIBILITY OF SUCH DAMAGE.
28 5fa91dc4 Marios Kogias
#
29 5fa91dc4 Marios Kogias
# The views and conclusions contained in the software and
30 5fa91dc4 Marios Kogias
# documentation are those of the authors and should not be
31 5fa91dc4 Marios Kogias
# interpreted as representing official policies, either expressed
32 5fa91dc4 Marios Kogias
# or implied, of GRNET S.A.
33 5fa91dc4 Marios Kogias
34 5fa91dc4 Marios Kogias
from optparse import make_option
35 5fa91dc4 Marios Kogias
from django.core.management.base import BaseCommand, CommandError
36 5fa91dc4 Marios Kogias
37 5fa91dc4 Marios Kogias
from synnefo.logic.rapi import GanetiApiError
38 86961519 Christos Stavrakakis
from synnefo.management.common import convert_api_faults
39 86961519 Christos Stavrakakis
from synnefo.logic.reconciliation import nics_from_instance
40 86961519 Christos Stavrakakis
from snf_django.management.utils import pprint_table
41 5fa91dc4 Marios Kogias
from synnefo.api.util import get_port
42 86961519 Christos Stavrakakis
43 86961519 Christos Stavrakakis
44 5fa91dc4 Marios Kogias
class Command(BaseCommand):
45 5fa91dc4 Marios Kogias
    help = "Inspect a port on DB and Ganeti"
46 5fa91dc4 Marios Kogias
    args = "<port ID>"
47 5fa91dc4 Marios Kogias
48 5fa91dc4 Marios Kogias
    option_list = BaseCommand.option_list + (
49 5fa91dc4 Marios Kogias
        make_option(
50 5fa91dc4 Marios Kogias
            '--jobs',
51 5fa91dc4 Marios Kogias
            action='store_true',
52 5fa91dc4 Marios Kogias
            dest='jobs',
53 5fa91dc4 Marios Kogias
            default=False,
54 5fa91dc4 Marios Kogias
            help="Show non-archived jobs concerning port."),
55 5fa91dc4 Marios Kogias
        make_option(
56 5fa91dc4 Marios Kogias
            '--displayname',
57 5fa91dc4 Marios Kogias
            action='store_true',
58 5fa91dc4 Marios Kogias
            dest='displayname',
59 5fa91dc4 Marios Kogias
            default=False,
60 5fa91dc4 Marios Kogias
            help="Display both uuid and display name"),
61 5fa91dc4 Marios Kogias
    )
62 5fa91dc4 Marios Kogias
63 5fa91dc4 Marios Kogias
    @convert_api_faults
64 5fa91dc4 Marios Kogias
    def handle(self, *args, **options):
65 5fa91dc4 Marios Kogias
        if len(args) != 1:
66 5fa91dc4 Marios Kogias
            raise CommandError("Please provide a port ID")
67 5fa91dc4 Marios Kogias
68 5fa91dc4 Marios Kogias
        port = get_port(args[0], None)
69 5fa91dc4 Marios Kogias
70 5fa91dc4 Marios Kogias
        sep = '-' * 80 + '\n'
71 86961519 Christos Stavrakakis
72 86961519 Christos Stavrakakis
        db_nic = {
73 86961519 Christos Stavrakakis
            "id": port.id,
74 86961519 Christos Stavrakakis
            "name": port.name,
75 86961519 Christos Stavrakakis
            "userid": port.userid,
76 86961519 Christos Stavrakakis
            "server": port.machine_id,
77 86961519 Christos Stavrakakis
            "network": port.network_id,
78 86961519 Christos Stavrakakis
            "device_owner": port.device_owner,
79 86961519 Christos Stavrakakis
            "mac": port.mac,
80 86961519 Christos Stavrakakis
            "state": port.state}
81 5fa91dc4 Marios Kogias
82 5fa91dc4 Marios Kogias
        self.stdout.write(sep)
83 5fa91dc4 Marios Kogias
        self.stdout.write('State of port in DB\n')
84 5fa91dc4 Marios Kogias
        self.stdout.write(sep)
85 86961519 Christos Stavrakakis
        pprint_table(self.stdout, db_nic.items(), None, separator=" | ")
86 86961519 Christos Stavrakakis
87 86961519 Christos Stavrakakis
        self.stdout.write('\n\n')
88 86961519 Christos Stavrakakis
        ips = list(port.ips.values_list("address", "network_id", "subnet_id",
89 86961519 Christos Stavrakakis
                                        "subnet__cidr", "floating_ip"))
90 86961519 Christos Stavrakakis
        headers = ["Address", "Network", "Subnet", "CIDR", "is_floating"]
91 86961519 Christos Stavrakakis
        pprint_table(self.stdout, ips, headers, separator=" | ")
92 86961519 Christos Stavrakakis
93 86961519 Christos Stavrakakis
        self.stdout.write('\n\n')
94 86961519 Christos Stavrakakis
95 86961519 Christos Stavrakakis
        self.stdout.write(sep)
96 86961519 Christos Stavrakakis
        self.stdout.write('State of port in Ganeti\n')
97 86961519 Christos Stavrakakis
        self.stdout.write(sep)
98 86961519 Christos Stavrakakis
        vm = port.machine
99 86961519 Christos Stavrakakis
        if vm is None:
100 86961519 Christos Stavrakakis
            self.stdout.write("Port is not attached to any instance.\n")
101 86961519 Christos Stavrakakis
            return
102 86961519 Christos Stavrakakis
103 5fa91dc4 Marios Kogias
        client = vm.get_client()
104 5fa91dc4 Marios Kogias
        try:
105 86961519 Christos Stavrakakis
            vm_info = client.GetInstance(vm.backend_vm_id)
106 5fa91dc4 Marios Kogias
        except GanetiApiError as e:
107 5fa91dc4 Marios Kogias
            if e.code == 404:
108 86961519 Christos Stavrakakis
                self.stdout.write("NIC seems attached to server %s, but"
109 86961519 Christos Stavrakakis
                                  " server does not exist in backend.\n"
110 86961519 Christos Stavrakakis
                                  % vm)
111 1aec0223 Christos Stavrakakis
                return
112 1aec0223 Christos Stavrakakis
            raise e
113 5fa91dc4 Marios Kogias
114 86961519 Christos Stavrakakis
        nics = nics_from_instance(vm_info)
115 86961519 Christos Stavrakakis
        try:
116 86961519 Christos Stavrakakis
            gnt_nic = filter(lambda nic: nic.get("name") == port.backend_uuid,
117 86961519 Christos Stavrakakis
                             nics)[0]
118 86961519 Christos Stavrakakis
        except IndexError:
119 86961519 Christos Stavrakakis
            self.stdout.write("NIC %s is not attached to instance %s"
120 86961519 Christos Stavrakakis
                              % (port, vm))
121 5fa91dc4 Marios Kogias
            return
122 86961519 Christos Stavrakakis
        pprint_table(self.stdout, gnt_nic.items(), None, separator=" | ")
123 5fa91dc4 Marios Kogias
124 5fa91dc4 Marios Kogias
        vm.put_client(client)