From 4b35a82ea3972ea26e22341c3882e1763f24c1b4 Mon Sep 17 00:00:00 2001 From: "zhu.boxiang" Date: Wed, 27 Apr 2022 12:03:44 +0800 Subject: [PATCH] fix: Remove invalid count of ports list Neutron does not supply the count of ports from list ports api. So we need to remove invalid count of ports list api from skyline. Closes-Bug: #1948615 Change-Id: I8858c242957a6cda47c08efa1e1d233db15cad18 --- docs/api/swagger.json | 5 -- .../skyline_apiserver/api/v1/extension.py | 25 +++------ .../client/openstack/neutron.py | 25 +++++++++ .../skyline_apiserver/network/__init__.py | 0 .../skyline_apiserver/network/neutron.py | 56 ------------------- .../skyline_apiserver/schemas/extension.py | 1 - 6 files changed, 33 insertions(+), 79 deletions(-) delete mode 100644 libs/skyline-apiserver/skyline_apiserver/network/__init__.py delete mode 100644 libs/skyline-apiserver/skyline_apiserver/network/neutron.py diff --git a/docs/api/swagger.json b/docs/api/swagger.json index 089b9b4..fb567b8 100644 --- a/docs/api/swagger.json +++ b/docs/api/swagger.json @@ -2192,11 +2192,6 @@ ], "type": "object", "properties": { - "count": { - "title": "Count", - "type": "integer", - "default": 0 - }, "ports": { "title": "Ports", "type": "array", diff --git a/libs/skyline-apiserver/skyline_apiserver/api/v1/extension.py b/libs/skyline-apiserver/skyline_apiserver/api/v1/extension.py index 284d929..68f01d8 100644 --- a/libs/skyline-apiserver/skyline_apiserver/api/v1/extension.py +++ b/libs/skyline-apiserver/skyline_apiserver/api/v1/extension.py @@ -21,16 +21,15 @@ from functools import reduce from typing import List from dateutil import parser -from fastapi import APIRouter, Depends, Header, HTTPException, Query, status +from fastapi import APIRouter, Depends, Header, Query, status from skyline_apiserver import schemas from skyline_apiserver.api import deps from skyline_apiserver.api.v1.openstack.base import OSPort, OSServer, OSVolume, OSVolumeSnapshot from skyline_apiserver.api.v1.utils import Port, Server, Service, Volume, VolumeSnapshot from skyline_apiserver.client import utils from skyline_apiserver.client.openstack import cinder, glance, keystone, neutron, nova -from skyline_apiserver.client.utils import generate_session, get_endpoint, get_system_session +from skyline_apiserver.client.utils import generate_session, get_system_session from skyline_apiserver.config import CONF -from skyline_apiserver.network.neutron import get_ports from skyline_apiserver.schemas import common from skyline_apiserver.types import constants from skyline_apiserver.utils.roles import assert_system_admin_or_reader, is_system_reader_no_admin @@ -874,7 +873,6 @@ async def list_volume_snapshots( "/extension/ports", description="List Ports.", responses={ - 200: {"model": schemas.ExtListPortsResponse}, 401: {"model": common.UnauthorizedMessage}, 403: {"model": common.ForbiddenMessage}, 500: {"model": common.InternalServerErrorMessage}, @@ -986,24 +984,17 @@ async def list_ports( kwargs["sort_dir"] = sort_dir kwargs["sort_key"] = sort_keys - try: - neutron_endpoint = await get_endpoint(profile.region, "neutron", current_session) - except Exception as ex: - raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(ex)) - - ports = await get_ports( - neutron_endpoint, - profile.keystone_token, + ports = await neutron.list_ports( + current_session, + profile.region, x_openstack_request_id, - kwargs, + **kwargs, ) - ports_count = ports.get("count", 0) - ports = ports["ports"] server_ids = [] network_ids = [] result = [] - for port in ports: + for port in ports.get("ports", []): origin_data = OSPort(port).to_dict() port = Port(port).to_dict() port["origin_data"] = origin_data @@ -1064,7 +1055,7 @@ async def list_ports( for port in result: port["server_name"] = ser_mappings.get(port["device_id"]) port["network_name"] = network_mappings.get(port["network_id"]) - return {"count": ports_count, "ports": result} + return {"ports": result} @router.get( diff --git a/libs/skyline-apiserver/skyline_apiserver/client/openstack/neutron.py b/libs/skyline-apiserver/skyline_apiserver/client/openstack/neutron.py index 8c79fe4..1b6d375 100644 --- a/libs/skyline-apiserver/skyline_apiserver/client/openstack/neutron.py +++ b/libs/skyline-apiserver/skyline_apiserver/client/openstack/neutron.py @@ -47,3 +47,28 @@ async def list_networks( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), ) + + +async def list_ports( + session: Session, + region_name: str, + global_request_id: str, + **kwargs: Any, +) -> Any: + try: + nc = await utils.neutron_client( + session=session, + region=region_name, + global_request_id=global_request_id, + ) + return await run_in_threadpool(nc.list_ports, **kwargs) + except Unauthorized as e: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail=str(e), + ) + except Exception as e: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail=str(e), + ) diff --git a/libs/skyline-apiserver/skyline_apiserver/network/__init__.py b/libs/skyline-apiserver/skyline_apiserver/network/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/libs/skyline-apiserver/skyline_apiserver/network/neutron.py b/libs/skyline-apiserver/skyline_apiserver/network/neutron.py deleted file mode 100644 index 7ba922e..0000000 --- a/libs/skyline-apiserver/skyline_apiserver/network/neutron.py +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright 2021 99cloud -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from typing import Any, Dict - -import six -from six.moves.urllib import parse -from skyline_apiserver.types import constants -from skyline_apiserver.utils.httpclient import get_assert_200 - - -async def get_ports( - neutron_endpoint: str, - keystone_token: str, - global_request_id: str, - search_opts: Dict[str, Any], -) -> Dict[str, Any]: - """Get the ports in the environment . - - :param neutron_endpoint: Nova endpoint in specified region. - :type neutron_endpoint: str - :param keystone_token: Keystone token. - :type keystone_token: str - :param search_opts: Search opts. - :type search_opts: dict - :return: ports. - :rtype: Dict[str, Any] - """ - url = neutron_endpoint + constants.NEUTRON_PORTS_API - qparams = {} - for opt, val in search_opts.items(): - if val: - if isinstance(val, six.text_type): - val = val.encode("utf-8") - if isinstance(val, list): - val = [v.encode("utf-8") for v in val] - qparams[opt] = val - url += "?%s" % parse.urlencode(qparams, doseq=True) - resp = await get_assert_200( - url, - headers={"X-Auth-Token": keystone_token, constants.INBOUND_HEADER: global_request_id}, - ) - return resp.json() diff --git a/libs/skyline-apiserver/skyline_apiserver/schemas/extension.py b/libs/skyline-apiserver/skyline_apiserver/schemas/extension.py index 4671a72..853e019 100644 --- a/libs/skyline-apiserver/skyline_apiserver/schemas/extension.py +++ b/libs/skyline-apiserver/skyline_apiserver/schemas/extension.py @@ -506,7 +506,6 @@ class ExtListPortsBaseResponse(BaseModel): class ExtListPortsResponse(BaseModel): - count: int = 0 ports: List[ExtListPortsBaseResponse]