Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / networks.py @ 8e440b3a

History | View | Annotate | Download (4.6 kB)

1 ece5581b Christos Stavrakakis
# Copyright 2011-2013 GRNET S.A. All rights reserved.
2 ece5581b Christos Stavrakakis
#
3 ece5581b Christos Stavrakakis
# Redistribution and use in source and binary forms, with or
4 ece5581b Christos Stavrakakis
# without modification, are permitted provided that the following
5 ece5581b Christos Stavrakakis
# conditions are met:
6 ece5581b Christos Stavrakakis
#
7 ece5581b Christos Stavrakakis
#   1. Redistributions of source code must retain the above
8 ece5581b Christos Stavrakakis
#      copyright notice, this list of conditions and the following
9 ece5581b Christos Stavrakakis
#      disclaimer.
10 ece5581b Christos Stavrakakis
#
11 ece5581b Christos Stavrakakis
#   2. Redistributions in binary form must reproduce the above
12 ece5581b Christos Stavrakakis
#      copyright notice, this list of conditions and the following
13 ece5581b Christos Stavrakakis
#      disclaimer in the documentation and/or other materials
14 ece5581b Christos Stavrakakis
#      provided with the distribution.
15 ece5581b Christos Stavrakakis
#
16 ece5581b Christos Stavrakakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 ece5581b Christos Stavrakakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 ece5581b Christos Stavrakakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 ece5581b Christos Stavrakakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 ece5581b Christos Stavrakakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 ece5581b Christos Stavrakakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 ece5581b Christos Stavrakakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 ece5581b Christos Stavrakakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 ece5581b Christos Stavrakakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 ece5581b Christos Stavrakakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 ece5581b Christos Stavrakakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 ece5581b Christos Stavrakakis
# POSSIBILITY OF SUCH DAMAGE.
28 ece5581b Christos Stavrakakis
#
29 ece5581b Christos Stavrakakis
# The views and conclusions contained in the software and
30 ece5581b Christos Stavrakakis
# documentation are those of the authors and should not be
31 ece5581b Christos Stavrakakis
# interpreted as representing official policies, either expressed
32 ece5581b Christos Stavrakakis
# or implied, of GRNET S.A.
33 ece5581b Christos Stavrakakis
from functools import wraps
34 ece5581b Christos Stavrakakis
from django.db import transaction
35 ece5581b Christos Stavrakakis
36 ece5581b Christos Stavrakakis
from snf_django.lib.api import faults
37 ece5581b Christos Stavrakakis
from synnefo.api import util
38 ece5581b Christos Stavrakakis
from synnefo import quotas
39 ece5581b Christos Stavrakakis
from synnefo.db.models import Network
40 ece5581b Christos Stavrakakis
from synnefo.db.utils import validate_mac
41 ece5581b Christos Stavrakakis
from synnefo.db.pools import EmptyPool
42 ece5581b Christos Stavrakakis
from synnefo.logic import backend
43 ece5581b Christos Stavrakakis
44 ece5581b Christos Stavrakakis
from logging import getLogger
45 ece5581b Christos Stavrakakis
log = getLogger(__name__)
46 ece5581b Christos Stavrakakis
47 ece5581b Christos Stavrakakis
48 ece5581b Christos Stavrakakis
def validate_network_action(network, action):
49 ece5581b Christos Stavrakakis
    if network.deleted:
50 ece5581b Christos Stavrakakis
        raise faults.BadRequest("Network has been deleted.")
51 ece5581b Christos Stavrakakis
52 ece5581b Christos Stavrakakis
53 ece5581b Christos Stavrakakis
def network_command(action):
54 ece5581b Christos Stavrakakis
    def decorator(func):
55 ece5581b Christos Stavrakakis
        @wraps(func)
56 ece5581b Christos Stavrakakis
        @transaction.commit_on_success()
57 ece5581b Christos Stavrakakis
        def wrapper(network, *args, **kwargs):
58 ece5581b Christos Stavrakakis
            validate_network_action(network, action)
59 ece5581b Christos Stavrakakis
            return func(network, *args, **kwargs)
60 ece5581b Christos Stavrakakis
        return wrapper
61 ece5581b Christos Stavrakakis
    return decorator
62 ece5581b Christos Stavrakakis
63 ece5581b Christos Stavrakakis
64 ece5581b Christos Stavrakakis
@transaction.commit_on_success
65 ece5581b Christos Stavrakakis
def create(user_id, name, flavor, subnet, gateway=None, subnet6=None,
66 ece5581b Christos Stavrakakis
           gateway6=None, public=False, dhcp=True):
67 ece5581b Christos Stavrakakis
    if flavor is None:
68 ece5581b Christos Stavrakakis
        raise faults.BadRequest("Missing request parameter 'type'")
69 ece5581b Christos Stavrakakis
    elif flavor not in Network.FLAVORS.keys():
70 ece5581b Christos Stavrakakis
        raise faults.BadRequest("Invalid network type '%s'" % flavor)
71 ece5581b Christos Stavrakakis
72 ece5581b Christos Stavrakakis
    # Check that network parameters are valid
73 ece5581b Christos Stavrakakis
    util.validate_network_params(subnet, gateway, subnet6, gateway6)
74 ece5581b Christos Stavrakakis
75 ece5581b Christos Stavrakakis
    try:
76 ece5581b Christos Stavrakakis
        mode, link, mac_prefix, tags = util.values_from_flavor(flavor)
77 ece5581b Christos Stavrakakis
    except EmptyPool:
78 ece5581b Christos Stavrakakis
        log.error("Failed to allocate resources for network of type: %s",
79 ece5581b Christos Stavrakakis
                  flavor)
80 ece5581b Christos Stavrakakis
        msg = "Failed to allocate resources for network."
81 ece5581b Christos Stavrakakis
        raise faults.ServiceUnavailable(msg)
82 ece5581b Christos Stavrakakis
    validate_mac(mac_prefix + "0:00:00:00")
83 ece5581b Christos Stavrakakis
84 ece5581b Christos Stavrakakis
    network = Network.objects.create(
85 ece5581b Christos Stavrakakis
        name=name,
86 ece5581b Christos Stavrakakis
        userid=user_id,
87 ece5581b Christos Stavrakakis
        subnet=subnet,
88 ece5581b Christos Stavrakakis
        subnet6=subnet6,
89 ece5581b Christos Stavrakakis
        gateway=gateway,
90 ece5581b Christos Stavrakakis
        gateway6=gateway6,
91 ece5581b Christos Stavrakakis
        dhcp=dhcp,
92 ece5581b Christos Stavrakakis
        flavor=flavor,
93 ece5581b Christos Stavrakakis
        mode=mode,
94 ece5581b Christos Stavrakakis
        link=link,
95 ece5581b Christos Stavrakakis
        mac_prefix=mac_prefix,
96 ece5581b Christos Stavrakakis
        tags=tags,
97 ece5581b Christos Stavrakakis
        action='CREATE',
98 ece5581b Christos Stavrakakis
        state='ACTIVE')
99 ece5581b Christos Stavrakakis
100 ece5581b Christos Stavrakakis
    # Issue commission to Quotaholder and accept it since at the end of
101 ece5581b Christos Stavrakakis
    # this transaction the Network object will be created in the DB.
102 ece5581b Christos Stavrakakis
    # Note: the following call does a commit!
103 ece5581b Christos Stavrakakis
    quotas.issue_and_accept_commission(network)
104 ece5581b Christos Stavrakakis
    return network
105 ece5581b Christos Stavrakakis
106 ece5581b Christos Stavrakakis
107 ece5581b Christos Stavrakakis
@network_command("RENAME")
108 ece5581b Christos Stavrakakis
def rename(network, name):
109 ece5581b Christos Stavrakakis
    network.name = name
110 ece5581b Christos Stavrakakis
    network.save()
111 ece5581b Christos Stavrakakis
    return network
112 ece5581b Christos Stavrakakis
113 ece5581b Christos Stavrakakis
114 ece5581b Christos Stavrakakis
@network_command("DESTROY")
115 ece5581b Christos Stavrakakis
def delete(network):
116 ece5581b Christos Stavrakakis
    if network.machines.exists():
117 ece5581b Christos Stavrakakis
        raise faults.NetworkInUse("Can not delete network. Servers connected"
118 ece5581b Christos Stavrakakis
                                  " to this network exists.")
119 ece5581b Christos Stavrakakis
    if network.floating_ips.filter(deleted=False).exists():
120 ece5581b Christos Stavrakakis
        msg = "Can not delete netowrk. Network has allocated floating IPs."
121 ece5581b Christos Stavrakakis
        raise faults.NetworkInUse(msg)
122 ece5581b Christos Stavrakakis
123 ece5581b Christos Stavrakakis
    network.action = "DESTROY"
124 ece5581b Christos Stavrakakis
    network.save()
125 ece5581b Christos Stavrakakis
126 ece5581b Christos Stavrakakis
    # Delete network to all backends that exists
127 ece5581b Christos Stavrakakis
    backend_networks = network.backend_networks.exclude(operstate="DELETED")
128 ece5581b Christos Stavrakakis
    for bnet in backend_networks:
129 ece5581b Christos Stavrakakis
        backend.delete_network(network, bnet.backend)
130 ece5581b Christos Stavrakakis
    # If network does not exist in any backend, update the network state
131 ece5581b Christos Stavrakakis
    if not backend_networks:
132 ece5581b Christos Stavrakakis
        backend.update_network_state(network)
133 ece5581b Christos Stavrakakis
    return network