Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / management / commands / floating-ip-create.py @ 9d1e6480

History | View | Annotate | Download (4 kB)

1 f29f1326 Marios Kogias
# Copyright 2012 GRNET S.A. All rights reserved.
2 f29f1326 Marios Kogias
#
3 f29f1326 Marios Kogias
# Redistribution and use in source and binary forms, with or
4 f29f1326 Marios Kogias
# without modification, are permitted provided that the following
5 f29f1326 Marios Kogias
# conditions are met:
6 f29f1326 Marios Kogias
#
7 f29f1326 Marios Kogias
#   1. Redistributions of source code must retain the above
8 f29f1326 Marios Kogias
#      copyright notice, this list of conditions and the following
9 f29f1326 Marios Kogias
#      disclaimer.
10 f29f1326 Marios Kogias
#
11 f29f1326 Marios Kogias
#   2. Redistributions in binary form must reproduce the above
12 f29f1326 Marios Kogias
#      copyright notice, this list of conditions and the following
13 f29f1326 Marios Kogias
#      disclaimer in the documentation and/or other materials
14 f29f1326 Marios Kogias
#      provided with the distribution.
15 f29f1326 Marios Kogias
#
16 f29f1326 Marios Kogias
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 f29f1326 Marios Kogias
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 f29f1326 Marios Kogias
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 f29f1326 Marios Kogias
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 f29f1326 Marios Kogias
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 f29f1326 Marios Kogias
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 f29f1326 Marios Kogias
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 f29f1326 Marios Kogias
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 f29f1326 Marios Kogias
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 f29f1326 Marios Kogias
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 f29f1326 Marios Kogias
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 f29f1326 Marios Kogias
# POSSIBILITY OF SUCH DAMAGE.
28 f29f1326 Marios Kogias
#
29 f29f1326 Marios Kogias
# The views and conclusions contained in the software and
30 f29f1326 Marios Kogias
# documentation are those of the authors and should not be
31 f29f1326 Marios Kogias
# interpreted as representing official policies, either expressed
32 f29f1326 Marios Kogias
# or implied, of GRNET S.A.
33 f29f1326 Marios Kogias
34 f29f1326 Marios Kogias
from optparse import make_option
35 f29f1326 Marios Kogias
36 f29f1326 Marios Kogias
from django.db import transaction
37 f29f1326 Marios Kogias
from django.core.management.base import BaseCommand, CommandError
38 f29f1326 Marios Kogias
from synnefo.management.common import convert_api_faults
39 f29f1326 Marios Kogias
40 f29f1326 Marios Kogias
from synnefo.api import util
41 f29f1326 Marios Kogias
from synnefo.db import pools
42 f29f1326 Marios Kogias
from synnefo import quotas
43 f29f1326 Marios Kogias
44 f29f1326 Marios Kogias
45 f29f1326 Marios Kogias
class Command(BaseCommand):
46 f29f1326 Marios Kogias
    can_import_settings = True
47 f29f1326 Marios Kogias
    output_transaction = True
48 f29f1326 Marios Kogias
49 f29f1326 Marios Kogias
    help = "Allocate a new floating IP"
50 f29f1326 Marios Kogias
51 f29f1326 Marios Kogias
    option_list = BaseCommand.option_list + (
52 f29f1326 Marios Kogias
        make_option(
53 f29f1326 Marios Kogias
            '--pool',
54 f29f1326 Marios Kogias
            dest='pool',
55 f29f1326 Marios Kogias
            help="The IP pool to allocate the address from"),
56 f29f1326 Marios Kogias
        make_option(
57 f29f1326 Marios Kogias
            '--address',
58 f29f1326 Marios Kogias
            dest='address',
59 f29f1326 Marios Kogias
            help="The address to be allocated"),
60 f29f1326 Marios Kogias
        make_option(
61 f29f1326 Marios Kogias
            '--owner',
62 f29f1326 Marios Kogias
            dest='owner',
63 f29f1326 Marios Kogias
            default=None,
64 f29f1326 Marios Kogias
            # required=True,
65 f29f1326 Marios Kogias
            help='The owner of the floating IP'),
66 f29f1326 Marios Kogias
    )
67 f29f1326 Marios Kogias
68 f29f1326 Marios Kogias
    @transaction.commit_on_success
69 f29f1326 Marios Kogias
    @convert_api_faults
70 f29f1326 Marios Kogias
    def handle(self, *args, **options):
71 f29f1326 Marios Kogias
        if args:
72 f29f1326 Marios Kogias
            raise CommandError("Command doesn't accept any arguments")
73 f29f1326 Marios Kogias
74 f29f1326 Marios Kogias
        pool = options['pool']
75 f29f1326 Marios Kogias
        address = options['address']
76 f29f1326 Marios Kogias
        owner = options['owner']
77 f29f1326 Marios Kogias
78 f29f1326 Marios Kogias
        if not owner:
79 f29f1326 Marios Kogias
            raise CommandError("'owner' is required for floating IP creation")
80 f29f1326 Marios Kogias
81 f29f1326 Marios Kogias
        if pool is None:
82 f29f1326 Marios Kogias
            if address:
83 f29f1326 Marios Kogias
                raise CommandError('Please specify a pool as well')
84 f29f1326 Marios Kogias
85 f29f1326 Marios Kogias
            # User did not specified a pool. Choose a random public IP
86 f29f1326 Marios Kogias
            try:
87 f29f1326 Marios Kogias
                floating_ip = util.allocate_public_ip(userid=owner,
88 f29f1326 Marios Kogias
                                                      floating_ip=True)
89 f29f1326 Marios Kogias
            except pools.EmptyPool:
90 f29f1326 Marios Kogias
                raise faults.Conflict("No more IP addresses available.")
91 f29f1326 Marios Kogias
        else:
92 f29f1326 Marios Kogias
            try:
93 f29f1326 Marios Kogias
                network_id = int(pool)
94 f29f1326 Marios Kogias
            except ValueError:
95 f29f1326 Marios Kogias
                raise CommandError("Invalid pool ID.")
96 f29f1326 Marios Kogias
            network = util.get_network(network_id, owner, for_update=True,
97 f29f1326 Marios Kogias
                                       non_deleted=True)
98 f29f1326 Marios Kogias
            if not network.floating_ip_pool:
99 f29f1326 Marios Kogias
                # Check that it is a floating IP pool
100 f29f1326 Marios Kogias
                raise CommandError("Floating IP pool %s does not exist." %
101 f29f1326 Marios Kogias
                                           network_id)
102 f29f1326 Marios Kogias
            floating_ip = util.allocate_ip(network, owner, address=address,
103 f29f1326 Marios Kogias
                                           floating_ip=True)
104 f29f1326 Marios Kogias
105 f29f1326 Marios Kogias
        quotas.issue_and_accept_commission(floating_ip)
106 f29f1326 Marios Kogias
        transaction.commit()
107 f29f1326 Marios Kogias
108 f29f1326 Marios Kogias
        self.stdout.write("Created floating IP '%s'.\n" % floating_ip)