Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (4.4 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
        db_nic = {
71
            "id": port.id,
72
            "name": port.name,
73
            "userid": port.userid,
74
            "server": port.machine_id,
75
            "network": port.network_id,
76
            "device_owner": port.device_owner,
77
            "mac": port.mac,
78
            "state": port.state}
79

    
80
        pprint_table(self.stdout, db_nic.items(), None, separator=" | ",
81
                     title="State of port in DB")
82
        self.stdout.write('\n\n')
83

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

    
91
        vm = port.machine
92
        if vm is None:
93
            self.stdout.write("Port is not attached to any instance.\n")
94
            return
95

    
96
        client = vm.get_client()
97
        try:
98
            vm_info = client.GetInstance(vm.backend_vm_id)
99
        except GanetiApiError as e:
100
            if e.code == 404:
101
                self.stdout.write("NIC seems attached to server %s, but"
102
                                  " server does not exist in backend.\n"
103
                                  % vm)
104
                return
105
            raise e
106

    
107
        nics = nics_from_instance(vm_info)
108
        try:
109
            gnt_nic = filter(lambda nic: nic.get("name") == port.backend_uuid,
110
                             nics)[0]
111
        except IndexError:
112
            self.stdout.write("NIC %s is not attached to instance %s"
113
                              % (port, vm))
114
            return
115
        pprint_table(self.stdout, gnt_nic.items(), None, separator=" | ",
116
                     title="State of port in Ganeti")
117

    
118
        vm.put_client(client)