Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / ports.py @ 0069a20c

History | View | Annotate | Download (3.5 kB)

1
# Copyright 2011-2013 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
import ipaddr
34

    
35
from functools import wraps
36
from django.db import transaction
37

    
38
from django.conf import settings
39
from snf_django.lib.api import faults
40
from synnefo.api import util
41
from synnefo import quotas
42
from synnefo.db.models import NetworkInterface, IPAddress
43

    
44
from logging import getLogger
45
log = getLogger(__name__)
46

    
47

    
48
def port_command(action):
49
    def decorator(func):
50
        @wraps(func)
51
        @transaction.commit_on_success()
52
        def wrapper(port, *args, **kwargs):
53
            return func(port, *args, **kwargs)
54
        return wrapper
55
    return decorator
56

    
57
@transaction.commit_on_success
58
def create(network, machine, name="", security_groups=None,
59
           device_owner='vm'):
60

    
61
    if network.state != 'ACTIVE':
62
        raise faults.Conflict('Network build in process')
63

    
64
    #create the port
65
    port = NetworkInterface.objects.create(name=name,
66
                                           network=network,
67
                                           machine=machine,
68
                                           userid=machine.userid,
69
                                           device_owner=device_owner,
70
                                           state="BUILDING")
71
    #add the security groups if any
72
    if security_groups:
73
        port.security_groups.add(*security_groups)
74

    
75
    #add new port to every subnet of the network
76
    for subn in network.subnets.all():
77
        IPAddress.objects.create(subnet=subn,
78
                                 network=network,
79
                                 nic=port,
80
                                 userid=machine.userid,
81
                                 # FIXME
82
                                 address="192.168.0." + str(subn.id))
83

    
84
    # Issue commission to Quotaholder and accept it since at the end of
85
    # this transaction the Network object will be created in the DB.
86
    # Note: the following call does a commit!
87
    #quotas.issue_and_accept_commission(new_port)
88

    
89
    return port
90

    
91
@transaction.commit_on_success
92
def delete(port):
93
    port.ips.all().delete()
94
    port.delete()