Revision 7cc3c7d9

b/admin/views.py
136 136
    if not image.format:
137 137
        formats = [''] + formats
138 138
    
139
    metadata = image.imagemetadata_set.order_by('meta_key')
139
    metadata = image.metadata.order_by('meta_key')
140 140
    html = render('images_info.html', 'images',
141 141
                    image=image,
142 142
                    states=states,
......
162 162
    keys = request.POST.getlist('key')
163 163
    vals = request.POST.getlist('value')
164 164
    meta = dict(zip(keys, vals))
165
    image.imagemetadata_set.all().delete()
165
    image.metadata.all().delete()
166 166
    for key, val in meta.items():
167 167
        if key:
168
            image.imagemetadata_set.create(meta_key=key, meta_value=val)
168
            image.metadata.create(meta_key=key, meta_value=val)
169 169
    
170 170
    _log.info('User %s modified Image %s', request.user.name, image.name)
171 171

  
b/api/images.py
105 105

  
106 106
    return d
107 107

  
108
def metadata_to_dict(image):
109
    image_meta = image.imagemetadata_set.all()
110
    return dict((meta.meta_key, meta.meta_value) for meta in image_meta)
111

  
112 108

  
113 109
@util.api_method('GET')
114 110
def list_images(request, detail=False):
......
220 216
    #                       overLimit (413)
221 217

  
222 218
    image = util.get_image(image_id, request.user)
223
    metadata = metadata_to_dict(image)
219
    metadata = dict((m.meta_key, m.meta_value) for m in image.metadata.all())
224 220
    return util.render_metadata(request, metadata, use_values=True, status=200)
225 221

  
226 222
@util.api_method('POST')
......
241 237
        assert isinstance(metadata, dict)
242 238
    except (KeyError, AssertionError):
243 239
        raise BadRequest('Malformed request.')
244

  
245
    updated = {}
246

  
247
    for key, val in metadata.items():
248
        try:
249
            meta = ImageMetadata.objects.get(meta_key=key, image=image)
250
            meta.meta_value = val
251
            meta.save()
252
            updated[key] = val
253
        except ImageMetadata.DoesNotExist:
254
            pass    # Ignore non-existent metadata
255 240
    
256
    if updated:
257
        image.save()
241
    for key, val in metadata.items():
242
        meta, created = image.metadata.get_or_create(meta_key=key)
243
        meta.meta_value = val
244
        meta.save()
258 245
    
259
    return util.render_metadata(request, updated, status=201)
246
    image.save()
247
    image_meta = dict((m.meta_key, m.meta_value) for m in image.metadata.all())
248
    return util.render_metadata(request, image_meta, status=201)
260 249

  
261 250
@util.api_method('GET')
262 251
def get_metadata_item(request, image_id, key):
b/api/servers.py
118 118
    return d
119 119

  
120 120

  
121
def metadata_to_dict(vm):
122
    vm_meta = vm.virtualmachinemetadata_set.all()
123
    return dict((meta.meta_key, meta.meta_value) for meta in vm_meta)
124

  
125

  
126 121
def vm_to_dict(vm, detail=False):
127 122
    d = dict(id=vm.id, name=vm.name)
128 123
    if detail:
......
134 129
        d['created'] = util.isoformat(vm.created)
135 130
        d['flavorRef'] = vm.flavor.id
136 131
        d['imageRef'] = vm.sourceimage.id
137

  
138
        metadata = metadata_to_dict(vm)
132
        
133
        metadata = dict((m.meta_key, m.meta_value) for m in vm.metadata.all())
139 134
        if metadata:
140 135
            d['metadata'] = {'values': metadata}
141 136

  
......
395 390
    #                       overLimit (413)
396 391

  
397 392
    vm = util.get_vm(server_id, request.user)
398
    metadata = metadata_to_dict(vm)
393
    metadata = dict((m.meta_key, m.meta_value) for m in vm.metadata.all())
399 394
    return util.render_metadata(request, metadata, use_values=True, status=200)
400 395

  
401 396

  
......
417 412
        assert isinstance(metadata, dict)
418 413
    except (KeyError, AssertionError):
419 414
        raise faults.BadRequest("Malformed request")
420

  
421
    updated = {}
422

  
423
    for key, val in metadata.items():
424
        try:
425
            meta = VirtualMachineMetadata.objects.get(meta_key=key, vm=vm)
426
            meta.meta_value = val
427
            meta.save()
428
            updated[key] = val
429
        except VirtualMachineMetadata.DoesNotExist:
430
            pass    # Ignore non-existent metadata
431 415
    
432
    if updated:
433
        vm.save()
416
    for key, val in metadata.items():
417
        meta, created = vm.metadata.get_or_create(meta_key=key)
418
        meta.meta_value = val
419
        meta.save()
434 420
    
435
    return util.render_metadata(request, updated, status=201)
421
    vm.save()
422
    vm_meta = dict((m.meta_key, m.meta_value) for m in vm.metadata.all())
423
    return util.render_metadata(request, vm_meta, status=201)
436 424

  
437 425

  
438 426
@util.api_method('GET')
b/api/tests.py
625 625
        new_metadata = {}
626 626
        for key in sample(metadata[server_id].keys(), 3):
627 627
            new_metadata[key] = 'New %s value' % key
628
        response_metadata = self.update_server_metadata(server_id, new_metadata)
629
        self.assertEqual(response_metadata, new_metadata)
628
        response_metadata = self.update_server_metadata(server_id,
629
                                                        new_metadata)
630 630
        metadata[server_id].update(new_metadata)
631
        self.assertEqual(response_metadata, metadata[server_id])
631 632
        self.assertEqual(metadata, self.get_all_server_metadata())
632

  
633
    def test_does_not_create(self):
634
        with AssertInvariant(self.get_all_server_metadata) as metadata:
635
            server_id = choice(metadata.keys())
636
            new_metadata = {'Foo': 'Bar'}
637
            response_metadata = self.update_server_metadata(server_id, new_metadata)
638
            self.assertEqual(response_metadata, {})
639

  
633
    
640 634
    def test_invalid_data(self):
641 635
        with AssertInvariant(self.get_all_server_metadata) as metadata:
642 636
            server_id = choice(metadata.keys())
......
773 767
        for key in sample(metadata[image_id].keys(), 3):
774 768
            new_metadata[key] = 'New %s value' % key
775 769
        response_metadata = self.update_image_metadata(image_id, new_metadata)
776
        self.assertEqual(response_metadata, new_metadata)
777 770
        metadata[image_id].update(new_metadata)
771
        self.assertEqual(response_metadata, metadata[image_id])
778 772
        self.assertEqual(metadata, self.get_all_image_metadata())
779

  
780
    def test_does_not_create(self):
781
        with AssertInvariant(self.get_all_image_metadata) as metadata:
782
            image_id = choice(metadata.keys())
783
            new_metadata = {'Foo': 'Bar'}
784
            response_metadata = self.update_image_metadata(image_id, new_metadata)
785
            self.assertEqual(response_metadata, {})
786

  
773
    
787 774
    def test_invalid_data(self):
788 775
        with AssertInvariant(self.get_all_image_metadata) as metadata:
789 776
            image_id = choice(metadata.keys())
b/db/models.py
140 140
class ImageMetadata(models.Model):
141 141
    meta_key = models.CharField('Image metadata key name', max_length=50)
142 142
    meta_value = models.CharField('Image metadata value', max_length=500)
143
    image = models.ForeignKey(Image)
143
    image = models.ForeignKey(Image, related_name='metadata')
144 144
    
145 145
    class Meta:
146 146
        unique_together = (('meta_key', 'image'),)
......
408 408
class VirtualMachineMetadata(models.Model):
409 409
    meta_key = models.CharField(max_length=50)
410 410
    meta_value = models.CharField(max_length=500)
411
    vm = models.ForeignKey(VirtualMachine)
411
    vm = models.ForeignKey(VirtualMachine, related_name='metadata')
412 412
    
413 413
    class Meta:
414 414
        unique_together = (('meta_key', 'vm'),)
b/snf-tools/snf-admin
431 431
        
432 432
        if not key:
433 433
            metadata = {}
434
            for meta in image.imagemetadata_set.order_by('meta_key'):
434
            for meta in image.metadata.order_by('meta_key'):
435 435
                metadata[meta.meta_key] = meta.meta_value
436 436
            print_dict(metadata)
437 437
            return
438 438
        
439 439
        try:
440
            meta = image.imagemetadata_set.get(meta_key=key)
440
            meta = image.metadata.get(meta_key=key)
441 441
        except models.ImageMetadata.DoesNotExist:
442 442
            meta = None
443 443
        
......
448 448
        
449 449
        if val:
450 450
            if not meta:
451
                meta = image.imagemetadata_set.create(meta_key=key)
451
                meta = image.metadata.create(meta_key=key)
452 452
            meta.meta_value = val
453 453
            meta.save()
454 454
        else:

Also available in: Unified diff