Skip to content

Commit

Permalink
Merge d3c3cc2 into fc47276
Browse files Browse the repository at this point in the history
  • Loading branch information
ycheng-aa committed Aug 12, 2015
2 parents fc47276 + d3c3cc2 commit 0158b94
Show file tree
Hide file tree
Showing 10 changed files with 271 additions and 31 deletions.
9 changes: 6 additions & 3 deletions pdc/apps/compose/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,15 +121,18 @@ def test_get_for_release_to_dict(self):
{'compose': u'compose-1', 'packages': [
{'name': u'bash', 'version': u'1.2.3', 'epoch': 0, 'release': u'4.b1',
'arch': u'x86_64', 'srpm_name': u'bash', 'srpm_nevra': u'bash-0:1.2.3-4.b1.src',
'filename': 'bash-1.2.3-4.b1.x86_64.rpm'}]},
'filename': 'bash-1.2.3-4.b1.x86_64.rpm', 'id': 1,
'linked_composes': [u'compose-1', u'compose-2'], 'linked_releases': []}]},
{'compose': u'compose-2', 'packages': [
{'name': u'bash', 'version': u'1.2.3', 'epoch': 0, 'release': u'4.b1',
'arch': u'x86_64', 'srpm_name': u'bash', 'srpm_nevra': u'bash-0:1.2.3-4.b1.src',
'filename': 'bash-1.2.3-4.b1.x86_64.rpm'}]},
'filename': 'bash-1.2.3-4.b1.x86_64.rpm', 'id': 1,
'linked_composes': [u'compose-1', u'compose-2'], 'linked_releases': []}]},
{'compose': u'compose-3', 'packages': [
{'name': u'bash', 'version': u'5.6.7', 'epoch': 0, 'release': u'8',
'arch': u'x86_64', 'srpm_name': u'bash', 'srpm_nevra': None,
'filename': 'bash-5.6.7-8.x86_64.rpm'}]}
'filename': 'bash-5.6.7-8.x86_64.rpm', 'id': 2,
'linked_composes': [u'compose-3'], 'linked_releases': []}]}
]
self.assertEqual(response.data, expected)

Expand Down
3 changes: 2 additions & 1 deletion pdc/apps/package/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,12 @@ class RPMFilter(django_filters.FilterSet):
filename = MultiValueFilter()
compose = MultiValueFilter(name='composerpm__variant_arch__variant__compose__compose_id',
distinct=True)
linked_release = MultiValueFilter(name='linked_releases__release_id', distinct=True)

class Meta:
model = models.RPM
fields = ('name', 'version', 'epoch', 'release', 'arch', 'srpm_name',
'srpm_nevra', 'compose', 'filename')
'srpm_nevra', 'compose', 'filename', 'linked_release')


class ImageFilter(django_filters.FilterSet):
Expand Down
2 changes: 1 addition & 1 deletion pdc/apps/package/fixtures/test/rpm.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"epoch": 0,
"version": "1.2.3",
"release": "4",
"arch": "x86_64",
"arch": "src",
"srpm_name": "bash",
"srpm_nevra": null,
"filename": "bash-other-1.2.3-4.x86_64.rpm"
Expand Down
5 changes: 5 additions & 0 deletions pdc/apps/package/migrations/0003_buildimage_releases.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
# -*- coding: utf-8 -*-
#
# Copyright (c) 2015 Red Hat
# Licensed under The MIT License (MIT)
# http://opensource.org/licenses/MIT
#
from __future__ import unicode_literals

from django.db import models, migrations
Expand Down
25 changes: 25 additions & 0 deletions pdc/apps/package/migrations/0004_rpm_linked_releases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
#
# Copyright (c) 2015 Red Hat
# Licensed under The MIT License (MIT)
# http://opensource.org/licenses/MIT
#
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

dependencies = [
('release', '0002_auto_20150512_0719'),
('package', '0003_buildimage_releases'),
]

operations = [
migrations.AddField(
model_name='rpm',
name='linked_releases',
field=models.ManyToManyField(related_name='linked_rpms', to='release.Release'),
),
]
17 changes: 14 additions & 3 deletions pdc/apps/package/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class RPM(models.Model):
srpm_nevra = models.CharField(max_length=200, null=True, blank=True, db_index=True)
# Well behaved filenames are unique, but that is enforced by having unique NVRA.
filename = models.CharField(max_length=4096)
linked_releases = models.ManyToManyField('release.Release', related_name='linked_rpms')

class Meta:
unique_together = (
Expand All @@ -37,6 +38,11 @@ class Meta:
def __unicode__(self):
return u"%s.rpm" % self.nevra

def linked_composes(self):
from pdc.apps.compose.models import Compose
"""Return a set of all composes that this RPM is linked"""
return Compose.objects.filter(variant__variantarch__composerpm__rpm=self)

@property
def nevra(self):
return u"%s-%s:%s-%s.%s" % (self.name, self.epoch, self.version, self.release, self.arch)
Expand All @@ -48,9 +54,14 @@ def check_srpm_nevra(srpm_nevra, arch):
raise ValidationError("RPM's srpm_nevra should be empty if and only if arch is src")

def export(self, fields=None):
_fields = ['name', 'epoch', 'version', 'release', 'arch',
'srpm_name', 'srpm_nevra'] if fields is None else fields
return model_to_dict(self, fields=_fields)
_fields = set(['name', 'epoch', 'version', 'release', 'arch',
'srpm_name', 'srpm_nevra', 'linked_releases']) if fields is None else set(fields)
result = model_to_dict(self, fields=_fields - {'linked_releases'})
if 'linked_releases' in _fields:
result['linked_releases'] = []
for linked_release in self.linked_releases.all():
result['linked_releases'].append(linked_release.release_id)
return result

@staticmethod
def default_filename(data):
Expand Down
34 changes: 19 additions & 15 deletions pdc/apps/package/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,30 @@
from pdc.apps.common.serializers import StrictSerializerMixin


class ReleaseRelatedField(serializers.RelatedField):
def to_representation(self, value):
return value.release_id

def to_internal_value(self, data):
try:
return self.queryset.get(release_id=data)
except ObjectDoesNotExist:
raise serializers.ValidationError("release with release_id %s doesn't exist." % data)
except Exception as err:
raise serializers.ValidationError("Can not find release with release_id (%s): %s." %
(data, err))


class RPMSerializer(StrictSerializerMixin, serializers.ModelSerializer):
filename = serializers.CharField(required=False)
linked_releases = ReleaseRelatedField(many=True, read_only=False, queryset=models.Release.objects.all(),
required=False)
linked_composes = serializers.SlugRelatedField(read_only=True, slug_field='compose_id', many=True)

class Meta:
model = models.RPM
fields = ('name', 'version', 'epoch', 'release', 'arch', 'srpm_name', 'srpm_nevra', 'filename')
fields = ('id', 'name', 'version', 'epoch', 'release', 'arch', 'srpm_name', 'srpm_nevra', 'filename',
'linked_releases', 'linked_composes')

def to_internal_value(self, data):
# If filename is not present, compute one.
Expand Down Expand Up @@ -137,20 +155,6 @@ def to_internal_value(self, data):
raise serializers.ValidationError("Unsupported Archive input.")


class ReleaseRelatedField(serializers.RelatedField):
def to_representation(self, value):
return value.release_id

def to_internal_value(self, data):
try:
return self.queryset.get(release_id=data)
except ObjectDoesNotExist:
raise serializers.ValidationError("release with release_id %s doesn't exist." % data)
except Exception as err:
raise serializers.ValidationError("Can not find release with release_id (%s): %s." %
(data, err))


class BuildImageSerializer(StrictSerializerMixin, serializers.HyperlinkedModelSerializer):
image_format = serializers.SlugRelatedField(slug_field='name', queryset=models.ImageFormat.objects.all())
rpms = RPMRelatedField(many=True, read_only=False, queryset=models.RPM.objects.all(), required=False)
Expand Down
82 changes: 79 additions & 3 deletions pdc/apps/package/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ def test_empty_srpm_nevra_with_arch_is_not_src(self):
self.assertEqual(0, models.RPM.objects.count())


class RPMsListRESTTestCase(APITestCase):
class RPMAPIRESTTestCase(TestCaseWithChangeSetMixin, APITestCase):
fixtures = [
'pdc/apps/common/fixtures/test/sigkey.json',
'pdc/apps/release/fixtures/tests/release.json',
Expand Down Expand Up @@ -113,7 +113,7 @@ def test_query_with_params(self):
self.assertEqual(response.data.get('count'), 1)
response = self.client.get(url + '?arch=x86_64', format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data.get('count'), 3)
self.assertEqual(response.data.get('count'), 2)
response = self.client.get(url + '?srpm_name=bash', format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data.get('count'), 3)
Expand All @@ -123,9 +123,15 @@ def test_query_with_params(self):
response = self.client.get(url + '?srpm_nevra=null', format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data.get('count'), 1)

response = self.client.get(url + '?compose=compose-1', format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data.get('count'), 2)
results = response.data.get('results', [])
ids = []
for result in results:
ids.append(result['id'])
self.assertTrue(1 in ids)

def test_query_with_multi_value_against_same_key(self):
url = reverse('rpms-list')
Expand All @@ -145,7 +151,7 @@ def test_query_with_different_key(self):

def test_query_with_wrong_params(self):
url = reverse('rpms-list')
response = self.client.get(url + 'wrong_param', format='json')
response = self.client.get(url + 'wrong_param/', format='json')
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

def test_query_with_only_key(self):
Expand All @@ -163,6 +169,76 @@ def test_query_with_only_key(self):
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data.get('count'), 0)

def test_retrieve_rpm(self):
url = reverse('rpms-detail', args=[1])
response = self.client.get(url, format='json')
expect_data = {"id": 1, "name": "bash", "version": "1.2.3", "epoch": 0, "release": "4.b1", "arch": "x86_64",
"srpm_name": "bash", "srpm_nevra": "bash-0:1.2.3-4.b1.src",
"filename": "bash-1.2.3-4.b1.x86_64.rpm", "linked_releases": [],
"linked_composes": ["compose-1"]}
self.assertEqual(response.data, expect_data)

def test_create_rpm(self):
url = reverse('rpms-list')
data = {"name": "fake_bash", "version": "1.2.3", "epoch": 0, "release": "4.b1", "arch": "x86_64",
"srpm_name": "bash", "filename": "bash-1.2.3-4.b1.x86_64.rpm", "linked_releases": ['release-1.0'],
"srpm_nevra": "fake_bash-0:1.2.3-4.b1.src"}
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
expected_response_data = {"id": 4, 'linked_composes': [],
"name": "fake_bash", "version": "1.2.3", "epoch": 0, "release": "4.b1",
"arch": "x86_64", "srpm_name": "bash", "filename": "bash-1.2.3-4.b1.x86_64.rpm",
"linked_releases": ['release-1.0'], "srpm_nevra": "fake_bash-0:1.2.3-4.b1.src"}
self.assertEqual(response.data, expected_response_data)
self.assertNumChanges([1])

def test_create_rpm_with_wrong_release(self):
url = reverse('rpms-list')
data = {"name": "fake_bash", "version": "1.2.3", "epoch": 0, "release": "4.b1", "arch": "x86_64",
"srpm_name": "bash", "filename": "bash-1.2.3-4.b1.x86_64.rpm", "linked_releases": ['release-1.0-wrong'],
"srpm_nevra": "fake_bash-0:1.2.3-4.b1.src"}
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

def test_partial_update_rpm_with_assign_release(self):
url = reverse('rpms-detail', args=[1])
data = {"linked_releases": ['release-1.0']}
response = self.client.patch(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data.get('linked_releases'), ['release-1.0'])
self.assertNumChanges([1])

def test_partial_update_rpm_with_assign_wrong_release(self):
url = reverse('rpms-detail', args=[1])
data = {"linked_releases": ['release-1.0-fake']}
response = self.client.patch(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

def test_update_rpm(self):
data = {"name": "fake_bash", "version": "1.2.3", "epoch": 0, "release": "4.b1", "arch": "x86_64",
"srpm_name": "bash", "filename": "bash-1.2.3-4.b1.x86_64.rpm", "linked_releases": ['release-1.0'],
"srpm_nevra": "fake_bash-0:1.2.3-4.b1.src"}
url = reverse('rpms-detail', args=[1])
response = self.client.put(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
data.update({'id': 1, 'linked_composes': [u'compose-1']})
self.assertEqual(response.data, data)
self.assertNumChanges([1])

def test_update_rpm_with_linked_compose_should_read_only(self):
url = reverse('rpms-detail', args=[3])
data = {'linked_composes': [u'compose-1']}
response = self.client.patch(url, data, format='json')
self.assertEqual(response.data.get('linked_composes'), [])

def test_bulk_update_patch(self):
self.client.patch(reverse('rpms-list'),
{1: {"linked_releases": ['release-1.0']}}, format='json')
url = reverse('rpms-detail', args=[1])
response = self.client.get(url, format='json')
self.assertEqual(response.data.get("linked_releases"), ['release-1.0'])
self.assertNumChanges([1])


class ImageRESTTestCase(APITestCase):
fixtures = [
Expand Down
Loading

0 comments on commit 0158b94

Please sign in to comment.