Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (5.9 kB)

1 8fad925a Giorgos Verigakis
# Copyright 2012 GRNET S.A. All rights reserved.
2 8fad925a Giorgos Verigakis
#
3 8fad925a Giorgos Verigakis
# Redistribution and use in source and binary forms, with or
4 8fad925a Giorgos Verigakis
# without modification, are permitted provided that the following
5 8fad925a Giorgos Verigakis
# conditions are met:
6 8fad925a Giorgos Verigakis
#
7 8fad925a Giorgos Verigakis
#   1. Redistributions of source code must retain the above
8 8fad925a Giorgos Verigakis
#      copyright notice, this list of conditions and the following
9 8fad925a Giorgos Verigakis
#      disclaimer.
10 8fad925a Giorgos Verigakis
#
11 8fad925a Giorgos Verigakis
#   2. Redistributions in binary form must reproduce the above
12 8fad925a Giorgos Verigakis
#      copyright notice, this list of conditions and the following
13 8fad925a Giorgos Verigakis
#      disclaimer in the documentation and/or other materials
14 8fad925a Giorgos Verigakis
#      provided with the distribution.
15 8fad925a Giorgos Verigakis
#
16 8fad925a Giorgos Verigakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 8fad925a Giorgos Verigakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 8fad925a Giorgos Verigakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 8fad925a Giorgos Verigakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 8fad925a Giorgos Verigakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 8fad925a Giorgos Verigakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 8fad925a Giorgos Verigakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 8fad925a Giorgos Verigakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 8fad925a Giorgos Verigakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 8fad925a Giorgos Verigakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 8fad925a Giorgos Verigakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 8fad925a Giorgos Verigakis
# POSSIBILITY OF SUCH DAMAGE.
28 8fad925a Giorgos Verigakis
#
29 8fad925a Giorgos Verigakis
# The views and conclusions contained in the software and
30 8fad925a Giorgos Verigakis
# documentation are those of the authors and should not be
31 8fad925a Giorgos Verigakis
# interpreted as representing official policies, either expressed
32 8fad925a Giorgos Verigakis
# or implied, of GRNET S.A.
33 8fad925a Giorgos Verigakis
34 8fad925a Giorgos Verigakis
from optparse import make_option
35 8fad925a Giorgos Verigakis
36 8fad925a Giorgos Verigakis
from django.core.management.base import BaseCommand, CommandError
37 8283d6c1 Stratos Psomadakis
from synnefo.management.common import (format_bool, filter_results, UserCache,
38 4500650c Stratos Psomadakis
                                       Omit)
39 8fad925a Giorgos Verigakis
from synnefo.db.models import Network
40 7a0aa449 Christos Stavrakakis
from synnefo.management.common import pprint_table
41 8fad925a Giorgos Verigakis
42 bad9404c Christos Stavrakakis
FIELDS = Network._meta.get_all_field_names()
43 bad9404c Christos Stavrakakis
44 8fad925a Giorgos Verigakis
45 8fad925a Giorgos Verigakis
class Command(BaseCommand):
46 8fad925a Giorgos Verigakis
    help = "List networks"
47 8fad925a Giorgos Verigakis
48 8fad925a Giorgos Verigakis
    option_list = BaseCommand.option_list + (
49 8fad925a Giorgos Verigakis
        make_option('-c',
50 8fad925a Giorgos Verigakis
            action='store_true',
51 8fad925a Giorgos Verigakis
            dest='csv',
52 8fad925a Giorgos Verigakis
            default=False,
53 8fad925a Giorgos Verigakis
            help="Use pipes to separate values"),
54 8fad925a Giorgos Verigakis
        make_option('--deleted',
55 8fad925a Giorgos Verigakis
            action='store_true',
56 8fad925a Giorgos Verigakis
            dest='deleted',
57 8fad925a Giorgos Verigakis
            default=False,
58 af88de58 Christos Stavrakakis
            help="Include deleted networks"),
59 8fad925a Giorgos Verigakis
        make_option('--public',
60 8fad925a Giorgos Verigakis
            action='store_true',
61 8fad925a Giorgos Verigakis
            dest='public',
62 8fad925a Giorgos Verigakis
            default=False,
63 8fad925a Giorgos Verigakis
            help="List only public networks"),
64 4500650c Stratos Psomadakis
        make_option('--user',
65 4500650c Stratos Psomadakis
            dest='user',
66 4500650c Stratos Psomadakis
            help="List only networks of the specified user"
67 4500650c Stratos Psomadakis
                 " (uuid or display name"),
68 cc3f266e Christos Stavrakakis
        make_option('--ipv6',
69 cc3f266e Christos Stavrakakis
            action='store_true',
70 cc3f266e Christos Stavrakakis
            dest='ipv6',
71 cc3f266e Christos Stavrakakis
            default=False,
72 cc3f266e Christos Stavrakakis
            help="Show IPv6 information of the network"),
73 bad9404c Christos Stavrakakis
        make_option('--filter-by',
74 bad9404c Christos Stavrakakis
            dest='filter_by',
75 bad9404c Christos Stavrakakis
            help="Filter results. Comma seperated list of key 'cond' val pairs"
76 bad9404c Christos Stavrakakis
                 " that displayed entries must satisfy. e.g."
77 bad9404c Christos Stavrakakis
                 " --filter-by \"name=Network-1,link!=prv0\"."
78 c51f3a08 Stratos Psomadakis
                 " Available keys are: %s" % ", ".join(FIELDS)),
79 4500650c Stratos Psomadakis
        make_option('--displayname',
80 c51f3a08 Stratos Psomadakis
            action='store_true',
81 4500650c Stratos Psomadakis
            dest='displayname',
82 c51f3a08 Stratos Psomadakis
            default=False,
83 4500650c Stratos Psomadakis
            help="Display both uuid and display name"),
84 8fad925a Giorgos Verigakis
        )
85 8fad925a Giorgos Verigakis
86 8fad925a Giorgos Verigakis
    def handle(self, *args, **options):
87 8fad925a Giorgos Verigakis
        if args:
88 8fad925a Giorgos Verigakis
            raise CommandError("Command doesn't accept any arguments")
89 8fad925a Giorgos Verigakis
90 8283d6c1 Stratos Psomadakis
        ucache = UserCache()
91 4500650c Stratos Psomadakis
92 8fad925a Giorgos Verigakis
        if options['deleted']:
93 af88de58 Christos Stavrakakis
            networks = Network.objects.all()
94 8fad925a Giorgos Verigakis
        else:
95 af88de58 Christos Stavrakakis
            networks = Network.objects.filter(deleted=False)
96 8fad925a Giorgos Verigakis
97 8fad925a Giorgos Verigakis
        if options['public']:
98 8fad925a Giorgos Verigakis
            networks = networks.filter(public=True)
99 8fad925a Giorgos Verigakis
100 4500650c Stratos Psomadakis
        user = options['user']
101 4500650c Stratos Psomadakis
        if user:
102 4500650c Stratos Psomadakis
            if '@' in user:
103 8283d6c1 Stratos Psomadakis
                user = ucache.get_uuid(user)
104 4500650c Stratos Psomadakis
            networks = networks.filter(userid=user)
105 4500650c Stratos Psomadakis
106 bad9404c Christos Stavrakakis
        filter_by = options['filter_by']
107 bad9404c Christos Stavrakakis
        if filter_by:
108 bad9404c Christos Stavrakakis
            networks = filter_results(networks, filter_by)
109 bad9404c Christos Stavrakakis
110 4500650c Stratos Psomadakis
        displayname = options['displayname']
111 4500650c Stratos Psomadakis
112 4500650c Stratos Psomadakis
        headers = filter(lambda x: x is not Omit,
113 7856a37a Stratos Psomadakis
                         ['id',
114 7856a37a Stratos Psomadakis
                          'name',
115 7856a37a Stratos Psomadakis
                          'flavor',
116 7856a37a Stratos Psomadakis
                          'owner_uuid',
117 7856a37a Stratos Psomadakis
                          'owner_name' if displayname else Omit,
118 7856a37a Stratos Psomadakis
                          'mac_prefix',
119 7856a37a Stratos Psomadakis
                          'dhcp',
120 7856a37a Stratos Psomadakis
                          'state',
121 7856a37a Stratos Psomadakis
                          'link',
122 7856a37a Stratos Psomadakis
                          'vms',
123 7856a37a Stratos Psomadakis
                          'public',
124 7856a37a Stratos Psomadakis
                          ])
125 cc3f266e Christos Stavrakakis
126 cc3f266e Christos Stavrakakis
        if options['ipv6']:
127 7a0aa449 Christos Stavrakakis
            headers.extend(['IPv6 Subnet', 'IPv6 Gateway'])
128 cc3f266e Christos Stavrakakis
        else:
129 7a0aa449 Christos Stavrakakis
            headers.extend(['IPv4 Subnet', 'IPv4 Gateway'])
130 8fad925a Giorgos Verigakis
131 d443e1dd Stratos Psomadakis
        if displayname:
132 d443e1dd Stratos Psomadakis
            uuids = list(set([network.userid for network in networks]))
133 d443e1dd Stratos Psomadakis
            ucache.fetch_names(uuids)
134 8283d6c1 Stratos Psomadakis
135 7a0aa449 Christos Stavrakakis
        table = []
136 90b67503 Christos Stavrakakis
        for network in networks.order_by("id"):
137 4500650c Stratos Psomadakis
            uuid = network.userid
138 4500650c Stratos Psomadakis
            if displayname:
139 8283d6c1 Stratos Psomadakis
                dname = ucache.get_name(uuid)
140 4500650c Stratos Psomadakis
141 4500650c Stratos Psomadakis
            fields = filter(lambda x: x is not Omit,
142 4500650c Stratos Psomadakis
                            [str(network.id),
143 4500650c Stratos Psomadakis
                             network.name,
144 4500650c Stratos Psomadakis
                             network.flavor,
145 4500650c Stratos Psomadakis
                             uuid or '-',
146 4500650c Stratos Psomadakis
                             dname or '-' if displayname else Omit,
147 4500650c Stratos Psomadakis
                             network.mac_prefix or '-',
148 4500650c Stratos Psomadakis
                             str(network.dhcp),
149 4500650c Stratos Psomadakis
                             network.state,
150 4500650c Stratos Psomadakis
                             network.link or '-',
151 4500650c Stratos Psomadakis
                             str(network.machines.count()),
152 4500650c Stratos Psomadakis
                             format_bool(network.public),
153 4500650c Stratos Psomadakis
                             ])
154 cc3f266e Christos Stavrakakis
155 cc3f266e Christos Stavrakakis
            if options['ipv6']:
156 cc3f266e Christos Stavrakakis
                fields.extend([network.subnet6 or '', network.gateway6 or ''])
157 cc3f266e Christos Stavrakakis
            else:
158 cc3f266e Christos Stavrakakis
                fields.extend([network.subnet, network.gateway or ''])
159 7a0aa449 Christos Stavrakakis
            table.append(fields)
160 8fad925a Giorgos Verigakis
161 7a0aa449 Christos Stavrakakis
        separator = " | " if options['csv'] else None
162 7a0aa449 Christos Stavrakakis
        pprint_table(self.stdout, table, headers, separator)