Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / management / commands / port-create.py @ 475d4a85

History | View | Annotate | Download (6.5 kB)

1 6d5c0344 Christos Stavrakakis
# Copyright 2013 GRNET S.A. All rights reserved.
2 a1713485 Marios Kogias
#
3 a1713485 Marios Kogias
# Redistribution and use in source and binary forms, with or
4 a1713485 Marios Kogias
# without modification, are permitted provided that the following
5 a1713485 Marios Kogias
# conditions are met:
6 a1713485 Marios Kogias
#
7 a1713485 Marios Kogias
#   1. Redistributions of source code must retain the above
8 a1713485 Marios Kogias
#      copyright notice, this list of conditions and the following
9 a1713485 Marios Kogias
#      disclaimer.
10 a1713485 Marios Kogias
#
11 a1713485 Marios Kogias
#   2. Redistributions in binary form must reproduce the above
12 a1713485 Marios Kogias
#      copyright notice, this list of conditions and the following
13 a1713485 Marios Kogias
#      disclaimer in the documentation and/or other materials
14 a1713485 Marios Kogias
#      provided with the distribution.
15 a1713485 Marios Kogias
#
16 a1713485 Marios Kogias
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 a1713485 Marios Kogias
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 a1713485 Marios Kogias
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 a1713485 Marios Kogias
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 a1713485 Marios Kogias
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 a1713485 Marios Kogias
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 a1713485 Marios Kogias
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 a1713485 Marios Kogias
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 a1713485 Marios Kogias
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 a1713485 Marios Kogias
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 a1713485 Marios Kogias
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 a1713485 Marios Kogias
# POSSIBILITY OF SUCH DAMAGE.
28 a1713485 Marios Kogias
#
29 a1713485 Marios Kogias
# The views and conclusions contained in the software and
30 a1713485 Marios Kogias
# documentation are those of the authors and should not be
31 a1713485 Marios Kogias
# interpreted as representing official policies, either expressed
32 a1713485 Marios Kogias
# or implied, of GRNET S.A.
33 a1713485 Marios Kogias
34 a1713485 Marios Kogias
from optparse import make_option
35 a1713485 Marios Kogias
36 a1713485 Marios Kogias
from django.core.management.base import BaseCommand, CommandError
37 a1713485 Marios Kogias
38 a1713485 Marios Kogias
from synnefo.api import util
39 d5a4a8d1 Christos Stavrakakis
from synnefo.management import common, pprint
40 0723a85c Christos Stavrakakis
from snf_django.management.utils import parse_bool
41 fae6e5f0 Christos Stavrakakis
from synnefo.logic import servers
42 a1713485 Marios Kogias
43 6d5c0344 Christos Stavrakakis
HELP_MSG = """Create a new port.
44 6d5c0344 Christos Stavrakakis

45 79f4eec0 Christos Stavrakakis
Connect a server/router to a network by creating a new port. If 'floating_ip'
46 79f4eec0 Christos Stavrakakis
option is used, the specified floating IP will be assigned to the new port.
47 79f4eec0 Christos Stavrakakis
Otherwise, the port will get an IP address for each Subnet that is associated
48 79f4eec0 Christos Stavrakakis
with the network."""
49 a1713485 Marios Kogias
50 a1713485 Marios Kogias
51 6d5c0344 Christos Stavrakakis
class Command(BaseCommand):
52 6d5c0344 Christos Stavrakakis
    help = HELP_MSG
53 a1713485 Marios Kogias
54 a1713485 Marios Kogias
    option_list = BaseCommand.option_list + (
55 a1713485 Marios Kogias
        make_option(
56 6d5c0344 Christos Stavrakakis
            "--name",
57 6d5c0344 Christos Stavrakakis
            dest="name",
58 a1713485 Marios Kogias
            default=None,
59 6d5c0344 Christos Stavrakakis
            help="Name of the port."),
60 a1713485 Marios Kogias
        make_option(
61 fae6e5f0 Christos Stavrakakis
            "--owner",
62 fae6e5f0 Christos Stavrakakis
            dest="user_id",
63 fae6e5f0 Christos Stavrakakis
            default=None,
64 fae6e5f0 Christos Stavrakakis
            help="UUID of the owner of the Port."),
65 fae6e5f0 Christos Stavrakakis
        make_option(
66 6d5c0344 Christos Stavrakakis
            "--network",
67 6d5c0344 Christos Stavrakakis
            dest="network_id",
68 a1713485 Marios Kogias
            default=None,
69 6d5c0344 Christos Stavrakakis
            help="The ID of the network where the port will be created."),
70 a1713485 Marios Kogias
        make_option(
71 6d5c0344 Christos Stavrakakis
            "--server",
72 6d5c0344 Christos Stavrakakis
            dest="server_id",
73 a1713485 Marios Kogias
            default=None,
74 6d5c0344 Christos Stavrakakis
            help="The ID of the server that the port will be connected to."),
75 014df29c Christos Stavrakakis
        #make_option(
76 014df29c Christos Stavrakakis
        #    "--router",
77 014df29c Christos Stavrakakis
        #    dest="router_id",
78 014df29c Christos Stavrakakis
        #    default=None,
79 014df29c Christos Stavrakakis
        #    help="The ID of the router that the port will be connected to."),
80 a1713485 Marios Kogias
        make_option(
81 79f4eec0 Christos Stavrakakis
            "--floating-ip",
82 79f4eec0 Christos Stavrakakis
            dest="floating_ip_id",
83 79f4eec0 Christos Stavrakakis
            default=None,
84 79f4eec0 Christos Stavrakakis
            help="The ID of the floating IP to use for the port."),
85 79f4eec0 Christos Stavrakakis
        make_option(
86 dfbe006a Christos Stavrakakis
            "--ipv4-address",
87 dfbe006a Christos Stavrakakis
            dest="ipv4_address",
88 dfbe006a Christos Stavrakakis
            default=None,
89 dfbe006a Christos Stavrakakis
            help="Specify IPv4 address for the new port."),
90 dfbe006a Christos Stavrakakis
        make_option(
91 6d5c0344 Christos Stavrakakis
            "--security-groups",
92 6d5c0344 Christos Stavrakakis
            dest="security-groups",
93 a1713485 Marios Kogias
            default=None,
94 6d5c0344 Christos Stavrakakis
            help="Comma separated list of Security Group IDs to associate"
95 6d5c0344 Christos Stavrakakis
                 " with the port."),
96 0723a85c Christos Stavrakakis
        make_option(
97 0723a85c Christos Stavrakakis
            "--wait",
98 0723a85c Christos Stavrakakis
            dest="wait",
99 0723a85c Christos Stavrakakis
            default="True",
100 0723a85c Christos Stavrakakis
            choices=["True", "False"],
101 0723a85c Christos Stavrakakis
            metavar="True|False",
102 0723a85c Christos Stavrakakis
            help="Wait for Ganeti jobs to complete."),
103 a1713485 Marios Kogias
    )
104 a1713485 Marios Kogias
105 0723a85c Christos Stavrakakis
    @common.convert_api_faults
106 a1713485 Marios Kogias
    def handle(self, *args, **options):
107 a1713485 Marios Kogias
        if args:
108 a1713485 Marios Kogias
            raise CommandError("Command doesn't accept any arguments")
109 a1713485 Marios Kogias
110 6d5c0344 Christos Stavrakakis
        name = options["name"]
111 fae6e5f0 Christos Stavrakakis
        user_id = options["user_id"]
112 6d5c0344 Christos Stavrakakis
        network_id = options["network_id"]
113 6d5c0344 Christos Stavrakakis
        server_id = options["server_id"]
114 014df29c Christos Stavrakakis
        #router_id = options["router_id"]
115 014df29c Christos Stavrakakis
        router_id = None
116 6d5c0344 Christos Stavrakakis
        # assume giving security groups comma separated
117 6d5c0344 Christos Stavrakakis
        security_group_ids = options["security-groups"]
118 0723a85c Christos Stavrakakis
        wait = parse_bool(options["wait"])
119 a1713485 Marios Kogias
120 a1713485 Marios Kogias
        if not name:
121 014df29c Christos Stavrakakis
            name = ""
122 a1713485 Marios Kogias
123 6d5c0344 Christos Stavrakakis
        if not network_id:
124 6d5c0344 Christos Stavrakakis
            raise CommandError("Please specify a 'network'")
125 6d5c0344 Christos Stavrakakis
126 fae6e5f0 Christos Stavrakakis
        vm = None
127 fae6e5f0 Christos Stavrakakis
        owner = None
128 6d5c0344 Christos Stavrakakis
        if server_id:
129 6d5c0344 Christos Stavrakakis
            owner = "vm"
130 d5a4a8d1 Christos Stavrakakis
            vm = common.get_vm(server_id)
131 014df29c Christos Stavrakakis
            #if vm.router:
132 014df29c Christos Stavrakakis
            #    raise CommandError("Server '%s' does not exist." % server_id)
133 6d5c0344 Christos Stavrakakis
        elif router_id:
134 6d5c0344 Christos Stavrakakis
            owner = "router"
135 d5a4a8d1 Christos Stavrakakis
            vm = common.get_vm(router_id)
136 6d5c0344 Christos Stavrakakis
            if not vm.router:
137 6d5c0344 Christos Stavrakakis
                raise CommandError("Router '%s' does not exist." % router_id)
138 a1713485 Marios Kogias
139 2a58c29b Christos Stavrakakis
        if user_id is None:
140 2a58c29b Christos Stavrakakis
            if vm is not None:
141 2a58c29b Christos Stavrakakis
                user_id = vm.userid
142 2a58c29b Christos Stavrakakis
            else:
143 2a58c29b Christos Stavrakakis
                raise CommandError("Please specify the owner of the port.")
144 2a58c29b Christos Stavrakakis
145 6d5c0344 Christos Stavrakakis
        # get the network
146 d5a4a8d1 Christos Stavrakakis
        network = common.get_network(network_id)
147 a1713485 Marios Kogias
148 dfbe006a Christos Stavrakakis
        # Get either floating IP or fixed ip address
149 dfbe006a Christos Stavrakakis
        ipaddress = None
150 dfbe006a Christos Stavrakakis
        floating_ip_id = options["floating_ip_id"]
151 dfbe006a Christos Stavrakakis
        ipv4_address = options["ipv4_address"]
152 dfbe006a Christos Stavrakakis
        if ipv4_address is not None and floating_ip_id is not None:
153 dfbe006a Christos Stavrakakis
            raise CommandError("Please use either --floating-ip-id or"
154 dfbe006a Christos Stavrakakis
                               " --ipv4-address option")
155 dfbe006a Christos Stavrakakis
        elif floating_ip_id:
156 dfbe006a Christos Stavrakakis
            ipaddress = common.get_floating_ip_by_id(floating_ip_id,
157 dfbe006a Christos Stavrakakis
                                                     for_update=True)
158 dfbe006a Christos Stavrakakis
159 6d5c0344 Christos Stavrakakis
        # validate security groups
160 a1713485 Marios Kogias
        sg_list = []
161 6d5c0344 Christos Stavrakakis
        if security_group_ids:
162 6d5c0344 Christos Stavrakakis
            security_group_ids = security_group_ids.split(",")
163 6d5c0344 Christos Stavrakakis
            for gid in security_group_ids:
164 a1713485 Marios Kogias
                sg = util.get_security_group(int(gid))
165 a1713485 Marios Kogias
                sg_list.append(sg)
166 a1713485 Marios Kogias
167 fae6e5f0 Christos Stavrakakis
        new_port = servers.create_port(user_id, network, machine=vm,
168 fae6e5f0 Christos Stavrakakis
                                       name=name,
169 fae6e5f0 Christos Stavrakakis
                                       use_ipaddress=ipaddress,
170 fae6e5f0 Christos Stavrakakis
                                       address=ipv4_address,
171 fae6e5f0 Christos Stavrakakis
                                       security_groups=sg_list,
172 fae6e5f0 Christos Stavrakakis
                                       device_owner=owner)
173 d5a4a8d1 Christos Stavrakakis
        self.stdout.write("Created port '%s' in DB:\n" % new_port)
174 d5a4a8d1 Christos Stavrakakis
        pprint.pprint_port(new_port, stdout=self.stdout)
175 d5a4a8d1 Christos Stavrakakis
        pprint.pprint_port_ips(new_port, stdout=self.stdout)
176 0723a85c Christos Stavrakakis
        self.stdout.write("\n")
177 fae6e5f0 Christos Stavrakakis
        if vm is not None:
178 fae6e5f0 Christos Stavrakakis
            common.wait_server_task(new_port.machine, wait, stdout=self.stdout)