netbox-community / netbox

The premier source of truth powering network automation. Open source under Apache 2. Public demo: https://demo.netbox.dev
http://netboxlabs.com/oss/netbox/
Apache License 2.0
15.32k stars 2.49k forks source link

Object count fields are documented in Swagger for REST API GET requests but not included in the response #16085

Open atownson opened 1 month ago

atownson commented 1 month ago

Deployment Type

Self-hosted

NetBox Version

v4.0.1

Python Version

3.11

Steps to Reproduce

The RelatedObjectCountField REST API serializer fields are being documented in the REST API Swagger for GET requests but not actually returned in the response.

  1. View the Swagger documentation for /dcim/devices/: image
  2. Invoke a corresponding GET request and review the response content:
    {
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 1,
            "url": "https://mynetbox.com/api/dcim/devices/1/",
            "display": "mydevice",
            "name": "mydevice",
            "device_type": {
                "id": 1,
                "url": "https://mynetbox.com/api/dcim/device-types/1/",
                "display": "mytype",
                "manufacturer": {
                    "id": 1,
                    "url": "https://mynetbox.com/api/dcim/manufacturers/1/",
                    "display": "mymanufacturer",
                    "name": "mymanufacturer",
                    "slug": "mymanufacturer",
                    "description": ""
                },
                "model": "mytype",
                "slug": "mytype",
                "description": ""
            },
            "role": {
                "id": 1,
                "url": "https://mynetbox.com/api/dcim/device-roles/1/",
                "display": "server",
                "name": "server",
                "slug": "server",
                "description": ""
            },
            "tenant": null,
            "platform": null,
            "serial": "",
            "asset_tag": null,
            "site": {
                "id": 1,
                "url": "https://mynetbox.com/api/dcim/sites/1/",
                "display": "mysite",
                "name": "mysite",
                "slug": "mysite",
                "description": ""
            },
            "location": null,
            "rack": null,
            "position": null,
            "face": null,
            "latitude": null,
            "longitude": null,
            "parent_device": null,
            "status": {
                "value": "active",
                "label": "Active"
            },
            "airflow": null,
            "primary_ip": {
                "id": 2,
                "url": "https://mynetbox.com/api/ipam/ip-addresses/2/",
                "display": "192.168.0.10/32",
                "family": {
                    "value": 4,
                    "label": "IPv4"
                },
                "address": "192.168.0.10/32",
                "description": ""
            },
            "primary_ip4": {
                "id": 2,
                "url": "https://mynetbox.com/api/ipam/ip-addresses/2/",
                "display": "192.168.0.10/32",
                "family": {
                    "value": 4,
                    "label": "IPv4"
                },
                "address": "192.168.0.10/32",
                "description": ""
            },
            "primary_ip6": null,
            "oob_ip": null,
            "cluster": null,
            "virtual_chassis": null,
            "vc_position": null,
            "vc_priority": null,
            "description": "",
            "comments": "",
            "config_template": null,
            "config_context": {},
            "local_context_data": null,
            "tags": [],
            "custom_fields": {},
            "created": "2023-10-04T17:05:56.749955Z",
            "last_updated": "2023-10-04T23:36:26.264584Z",
            "console_port_count": 0,
            "console_server_port_count": 0,
            "power_port_count": 0,
            "power_outlet_count": 0,
            "interface_count": 1,
            "front_port_count": 0,
            "rear_port_count": 0,
            "device_bay_count": 0,
            "module_bay_count": 0,
            "inventory_item_count": 0
        }
    ]
    }

    The behavior seems consistent wherever RelatedObjectCountField is used.

Expected Behavior

Based on the serializer classes, I assume the intention is to include these count fields since they're included in the brief fields. Either way, the Swagger scheme documentation should match the response content.

Observed Behavior

The Swagger documented schemes differ from the response content.

jeremystretch commented 1 month ago

Related object counts are intended to be included only for the root object: The data is not available on the underlying queryset when nesting. Opening this for anyone who would like to correct the OpenAPI schema to reflect this.

jeffgdotorg commented 3 weeks ago

As laid out in #16418, this kind of discrepancy can wreak havoc with strongly-typed client generator frameworks. Bumping severity to medium.

jeremystretch commented 3 weeks ago

@jeffgdotorg any issues with the OpenAPI schema should be classified as low severity as they do not impact the operation of NetBox itself.

jeffgdotorg commented 2 weeks ago

@janhlavin in #16418 (dupe of this issue) you mentioned that dropping device_count from the relevant section of the OpenAPI definition would resolve this problem for your use case. If you're in a position to create a PR to that effect, please chime in and a maintainer will assign the issue to you.

jeffgdotorg commented 2 weeks ago

@atownson same goes for you – PRs are welcome. Just let us know if you'd like to work it through, so we can assign the issue to you.

deathbeam commented 1 week ago

Also encountered this issue, but in broader sense, the brief fields being returned instead of the whole model in the swagger definition is incorrect even outside of just the count fields and as mentioned above breaks swagger generators. Not sure if I should open new issue or this one encapsulates that.