Revision 09b76b7e

b/snf-cyclades-app/synnefo/api/management/commands/port-inspect.py
35 35
from django.core.management.base import BaseCommand, CommandError
36 36

  
37 37
from synnefo.management.common import convert_api_faults
38
from synnefo.api.util import get_port
39
from synnefo.management import pprint
38
from synnefo.management import pprint, common
40 39

  
41 40

  
42 41
class Command(BaseCommand):
......
63 62
        if len(args) != 1:
64 63
            raise CommandError("Please provide a port ID")
65 64

  
66
        port = get_port(args[0], None)
65
        port = common.get_port(args[0])
67 66

  
68 67
        pprint.pprint_port(port, stdout=self.stdout)
69 68
        self.stdout.write('\n\n')
b/snf-cyclades-app/synnefo/api/management/commands/port-remove.py
31 31
from optparse import make_option
32 32
from django.core.management.base import BaseCommand, CommandError
33 33
from synnefo.logic import servers
34
from synnefo.api.util import get_port
35 34
from synnefo.management import common
36 35
from snf_django.management.utils import parse_bool
37 36

  
......
54 53
        if len(args) < 1:
55 54
            raise CommandError("Please provide a port ID")
56 55

  
57
        port = get_port(args[0], None, for_update=True)
56
        port = common.get_port(args[0], for_update=True)
58 57

  
59 58
        servers.delete_port(port)
60 59

  
b/snf-cyclades-app/synnefo/api/tests/ports.py
61 61
    def test_get_port(self):
62 62
        nic = dbmf.NetworkInterfaceFactory()
63 63
        url = join_urls(PORTS_URL, str(nic.id))
64
        response = self.get(url, user=nic.network.userid)
64
        response = self.get(url, user=nic.userid)
65 65
        self.assertEqual(response.status_code, 200)
66 66

  
67 67
    @patch("synnefo.db.models.get_rapi_client")
......
70 70
        url = join_urls(PORTS_URL, str(nic.id))
71 71
        mrapi().ModifyInstance.return_value = 42
72 72
        with override_settings(settings, GANETI_USE_HOTPLUG=True):
73
            response = self.delete(url, user=nic.network.userid)
73
            response = self.delete(url, user=nic.userid)
74 74
        self.assertEqual(response.status_code, 204)
75 75
        with override_settings(settings, GANETI_USE_HOTPLUG=False):
76
            response = self.delete(url, user=nic.network.userid)
76
            response = self.delete(url, user=nic.userid)
77 77
        self.assertEqual(response.status_code, 400)
78 78

  
79 79
    def test_remove_nic_malformed(self):
......
86 86
        url = join_urls(PORTS_URL, str(nic.id))
87 87
        request = {'port': {"name": "test-name"}}
88 88
        response = self.put(url, params=json.dumps(request),
89
                            user=nic.network.userid)
89
                            user=nic.userid)
90 90
        self.assertEqual(response.status_code, 200)
91 91
        res = json.loads(response.content)
92 92
        self.assertEqual(res['port']['name'], "test-name")
......
99 99
        url = join_urls(PORTS_URL, str(nic.id))
100 100
        request = {'port': {"security_groups": ["123"]}}
101 101
        response = self.put(url, params=json.dumps(request),
102
                            user=nic.network.userid)
102
                            user=nic.userid)
103 103
        self.assertEqual(response.status_code, 404)
104 104

  
105 105
    def test_update_port_sg(self):
......
112 112
        url = join_urls(PORTS_URL, str(nic.id))
113 113
        request = {'port': {"security_groups": [str(sg2.id), str(sg3.id)]}}
114 114
        response = self.put(url, params=json.dumps(request),
115
                            user=nic.network.userid)
115
                            user=nic.userid)
116 116
        res = json.loads(response.content)
117 117
        self.assertEqual(res['port']['security_groups'],
118 118
                         [str(sg2.id), str(sg3.id)])
b/snf-cyclades-app/synnefo/api/tests/servers.py
408 408

  
409 409
    def test_create_server_with_port(self, mrapi):
410 410
        mrapi().CreateInstance.return_value = 42
411
        port1 = mfactory.IPv4AddressFactory(nic=None)
411
        ip = mfactory.IPv4AddressFactory(nic__machine=None)
412
        port1 = ip.nic
412 413
        request = deepcopy(self.request)
413 414
        request["server"]["networks"] = [{"port": port1.id}]
414 415
        with mocked_quotaholder():
......
424 425
                                   json.dumps(request), 'json')
425 426
        self.assertConflict(response)
426 427
        # Test permissions
427
        port2 = mfactory.IPv4AddressFactory(userid="user1")
428
        ip = mfactory.IPv4AddressFactory(userid="user1", nic__userid="user1")
429
        port2 = ip.nic
428 430
        request["server"]["networks"] = [{"port": port2.id}]
429 431
        with mocked_quotaholder():
430 432
            response = self.mypost("servers", "user2",
b/snf-cyclades-app/synnefo/api/util.py
231 231
    Return a NetworkInteface instance or raise ItemNotFound.
232 232
    """
233 233
    try:
234
        objects = NetworkInterface.objects
234
        objects = NetworkInterface.objects.filter(userid=user_id)
235 235
        if for_update:
236 236
            objects = objects.select_for_update()
237

  
238
        if not user_id:
239
            port = objects.get(id=port_id)
240
        else:
241
            port = objects.get(network__userid=user_id, id=port_id)
242

  
243 237
        # if (port.device_owner != "vm") and for_update:
244 238
        #     raise faults.BadRequest('Can not update non vm port')
245

  
246
        return port
239
        return objects.get(id=port_id)
247 240
    except (ValueError, NetworkInterface.DoesNotExist):
248
        raise faults.ItemNotFound('Port not found.')
241
        raise faults.ItemNotFound("Port '%s' not found." % port_id)
249 242

  
250 243

  
251 244
def get_security_group(sg_id):
b/snf-cyclades-app/synnefo/db/models_factory.py
176 176
class NetworkInterfaceFactory(factory.DjangoModelFactory):
177 177
    FACTORY_FOR = models.NetworkInterface
178 178

  
179
    userid = factory.Sequence(user_seq())
179 180
    name = factory.LazyAttribute(lambda self: random_string(30))
180 181
    machine = factory.SubFactory(VirtualMachineFactory, operstate="STARTED")
181 182
    network = factory.SubFactory(NetworkFactory, state="ACTIVE")
......
231 232
        factory.LazyAttributeSequence(lambda self, n: self.subnet.cidr[:-4] +
232 233
                                      '{0}'.format(int(n) + 2))
233 234
    nic = factory.SubFactory(NetworkInterfaceFactory,
235
                             userid=factory.SelfAttribute('..userid'),
234 236
                             network=factory.SelfAttribute('..network'))
235 237

  
236 238

  
b/snf-cyclades-app/synnefo/logic/servers.py
261 261
        ports.append(port)
262 262

  
263 263
    for floating_ip_id in floating_ips:
264
        floating_ip = util.get_floating_ip_by_id(vm.userid, floating_ip_id,
264
        floating_ip = util.get_floating_ip_by_id(userid, floating_ip_id,
265 265
                                                 for_update=True)
266 266
        port = _create_port(userid, network=floating_ip.network,
267 267
                            use_ipaddress=floating_ip)
b/snf-cyclades-app/synnefo/management/common.py
34 34
from django.core.management import CommandError
35 35
from synnefo.db.models import (Backend, VirtualMachine, Network,
36 36
                               Flavor, IPAddress, Subnet,
37
                               BridgePoolTable, MacPrefixPoolTable)
37
                               BridgePoolTable, MacPrefixPoolTable,
38
                               NetworkInterface)
38 39
from functools import wraps
39 40

  
40 41
from snf_django.lib.api import faults
......
132 133
def get_subnet(subnet_id, for_update=True):
133 134
    """Get a Subnet object by its ID."""
134 135
    try:
135
        return Subnet.objects.get(id=subnet_id)
136
        subnets = Subnet.objects
137
        if for_update:
138
            subnets.select_for_update()
139
        return subnets.get(id=subnet_id)
136 140
    except Subnet.DoesNotExist:
137 141
        raise CommandError("Subnet with ID %s not found in DB."
138 142
                           " Use snf-manage subnet-list to find out"
139 143
                           " available subnet IDs" % subnet_id)
140 144

  
141 145

  
146
def get_port(port_id, for_update=True):
147
    """Get a port object by its ID."""
148
    try:
149
        ports = NetworkInterface.objects
150
        if for_update:
151
            ports.select_for_update()
152
        return ports.get(id=port_id)
153
    except NetworkInterface.DoesNotExist:
154
        raise CommandError("Port with ID %s not found in DB."
155
                           " Use snf-manage port-list to find out"
156
                           " available port IDs" % port_id)
157

  
158

  
142 159
def get_flavor(flavor_id):
143 160
    try:
144 161
        flavor_id = int(flavor_id)

Also available in: Unified diff