Skip to content

Commit

Permalink
Merge pull request #3280 from m1kra/api-related-virtual-hosts
Browse files Browse the repository at this point in the history
Add related hosts to api RAS-1267
  • Loading branch information
MarekBleschke committed Aug 8, 2018
2 parents f51b400 + 5476db3 commit 4873710
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 2 deletions.
42 changes: 42 additions & 0 deletions src/ralph/data_center/api/serializers.py
@@ -1,4 +1,6 @@
# -*- coding: utf-8 -*-
from django.contrib.contenttypes.models import ContentType

from rest_framework import serializers

from ralph.api import RalphAPISerializer
Expand All @@ -25,6 +27,7 @@
VIP
)
from ralph.security.api import SecurityScanSerializer
from ralph.virtual.models import VirtualServer


class ClusterTypeSerializer(RalphAPISerializer):
Expand Down Expand Up @@ -122,6 +125,45 @@ class DataCenterAssetSerializer(ComponentSerializerMixin, AssetSerializer):
rack = SimpleRackSerializer()
scmstatuscheck = SCMInfoSerializer()
securityscan = SecurityScanSerializer()
related_hosts = serializers.SerializerMethodField()

def _get_serialized_sublist(self, full_list, serializer_class, cond):
return serializer_class(
[elem for elem in full_list if cond(elem)],
many=True, context=self.context
).data

def _get_physical_servers(self, obj):
dca = ContentType.objects.get_for_model(DataCenterAsset)
return self._get_serialized_sublist(
obj.children.all(),
DataCenterAssetSimpleSerializer,
lambda child: child.content_type == dca
)

def _get_virtual_servers(self, obj):
from ralph.virtual.api import VirtualServerSimpleSerializer
vs = ContentType.objects.get_for_model(VirtualServer)
return self._get_serialized_sublist(
obj.children.all(),
VirtualServerSimpleSerializer,
lambda child: child.content_type == vs
)

def _get_cloud_hosts(self, obj):
from ralph.virtual.api import CloudHostSimpleSerializer
return self._get_serialized_sublist(
obj.cloudhost_set.all(),
CloudHostSimpleSerializer,
lambda host: True
)

def get_related_hosts(self, obj):
related_hosts = {}
related_hosts['virtual_servers'] = self._get_virtual_servers(obj)
related_hosts['physical_servers'] = self._get_physical_servers(obj)
related_hosts['cloud_hosts'] = self._get_cloud_hosts(obj)
return related_hosts

class Meta(AssetSerializer.Meta):
model = DataCenterAsset
Expand Down
4 changes: 3 additions & 1 deletion src/ralph/data_center/api/views.py
Expand Up @@ -52,12 +52,14 @@ class DataCenterAssetViewSet(BaseObjectViewSetMixin, RalphAPIViewSet):
'service_env', 'service_env__service', 'service_env__environment',
'rack', 'rack__server_room', 'rack__server_room__data_center',
'property_of', 'budget_info', 'content_type',
'configuration_path__module'
'configuration_path__module',
]
prefetch_related = base_object_descendant_prefetch_related + [
'connections',
'tags',
'memory_set',
'children',
'cloudhost_set',
Prefetch(
'ethernet_set',
queryset=Ethernet.objects.select_related('ipaddress')
Expand Down
47 changes: 46 additions & 1 deletion src/ralph/data_center/tests/test_api.py
Expand Up @@ -29,6 +29,8 @@
)
from ralph.networks.tests.factories import IPAddressFactory

from ralph.virtual.tests.factories import CloudHostFactory, VirtualServerFactory


class DataCenterAssetAPITests(RalphAPITestCase):
def setUp(self):
Expand All @@ -53,7 +55,7 @@ def setUp(self):

def test_get_data_center_assets_list(self):
url = reverse('datacenterasset-list')
with self.assertNumQueries(15):
with self.assertNumQueries(17):
response = self.client.get(url, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(
Expand Down Expand Up @@ -86,6 +88,49 @@ def test_get_data_center_asset_details(self):
response.data['technical_owners'][0]['username'], 'user2'
)

def test_get_data_center_asset_details_related_hosts(self):
dc_asset_3 = DataCenterAssetFullFactory()
cloud_host = CloudHostFactory(
hypervisor=dc_asset_3
)
virtual_server = VirtualServerFactory(
parent=dc_asset_3
)
virtual_server_2 = VirtualServerFactory(
parent=dc_asset_3,
hostname='random_test_hostname'
)
dc_asset_4 = DataCenterAssetFullFactory(
parent=dc_asset_3
)
url = reverse('datacenterasset-detail', args=(dc_asset_3.id,))
response = self.client.get(url, format='json')
self.assertEqual(
len(response.data['related_hosts']['cloud_hosts']), 1
)
self.assertEqual(
len(response.data['related_hosts']['virtual_servers']), 2
)
self.assertIn(
response.data['related_hosts']['virtual_servers'][0]['hostname'],
(virtual_server.hostname, virtual_server_2.hostname)
)
self.assertIn(
response.data['related_hosts']['virtual_servers'][1]['hostname'],
(virtual_server.hostname, virtual_server_2.hostname)
)
self.assertEqual(
response.data['related_hosts']['cloud_hosts'][0]['hostname'],
cloud_host.hostname
)
self.assertEqual(
len(response.data['related_hosts']['physical_servers']), 1
)
self.assertEqual(
response.data['related_hosts']['physical_servers'][0]['hostname'],
dc_asset_4.hostname
)

def test_create_data_center_asset(self):
url = reverse('datacenterasset-list')
data = {
Expand Down
7 changes: 7 additions & 0 deletions src/ralph/virtual/api.py
Expand Up @@ -136,6 +136,13 @@ class Meta:
model = VirtualServerType


class VirtualServerSimpleSerializer(BaseObjectSerializer):
class Meta(BaseObjectSerializer):
model = VirtualServer
fields = ['hostname', 'url']
_skip_tags_field = True


# TODO: select related
class VirtualServerSerializer(ComponentSerializerMixin, BaseObjectSerializer):
type = VirtualServerTypeSerializer()
Expand Down

0 comments on commit 4873710

Please sign in to comment.