Revision bf5c82dc

b/snf-cyclades-app/synnefo/api/actions.py
49 49
from synnefo.logic import backend
50 50
from synnefo.logic.utils import get_rsapi_state
51 51

  
52
from logging import getLogger
53
log = getLogger(__name__)
54

  
52 55

  
53 56
server_actions = {}
54 57
network_actions = {}
......
90 93

  
91 94
    raise ServiceUnavailable('Changing password is not supported.')
92 95

  
96

  
93 97
@server_action('reboot')
94 98
def reboot(request, vm, args):
95 99
    # Normal Response Code: 202
......
102 106
    #                       buildInProgress (409),
103 107
    #                       overLimit (413)
104 108

  
109
    log.info("Reboot VM %s", vm)
105 110
    reboot_type = args.get('type', '')
106 111
    if reboot_type not in ('SOFT', 'HARD'):
107 112
        raise BadRequest('Malformed Request.')
108 113
    backend.reboot_instance(vm, reboot_type.lower())
109 114
    return HttpResponse(status=202)
110 115

  
116

  
111 117
@server_action('start')
112 118
def start(request, vm, args):
113 119
    # Normal Response Code: 202
114 120
    # Error Response Codes: serviceUnavailable (503),
115 121
    #                       itemNotFound (404)
116 122

  
123
    log.info("Start VM %s", vm)
117 124
    if args:
118 125
        raise BadRequest('Malformed Request.')
119 126
    backend.startup_instance(vm)
120 127
    return HttpResponse(status=202)
121 128

  
129

  
122 130
@server_action('shutdown')
123 131
def shutdown(request, vm, args):
124 132
    # Normal Response Code: 202
125 133
    # Error Response Codes: serviceUnavailable (503),
126 134
    #                       itemNotFound (404)
127 135

  
136
    log.info("Shutdown VM %s", vm)
128 137
    if args:
129 138
        raise BadRequest('Malformed Request.')
130 139
    backend.shutdown_instance(vm)
131 140
    return HttpResponse(status=202)
132 141

  
142

  
133 143
@server_action('rebuild')
134 144
def rebuild(request, vm, args):
135 145
    # Normal Response Code: 202
......
145 155

  
146 156
    raise ServiceUnavailable('Rebuild not supported.')
147 157

  
158

  
148 159
@server_action('resize')
149 160
def resize(request, vm, args):
150 161
    # Normal Response Code: 202
......
161 172

  
162 173
    raise ServiceUnavailable('Resize not supported.')
163 174

  
175

  
164 176
@server_action('confirmResize')
165 177
def confirm_resize(request, vm, args):
166 178
    # Normal Response Code: 204
......
177 189

  
178 190
    raise ServiceUnavailable('Resize not supported.')
179 191

  
192

  
180 193
@server_action('revertResize')
181 194
def revert_resize(request, vm, args):
182 195
    # Normal Response Code: 202
......
216 229
    #                       buildInProgress (409),
217 230
    #                       overLimit (413)
218 231

  
232
    log.info("Get console  VM %s", vm)
233

  
219 234
    console_type = args.get('type', '')
220 235
    if console_type != 'vnc':
221 236
        raise BadRequest('Type can only be "vnc".')
......
284 299
    #                       overLimit (413)
285 300

  
286 301
    profile = args.get('profile', '')
302
    log.info("Set VM %s firewall %s", vm, profile)
287 303
    if profile not in [x[0] for x in NetworkInterface.FIREWALL_PROFILES]:
288 304
        raise BadRequest("Unsupported firewall profile")
289 305
    backend.set_firewall_profile(vm, profile)
......
307 323
        raise BadRequest('Malformed Request.')
308 324
    vm = get_vm(server_id, request.user_uniq)
309 325

  
326
    log.info("Connect VM %s to Network %s", vm, net)
327

  
310 328
    net = Network.objects.get(id=net.id)
311 329

  
312 330
    if net.state != 'ACTIVE':
......
318 336
    except EmptyPool:
319 337
        raise ServiceUnavailable('Network is full')
320 338

  
339
    log.info("Connecting VM %s to Network %s(%s)", vm, net, address)
340

  
321 341
    backend.connect_to_network(vm, net, address)
322 342
    return HttpResponse(status=202)
323 343

  
......
347 367
    vm = get_vm(server_id, request.user_uniq)
348 368
    nic = get_nic_from_index(vm, nic_index)
349 369

  
370
    log.info("Disconnect VM %s NIC %s", vm, str(nic.index))
371

  
350 372
    if nic.dirty:
351 373
        raise BuildInProgress('Machine is busy.')
352 374
    else:
b/snf-cyclades-app/synnefo/api/images.py
113 113
    #                       badRequest (400),
114 114
    #                       overLimit (413)
115 115
    
116
    log.debug('list_images detail=%s', detail)
116
    log.info('list_images detail=%s', detail)
117 117
    backend = ImageBackend(request.user_uniq)
118 118
    
119 119
    since = isoparse(request.GET.get('changes-since'))
......
167 167
    #                       itemNotFound (404),
168 168
    #                       overLimit (413)
169 169
    
170
    log.debug('get_image_details %s', image_id)
170
    log.info('get_image_details %s', image_id)
171 171
    image = util.get_image(image_id, request.user_uniq)
172 172
    reply = image_to_dict(image)
173 173
    
......
188 188
    #                       itemNotFound (404),
189 189
    #                       overLimit (413)
190 190
    
191
    log.debug('delete_image %s', image_id)
191
    log.info('delete_image %s', image_id)
192 192
    backend = ImageBackend(request.user_uniq)
193 193
    backend.delete(image_id)
194 194
    backend.close()
......
205 205
    #                       badRequest (400),
206 206
    #                       overLimit (413)
207 207
    
208
    log.debug('list_image_metadata %s', image_id)
208
    log.info('list_image_metadata %s', image_id)
209 209
    image = util.get_image(image_id, request.user_uniq)
210 210
    metadata = image['properties']
211 211
    return util.render_metadata(request, metadata, use_values=True, status=200)
......
223 223
    #                       overLimit (413)
224 224
    
225 225
    req = util.get_request_dict(request)
226
    log.debug('update_image_metadata %s %s', image_id, req)
226
    log.info('update_image_metadata %s %s', image_id, req)
227 227
    image = util.get_image(image_id, request.user_uniq)
228 228
    try:
229 229
        metadata = req['metadata']
......
251 251
    #                       badRequest (400),
252 252
    #                       overLimit (413)
253 253
    
254
    log.debug('get_image_metadata_item %s %s', image_id, key)
254
    log.info('get_image_metadata_item %s %s', image_id, key)
255 255
    image = util.get_image(image_id, request.user_uniq)
256 256
    val = image['properties'].get(key)
257 257
    if val is None:
......
272 272
    #                       overLimit (413)
273 273
    
274 274
    req = util.get_request_dict(request)
275
    log.debug('create_image_metadata_item %s %s %s', image_id, key, req)
275
    log.info('create_image_metadata_item %s %s %s', image_id, key, req)
276 276
    try:
277 277
        metadict = req['meta']
278 278
        assert isinstance(metadict, dict)
......
305 305
    #                       badMediaType(415),
306 306
    #                       overLimit (413),
307 307
    
308
    log.debug('delete_image_metadata_item %s %s', image_id, key)
308
    log.info('delete_image_metadata_item %s %s', image_id, key)
309 309
    image = util.get_image(image_id, request.user_uniq)
310 310
    properties = image['properties']
311 311
    properties.pop(key, None)
b/snf-cyclades-app/synnefo/api/networks.py
118 118
    #                       badRequest (400),
119 119
    #                       overLimit (413)
120 120

  
121
    log.debug('list_networks detail=%s', detail)
121
    log.info('list_networks detail=%s', detail)
122 122
    since = util.isoparse(request.GET.get('changes-since'))
123 123
    user_networks = Network.objects.filter(Q(userid=request.user_uniq) |
124 124
                                           Q(public=True))
......
155 155
    #                       overLimit (413)
156 156

  
157 157
    req = util.get_request_dict(request)
158
    log.debug('create_network %s', req)
158
    log.info('create_network %s', req)
159 159

  
160 160
    try:
161 161
        d = req['network']
......
223 223
    #                       itemNotFound (404),
224 224
    #                       overLimit (413)
225 225

  
226
    log.debug('get_network_details %s', network_id)
226
    log.info('get_network_details %s', network_id)
227 227
    net = util.get_network(network_id, request.user_uniq)
228 228
    netdict = network_to_dict(net, request.user_uniq)
229 229
    return render_network(request, netdict)
......
241 241
    #                       overLimit (413)
242 242

  
243 243
    req = util.get_request_dict(request)
244
    log.debug('update_network_name %s', network_id)
244
    log.info('update_network_name %s', network_id)
245 245

  
246 246
    try:
247 247
        name = req['network']['name']
......
267 267
    #                       unauthorized (401),
268 268
    #                       overLimit (413)
269 269

  
270
    log.debug('delete_network %s', network_id)
270
    log.info('delete_network %s', network_id)
271 271
    net = util.get_network(network_id, request.user_uniq, for_update=True)
272 272
    if net.public:
273 273
        raise Unauthorized('Can not delete the public network.')
......
285 285
@util.api_method('POST')
286 286
def network_action(request, network_id):
287 287
    req = util.get_request_dict(request)
288
    log.debug('network_action %s %s', network_id, req)
288
    log.info('network_action %s %s', network_id, req)
289 289
    if len(req) != 1:
290 290
        raise BadRequest('Malformed request.')
291 291

  
b/snf-cyclades-app/synnefo/api/servers.py
32 32
# or implied, of GRNET S.A.
33 33

  
34 34
from base64 import b64decode
35
from logging import getLogger
36 35

  
37 36
from django.conf import settings
38 37
from django.conf.urls.defaults import patterns
......
44 43
from synnefo.api import faults, util
45 44
from synnefo.api.actions import server_actions
46 45
from synnefo.api.common import method_not_allowed
47
from synnefo.db.models import Backend, VirtualMachine, VirtualMachineMetadata
46
from synnefo.db.models import VirtualMachine, VirtualMachineMetadata
48 47
from synnefo.logic.backend import create_instance, delete_instance
49 48
from synnefo.logic.utils import get_rsapi_state
50 49
from synnefo.util.rapi import GanetiApiError
51 50
from synnefo.logic.backend_allocator import BackendAllocator
52 51

  
53
from django.utils import importlib
54

  
55

  
56 52

  
53
from logging import getLogger
57 54
log = getLogger('synnefo.api')
58 55

  
59 56
urlpatterns = patterns('synnefo.api.servers',
......
162 159
    #                       badRequest (400),
163 160
    #                       overLimit (413)
164 161

  
165
    log.debug('list_servers detail=%s', detail)
162
    log.info('list_servers detail=%s', detail)
166 163
    user_vms = VirtualMachine.objects.filter(userid=request.user_uniq)
167 164

  
168 165
    since = util.isoparse(request.GET.get('changes-since'))
......
202 199
    #                       serverCapacityUnavailable (503),
203 200
    #                       overLimit (413)
204 201
    req = util.get_request_dict(request)
205
    log.debug('create_server %s', req)
202
    log.info('create_server %s', req)
206 203

  
207 204
    try:
208 205
        server = req['server']
......
285 282
        imageid=image_id,
286 283
        flavor=flavor)
287 284

  
285
    log.info("Create VM %s, with NIC %s, on Backend %s", vm, nic, backend)
286

  
288 287
    try:
289 288
        jobID = create_instance(vm, nic, flavor, image, password, personality)
290 289
    except GanetiApiError:
......
323 322
    #                       itemNotFound (404),
324 323
    #                       overLimit (413)
325 324

  
326
    log.debug('get_server_details %s', server_id)
325
    log.info('get_server_details %s', server_id)
327 326
    vm = util.get_vm(server_id, request.user_uniq)
328 327
    server = vm_to_dict(vm, detail=True)
329 328
    return render_server(request, server)
......
342 341
    #                       overLimit (413)
343 342

  
344 343
    req = util.get_request_dict(request)
345
    log.debug('update_server_name %s %s', server_id, req)
344
    log.info('update_server_name %s %s', server_id, req)
346 345

  
347 346
    try:
348 347
        name = req['server']['name']
......
368 367
    #                       buildInProgress (409),
369 368
    #                       overLimit (413)
370 369

  
371
    log.debug('delete_server %s', server_id)
370
    log.info('delete_server %s', server_id)
372 371
    vm = util.get_vm(server_id, request.user_uniq)
373 372
    delete_instance(vm)
374 373
    return HttpResponse(status=204)
......
377 376
@util.api_method('POST')
378 377
def server_action(request, server_id):
379 378
    req = util.get_request_dict(request)
380
    log.debug('server_action %s %s', server_id, req)
379
    log.info('server_action %s %s', server_id, req)
381 380
    vm = util.get_vm(server_id, request.user_uniq)
382 381
    if len(req) != 1:
383 382
        raise faults.BadRequest("Malformed request")
......
403 402
    #                       badRequest (400),
404 403
    #                       overLimit (413)
405 404

  
406
    log.debug('list_addresses %s', server_id)
405
    log.info('list_addresses %s', server_id)
407 406
    vm = util.get_vm(server_id, request.user_uniq)
408 407
    addresses = [nic_to_dict(nic) for nic in vm.nics.all()]
409 408

  
......
425 424
    #                       itemNotFound (404),
426 425
    #                       overLimit (413)
427 426

  
428
    log.debug('list_addresses_by_network %s %s', server_id, network_id)
427
    log.info('list_addresses_by_network %s %s', server_id, network_id)
429 428
    machine = util.get_vm(server_id, request.user_uniq)
430 429
    network = util.get_network(network_id, request.user_uniq)
431 430
    nic = util.get_nic(machine, network)
......
448 447
    #                       badRequest (400),
449 448
    #                       overLimit (413)
450 449

  
451
    log.debug('list_server_metadata %s', server_id)
450
    log.info('list_server_metadata %s', server_id)
452 451
    vm = util.get_vm(server_id, request.user_uniq)
453 452
    metadata = dict((m.meta_key, m.meta_value) for m in vm.metadata.all())
454 453
    return util.render_metadata(request, metadata, use_values=True, status=200)
......
466 465
    #                       overLimit (413)
467 466

  
468 467
    req = util.get_request_dict(request)
469
    log.debug('update_server_metadata %s %s', server_id, req)
468
    log.info('update_server_metadata %s %s', server_id, req)
470 469
    vm = util.get_vm(server_id, request.user_uniq)
471 470
    try:
472 471
        metadata = req['metadata']
......
494 493
    #                       badRequest (400),
495 494
    #                       overLimit (413)
496 495

  
497
    log.debug('get_server_metadata_item %s %s', server_id, key)
496
    log.info('get_server_metadata_item %s %s', server_id, key)
498 497
    vm = util.get_vm(server_id, request.user_uniq)
499 498
    meta = util.get_vm_meta(vm, key)
500 499
    d = {meta.meta_key: meta.meta_value}
......
515 514
    #                       overLimit (413)
516 515

  
517 516
    req = util.get_request_dict(request)
518
    log.debug('create_server_metadata_item %s %s %s', server_id, key, req)
517
    log.info('create_server_metadata_item %s %s %s', server_id, key, req)
519 518
    vm = util.get_vm(server_id, request.user_uniq)
520 519
    try:
521 520
        metadict = req['meta']
......
549 548
    #                       badMediaType(415),
550 549
    #                       overLimit (413),
551 550

  
552
    log.debug('delete_server_metadata_item %s %s', server_id, key)
551
    log.info('delete_server_metadata_item %s %s', server_id, key)
553 552
    vm = util.get_vm(server_id, request.user_uniq)
554 553
    meta = util.get_vm_meta(vm, key)
555 554
    meta.delete()
......
567 566
    #                       itemNotFound (404),
568 567
    #                       overLimit (413)
569 568

  
570
    log.debug('server_stats %s', server_id)
569
    log.info('server_stats %s', server_id)
571 570
    vm = util.get_vm(server_id, request.user_uniq)
572 571
    #secret = util.encrypt(vm.backend_vm_id)
573 572
    secret = vm.backend_vm_id      # XXX disable backend id encryption
b/snf-cyclades-app/synnefo/db/models.py
106 106
        ordering = ["clustername"]
107 107

  
108 108
    def __unicode__(self):
109
        return self.clustername
109
        return self.clustername + "(id=" + str(self.id) + ")"
110 110

  
111 111
    @property
112 112
    def backend_id(self):
......
358 358
        get_latest_by = 'created'
359 359

  
360 360
    def __unicode__(self):
361
        return self.name
361
        return self.name + "(id=" + str(self.id) + ")"
362 362

  
363 363

  
364 364
class VirtualMachineMetadata(models.Model):
......
467 467
        return getattr(snf_settings, self.type + '_TAGS')
468 468

  
469 469
    def __unicode__(self):
470
        return self.name
470
        return self.name + "(id=" + str(self.id) + ")"
471 471

  
472 472
    @transaction.commit_on_success
473 473
    def update_state(self):
b/snf-cyclades-app/synnefo/logic/backend.py
217 217

  
218 218
def start_action(vm, action):
219 219
    """Update the state of a VM when a new action is initiated."""
220
    log.debug("Applying action %s to VM %s", action, vm)
221

  
220 222
    if not action in [x[0] for x in VirtualMachine.ACTIONS]:
221 223
        raise VirtualMachine.InvalidActionError(action)
222 224

  
......
326 328

  
327 329
    # Defined in settings.GANETI_CREATEINSTANCE_KWARGS
328 330
    # kw['hvparams'] = dict(serial_console=False)
331
    log.debug("Creating instance %s", kw)
329 332
    with pooled_rapi_client(vm) as client:
330 333
        return client.CreateInstance(**kw)
331 334

  
......
339 342
def reboot_instance(vm, reboot_type):
340 343
    assert reboot_type in ('soft', 'hard')
341 344
    with pooled_rapi_client(vm) as client:
342
        return client.RebootInstance(vm.backend_vm_id, reboot_type, dry_run=settings.TEST)
345
        return client.RebootInstance(vm.backend_vm_id, reboot_type,
346
                                     dry_run=settings.TEST)
343 347

  
344 348

  
345 349
def startup_instance(vm):
......
366 370
    #          the instance's primary node, and is probably
367 371
    #          hypervisor-specific.
368 372
    #
373
    log.debug("Getting console for vm %s", vm)
374

  
369 375
    console = {}
370 376
    console['kind'] = 'vnc'
371 377

  
......
390 396
    if not backends:
391 397
        backends = Backend.objects.exclude(offline=True)
392 398

  
399
    log.debug("Creating network %s in backends %s", network, backends)
400

  
393 401
    for backend in backends:
394 402
        create_jobID = _create_network(network, backend)
395 403
        if connect:
......
424 432

  
425 433
def connect_network(network, backend, depend_job=None, group=None):
426 434
    """Connect a network to nodegroups."""
435
    log.debug("Connecting network %s to backend %s", network, backend)
436

  
427 437
    mode = "routed" if "ROUTED" in network.type else "bridged"
428 438

  
429 439
    with pooled_rapi_client(backend) as client:
......
440 450
    if not backends:
441 451
        backends = Backend.objects.exclude(offline=True)
442 452

  
453
    log.debug("Deleting network %s from backends %s", network, backends)
454

  
443 455
    for backend in backends:
444 456
        disconnect_jobIDs = []
445 457
        if disconnect:
......
453 465

  
454 466

  
455 467
def disconnect_network(network, backend, group=None):
468
    log.debug("Disconnecting network %s to backend %s", network, backend)
469

  
456 470
    with pooled_rapi_client(backend) as client:
457 471
        if group:
458 472
            return [client.DisconnectNetwork(network.backend_id, group)]
......
467 481
def connect_to_network(vm, network, address):
468 482
    nic = {'ip': address, 'network': network.backend_id}
469 483

  
484
    log.debug("Connecting vm %s to network %s(%s)", vm, network, address)
485

  
470 486
    with pooled_rapi_client(vm) as client:
471 487
        return client.ModifyInstance(vm.backend_vm_id, nics=[('add',  nic)],
472 488
                                     hotplug=settings.GANETI_USE_HOTPLUG,
......
475 491

  
476 492
def disconnect_from_network(vm, nic):
477 493
    op = [('remove', nic.index, {})]
494

  
495
    log.debug("Removing nic of VM %s, with index %s", vm, str(nic.index))
496

  
478 497
    with pooled_rapi_client(vm) as client:
479 498
        return client.ModifyInstance(vm.backend_vm_id, nics=op,
480 499
                                     hotplug=settings.GANETI_USE_HOTPLUG,
......
487 506
    except KeyError:
488 507
        raise ValueError("Unsopported Firewall Profile: %s" % profile)
489 508

  
509
    log.debug("Setting tag of VM %s to %s", vm, profile)
510

  
490 511
    with pooled_rapi_client(vm) as client:
491 512
        # Delete all firewall tags
492 513
        for t in _firewall_tags.values():

Also available in: Unified diff