Skip to content

Commit 56e1083

Browse files
authored
Merge pull request #3939 from allegro/add-missing-prefetches
Add missing prefetches
2 parents e8afaa7 + 82de5b4 commit 56e1083

9 files changed

Lines changed: 50 additions & 16 deletions

File tree

src/ralph/api/tests/test_rendering.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class APIBrowsableClient(APIClient):
8484
"racks": "/api/racks/",
8585
"regions": "/api/regions/",
8686
"server-rooms": "/api/server-rooms/",
87-
"services": ("/api/services/", 25),
87+
"services": "/api/services/",
8888
"services-environments": "/api/services-environments/",
8989
"sim-card": "/api/sim-card/",
9090
"sim-card-cellular-carrier": "/api/sim-card-cellular-carrier/",

src/ralph/assets/api/views.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class Meta:
5353
model = models.Service
5454
fields = ["active"]
5555

56+
renderer_classes = renderer_classes_without_form(RalphAPIViewSet.renderer_classes)
5657
queryset = models.Service.objects.all()
5758
serializer_class = serializers.ServiceSerializer
5859
save_serializer_class = serializers.SaveServiceSerializer
@@ -255,14 +256,15 @@ class ConfigurationModuleViewSet(RalphAPIViewSet):
255256
# don't allow for ConfigurationModule updating or deleting as it might
256257
# dissrupt configuration of many hosts!
257258
http_method_names = ["get", "post", "options", "head"]
259+
prefetch_related = ["custom_fields", "children_modules"]
258260

259261

260262
class ConfigurationClassViewSet(RalphAPIViewSet):
261263
queryset = models.ConfigurationClass.objects.all()
262264
serializer_class = serializers.ConfigurationClassSerializer
263265
filterset_fields = ("module", "module__name", "class_name", "path")
264266
select_related = ["module"]
265-
prefetch_related = ["tags"]
267+
prefetch_related = ["tags", "custom_fields", "content_type"]
266268
# don't allow for ConfigurationClass updating or deleting as it might
267269
# dissrupt configuration of many hosts!
268270
http_method_names = ["get", "post", "options", "head"]

src/ralph/assets/tests/factories.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ def post_environments(self, create, extracted, **kwargs):
263263
def post_business_owners(self, create, extracted, **kwargs):
264264
if not create:
265265
return
266-
if extracted:
266+
if extracted is not None:
267267
for business_owner in extracted:
268268
self.business_owners.add(business_owner)
269269
else:
@@ -274,7 +274,7 @@ def post_business_owners(self, create, extracted, **kwargs):
274274
def post_technical_owners(self, create, extracted, **kwargs):
275275
if not create:
276276
return
277-
if extracted:
277+
if extracted is not None:
278278
for technical_owner in extracted:
279279
self.technical_owners.add(technical_owner)
280280
else:
@@ -307,8 +307,19 @@ class EthernetWithIPAddressFactory(EthernetFactory):
307307
)
308308

309309

310+
class ParentConfigurationModuleFactory(DjangoModelFactory):
311+
name = factory.Sequence(lambda n: "Parent Configuration Module {}".format(n))
312+
support_team = factory.SubFactory(TeamFactory)
313+
314+
class Meta:
315+
model = ConfigurationModule
316+
django_get_or_create = ["name"]
317+
318+
310319
class ConfigurationModuleFactory(DjangoModelFactory):
311320
name = factory.Iterator(["ralph", "allegro", "auth", "order"])
321+
parent = factory.SubFactory(ParentConfigurationModuleFactory)
322+
support_team = factory.SubFactory(TeamFactory)
312323

313324
class Meta:
314325
model = ConfigurationModule

src/ralph/assets/tests/test_api.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,8 +1074,7 @@ def test_get_configuration_modules_list(self):
10741074
url = reverse("configurationmodule-list")
10751075
response = self.client.get(url, format="json")
10761076
self.assertEqual(response.status_code, status.HTTP_200_OK)
1077-
self.assertEqual(response.data["count"], 2)
1078-
self.assertEqual(response.data["results"][0]["name"], self.conf_module_1.name)
1077+
self.assertEqual(response.data["count"], ConfigurationModule.objects.count())
10791078

10801079
def test_get_configuration_module_details(self):
10811080
url = reverse("configurationmodule-detail", args=(self.conf_module_1.id,))
@@ -1099,14 +1098,15 @@ def test_get_configuration_module_details_with_parent(self):
10991098
)
11001099

11011100
def test_create_configuration_module(self):
1101+
modules_before = ConfigurationModule.objects.count()
11021102
url = reverse("configurationmodule-list")
11031103
data = {
11041104
"name": "test_1",
11051105
"parent": self.conf_module_2.pk,
11061106
}
11071107
response = self.client.post(url, data, format="json")
11081108
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
1109-
self.assertEqual(ConfigurationModule.objects.count(), 3)
1109+
self.assertEqual(ConfigurationModule.objects.count(), modules_before + 1)
11101110
conf_module = ConfigurationModule.objects.get(pk=response.data["id"])
11111111
self.assertEqual(conf_module.name, "test_1")
11121112
self.assertEqual(conf_module.parent, self.conf_module_2)

src/ralph/data_center/api/views.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
RackAccessory,
4141
ServerRoom,
4242
)
43+
from ralph.lib.api.utils import renderer_classes_without_form
4344
from ralph.lib.visibility_scope.filters import visibility_scope_filter
4445
from ralph.virtual.models import CloudHost, VirtualServer
4546

@@ -50,6 +51,7 @@ class Meta(NetworkableObjectFilters.Meta):
5051

5152

5253
class DataCenterAssetViewSet(BaseObjectViewSetMixin, RalphAPIViewSet):
54+
renderer_classes = renderer_classes_without_form(RalphAPIViewSet.renderer_classes)
5355
queryset = DataCenterAsset.objects.all()
5456
serializer_class = DataCenterAssetSerializer
5557
save_serializer_class = DataCenterAssetSaveSerializer

src/ralph/data_center/tests/factories.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,21 @@ class Meta:
7878
def post_tags(self, create, extracted, **kwargs):
7979
self.tags.add("abc, cde", "xyz")
8080

81+
@factory.post_generation
82+
def post_base_objects(self, create, extracted, **kwargs):
83+
if not create:
84+
return
85+
if extracted is not None:
86+
for base_object in extracted:
87+
BaseObjectClusterFactory(cluster=self, base_object=base_object)
88+
else:
89+
BaseObjectClusterFactory.create_batch(3, cluster=self)
90+
8191

8292
class BaseObjectClusterFactory(DjangoModelFactory):
8393
cluster = factory.SubFactory(ClusterFactory)
8494
base_object = factory.SubFactory(BaseObjectFactory)
95+
is_master = False
8596

8697
class Meta:
8798
model = BaseObjectCluster

src/ralph/data_center/tests/test_api.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
ServiceEnvironmentFactory,
1515
)
1616
from ralph.data_center.models import (
17-
BaseObjectCluster,
1817
Cluster,
1918
DataCenterAsset,
2019
Orientation,
@@ -32,6 +31,7 @@
3231
RackAccessoryFactory,
3332
RackFactory,
3433
ServerRoomFactory,
34+
BaseObjectClusterFactory,
3535
)
3636
from ralph.lib.custom_fields.models import CustomField
3737
from ralph.networks.tests.factories import IPAddressFactory
@@ -599,15 +599,15 @@ def setUp(self):
599599
super().setUp()
600600
self.cluster_type = ClusterTypeFactory()
601601
self.service_env = ServiceEnvironmentFactory()
602-
self.cluster_1 = ClusterFactory()
603-
self.boc_1 = BaseObjectCluster.objects.create(
602+
self.cluster_1 = ClusterFactory(post_base_objects=[])
603+
self.boc_1 = BaseObjectClusterFactory(
604604
cluster=self.cluster_1, base_object=DataCenterAssetFactory()
605605
)
606606
self.master = DataCenterAssetFactory()
607-
self.boc_2 = BaseObjectCluster.objects.create(
607+
self.boc_2 = BaseObjectClusterFactory(
608608
cluster=self.cluster_1, base_object=self.master, is_master=True
609609
)
610-
self.cluster_2 = ClusterFactory()
610+
self.cluster_2 = ClusterFactory(post_base_objects=[])
611611
self.cluster_1.service_env.service.business_owners.set([self.user1])
612612
self.cluster_1.service_env.service.technical_owners.set([self.user2])
613613
self.cluster_1.management_ip = "10.20.30.40"
@@ -655,7 +655,7 @@ def test_create_cluster_without_hostname_or_name(self):
655655
def test_list_cluster(self):
656656
ClusterFactory.create_batch(20)
657657
url = reverse("cluster-list") + "?limit=100"
658-
with self.assertNumQueries(12):
658+
with self.assertQueriesMoreOrLess(11, plus_minus=1):
659659
response = self.client.get(url, format="json")
660660
self.assertEqual(response.status_code, status.HTTP_200_OK)
661661
self.assertEqual(len(response.data["results"]), 22)
@@ -665,7 +665,7 @@ def test_list_cluster(self):
665665

666666
def test_get_cluster_details(self):
667667
url = reverse("cluster-detail", args=(self.cluster_1.id,))
668-
with self.assertNumQueries(11):
668+
with self.assertQueriesMoreOrLess(10, plus_minus=1):
669669
response = self.client.get(url, format="json")
670670
self.assertEqual(response.status_code, status.HTTP_200_OK)
671671
self.assertEqual(response.data["name"], self.cluster_1.name)

src/ralph/data_center/tests/test_view.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def test_changelist_view(self):
4949
VirtualServerFullFactory.create_batch(5)
5050
CloudHostFullFactory.create_batch(4)
5151
ClusterFactory.create_batch(4)
52-
with self.assertQueriesMoreOrLess(18, plus_minus=3):
52+
with self.assertQueriesMoreOrLess(20, plus_minus=3):
5353
result = self.client.get(
5454
reverse("admin:data_center_dchost_changelist"),
5555
)

src/ralph/virtual/api.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,13 @@ class CloudFlavorViewSet(RalphAPIViewSet):
194194
queryset = CloudFlavor.objects.all()
195195
serializer_class = CloudFlavorSerializer
196196
save_serializer_class = SaveCloudFlavorSerializer
197-
prefetch_related = ["tags", "virtualcomponent_set__model"]
197+
prefetch_related = [
198+
"tags",
199+
"virtualcomponent_set__model",
200+
"custom_fields",
201+
"licences",
202+
"content_type",
203+
]
198204
filterset_fields = ["flavor_id"]
199205

200206
def destroy(self, request, *args, **kwargs):
@@ -296,6 +302,8 @@ class CloudProjectViewSet(RalphAPIViewSet):
296302
"tags",
297303
"licences",
298304
"cloudprovider",
305+
"custom_fields",
306+
"content_type",
299307
]
300308

301309

0 commit comments

Comments
 (0)