Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (4.5 kB)

1
# Copyright 2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
from optparse import make_option
35
from django.core.management.base import BaseCommand, CommandError
36

    
37
from synnefo.logic.rapi import GanetiApiError
38
from synnefo.management.common import convert_api_faults
39
from synnefo.logic.reconciliation import nics_from_instance
40
from snf_django.management.utils import pprint_table
41
from synnefo.api.util import get_port
42

    
43

    
44
class Command(BaseCommand):
45
    help = "Inspect a port on DB and Ganeti"
46
    args = "<port ID>"
47

    
48
    option_list = BaseCommand.option_list + (
49
        make_option(
50
            '--jobs',
51
            action='store_true',
52
            dest='jobs',
53
            default=False,
54
            help="Show non-archived jobs concerning port."),
55
        make_option(
56
            '--displayname',
57
            action='store_true',
58
            dest='displayname',
59
            default=False,
60
            help="Display both uuid and display name"),
61
    )
62

    
63
    @convert_api_faults
64
    def handle(self, *args, **options):
65
        if len(args) != 1:
66
            raise CommandError("Please provide a port ID")
67

    
68
        port = get_port(args[0], None)
69

    
70
        sep = '-' * 80 + '\n'
71

    
72
        db_nic = {
73
            "id": port.id,
74
            "name": port.name,
75
            "userid": port.userid,
76
            "server": port.machine_id,
77
            "network": port.network_id,
78
            "device_owner": port.device_owner,
79
            "mac": port.mac,
80
            "state": port.state}
81

    
82
        self.stdout.write(sep)
83
        self.stdout.write('State of port in DB\n')
84
        self.stdout.write(sep)
85
        pprint_table(self.stdout, db_nic.items(), None, separator=" | ")
86

    
87
        self.stdout.write('\n\n')
88
        ips = list(port.ips.values_list("address", "network_id", "subnet_id",
89
                                        "subnet__cidr", "floating_ip"))
90
        headers = ["Address", "Network", "Subnet", "CIDR", "is_floating"]
91
        pprint_table(self.stdout, ips, headers, separator=" | ")
92

    
93
        self.stdout.write('\n\n')
94

    
95
        self.stdout.write(sep)
96
        self.stdout.write('State of port in Ganeti\n')
97
        self.stdout.write(sep)
98
        vm = port.machine
99
        if vm is None:
100
            self.stdout.write("Port is not attached to any instance.\n")
101
            return
102

    
103
        client = vm.get_client()
104
        try:
105
            vm_info = client.GetInstance(vm.backend_vm_id)
106
        except GanetiApiError as e:
107
            if e.code == 404:
108
                self.stdout.write("NIC seems attached to server %s, but"
109
                                  " server does not exist in backend.\n"
110
                                  % vm)
111

    
112
        nics = nics_from_instance(vm_info)
113
        try:
114
            gnt_nic = filter(lambda nic: nic.get("name") == port.backend_uuid,
115
                             nics)[0]
116
        except IndexError:
117
            self.stdout.write("NIC %s is not attached to instance %s"
118
                              % (port, vm))
119
            return
120
        pprint_table(self.stdout, gnt_nic.items(), None, separator=" | ")
121

    
122
        vm.put_client(client)