Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / management / commands / network-list.py @ 8283d6c1

History | View | Annotate | Download (5.9 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

    
36
from django.core.management.base import BaseCommand, CommandError
37
from synnefo.management.common import (format_bool, filter_results, UserCache,
38
                                       Omit)
39
from synnefo.db.models import Network
40
from synnefo.management.common import pprint_table
41

    
42
FIELDS = Network._meta.get_all_field_names()
43

    
44

    
45
class Command(BaseCommand):
46
    help = "List networks"
47

    
48
    option_list = BaseCommand.option_list + (
49
        make_option('-c',
50
            action='store_true',
51
            dest='csv',
52
            default=False,
53
            help="Use pipes to separate values"),
54
        make_option('--deleted',
55
            action='store_true',
56
            dest='deleted',
57
            default=False,
58
            help="Include deleted networks"),
59
        make_option('--public',
60
            action='store_true',
61
            dest='public',
62
            default=False,
63
            help="List only public networks"),
64
        make_option('--user',
65
            dest='user',
66
            help="List only networks of the specified user"
67
                 " (uuid or display name"),
68
        make_option('--ipv6',
69
            action='store_true',
70
            dest='ipv6',
71
            default=False,
72
            help="Show IPv6 information of the network"),
73
        make_option('--filter-by',
74
            dest='filter_by',
75
            help="Filter results. Comma seperated list of key 'cond' val pairs"
76
                 " that displayed entries must satisfy. e.g."
77
                 " --filter-by \"name=Network-1,link!=prv0\"."
78
                 " Available keys are: %s" % ", ".join(FIELDS)),
79
        make_option('--displayname',
80
            action='store_true',
81
            dest='displayname',
82
            default=False,
83
            help="Display both uuid and display name"),
84
        )
85

    
86
    def handle(self, *args, **options):
87
        if args:
88
            raise CommandError("Command doesn't accept any arguments")
89

    
90
        ucache = UserCache()
91

    
92
        if options['deleted']:
93
            networks = Network.objects.all()
94
        else:
95
            networks = Network.objects.filter(deleted=False)
96

    
97
        if options['public']:
98
            networks = networks.filter(public=True)
99

    
100
        user = options['user']
101
        if user:
102
            if '@' in user:
103
                user = ucache.get_uuid(user)
104
            networks = networks.filter(userid=user)
105

    
106
        filter_by = options['filter_by']
107
        if filter_by:
108
            networks = filter_results(networks, filter_by)
109

    
110
        displayname = options['displayname']
111

    
112
        headers = filter(lambda x: x is not Omit,
113
                        ['id',
114
                         'name',
115
                         'flavor',
116
                         'owner_uuid',
117
                         'owner_name' if displayname else Omit,
118
                         'mac_prefix',
119
                         'dhcp',
120
                         'state',
121
                         'link',
122
                         'vms',
123
                         'public',
124
                         ])
125

    
126
        if options['ipv6']:
127
            headers.extend(['IPv6 Subnet', 'IPv6 Gateway'])
128
        else:
129
            headers.extend(['IPv4 Subnet', 'IPv4 Gateway'])
130

    
131
        uuids = list(set([network.userid for network in networks]))
132
        ucache.fetch_names(uuids)
133

    
134
        table = []
135
        for network in networks.order_by("id"):
136
            uuid = network.userid
137
            if displayname:
138
                dname = ucache.get_name(uuid)
139

    
140
            fields = filter(lambda x: x is not Omit,
141
                            [str(network.id),
142
                             network.name,
143
                             network.flavor,
144
                             uuid or '-',
145
                             dname or '-' if displayname else Omit,
146
                             network.mac_prefix or '-',
147
                             str(network.dhcp),
148
                             network.state,
149
                             network.link or '-',
150
                             str(network.machines.count()),
151
                             format_bool(network.public),
152
                             ])
153

    
154
            if options['ipv6']:
155
                fields.extend([network.subnet6 or '', network.gateway6 or ''])
156
            else:
157
                fields.extend([network.subnet, network.gateway or ''])
158
            table.append(fields)
159

    
160
        separator = " | " if options['csv'] else None
161
        pprint_table(self.stdout, table, headers, separator)